import { useEffect, useCallback, useRef } from 'react'; export function cursorPositionToTextOffset(cursorPos: any, body: string) { if (!body) return 0; const noteLines = body.split('\n'); let pos = 0; for (let i = 0; i < noteLines.length; i++) { if (i > 0) pos++; // Need to add the newline that's been removed in the split() call above if (i === cursorPos.line) { pos += cursorPos.ch; break; } else { pos += noteLines[i].length; } } return pos; } export function usePrevious(value: any): any { const ref = useRef(); useEffect(() => { ref.current = value; }); return ref.current; } export function useScrollHandler(editorRef: any, webviewRef: any, onScroll: Function) { const ignoreNextEditorScrollEvent_ = useRef(false); const scrollTimeoutId_ = useRef(null); const scheduleOnScroll = useCallback((event: any) => { if (scrollTimeoutId_.current) { clearTimeout(scrollTimeoutId_.current); scrollTimeoutId_.current = null; } scrollTimeoutId_.current = setTimeout(() => { scrollTimeoutId_.current = null; onScroll(event); }, 10); }, [onScroll]); const setEditorPercentScroll = useCallback((p: number) => { ignoreNextEditorScrollEvent_.current = true; if (editorRef.current) { editorRef.current.setScrollPercent(p); scheduleOnScroll({ percent: p }); } }, [scheduleOnScroll]); const setViewerPercentScroll = useCallback((p: number) => { if (webviewRef.current) { webviewRef.current.wrappedInstance.send('setPercentScroll', p); scheduleOnScroll({ percent: p }); } }, [scheduleOnScroll]); const editor_scroll = useCallback(() => { if (ignoreNextEditorScrollEvent_.current) { ignoreNextEditorScrollEvent_.current = false; return; } if (editorRef.current) { const percent = editorRef.current.getScrollPercent(); setViewerPercentScroll(percent); } }, [setViewerPercentScroll]); const resetScroll = useCallback(() => { if (editorRef.current) { editorRef.current.setScrollPercent(0); } }, []); return { resetScroll, setEditorPercentScroll, setViewerPercentScroll, editor_scroll }; }