const React = require('react'); const { connect } = require('react-redux'); const { reg } = require('lib/registry.js'); const Setting = require('lib/models/Setting.js'); const { bridge } = require('electron').remote.require('./bridge'); const { Header } = require('./Header.min.js'); const { themeStyle } = require('../theme.js'); const pathUtils = require('lib/path-utils.js'); const { _ } = require('lib/locale.js'); const SyncTargetRegistry = require('lib/SyncTargetRegistry'); const shared = require('lib/components/shared/config-shared.js'); class ConfigScreenComponent extends React.Component { constructor() { super(); shared.init(this); this.checkSyncConfig_ = async () => { await shared.checkSyncConfig(this, this.state.settings); } this.rowStyle_ = { marginBottom: 10, }; } componentWillMount() { this.setState({ settings: this.props.settings }); } keyValueToArray(kv) { let output = []; for (let k in kv) { if (!kv.hasOwnProperty(k)) continue; output.push({ key: k, label: kv[k], }); } return output; } settingToComponent(key, value) { const theme = themeStyle(this.props.theme); let output = null; const rowStyle = this.rowStyle_; const labelStyle = Object.assign({}, theme.textStyle, { display: 'inline-block', marginRight: 10, }); const controlStyle = { display: 'inline-block', }; const descriptionStyle = Object.assign({}, theme.textStyle, { color: theme.colorFaded, marginTop: 5, fontStyle: 'italic', }); const updateSettingValue = (key, value) => { return shared.updateSettingValue(this, key, value); } // Component key needs to be key+value otherwise it doesn't update when the settings change. const md = Setting.settingMetadata(key); const descriptionText = Setting.keyDescription(key, 'desktop'); const descriptionComp = descriptionText ? (
{descriptionText}
) : null; if (md.isEnum) { let items = []; const settingOptions = md.options(); let array = this.keyValueToArray(settingOptions); for (let i = 0; i < array.length; i++) { const e = array[i]; items.push(); } return (
{ descriptionComp }
); } else if (md.type === Setting.TYPE_BOOL) { const onCheckboxClick = (event) => { updateSettingValue(key, !value) } // Hack: The {key+value.toString()} is needed as otherwise the checkbox doesn't update when the state changes. // There's probably a better way to do this but can't figure it out. return (
{ onCheckboxClick(event) }}/> { descriptionComp }
); } else if (md.type === Setting.TYPE_STRING) { const onTextChange = (event) => { updateSettingValue(key, event.target.value); } const inputStyle = Object.assign({}, controlStyle, { width: '50%', minWidth: '20em' }); const inputType = md.secure === true ? 'password' : 'text'; return (
{onTextChange(event)}} /> { descriptionComp }
); } else if (md.type === Setting.TYPE_INT) { const onNumChange = (event) => { updateSettingValue(key, event.target.value); }; return (
{onNumChange(event)}} min={md.minimum} max={md.maximum} step={md.step}/> { descriptionComp }
); } else { console.warn('Type not implemented: ' + key); } return output; } onSaveClick() { shared.saveSettings(this); this.props.dispatch({ type: 'NAV_BACK' }); } onCancelClick() { this.props.dispatch({ type: 'NAV_BACK' }); } render() { const theme = themeStyle(this.props.theme); const style = Object.assign({}, this.props.style, { overflow: 'auto' }); const settings = this.state.settings; const headerStyle = { width: style.width, }; const containerStyle = { padding: 10, }; const buttonStyle = { display: this.state.changedSettingKeys.length ? 'inline-block' : 'none', marginRight: 10, } const settingComps = shared.settingsToComponents(this, 'desktop', settings); const syncTargetMd = SyncTargetRegistry.idToMetadata(settings['sync.target']); if (syncTargetMd.supportsConfigCheck) { const messages = shared.checkSyncConfigMessages(this); const statusStyle = Object.assign({}, theme.textStyle, { marginTop: 10 }); const statusComp = !messages.length ? null : (
{messages[0]} {messages.length >= 1 ? (

{messages[1]}

) : null}
); settingComps.push(
{ statusComp }
); } return (
{_('Notes and settings are stored in: %s', pathUtils.toSystemSlashes(Setting.value('profileDir'), process.platform))}
{ settingComps }
); } } const mapStateToProps = (state) => { return { theme: state.settings.theme, settings: state.settings, locale: state.settings.locale, }; }; const ConfigScreen = connect(mapStateToProps)(ConfigScreenComponent); module.exports = { ConfigScreen };