diff options
author | Shin'ya Ueoka <ueokande@i-beam.org> | 2019-04-30 14:00:07 +0900 |
---|---|---|
committer | Shin'ya Ueoka <ueokande@i-beam.org> | 2019-05-02 11:14:19 +0900 |
commit | c60d0e7392fc708e961614d6b756a045de74f458 (patch) | |
tree | 0b9a5fce1879e38a92d5dbb2915779aee0ad22d6 /src/settings/components/index.tsx | |
parent | 257162e5b6b4993e1dff0d705ffa6f0d809033eb (diff) |
Rename .js/.jsx to .ts/.tsx
Diffstat (limited to 'src/settings/components/index.tsx')
-rw-r--r-- | src/settings/components/index.tsx | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/settings/components/index.tsx b/src/settings/components/index.tsx new file mode 100644 index 0000000..4ef59d7 --- /dev/null +++ b/src/settings/components/index.tsx @@ -0,0 +1,153 @@ +import './site.scss'; +import React from 'react'; +import { connect } from 'react-redux'; +import Input from './ui/Input'; +import SearchForm from './form/SearchForm'; +import KeymapsForm from './form/KeymapsForm'; +import BlacklistForm from './form/BlacklistForm'; +import PropertiesForm from './form/PropertiesForm'; +import * as properties from 'shared/settings/properties'; +import * as settingActions from 'settings/actions/setting'; + +const DO_YOU_WANT_TO_CONTINUE = + 'Some settings in JSON can be lost when migrating. ' + + 'Do you want to continue?'; + +class SettingsComponent extends React.Component { + componentDidMount() { + this.props.dispatch(settingActions.load()); + } + + renderFormFields(form) { + return <div> + <fieldset> + <legend>Keybindings</legend> + <KeymapsForm + value={form.keymaps} + onChange={value => this.bindForm('keymaps', value)} + onBlur={this.save.bind(this)} + /> + </fieldset> + <fieldset> + <legend>Search Engines</legend> + <SearchForm + value={form.search} + onChange={value => this.bindForm('search', value)} + onBlur={this.save.bind(this)} + /> + </fieldset> + <fieldset> + <legend>Blacklist</legend> + <BlacklistForm + value={form.blacklist} + onChange={value => this.bindForm('blacklist', value)} + onBlur={this.save.bind(this)} + /> + </fieldset> + <fieldset> + <legend>Properties</legend> + <PropertiesForm + types={properties.types} + value={form.properties} + onChange={value => this.bindForm('properties', value)} + onBlur={this.save.bind(this)} + /> + </fieldset> + </div>; + } + + renderJsonFields(json, error) { + return <div> + <Input + type='textarea' + name='json' + label='Plain JSON' + spellCheck='false' + error={error} + onChange={this.bindJson.bind(this)} + onBlur={this.save.bind(this)} + value={json} + /> + </div>; + } + + render() { + let fields = null; + let disabled = this.props.error.length > 0; + if (this.props.source === 'form') { + fields = this.renderFormFields(this.props.form); + } else if (this.props.source === 'json') { + fields = this.renderJsonFields(this.props.json, this.props.error); + } + return ( + <div> + <h1>Configure Vim-Vixen</h1> + <form className='vimvixen-settings-form'> + <Input + type='radio' + id='setting-source-form' + name='source' + label='Use form' + checked={this.props.source === 'form'} + value='form' + onChange={this.bindSource.bind(this)} + disabled={disabled} /> + + <Input + type='radio' + name='source' + label='Use plain JSON' + checked={this.props.source === 'json'} + value='json' + onChange={this.bindSource.bind(this)} + disabled={disabled} /> + { fields } + </form> + </div> + ); + } + + bindForm(name, value) { + let settings = { + source: this.props.source, + json: this.props.json, + form: { ...this.props.form }, + }; + settings.form[name] = value; + this.props.dispatch(settingActions.set(settings)); + } + + bindJson(e) { + let settings = { + source: this.props.source, + json: e.target.value, + form: this.props.form, + }; + this.props.dispatch(settingActions.set(settings)); + } + + bindSource(e) { + let from = this.props.source; + let to = e.target.value; + + if (from === 'form' && to === 'json') { + this.props.dispatch(settingActions.switchToJson(this.props.form)); + } else if (from === 'json' && to === 'form') { + let b = window.confirm(DO_YOU_WANT_TO_CONTINUE); + if (!b) { + this.forceUpdate(); + return; + } + this.props.dispatch(settingActions.switchToForm(this.props.json)); + } + } + + save() { + let settings = this.props.store.getState(); + this.props.dispatch(settingActions.save(settings)); + } +} + +const mapStateToProps = state => state; + +export default connect(mapStateToProps)(SettingsComponent); |