From 8cd73671c0196005dd0324c8a9340b5bfd6886ac Mon Sep 17 00:00:00 2001 From: EnixCoda Date: Sun, 24 Jun 2018 23:10:54 +0800 Subject: [PATCH] feat(configHelper): create --- src/components/SettingsBar.js | 8 ++++---- src/driver/core.js | 7 ++----- src/utils/configHelper.js | 34 ++++++++++++++++++++++++++++++++++ src/utils/general.js | 18 +++++++++++++++++- src/utils/storageHelper.js | 30 ++++-------------------------- 5 files changed, 61 insertions(+), 36 deletions(-) create mode 100644 src/utils/configHelper.js diff --git a/src/components/SettingsBar.js b/src/components/SettingsBar.js index efa7431..2904424 100644 --- a/src/components/SettingsBar.js +++ b/src/components/SettingsBar.js @@ -1,6 +1,6 @@ import React from 'react' import Icon from './Icon' -import storageHelper from '../utils/storageHelper' +import configHelper, { config } from '../utils/configHelper' import keyHelper from '../utils/keyHelper' const ACCESS_TOKEN_REGEXP = /^[0-9a-f]{40}$/ @@ -66,7 +66,7 @@ export default class SettingsBar extends React.PureComponent { const { onAccessTokenChange } = this.props const { accessToken } = this.state if (accessToken) { - await storageHelper.setAccessToken(accessToken) + await configHelper.setOne(config.accessToken, accessToken) onAccessTokenChange(accessToken) this.setState({ accessToken: '', @@ -77,7 +77,7 @@ export default class SettingsBar extends React.PureComponent { clearToken = async () => { const { onAccessTokenChange } = this.props - await storageHelper.setAccessToken('') + await configHelper.setOne(config.accessToken, '') onAccessTokenChange('') this.setState({ accessToken: '' }) } @@ -85,7 +85,7 @@ export default class SettingsBar extends React.PureComponent { saveShortcut = async () => { const { onShortcutChange } = this.props const { toggleShowSideBarShortcut } = this.state - await storageHelper.setShortcut(toggleShowSideBarShortcut) + await configHelper.setOne(config.shortcut, toggleShowSideBarShortcut) onShortcutChange(toggleShowSideBarShortcut) this.setState({ shortcutHint: 'Shortcut is saved!', diff --git a/src/driver/core.js b/src/driver/core.js index ea80664..9f03175 100644 --- a/src/driver/core.js +++ b/src/driver/core.js @@ -1,6 +1,6 @@ import DOMHelper, { REPO_TYPE_PRIVATE } from '../utils/DOMHelper' import GitHubHelper, { NOT_FOUND, BAD_CREDENTIALS } from '../utils/GitHubHelper' -import storageHelper from '../utils/storageHelper' +import configHelper from '../utils/configHelper' import URLHelper from '../utils/URLHelper' import keyHelper from '../utils/keyHelper' @@ -9,10 +9,7 @@ const init = dispatch => async () => { DOMHelper.decorateGitHubPageContent() const metaData = URLHelper.parse() dispatch(setMetaData, metaData) - const [accessToken, shortcut] = await Promise.all([ - storageHelper.getAccessToken(), - storageHelper.getShortcut(), - ]) + const { access_token: accessToken, shortcut } = await configHelper.get() dispatch({ accessToken, toggleShowSideBarShortcut: shortcut }) const metaDataFromAPI = await GitHubHelper.getRepoMeta({ ...metaData, accessToken }) const branchName = metaData.branchName || metaDataFromAPI['default_branch'] diff --git a/src/utils/configHelper.js b/src/utils/configHelper.js new file mode 100644 index 0000000..dceba79 --- /dev/null +++ b/src/utils/configHelper.js @@ -0,0 +1,34 @@ +import storageHelper from './storageHelper' +import { pick } from './general' + +export const config = { + shortcut: 'shortcut', + accessToken: 'access_token', +} + +const configKeys = Object.values(config) + +function get() { + return storageHelper.get(configKeys) +} + +function getOne(key) { + return get()[key] +} + +function set(partialConfig) { + return storageHelper.set(pick(partialConfig, configKeys)) +} + +function setOne(key, value) { + return set({ + [key]: value, + }) +} + +export default { + get, + getOne, + set, + setOne, +} diff --git a/src/utils/general.js b/src/utils/general.js index b1c6ea4..5deebbc 100644 --- a/src/utils/general.js +++ b/src/utils/general.js @@ -1 +1,17 @@ -export default {} + +/** + * @param {Object} source + * @param {Object|Array} keys + * @returns + */ +export function pick(source, keys) { + if (keys && typeof keys === 'object') { + return ( + Array.isArray(keys) ? keys : Object.keys(keys) + ).reduce((copy, key) => { + copy[key] = source[key] + return copy + }, {}) + } + return {} +} diff --git a/src/utils/storageHelper.js b/src/utils/storageHelper.js index a5f1f19..8f06782 100644 --- a/src/utils/storageHelper.js +++ b/src/utils/storageHelper.js @@ -1,36 +1,14 @@ const localStorage = chrome.storage.local -const ACCESS_TOKEN_KEY = 'access_token' -const SHORTCUT_KEY = 'shortcut' -function get(key) { - return new Promise(resolve => localStorage.get(key, items => resolve(items[key]))) +function get(mapping) { + return new Promise(resolve => localStorage.get(mapping, resolve)) } -function set(key, value) { - return new Promise(resolve => localStorage.set({ [key]: value }, resolve)) -} - -function getAccessToken() { - return get(ACCESS_TOKEN_KEY) -} - -function setAccessToken(accessToken) { - return set(ACCESS_TOKEN_KEY, accessToken) -} - -function getShortcut() { - return get(SHORTCUT_KEY) -} - -function setShortcut(shortcut) { - return set(SHORTCUT_KEY, shortcut) +function set(value) { + return new Promise(resolve => localStorage.set(value, resolve)) } export default { get, set, - getAccessToken, - setAccessToken, - getShortcut, - setShortcut, }