import { Button, Tabs } from '@mantine/core'; import { Allotment } from 'allotment'; import { ContextMenuProvider } from 'mantine-contextmenu'; import React from 'react'; import { useSelector, useStore } from 'react-redux'; import { confirm } from 'vj/components/dialog/index'; import { i18n } from 'vj/utils'; import ProblemConfigEditor from './ProblemConfigEditor'; import ProblemConfigForm from './ProblemConfigForm'; import { ProblemConfigTree } from './ProblemConfigTree'; import { RootState } from './reducer'; interface Props { onSave: () => void; } export default function ProblemConfig(props: Props) { const [selected, setSelected] = React.useState('basic'); const [container, setContainer] = React.useState(null); const [tabs, setTabs] = React.useState(null); const [editor, setEditor] = React.useState(null); const store = useStore(); const valid = useSelector((state: RootState) => state.config.__valid); const errors = useSelector((state: RootState) => state.config.__errors, (a, b) => JSON.stringify(a) === JSON.stringify(b)); const handleSave = React.useCallback(async () => { if (valid) props.onSave(); else if (await confirm(i18n('Errors detected in the config. Confirm save?'))) props.onSave(); }, [valid, props.onSave]); React.useEffect(() => { if (!container) return () => { }; container.style.height ||= '600px'; const callback = () => { setTimeout(() => { const target = Math.max(container.clientHeight, tabs?.clientHeight || 0); container.style.height = `${target}px`; if (editor) editor.layout(); }, 50); }; const dispose = store.subscribe(callback); window.addEventListener('resize', callback); return () => { dispose(); window.removeEventListener('resize', callback); }; }, [container, tabs, store]); return
(t !== 'errors' && t && setSelected(t.toString()))} >
{i18n('Basic')} {i18n('Subtasks')} {errors.length ? `Errors(${errors.length})` : 'No Errors'}
{errors.map((i) => (
{i}
))}
; }