1- import { useMemo , useState } from "react" ;
1+ import { useEffect , useState } from "react" ;
22import { EditorInstance } from "novel" ;
33import { useDebouncedCallback } from "use-debounce" ;
44import * as Y from "yjs" ;
@@ -15,16 +15,23 @@ export default function EditorView() {
1515 const { currentPage } = usePageStore ( ) ;
1616 const { page, isLoading } = usePage ( currentPage ) ;
1717 const [ saveStatus , setSaveStatus ] = useState < "saved" | "unsaved" > ( "saved" ) ;
18+ const [ ydoc , setYDoc ] = useState < Y . Doc | null > ( null ) ;
19+ const [ provider , setProvider ] = useState < SocketIOProvider | null > ( null ) ;
1820
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+ }
2227
23- const provider = useMemo ( ( ) => {
24- return new SocketIOProvider (
28+ const doc = new Y . Doc ( ) ;
29+ setYDoc ( doc ) ;
30+
31+ const wsProvider = new SocketIOProvider (
2532 import . meta. env . VITE_WS_URL ,
2633 `document-${ currentPage } ` ,
27- ydoc ,
34+ doc ,
2835 {
2936 autoConnect : true ,
3037 disableBc : false ,
@@ -35,32 +42,18 @@ export default function EditorView() {
3542 transports : [ "websocket" , "polling" ] ,
3643 } ,
3744 ) ;
45+
46+ setProvider ( wsProvider ) ;
47+
48+ return ( ) => {
49+ wsProvider . disconnect ( ) ;
50+ } ;
3851 } , [ currentPage ] ) ;
3952
4053 const pageTitle = page ?. title ?? "제목없음" ;
4154 const pageContent = page ?. content ?? { } ;
4255
4356 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-
6457 const handleEditorUpdate = useDebouncedCallback (
6558 async ( { editor } : { editor : EditorInstance } ) => {
6659 if ( currentPage === null ) {
0 commit comments