import React from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, } from 'reactstrap'; import { withUnstatedContainers } from '../UnstatedUtils'; import AppContainer from '~/client/services/AppContainer'; import EditorContainer from '~/client/services/EditorContainer'; import { toastError } from '~/client/util/apiNotification'; export const defaultEditorOptions = { theme: 'elegant', keymapMode: 'default', styleActiveLine: false, }; export const defaultPreviewOptions = { renderMathJaxInRealtime: false, }; class OptionsSelector extends React.Component { constructor(props) { super(props); const config = this.props.appContainer.getConfig(); const isMathJaxEnabled = !!config.env.MATHJAX; this.state = { isCddMenuOpened: false, isMathJaxEnabled, }; this.availableThemes = [ 'eclipse', 'elegant', 'neo', 'mdn-like', 'material', 'dracula', 'monokai', 'twilight', ]; this.keymapModes = { default: 'Default', vim: 'Vim', emacs: 'Emacs', sublime: 'Sublime Text', }; this.typicalIndentSizes = [2, 4]; this.onChangeTheme = this.onChangeTheme.bind(this); this.onChangeKeymapMode = this.onChangeKeymapMode.bind(this); this.onClickStyleActiveLine = this.onClickStyleActiveLine.bind(this); this.onClickRenderMathJaxInRealtime = this.onClickRenderMathJaxInRealtime.bind(this); this.onClickMarkdownTableAutoFormatting = this.onClickMarkdownTableAutoFormatting.bind(this); this.switchTextlintEnabledHandler = this.switchTextlintEnabledHandler.bind(this); this.updateIsTextlintEnabledToDB = this.updateIsTextlintEnabledToDB.bind(this); this.onToggleConfigurationDropdown = this.onToggleConfigurationDropdown.bind(this); this.onChangeIndentSize = this.onChangeIndentSize.bind(this); } onChangeTheme(newValue) { const { editorContainer } = this.props; const newOpts = Object.assign(editorContainer.state.editorOptions, { theme: newValue }); editorContainer.setState({ editorOptions: newOpts }); // save to localStorage editorContainer.saveOptsToLocalStorage(); } onChangeKeymapMode(newValue) { const { editorContainer } = this.props; const newOpts = Object.assign(editorContainer.state.editorOptions, { keymapMode: newValue }); editorContainer.setState({ editorOptions: newOpts }); // save to localStorage editorContainer.saveOptsToLocalStorage(); } onClickStyleActiveLine(event) { const { editorContainer } = this.props; // keep dropdown opened this._cddForceOpen = true; const newValue = !editorContainer.state.editorOptions.styleActiveLine; const newOpts = Object.assign(editorContainer.state.editorOptions, { styleActiveLine: newValue }); editorContainer.setState({ editorOptions: newOpts }); // save to localStorage editorContainer.saveOptsToLocalStorage(); } onClickRenderMathJaxInRealtime(event) { const { editorContainer } = this.props; const newValue = !editorContainer.state.previewOptions.renderMathJaxInRealtime; const newOpts = Object.assign(editorContainer.state.previewOptions, { renderMathJaxInRealtime: newValue }); editorContainer.setState({ previewOptions: newOpts }); // save to localStorage editorContainer.saveOptsToLocalStorage(); } onClickMarkdownTableAutoFormatting(event) { const { editorContainer } = this.props; const newValue = !editorContainer.state.editorOptions.ignoreMarkdownTableAutoFormatting; const newOpts = Object.assign(editorContainer.state.editorOptions, { ignoreMarkdownTableAutoFormatting: newValue }); editorContainer.setState({ editorOptions: newOpts }); // save to localStorage editorContainer.saveOptsToLocalStorage(); } async updateIsTextlintEnabledToDB(newVal) { const { appContainer } = this.props; try { await appContainer.apiv3Put('/personal-setting/editor-settings', { textlintSettings: { isTextlintEnabled: newVal } }); } catch (err) { toastError(err); } } async switchTextlintEnabledHandler() { const { editorContainer } = this.props; const newVal = !editorContainer.state.isTextlintEnabled; editorContainer.setState({ isTextlintEnabled: newVal }); this.updateIsTextlintEnabledToDB(newVal); } onToggleConfigurationDropdown(newValue) { this.setState({ isCddMenuOpened: !this.state.isCddMenuOpened }); } onChangeIndentSize(newValue) { const { editorContainer } = this.props; editorContainer.setState({ indentSize: newValue }); } renderThemeSelector() { const { editorContainer } = this.props; const selectedTheme = editorContainer.state.editorOptions.theme; const menuItems = this.availableThemes.map((theme) => { return ; }); return (