import { ActionIcon, ScrollArea } from '@mantine/core'; import { useDebouncedValue } from '@mantine/hooks'; import { Link, RichTextEditor } from '@mantine/tiptap'; import { IconEdit, IconEditOff } from '@tabler/icons-react'; import { BubbleMenu, useEditor } from '@tiptap/react'; import StarterKit from '@tiptap/starter-kit'; import { useState } from 'react'; import { useConfigStore } from '~/config/store'; import { useColorTheme } from '~/tools/color'; import { api } from '~/utils/api'; import { useEditModeStore } from '../../components/Dashboard/Views/useEditModeStore'; import { useConfigContext } from '../../config/provider'; import { WidgetLoading } from '../loading'; import { INotebookWidget } from './NotebookWidgetTile'; Link.configure({ openOnClick: true, }); export function Editor({ widget }: { widget: INotebookWidget }) { const [content, setContent] = useState(widget.properties.content); const { enabled } = useEditModeStore(); const [isEditing, setIsEditing] = useState(false); const { config, name: configName } = useConfigContext(); const updateConfig = useConfigStore((x) => x.updateConfig); const { primaryColor } = useColorTheme(); const { mutateAsync } = api.notebook.update.useMutation(); const [debouncedContent] = useDebouncedValue(content, 500); const editor = useEditor({ extensions: [StarterKit, Link], content, editable: false, onUpdate: (e) => { setContent(e.editor.getHTML()); }, }); const handleEditToggle = (previous: boolean) => { const current = !previous; if (!editor) return current; editor.setEditable(current); updateConfig( configName!, (previous) => { const currentWidget = previous.widgets.find((x) => x.id === widget.id); currentWidget!.properties.content = debouncedContent; return { ...previous, widgets: [ ...previous.widgets.filter((iterationWidget) => iterationWidget.id !== widget.id), currentWidget!, ], }; }, true ); void mutateAsync({ configName: configName!, content: debouncedContent, widgetId: widget.id, }); return current; }; if (!config || !configName) return ; return ( <> ({ root: { '& .ProseMirror': { padding: '0 !important', }, backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[6] : 'white', border: 'none', borderRadius: '0.5rem', display: 'flex', flexDirection: 'column', }, toolbar: { backgroundColor: 'transparent', padding: '0.5rem', }, content: { backgroundColor: 'transparent', padding: '0.5rem', }, })} > {editor && ( )} {!enabled && ( setIsEditing(handleEditToggle)} > {isEditing ? : } )} ); }