import './site.scss'; import { h, Component } from 'preact'; import Input from './ui/input'; import SearchEngineForm from './form/search-engine-form'; import KeymapsForm from './form/keymaps-form'; import * as settingActions from 'settings/actions/setting'; import * as validator from 'shared/validators/setting'; class SettingsComponent extends Component { constructor(props, context) { super(props, context); this.state = { settings: { json: '', }, errors: { json: '', } }; this.context.store.subscribe(this.stateChanged.bind(this)); } componentDidMount() { this.context.store.dispatch(settingActions.load()); } stateChanged() { let settings = this.context.store.getState(); this.setState({ settings: { source: settings.source, json: settings.json, form: settings.form, } }); } renderFormFields() { return
Keybindings
Search Engines
; } renderJsonFields() { return
; } render() { let fields = null; if (this.state.settings.source === 'form') { fields = this.renderFormFields(); } else if (this.state.settings.source === 'json') { fields = this.renderJsonFields(); } return (

Configure Vim-Vixen

{ fields }
); } validate(target) { if (target.name === 'json') { let settings = JSON.parse(target.value); validator.validate(settings); } } bindSearchForm(value) { let next = Object.assign({}, this.state); next.settings.form.search = value; this.setState(next); this.context.store.dispatch(settingActions.save(next.settings)); } bindKeymapsForm(value) { let next = Object.assign({}, this.state); next.settings.form.keymaps = value; this.setState(next); this.context.store.dispatch(settingActions.save(next.settings)); } bindValue(e) { let next = Object.assign({}, this.state); next.errors.json = ''; try { this.validate(e.target); } catch (err) { next.errors.json = err.message; } next.settings[e.target.name] = e.target.value; this.setState(next); this.context.store.dispatch(settingActions.save(next.settings)); } } export default SettingsComponent;