1- import { useEffect , useState } from 'react' ;
1+ import { useEffect , useRef , useState } from 'react' ;
22import SOCKET_MESSAGE from 'src/constants/socket-message' ;
33import { useCRDT } from 'src/hooks/useCRDT' ;
4+ import useDebounce from 'src/hooks/useDebounce' ;
45import useSelectedMom from 'src/hooks/useSelectedMom' ;
56import useSocketContext from 'src/hooks/useSocketContext' ;
67import { v4 as uuid } from 'uuid' ;
@@ -22,16 +23,18 @@ function Mom() {
2223 remoteDeleteCRDT,
2324 } = useCRDT ( ) ;
2425
25- const onTitleChange : React . FormEventHandler < HTMLHeadingElement > = ( e ) => {
26- /*
27- 제목 변경하는 요청
28- const title = e.target as HTMLHeadingElement;
29- title.innerText
30- OR
31- titleRef.current.innerText
32- */
33- const title = e . target as HTMLHeadingElement ;
34- } ;
26+ const titleRef = useRef < HTMLHeadingElement > ( null ) ;
27+
28+ const onTitleUpdate : React . FormEventHandler < HTMLHeadingElement > = useDebounce (
29+ ( e ) => {
30+ if ( ! titleRef . current ) return ;
31+
32+ const title = titleRef . current . innerText ;
33+
34+ socket . emit ( SOCKET_MESSAGE . MOM . UPDATE_TITLE , title ) ;
35+ } ,
36+ 500 ,
37+ ) ;
3538
3639 const [ blocks , setBlocks ] = useState < string [ ] > ( [ ] ) ;
3740
@@ -80,6 +83,12 @@ function Mom() {
8083 } , [ selectedMom ] ) ;
8184
8285 useEffect ( ( ) => {
86+ socket . on ( SOCKET_MESSAGE . MOM . UPDATE_TITLE , ( title ) => {
87+ if ( ! titleRef . current ) return ;
88+
89+ titleRef . current . innerText = title ;
90+ } ) ;
91+
8392 socket . on ( SOCKET_MESSAGE . MOM . UPDATED , ( ) => setBlocks ( spreadCRDT ( ) ) ) ;
8493
8594 socket . on ( SOCKET_MESSAGE . MOM . INSERT_BLOCK , ( op ) => {
@@ -106,6 +115,7 @@ function Mom() {
106115
107116 return ( ) => {
108117 [
118+ SOCKET_MESSAGE . MOM . UPDATE_TITLE ,
109119 SOCKET_MESSAGE . MOM . UPDATED ,
110120 SOCKET_MESSAGE . MOM . INSERT_BLOCK ,
111121 SOCKET_MESSAGE . MOM . DELETE_BLOCK ,
@@ -123,11 +133,12 @@ function Mom() {
123133 < >
124134 < div className = { style [ 'mom-header' ] } >
125135 < h1
136+ ref = { titleRef }
126137 contentEditable = { true }
127138 suppressContentEditableWarning = { true }
128- onInput = { onTitleChange }
139+ onInput = { onTitleUpdate }
129140 >
130- { selectedMom . name }
141+ { selectedMom . title }
131142 </ h1 >
132143 < span > { new Date ( selectedMom . createdAt ) . toLocaleString ( ) } </ span >
133144 </ div >
0 commit comments