diff --git a/src/components/designer/components/searchbar.tsx b/src/components/designer/components/searchbar.tsx new file mode 100644 index 00000000..d0e6b7e8 --- /dev/null +++ b/src/components/designer/components/searchbar.tsx @@ -0,0 +1,57 @@ +import { Script } from '@/types/script'; +import { useNode } from '@craftjs/core' + +type SearchbarProps = { + placeholder: string; + script?: Script; +} + +function Searchbar({}: SearchbarProps) { + const { connectors: { connect, drag } } = useNode() + + return ( + // @ts-ignore +
connect(drag(ref!))}> + {/* {}} /> */} +
+ ) +} + +export function SearchbarPreview() { + return ( + <> + // {}} /> + ) +} + +function SearchbarSettings() { + // const { id, actions: { setProp }, placeholder, script } = useNode(node => ({ + // placeholder: node.data.props.placeholder, + // script: node.data.props.script + // })) + + // const localParams = useLocalState(id) + + // const editor = editorState.useValue() + // const versionEdits = useVersionEdits(editor.versionId) + + // const types: SystemType[] = useMemo(() => [ + // versionEdits?.data.defaultCharacterData._type, + // ...(versionEdits?.data.types ?? []) + // ], [versionEdits]) + + return ( + <> + + + ) +} + +Searchbar.craft = { + rules: {}, + related: { + settings: SearchbarSettings + } +} + +export default Searchbar diff --git a/src/components/providers/editor-provider.tsx b/src/components/providers/editor-provider.tsx index 966712fc..0e2ee127 100644 --- a/src/components/providers/editor-provider.tsx +++ b/src/components/providers/editor-provider.tsx @@ -1,5 +1,5 @@ -import { Editor as EditorContext, SerializedNodes } from '@craftjs/core' -import { createContext, useContext, useState, useCallback, ReactNode } from 'react' +import { Editor as EditorContext } from '@craftjs/core' +import { createContext, useContext, useCallback, ReactNode, useRef } from 'react' import Container from '@/components/designer/components/Container/Editor' import EditorSelect from '@/components/designer/components/Select/Editor' @@ -8,7 +8,7 @@ import Text from '@/components/designer/components/Text/Editor' import Input from '@/components/designer/components/Input/Editor' import Separator from '@/components/designer/components/Divider' -type NodeChangeHandler = (query: { serialize: () => SerializedNodes }) => void +type NodeChangeHandler = (lexical: string) => void interface EditorProviderContextType { setOnNodeChange: (handler: NodeChangeHandler | null) => void @@ -60,16 +60,16 @@ interface EditorProviderProps { } export function EditorProvider({ children }: EditorProviderProps) { - const [onNodeChangeHandler, setOnNodeChangeHandler] = useState(null) + const onNodeChangeHandlerRef = useRef(null) const handleNodeChange = useCallback((query: any) => { - if (onNodeChangeHandler) { - onNodeChangeHandler(query) + if (onNodeChangeHandlerRef.current) { + onNodeChangeHandlerRef.current(query.serialize()) } - }, [onNodeChangeHandler]) + }, []) const setOnNodeChange = useCallback((handler: NodeChangeHandler | null) => { - setOnNodeChangeHandler(() => handler) + onNodeChangeHandlerRef.current = handler }, []) return ( diff --git a/src/modals/editors/edit-number/index.tsx b/src/modals/editors/edit-number/index.tsx new file mode 100644 index 00000000..c170ceb1 --- /dev/null +++ b/src/modals/editors/edit-number/index.tsx @@ -0,0 +1,48 @@ +import { Button } from "@/components/ui/button"; +import { Dialog, DialogBody, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog"; +import { Input } from "@/components/ui/input"; +import { closeModal } from "@/state/modals"; +import { useCallback, useState } from "react"; + +interface Props { + id: number; + data: number; + title?: string; + + onSave(newData: number): void; + onDelete?(): void; +} + +export default function EditNumber({ id, data, title = 'Edit number', onSave, onDelete }: Props) { + const [number, setNumber] = useState(data) + + const requestClose = useCallback(() => closeModal(id), [id]) + + return ( + + + + {title} + + + setNumber(v.currentTarget.valueAsNumber)} /> + + + + + + + + + ) +} \ No newline at end of file diff --git a/src/routes/editors/system/editor/index.tsx b/src/routes/editors/system/editor/index.tsx index 1d82f984..b577e723 100644 --- a/src/routes/editors/system/editor/index.tsx +++ b/src/routes/editors/system/editor/index.tsx @@ -26,9 +26,8 @@ const EditorTab: React.FC = ({ versionedResource }) => { useEffect(() => { // Set the node change handler with access to versionedResource - setOnNodeChange((query) => { - const serialized = JSON.stringify(query.serialize()) - storeMutation(versionedResource.local_id, updateLexical(versionedResource.local_id, serialized)) + setOnNodeChange((lexical: string) => { + storeMutation(versionedResource.local_id, updateLexical(versionedResource.local_id, lexical)) }) // Clean up when component unmounts @@ -40,15 +39,16 @@ const EditorTab: React.FC = ({ versionedResource }) => { useEffect(() => { let lexical = (versionedResource.data as any).pages.find((p: PageData) => p.name === editor.characterPage)?.lexical - // @ts-ignore - console.log(versionedResource.data.pages.map(p => p.name)) - console.log(editor.characterPage) - console.log(lexical) - if (!lexical) lexical = defaultLexical - actions.deserialize(lz.decompress(lz.decodeBase64(lexical))) - }, [versionedResource.data.pages, editor.characterPage]) + try { + actions.deserialize(lz.decompress(lz.decodeBase64(lexical))) + } catch (error) { + console.error('Error deserializing lexical:', error) + // Fallback to default if there's an error + actions.deserialize(lz.decompress(lz.decodeBase64(defaultLexical))) + } + }, [editor.characterPage]) return (
diff --git a/src/utils/verse/showModal.tsx b/src/utils/verse/showModal.tsx index e806d27b..debd1750 100644 --- a/src/utils/verse/showModal.tsx +++ b/src/utils/verse/showModal.tsx @@ -1,5 +1,7 @@ import { useScriptTypes } from '@/components/providers/script-types'; +import EditNumber from '@/modals/editors/edit-number'; import EditObject from '@/modals/editors/edit-object'; +import EditString from '@/modals/editors/edit-string'; import { handleCallback, openModal, registerCallback } from '@/state/modals'; import { ReactNode } from 'react' @@ -25,17 +27,17 @@ export default (type: string, title: string, value: any): Promise ) }; break; - // case 'edit_number': - // Comp = ({ id }) => handleCallback(id, 'save', +newNumber)} - // /> - // break; - // case 'edit_string': - // Comp = ({ id }) => handleCallback(id, 'delete', null)} - // onSave={(newString) => handleCallback(id, 'save', newString)} - // /> - // break; + case 'edit_number': + Comp = ({ id }) => handleCallback(id, 'save', newNumber)} + /> + break; + case 'edit_string': + Comp = ({ id }) => handleCallback(id, 'delete', null)} + onSave={(newString) => handleCallback(id, 'save', newString)} + /> + break; } return new Promise((resolve) => {