@@ -4,9 +4,10 @@ import { jsx, css } from '@emotion/react';
44
55import { useRecoilState , useSetRecoilState } from 'recoil' ;
66import { pagesState , pageState } from '@/stores' ;
7- import { ChangeEvent , useEffect , useRef } from 'react' ;
7+ import { ChangeEvent , useRef } from 'react' ;
88import { debounce , refreshPages , updatePage } from '@/utils' ;
99import { Page } from '@/schemes' ;
10+ import { useManager } from '@/hooks' ;
1011
1112const wrapperCss = ( ) => css `
1213 padding-left : calc (96px + env (safe-area-inset-left));
@@ -49,27 +50,22 @@ const titleCss = () => css`
4950function Title ( ) : JSX . Element {
5051 const [ selectedPage , setSelectedPage ] = useRecoilState ( pageState ) ;
5152 const setPages = useSetRecoilState ( pagesState ) ;
52- const caretRef = useRef ( 0 ) ;
53+ const [ , { setCaretOffset } ] = useManager ( selectedPage . rootId ) ;
5354 const updateSelectedPage = useRef (
5455 debounce ( async ( page : Page ) => {
55- caretRef . current = window . getSelection ( ) . focusOffset ;
56-
5756 const { page : updatedPage } = await updatePage ( page ) ;
5857 const updatedPages = await refreshPages ( ) ;
58+ const { focusOffset } = window . getSelection ( ) ;
59+ setTimeout ( ( ) => {
60+ setCaretOffset ( focusOffset ) ;
61+ } ) ;
62+ titleRef . current . blur ( ) ;
5963
6064 setSelectedPage ( updatedPage ) ;
6165 setPages ( updatedPages ) ;
6266 } , 300 ) ,
6367 ) . current ;
64-
65- useEffect ( ( ) => {
66- const selection = window . getSelection ( ) ;
67- const nodeLength = selection . focusNode ?. nodeValue ?. length ?? 0 ;
68- if ( caretRef . current > nodeLength ) {
69- caretRef . current = nodeLength ;
70- }
71- selection . collapse ( selection . focusNode , caretRef . current ) ;
72- } , [ selectedPage ] ) ;
68+ const titleRef = useRef ( null ) ;
7369
7470 const handleChange = async ( event : ChangeEvent < HTMLDivElement > ) =>
7571 updateSelectedPage ( {
@@ -81,6 +77,7 @@ function Title(): JSX.Element {
8177 < div css = { wrapperCss ( ) } >
8278 < div css = { titlePaddingTopCss ( ) } />
8379 < div
80+ ref = { titleRef }
8481 contentEditable
8582 suppressContentEditableWarning
8683 css = { titleCss ( ) }
0 commit comments