1
- import { useMemo , useState } from "react" ;
1
+ import { useEffect , useState } from "react" ;
2
2
import { EditorInstance } from "novel" ;
3
3
import { useDebouncedCallback } from "use-debounce" ;
4
4
import * as Y from "yjs" ;
@@ -15,16 +15,23 @@ export default function EditorView() {
15
15
const { currentPage } = usePageStore ( ) ;
16
16
const { page, isLoading } = usePage ( currentPage ) ;
17
17
const [ saveStatus , setSaveStatus ] = useState < "saved" | "unsaved" > ( "saved" ) ;
18
+ const [ ydoc , setYDoc ] = useState < Y . Doc | null > ( null ) ;
19
+ const [ provider , setProvider ] = useState < SocketIOProvider | null > ( null ) ;
18
20
19
- const ydoc = useMemo ( ( ) => {
20
- return new Y . Doc ( ) ;
21
- } , [ currentPage ] ) ;
21
+ useEffect ( ( ) => {
22
+ if ( ! currentPage ) return ;
23
+
24
+ if ( provider ) {
25
+ provider . disconnect ( ) ;
26
+ }
22
27
23
- const provider = useMemo ( ( ) => {
24
- return new SocketIOProvider (
28
+ const doc = new Y . Doc ( ) ;
29
+ setYDoc ( doc ) ;
30
+
31
+ const wsProvider = new SocketIOProvider (
25
32
import . meta. env . VITE_WS_URL ,
26
33
`document-${ currentPage } ` ,
27
- ydoc ,
34
+ doc ,
28
35
{
29
36
autoConnect : true ,
30
37
disableBc : false ,
@@ -35,32 +42,18 @@ export default function EditorView() {
35
42
transports : [ "websocket" , "polling" ] ,
36
43
} ,
37
44
) ;
45
+
46
+ setProvider ( wsProvider ) ;
47
+
48
+ return ( ) => {
49
+ wsProvider . disconnect ( ) ;
50
+ } ;
38
51
} , [ currentPage ] ) ;
39
52
40
53
const pageTitle = page ?. title ?? "제목없음" ;
41
54
const pageContent = page ?. content ?? { } ;
42
55
43
56
const updatePageMutation = useUpdatePage ( ) ;
44
- /* const optimisticUpdatePageMutation = useOptimisticUpdatePage({
45
- id: currentPage ?? 0,
46
- });
47
-
48
- const handleTitleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
49
- if (currentPage === null) return;
50
-
51
- setSaveStatus("unsaved");
52
-
53
- optimisticUpdatePageMutation.mutate(
54
- {
55
- pageData: { title: e.target.value, content: pageContent },
56
- },
57
- {
58
- onSuccess: () => setSaveStatus("saved"),
59
- onError: () => setSaveStatus("unsaved"),
60
- },
61
- );
62
- }; */
63
-
64
57
const handleEditorUpdate = useDebouncedCallback (
65
58
async ( { editor } : { editor : EditorInstance } ) => {
66
59
if ( currentPage === null ) {
0 commit comments