diff --git a/app/note/[id].tsx b/app/note/[id].tsx index f75f641..46f1c49 100644 --- a/app/note/[id].tsx +++ b/app/note/[id].tsx @@ -793,26 +793,27 @@ export default function NoteScreen() { onCurrentPageChange={handleCurrentPageChange} onPagesChange={handlePagesChange} onPencilDoubleTap={handlePencilDoubleTap} + overlay={ + + } onTransformChange={handleTransform} /> - - =2.0.0", diff --git a/package.json b/package.json index 75a2697..c4bc5d6 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "dependencies": { "@expo/vector-icons": "^15.0.3", - "@mathnotes/mobile-ink": "0.3.3", + "@mathnotes/mobile-ink": "0.3.4", "@react-native-async-storage/async-storage": "2.2.0", "@shopify/react-native-skia": "2.2.12", "expo": "54.0.34", diff --git a/src/components/editor/OverlayLayer.tsx b/src/components/editor/OverlayLayer.tsx index 0ecc8e5..6d36621 100644 --- a/src/components/editor/OverlayLayer.tsx +++ b/src/components/editor/OverlayLayer.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { GestureResponderEvent, Keyboard, @@ -15,10 +15,7 @@ import type { import { TextBoxOverlay } from './TextBoxOverlay'; import { ImageInsertOverlay } from './ImageInsertOverlay'; import type { ViewportTransformStore } from '../../hooks/useViewportTransform'; -import { - pageRectFromTransform, - screenToPageCoord, -} from '../../hooks/useViewportTransform'; +import { screenToPageCoord } from '../../hooks/useViewportTransform'; import type { SupportedTool } from '../../utils/toolPalette'; const CONTENT_PADDING = 16; @@ -70,19 +67,22 @@ export function OverlayLayer({ onRemoveInsertedElement, onCreateTextBoxId, }: OverlayLayerProps) { - const [transform, setTransform] = useState( - () => store.getSnapshot(), - ); + const transformRef = useRef(store.getSnapshot()); + const [hasTransform, setHasTransform] = useState(() => transformRef.current !== null); useEffect(() => { const unsub = store.subscribe(() => { - setTransform(store.getSnapshot()); + const next = store.getSnapshot(); + if (!next) return; + transformRef.current = next; + setHasTransform(true); }); return unsub; }, [store]); const handleTextToolTap = useCallback( (event: GestureResponderEvent) => { + const transform = transformRef.current; if (!transform || activeTool !== 'text') return; const { locationX, locationY } = event.nativeEvent; const coord = screenToPageCoord( @@ -122,7 +122,6 @@ export function OverlayLayer({ pageHeight, pageWidth, pages.length, - transform, ], ); @@ -140,7 +139,7 @@ export function OverlayLayer({ [activeTool, handleTextToolTap, onSelectionChange, selection], ); - if (!transform) { + if (!hasTransform) { return null; } @@ -159,20 +158,6 @@ export function OverlayLayer({ ) : null} {pages.map((page, pageIndex) => { - const rect = pageRectFromTransform( - transform, - pageIndex, - pageWidth, - pageHeight, - CONTENT_PADDING, - PAGE_GAP, - ); - if ( - rect.screenY + rect.height < -200 || - rect.screenY > transform.containerHeight + 200 - ) { - return null; - } const textBoxes = page.textBoxes ?? []; const elements = [...(page.insertedElements ?? [])].sort( (a, b) => (a.zIndex ?? 0) - (b.zIndex ?? 0), @@ -184,10 +169,10 @@ export function OverlayLayer({ style={[ styles.pageHost, { - left: rect.screenX, - top: rect.screenY, - width: rect.width, - height: rect.height, + left: 0, + top: pageIndex * (pageHeight + PAGE_GAP), + width: pageWidth, + height: pageHeight, }, ]} > @@ -204,7 +189,7 @@ export function OverlayLayer({