import React, { memo, useCallback, useMemo, useState, } from 'react'; import { useTranslation } from 'next-i18next'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, } from 'reactstrap'; import { useIsIndentSizeForced } from '~/stores/context'; import { useEditorSettings, useCurrentIndentSize } from '~/stores/editor'; import { DEFAULT_THEME, KeyMapMode } from '../../interfaces/editor-settings'; const AVAILABLE_THEMES = [ 'DefaultLight', 'Eclipse', 'Basic', 'Ayu', 'Rosé Pine', 'DefaultDark', 'Material', 'Nord', 'Cobalt', 'Kimbie', ]; const TYPICAL_INDENT_SIZE = [2, 4]; const ThemeSelector = (): JSX.Element => { const [isThemeMenuOpened, setIsThemeMenuOpened] = useState(false); const { data: editorSettings, update } = useEditorSettings(); const menuItems = useMemo(() => ( <> { AVAILABLE_THEMES.map((theme) => { return ( update({ theme })}> {theme} ); }) } ), [update]); const selectedTheme = editorSettings?.theme ?? DEFAULT_THEME; return (
Theme
setIsThemeMenuOpened(!isThemeMenuOpened)} > {selectedTheme} {menuItems}
); }; type KeyMapModeToLabel = { [key in KeyMapMode]: string; } const KEYMAP_LABEL_MAP: KeyMapModeToLabel = { default: 'Default', vim: 'Vim', emacs: 'Emacs', sublime: 'Sublime Text', }; const KeymapSelector = memo((): JSX.Element => { const [isKeyMenuOpened, setIsKeyMenuOpened] = useState(false); const { data: editorSettings, update } = useEditorSettings(); const menuItems = useMemo(() => ( <> { (Object.keys(KEYMAP_LABEL_MAP) as KeyMapMode[]).map((keymapMode) => { const keymapLabel = KEYMAP_LABEL_MAP[keymapMode]; const icon = (keymapMode !== 'default') ? : null; return ( update({ keymapMode })}> {icon}{keymapLabel} ); }) } ), [update]); const selectedKeymapMode = editorSettings?.keymapMode ?? 'default'; return (
Keymap setIsKeyMenuOpened(!isKeyMenuOpened)} > {selectedKeymapMode} {menuItems}
); }); KeymapSelector.displayName = 'KeymapSelector'; type IndentSizeSelectorProps = { isIndentSizeForced: boolean, selectedIndentSize: number, onChange: (indentSize: number) => void, } const IndentSizeSelector = memo(({ isIndentSizeForced, selectedIndentSize, onChange }: IndentSizeSelectorProps): JSX.Element => { const [isIndentMenuOpened, setIsIndentMenuOpened] = useState(false); const menuItems = useMemo(() => ( <> { TYPICAL_INDENT_SIZE.map((indent) => { return ( onChange(indent)}> {indent} ); }) } ), [onChange]); return (
Indent setIsIndentMenuOpened(!isIndentMenuOpened)} disabled={isIndentSizeForced} > {selectedIndentSize} {menuItems}
); }); IndentSizeSelector.displayName = 'IndentSizeSelector'; const ConfigurationDropdown = memo((): JSX.Element => { const { t } = useTranslation(); const [isCddMenuOpened, setCddMenuOpened] = useState(false); const { data: editorSettings, update } = useEditorSettings(); const renderActiveLineMenuItem = useCallback(() => { if (editorSettings == null) { return <>; } const isActive = editorSettings.styleActiveLine; const iconClasses = ['text-info']; if (isActive) { iconClasses.push('ti ti-check'); } const iconClassName = iconClasses.join(' '); return ( update({ styleActiveLine: !isActive })}>
{ t('page_edit.Show active line') }
); }, [editorSettings, update, t]); const renderMarkdownTableAutoFormattingMenuItem = useCallback(() => { if (editorSettings == null) { return <>; } const isActive = editorSettings.autoFormatMarkdownTable; const iconClasses = ['text-info']; if (isActive) { iconClasses.push('ti ti-check'); } const iconClassName = iconClasses.join(' '); return ( update({ autoFormatMarkdownTable: !isActive })}>
{ t('page_edit.auto_format_table') }
); }, [editorSettings, t, update]); return (
setCddMenuOpened(!isCddMenuOpened)} > {renderActiveLineMenuItem()} {renderMarkdownTableAutoFormattingMenuItem()} {/* */}
); }); ConfigurationDropdown.displayName = 'ConfigurationDropdown'; export const OptionsSelector = (): JSX.Element => { const { data: editorSettings } = useEditorSettings(); const { data: isIndentSizeForced } = useIsIndentSizeForced(); const { data: currentIndentSize, mutate: mutateCurrentIndentSize } = useCurrentIndentSize(); if (editorSettings == null || isIndentSizeForced == null || currentIndentSize == null) { return <>; } return ( <>
mutateCurrentIndentSize(newValue)} />
); };