setting as redux
This commit is contained in:
parent
709fa95aa3
commit
61806a4e7f
6 changed files with 112 additions and 19 deletions
|
@ -13,5 +13,8 @@ export default {
|
||||||
// Completion
|
// Completion
|
||||||
COMPLETION_SET_ITEMS: 'completion.set.items',
|
COMPLETION_SET_ITEMS: 'completion.set.items',
|
||||||
COMPLETION_SELECT_NEXT: 'completions.select.next',
|
COMPLETION_SELECT_NEXT: 'completions.select.next',
|
||||||
COMPLETION_SELECT_PREV: 'completions.select.prev'
|
COMPLETION_SELECT_PREV: 'completions.select.prev',
|
||||||
|
|
||||||
|
// Settings
|
||||||
|
SETTING_SET_SETTINGS: 'setting.set.settings',
|
||||||
};
|
};
|
||||||
|
|
27
src/actions/setting.js
Normal file
27
src/actions/setting.js
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
import actions from '../actions';
|
||||||
|
import messages from '../content/messages';
|
||||||
|
|
||||||
|
const load = () => {
|
||||||
|
return browser.storage.local.get('settings').then((value) => {
|
||||||
|
return set(value.settings);
|
||||||
|
}, console.error);
|
||||||
|
};
|
||||||
|
|
||||||
|
const save = (settings) => {
|
||||||
|
return browser.storage.local.set({
|
||||||
|
settings
|
||||||
|
}).then(() => {
|
||||||
|
return browser.runtime.sendMessage({
|
||||||
|
type: messages.SETTINGS_RELOAD
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const set = (settings) => {
|
||||||
|
return {
|
||||||
|
type: actions.SETTING_SET_SETTINGS,
|
||||||
|
settings,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export { load, save, set };
|
31
src/components/setting.js
Normal file
31
src/components/setting.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
import * as settingActions from '../actions/setting';
|
||||||
|
|
||||||
|
export default class SettingComponent {
|
||||||
|
constructor(wrapper, store) {
|
||||||
|
this.wrapper = wrapper;
|
||||||
|
this.store = store;
|
||||||
|
|
||||||
|
let doc = wrapper.ownerDocument;
|
||||||
|
let form = doc.getElementById('vimvixen-settings-form');
|
||||||
|
form.addEventListener('submit', this.onSubmit.bind(this));
|
||||||
|
|
||||||
|
store.dispatch(settingActions.load());
|
||||||
|
}
|
||||||
|
|
||||||
|
onSubmit(e) {
|
||||||
|
let settings = {
|
||||||
|
json: e.target.elements['plain-json'].value,
|
||||||
|
};
|
||||||
|
this.store.dispatch(settingActions.save(settings));
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
update() {
|
||||||
|
let { settings } = this.store.getState();
|
||||||
|
|
||||||
|
let doc = this.wrapper.ownerDocument;
|
||||||
|
let form = doc.getElementById('vimvixen-settings-form');
|
||||||
|
let plainJsonInput = form.elements['plain-json'];
|
||||||
|
plainJsonInput.value = settings.json;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,22 +1,15 @@
|
||||||
import './settings.scss';
|
import './settings.scss';
|
||||||
import messages from '../content/messages';
|
import SettingComponent from '../components/setting';
|
||||||
|
import settingReducer from '../reducers/setting';
|
||||||
|
import * as store from '../store';
|
||||||
|
|
||||||
|
const settingStore = store.createStore(settingReducer);
|
||||||
|
let settingComponent = null;
|
||||||
|
|
||||||
|
settingStore.subscribe(() => {
|
||||||
|
settingComponent.update();
|
||||||
|
});
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
let form = document.getElementById('vimvixen-settings-form');
|
settingComponent = new SettingComponent(document.body, settingStore);
|
||||||
form.addEventListener('submit', (e) => {
|
|
||||||
e.preventDefault();
|
|
||||||
browser.storage.local.set({
|
|
||||||
settings: {
|
|
||||||
json: e.target.elements['plain-json'].value
|
|
||||||
}
|
|
||||||
}).then(() => {
|
|
||||||
return browser.runtime.sendMessage({
|
|
||||||
type: messages.SETTINGS_RELOAD
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
browser.storage.local.get('settings').then((value) => {
|
|
||||||
form.elements['plain-json'].value = value.settings.json;
|
|
||||||
}, console.error);
|
|
||||||
});
|
});
|
||||||
|
|
17
src/reducers/setting.js
Normal file
17
src/reducers/setting.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import actions from '../actions';
|
||||||
|
|
||||||
|
const defaultState = {
|
||||||
|
settings: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default function reducer(state = defaultState, action = {}) {
|
||||||
|
switch (action.type) {
|
||||||
|
case actions.SETTING_SET_SETTINGS:
|
||||||
|
return Object.assign({}, state, {
|
||||||
|
settings: action.settings,
|
||||||
|
});
|
||||||
|
default:
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
22
test/reducers/setting.test.js
Normal file
22
test/reducers/setting.test.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { expect } from "chai";
|
||||||
|
import actions from '../../src/actions';
|
||||||
|
import settingReducer from '../../src/reducers/setting';
|
||||||
|
|
||||||
|
describe("setting reducer", () => {
|
||||||
|
it('return the initial state', () => {
|
||||||
|
let state = settingReducer(undefined, {});
|
||||||
|
expect(state).to.have.deep.property('settings', {});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('return next state for SETTING_SET_SETTINGS', () => {
|
||||||
|
let action = {
|
||||||
|
type: actions.SETTING_SET_SETTINGS,
|
||||||
|
settings: { value1: 'hello', value2: 'world' },
|
||||||
|
};
|
||||||
|
let state = settingReducer(undefined, action);
|
||||||
|
expect(state).to.have.deep.property('settings', {
|
||||||
|
value1: 'hello',
|
||||||
|
value2: 'world',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Reference in a new issue