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)}
/>
>
);
};