diff options
| author | Shin'ya Ueoka <ueokande@i-beam.org> | 2018-01-08 21:54:16 +0900 | 
|---|---|---|
| committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2018-01-08 22:04:33 +0900 | 
| commit | 6083e70ea089fa2683741a1118be0e4e6b76f858 (patch) | |
| tree | de282571884396e961a10cd447572c0fb1e370ea | |
| parent | d23c190cad81ec2109f69b4afa957194d029caaf (diff) | |
separate setting actions and reducers
| -rw-r--r-- | src/background/actions/index.js | 4 | ||||
| -rw-r--r-- | src/background/actions/setting.js | 13 | ||||
| -rw-r--r-- | src/background/components/background.js | 4 | ||||
| -rw-r--r-- | src/background/index.js | 4 | ||||
| -rw-r--r-- | src/background/reducers/index.js | 2 | ||||
| -rw-r--r-- | src/background/reducers/setting.js | 17 | ||||
| -rw-r--r-- | src/settings/actions/setting.js | 18 | ||||
| -rw-r--r-- | src/shared/settings/storage.js | 31 | ||||
| -rw-r--r-- | test/background/reducers/setting.test.js | 19 | 
9 files changed, 96 insertions, 16 deletions
diff --git a/src/background/actions/index.js b/src/background/actions/index.js new file mode 100644 index 0000000..8c212c2 --- /dev/null +++ b/src/background/actions/index.js @@ -0,0 +1,4 @@ +export default { +  // Settings +  SETTING_SET_SETTINGS: 'setting.set.settings', +}; diff --git a/src/background/actions/setting.js b/src/background/actions/setting.js new file mode 100644 index 0000000..0454a68 --- /dev/null +++ b/src/background/actions/setting.js @@ -0,0 +1,13 @@ +import actions from '../actions'; +import * as settingsStorage from 'shared/settings/storage'; + +const load = () => { +  return settingsStorage.loadValue().then((value) => { +    return { +      type: actions.SETTING_SET_SETTINGS, +      value, +    }; +  }); +}; + +export { load }; diff --git a/src/background/components/background.js b/src/background/components/background.js index 2d94310..22c6693 100644 --- a/src/background/components/background.js +++ b/src/background/components/background.js @@ -1,6 +1,6 @@  import messages from 'shared/messages';  import * as operationActions from 'background/actions/operation'; -import * as settingsActions from 'settings/actions/setting'; +import * as settingActions from 'background/actions/setting';  import * as tabActions from 'background/actions/tab';  import * as commands from 'shared/commands'; @@ -46,7 +46,7 @@ export default class BackgroundComponent {      case messages.CONSOLE_QUERY_COMPLETIONS:        return commands.complete(message.text, settings.value);      case messages.SETTINGS_RELOAD: -      this.store.dispatch(settingsActions.load()); +      this.store.dispatch(settingActions.load());        return this.broadcastSettingsChanged();      }    } diff --git a/src/background/index.js b/src/background/index.js index 8a68767..3ef712f 100644 --- a/src/background/index.js +++ b/src/background/index.js @@ -1,4 +1,4 @@ -import * as settingsActions from 'settings/actions/setting'; +import * as settingActions from 'background/actions/setting';  import messages from 'shared/messages';  import BackgroundComponent from 'background/components/background';  import reducers from 'background/reducers'; @@ -16,4 +16,4 @@ const store = createStore(reducers, (e, sender) => {  // eslint-disable-next-line no-unused-vars  const backgroundComponent = new BackgroundComponent(store); -store.dispatch(settingsActions.load()); +store.dispatch(settingActions.load()); diff --git a/src/background/reducers/index.js b/src/background/reducers/index.js index 4be8fac..dab0c62 100644 --- a/src/background/reducers/index.js +++ b/src/background/reducers/index.js @@ -1,4 +1,4 @@ -import settingReducer from 'settings/reducers/setting'; +import settingReducer from './setting';  // Make setting reducer instead of re-use  const defaultState = { diff --git a/src/background/reducers/setting.js b/src/background/reducers/setting.js new file mode 100644 index 0000000..70bf8ea --- /dev/null +++ b/src/background/reducers/setting.js @@ -0,0 +1,17 @@ +import actions from 'settings/actions'; + +const defaultState = { +  value: {}, +}; + +export default function reducer(state = defaultState, action = {}) { +  switch (action.type) { +  case actions.SETTING_SET_SETTINGS: +    return { +      value: action.value, +    }; +  default: +    return state; +  } +} + diff --git a/src/settings/actions/setting.js b/src/settings/actions/setting.js index 1d01fda..92c9f8a 100644 --- a/src/settings/actions/setting.js +++ b/src/settings/actions/setting.js @@ -1,26 +1,22 @@  import actions from 'settings/actions';  import messages from 'shared/messages';  import DefaultSettings from 'shared/settings/default'; +import * as settingsStorage from 'shared/settings/storage';  import * as settingsValues from 'shared/settings/values';  const load = () => { -  return browser.storage.local.get('settings').then(({ settings }) => { -    if (!settings) { -      return set(DefaultSettings); -    } -    return set(Object.assign({}, DefaultSettings, settings)); -  }, console.error); +  return settingsStorage.loadRaw().then((settings) => { +    return set(settings); +  });  };  const save = (settings) => { -  return browser.storage.local.set({ -    settings, -  }).then(() => { +  return settingsStorage.save(settings).then(() => {      return browser.runtime.sendMessage({        type: messages.SETTINGS_RELOAD -    }).then(() => { -      return set(settings);      }); +  }).then(() => { +    return set(settings);    });  }; diff --git a/src/shared/settings/storage.js b/src/shared/settings/storage.js new file mode 100644 index 0000000..1edb441 --- /dev/null +++ b/src/shared/settings/storage.js @@ -0,0 +1,31 @@ +import DefaultSettings from './default'; +import * as settingsValues from './values'; + +const loadRaw = () => { +  return browser.storage.local.get('settings').then(({ settings }) => { +    if (!settings) { +      return DefaultSettings; +    } +    return Object.assign({}, DefaultSettings, settings); +  }); +}; + +const loadValue = () => { +  return loadRaw().then((settings) => { +    let value = JSON.parse(DefaultSettings.json); +    if (settings.source === 'json') { +      value = settingsValues.valueFromJson(settings.json); +    } else if (settings.source === 'form') { +      value = settingsValues.valueFromForm(settings.form); +    } +    return value; +  }); +}; + +const save = (settings) => { +  return browser.storage.local.set({ +    settings, +  }); +}; + +export { loadRaw, loadValue, save }; diff --git a/test/background/reducers/setting.test.js b/test/background/reducers/setting.test.js new file mode 100644 index 0000000..a6a5573 --- /dev/null +++ b/test/background/reducers/setting.test.js @@ -0,0 +1,19 @@ +import { expect } from "chai"; +import actions from 'background/actions'; +import settingReducer from 'background/reducers/setting'; + +describe("setting reducer", () => { +  it('return the initial state', () => { +    let state = settingReducer(undefined, {}); +    expect(state).to.have.deep.property('value', {}); +  }); + +  it('return next state for SETTING_SET_SETTINGS', () => { +    let action = { +      type: actions.SETTING_SET_SETTINGS, +      value: { key: 123 }, +    }; +    let state = settingReducer(undefined, action); +    expect(state).to.have.deep.property('value', { key: 123 }); +  }); +});  | 
