aboutsummaryrefslogtreecommitdiff
path: root/src/settings/components/setting.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/settings/components/setting.js')
-rw-r--r--src/settings/components/setting.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/settings/components/setting.js b/src/settings/components/setting.js
new file mode 100644
index 0000000..14482a3
--- /dev/null
+++ b/src/settings/components/setting.js
@@ -0,0 +1,45 @@
+import * as settingActions from 'settings/actions/setting';
+import { validate } from 'shared/validators/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));
+
+ let plainJson = form.elements['plain-json'];
+ plainJson.addEventListener('input', this.onPlainJsonChanged.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();
+ }
+
+ onPlainJsonChanged(e) {
+ try {
+ let settings = JSON.parse(e.target.value);
+ validate(settings);
+ e.target.setCustomValidity('');
+ } catch (err) {
+ e.target.setCustomValidity(err.message);
+ }
+ }
+
+ 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;
+ }
+}