import { ReactNode, ComponentProps, PropsWithChildren, useMemo } from 'react'; import { JSONSchema7 } from 'json-schema'; import { CodeEditor } from '@@/CodeEditor'; import { FormSectionTitle } from './form-components/FormSectionTitle'; import { FormError } from './form-components/FormError'; import { usePreventFormExit } from './form-components/usePreventFormExit'; import { confirmWebEditorDiscard } from './modals/confirm'; import { ShortcutsTooltip } from './CodeEditor/ShortcutsTooltip'; type CodeEditorProps = ComponentProps; interface Props extends CodeEditorProps { titleContent?: ReactNode; hideTitle?: boolean; error?: string; schema?: JSONSchema7; } export function WebEditorForm({ id, titleContent = 'Web editor', hideTitle, children, error, schema, textTip, ...props }: PropsWithChildren) { return (
{!hideTitle && ( {titleContent ?? null} )} {children && (
{children}
)} {error && {error}}
); } function DefaultTitle({ id, children }: { id: string; children?: ReactNode }) { return ( {children} ); } export function usePreventExit( initialValue: string, value: string, check: boolean ) { const isChanged = useMemo( () => cleanText(initialValue) !== cleanText(value), [initialValue, value] ); usePreventFormExit(() => isChanged, check, confirmWebEditorDiscard); } function cleanText(value: string) { return value.replace(/(\r\n|\n|\r)/gm, ''); }