|
1 | | -import usePageStore from "@/store/usePageStore"; |
| 1 | +import { useMemo, useState } from "react"; |
| 2 | +import { EditorInstance } from "novel"; |
| 3 | +import { useDebouncedCallback } from "use-debounce"; |
| 4 | +import { WebsocketProvider } from "y-websocket"; |
| 5 | +import * as Y from "yjs"; |
| 6 | + |
2 | 7 | import Editor from "./editor"; |
| 8 | +import usePageStore from "@/store/usePageStore"; |
3 | 9 | import { |
4 | 10 | usePage, |
5 | 11 | useUpdatePage, |
6 | 12 | useOptimisticUpdatePage, |
7 | 13 | } from "@/hooks/usePages"; |
8 | 14 | import EditorLayout from "./layout/EditorLayout"; |
9 | 15 | import EditorTitle from "./editor/EditorTitle"; |
10 | | -import { EditorInstance } from "novel"; |
11 | | -import { useEffect, useRef, useState } from "react"; |
12 | | -import { useDebouncedCallback } from "use-debounce"; |
13 | | -import { WebsocketProvider } from "y-websocket"; |
14 | | -import * as Y from "yjs"; |
15 | 16 | import SaveStatus from "./editor/ui/SaveStatus"; |
16 | 17 |
|
17 | 18 | export default function EditorView() { |
18 | 19 | const { currentPage } = usePageStore(); |
19 | 20 | const { page, isLoading } = usePage(currentPage); |
20 | | - const [editorKey, setEditorKey] = useState(0); |
21 | 21 | const [saveStatus, setSaveStatus] = useState<"saved" | "unsaved">("saved"); |
22 | 22 |
|
23 | | - const ydoc = useRef<Y.Doc>(); |
24 | | - const provider = useRef<WebsocketProvider>(); |
25 | | - |
26 | | - useEffect(() => { |
27 | | - if (currentPage === null) return; |
28 | | - |
29 | | - if (provider.current) { |
30 | | - provider.current.disconnect(); |
31 | | - provider.current.destroy(); |
32 | | - } |
33 | | - if (ydoc.current) { |
34 | | - ydoc.current.destroy(); |
35 | | - } |
| 23 | + const ydoc = useMemo(() => { |
| 24 | + return new Y.Doc(); |
| 25 | + }, [currentPage]); |
36 | 26 |
|
37 | | - const doc = new Y.Doc(); |
38 | | - const wsProvider = new WebsocketProvider( |
| 27 | + const provider = useMemo(() => { |
| 28 | + return new WebsocketProvider( |
39 | 29 | "ws://localhost:1234", |
40 | 30 | `document-${currentPage}`, |
41 | | - doc, |
| 31 | + ydoc, |
42 | 32 | ); |
43 | | - |
44 | | - ydoc.current = doc; |
45 | | - provider.current = wsProvider; |
46 | | - |
47 | | - setEditorKey((prev) => prev + 1); |
48 | | - |
49 | | - return () => { |
50 | | - wsProvider.disconnect(); |
51 | | - wsProvider.destroy(); |
52 | | - doc.destroy(); |
53 | | - }; |
54 | 33 | }, [currentPage]); |
55 | 34 |
|
56 | 35 | const pageTitle = page?.title ?? "제목없음"; |
@@ -107,18 +86,18 @@ export default function EditorView() { |
107 | 86 | ); |
108 | 87 | } |
109 | 88 |
|
110 | | - if (!ydoc.current || !provider.current) return <div>로딩중</div>; |
| 89 | + if (!ydoc || !provider) return <div>로딩중</div>; |
111 | 90 |
|
112 | 91 | return ( |
113 | 92 | <EditorLayout> |
114 | 93 | <SaveStatus saveStatus={saveStatus} /> |
115 | 94 | <EditorTitle title={pageTitle} onTitleChange={handleTitleChange} /> |
116 | 95 | <Editor |
117 | | - key={editorKey} |
| 96 | + key={ydoc.guid} |
118 | 97 | initialContent={pageContent} |
119 | 98 | pageId={currentPage} |
120 | | - ydoc={ydoc.current} |
121 | | - provider={provider.current} |
| 99 | + ydoc={ydoc} |
| 100 | + provider={provider} |
122 | 101 | onEditorUpdate={handleEditorUpdate} |
123 | 102 | /> |
124 | 103 | </EditorLayout> |
|
0 commit comments