"use client" import React, { useCallback, useRef, useEffect } from "react" import { LAEditor, LAEditorRef } from "@/components/la-editor" // import { DetailPageHeader } from "./header" //dont need. check figma import { ID } from "jazz-tools" import { PersonalPage } from "@/lib/schema/personal-page" import { Content, EditorContent, useEditor } from "@tiptap/react" import { StarterKit } from "@/components/la-editor/extensions/starter-kit" import { Paragraph } from "@/components/la-editor/extensions/paragraph" import { useAccount, useCoState } from "@/lib/providers/jazz-provider" import { toast } from "sonner" import { EditorView } from "prosemirror-view" import { Editor } from "@tiptap/core" import { generateUniqueSlug } from "@/lib/utils" const TITLE_PLACEHOLDER = "Page title" export function DetailPageWrapper({ pageId }: { pageId: string }) { const page = useCoState(PersonalPage, pageId as ID) if (!page) return
Loading...
return (
{/* } /> */}
) } const DetailPageForm = ({ page }: { page: PersonalPage }) => { const { me } = useAccount() const titleEditorRef = useRef(null) const contentEditorRef = useRef(null) const updatePageContent = (content: Content, model: PersonalPage) => { model.content = content } const handleTitleBlur = (editor: Editor) => { const newTitle = editor.getText().trim() if (!newTitle) { toast.error("Update failed", { description: "Title must be longer than or equal to 1 character" }) editor.commands.setContent(page.title) return } if (newTitle === page.title) return const personalPages = me.root?.personalPages?.toJSON() || [] const slug = generateUniqueSlug(personalPages, page.slug) const capitalizedTitle = newTitle.charAt(0).toUpperCase() + newTitle.slice(1) page.title = capitalizedTitle page.slug = slug editor.commands.setContent(capitalizedTitle) } const handleTitleKeyDown = useCallback((view: EditorView, event: KeyboardEvent) => { const editor = titleEditorRef.current if (!editor) return false const { state } = editor const { selection } = state const { $anchor } = selection switch (event.key) { case "ArrowRight": case "ArrowDown": if ($anchor.pos === state.doc.content.size - 1) { event.preventDefault() contentEditorRef.current?.editor?.commands.focus("start") return true } break case "Enter": if (!event.shiftKey) { event.preventDefault() contentEditorRef.current?.editor?.commands.focus("start") return true } break } return false }, []) const handleContentKeyDown = useCallback((view: EditorView, event: KeyboardEvent) => { const editor = contentEditorRef.current?.editor if (!editor) return false const { state } = editor const { selection } = state const { $anchor } = selection if ((event.key === "ArrowLeft" || event.key === "ArrowUp") && $anchor.pos - 1 === 0) { event.preventDefault() titleEditorRef.current?.commands.focus("end") return true } return false }, []) const titleEditor = useEditor({ immediatelyRender: false, extensions: [ Paragraph, StarterKit.configure({ bold: false, italic: false, typography: false, hardBreak: false, listItem: false, strike: false, focus: false, gapcursor: false, history: false, placeholder: { placeholder: TITLE_PLACEHOLDER } }) ], editorProps: { attributes: { spellcheck: "true", role: "textbox", "aria-readonly": "false", "aria-multiline": "false", "aria-label": TITLE_PLACEHOLDER, translate: "no" }, handleKeyDown: handleTitleKeyDown }, onCreate: ({ editor }) => { const capitalizedTitle = page.title.charAt(0).toUpperCase() + page.title.slice(1) editor.commands.setContent(`

${capitalizedTitle}

`) }, onBlur: ({ editor }) => handleTitleBlur(editor) }) useEffect(() => { if (titleEditor) { titleEditorRef.current = titleEditor } }, [titleEditor]) return (
updatePageContent(c, page)} handleKeyDown={handleContentKeyDown} onBlur={c => updatePageContent(c, page)} onNewBlock={c => updatePageContent(c, page)} />
) }