11import './style/floater.css'
22
3- import React , { useMemo , useRef } from 'react'
3+ import React , { useEffect , useMemo , useRef , useState } from 'react'
44
55import { useEditorState , useEditorView } from './EditorProvider'
66
77export const Floater : React . FC = ( { children } ) => {
88 const view = useEditorView ( )
99 const state = useEditorState ( )
10+ const [ needsUpdate , setNeedsUpdate ] = useState ( Date . now ( ) )
11+
12+ // trigger redraw on resize and scroll events
13+ useEffect ( ( ) => {
14+ let handle : number
15+
16+ const handleEvent = ( ) => {
17+ if ( handle ) {
18+ window . clearTimeout ( handle )
19+ }
20+
21+ handle = window . setTimeout ( ( ) => {
22+ setNeedsUpdate ( Date . now ( ) )
23+ } , 50 )
24+ }
25+
26+ window . addEventListener ( 'resize' , handleEvent )
27+ window . addEventListener ( 'scroll' , handleEvent )
28+
29+ return ( ) => {
30+ window . removeEventListener ( 'resize' , handleEvent )
31+ window . removeEventListener ( 'scroll' , handleEvent )
32+ }
33+ } , [ ] )
1034
1135 const menuRef = useRef < HTMLDivElement > ( null )
1236
@@ -26,7 +50,8 @@ export const Floater: React.FC = ({ children }) => {
2650 : coords . left ,
2751 top : coords . top - 30 > 0 ? coords . top - 30 : coords . top + 30 ,
2852 }
29- } , [ menuRef , state , view ] )
53+ // eslint-disable-next-line react-hooks/exhaustive-deps
54+ } , [ menuRef , state , view , needsUpdate ] )
3055
3156 return (
3257 < div ref = { menuRef } className = "prosemirror-floater" style = { style } >
0 commit comments