@anaralabs/lector 3.5.6 → 3.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -384,12 +384,13 @@ declare const useAnnotations: UseBoundStore<StoreApi<AnnotationState>>;
384
384
  export { useAnnotations }
385
385
  export { useAnnotations as useAnnotations_alias_1 }
386
386
 
387
- export declare const useAnnotationTooltip: ({ annotation, onOpenChange, position, }: UseAnnotationTooltipProps) => UseAnnotationTooltipReturn;
387
+ export declare const useAnnotationTooltip: ({ annotation, onOpenChange, position, isOpen: controlledIsOpen, }: UseAnnotationTooltipProps) => UseAnnotationTooltipReturn;
388
388
 
389
389
  declare interface UseAnnotationTooltipProps {
390
390
  annotation: Annotation;
391
391
  onOpenChange?: (open: boolean) => void;
392
392
  position?: "top" | "bottom" | "left" | "right";
393
+ isOpen?: boolean;
393
394
  }
394
395
 
395
396
  declare interface UseAnnotationTooltipReturn {
package/dist/index.js CHANGED
@@ -134,32 +134,25 @@ var PDFStore = createZustandContext(
134
134
  var usePdf = (selector) => useStore(PDFStore.useContext(), selector);
135
135
 
136
136
  // src/hooks/useAnnotationTooltip.ts
137
- var defaultRect = {
138
- width: 0,
139
- height: 0,
140
- x: 0,
141
- y: 0,
142
- top: 0,
143
- right: 0,
144
- bottom: 0,
145
- left: 0
146
- };
147
137
  var useAnnotationTooltip = ({
148
138
  annotation,
149
139
  onOpenChange,
150
- position = "top"
140
+ position = "top",
141
+ isOpen: controlledIsOpen
151
142
  }) => {
152
143
  const isNewAnnotation = Date.now() - new Date(annotation.createdAt).getTime() < 1e3;
153
- const [isOpen, setIsOpen] = useState(isNewAnnotation);
144
+ const [isPositionCalculated, setIsPositionCalculated] = useState(false);
145
+ const [isOpen, setIsOpen] = useState(false);
154
146
  const viewportRef = usePdf((state) => state.viewportRef);
155
147
  const scale = usePdf((state) => state.zoom);
148
+ const effectiveIsOpen = (isOpen && isPositionCalculated || controlledIsOpen) ?? false;
156
149
  const {
157
150
  refs,
158
151
  floatingStyles,
159
152
  context
160
153
  } = useFloating({
161
154
  placement: position,
162
- open: isOpen,
155
+ open: effectiveIsOpen,
163
156
  onOpenChange: (open) => {
164
157
  setIsOpen(open);
165
158
  onOpenChange?.(open);
@@ -178,18 +171,27 @@ var useAnnotationTooltip = ({
178
171
  const dismiss = useDismiss(context);
179
172
  const { getReferenceProps, getFloatingProps } = useInteractions([dismiss]);
180
173
  const updateTooltipPosition = useCallback(() => {
181
- if (!annotation.highlights.length) return;
174
+ if (!annotation.highlights.length) {
175
+ setIsPositionCalculated(false);
176
+ return;
177
+ }
182
178
  const highlightRects = annotation.highlights;
183
179
  let minLeft = Infinity;
184
180
  let maxRight = -Infinity;
185
181
  let minTop = Infinity;
186
182
  let maxBottom = -Infinity;
183
+ const viewportElement = viewportRef.current;
184
+ if (!viewportElement) {
185
+ setIsPositionCalculated(false);
186
+ return;
187
+ }
188
+ const pageElement = viewportElement.querySelector(`[data-page-number="${annotation.pageNumber}"]`);
189
+ if (!pageElement) {
190
+ setIsPositionCalculated(false);
191
+ return;
192
+ }
187
193
  refs.setReference({
188
194
  getBoundingClientRect() {
189
- const viewportElement = viewportRef.current;
190
- if (!viewportElement) return defaultRect;
191
- const pageElement = viewportElement.querySelector(`[data-page-number="${annotation.pageNumber}"]`);
192
- if (!pageElement) return defaultRect;
193
195
  const pageRect = pageElement.getBoundingClientRect();
194
196
  highlightRects.forEach((highlight) => {
195
197
  const scaledLeft = highlight.left * scale;
@@ -226,10 +228,17 @@ var useAnnotationTooltip = ({
226
228
  },
227
229
  contextElement: viewportRef.current || void 0
228
230
  });
229
- }, [annotation.highlights, annotation.pageNumber, refs, viewportRef, scale]);
231
+ setIsPositionCalculated(true);
232
+ if (isNewAnnotation) {
233
+ setIsOpen(true);
234
+ }
235
+ }, [annotation.highlights, annotation.pageNumber, refs, viewportRef, scale, isNewAnnotation]);
230
236
  useEffect(() => {
231
237
  const viewport = viewportRef.current;
232
- updateTooltipPosition();
238
+ setIsPositionCalculated(false);
239
+ requestAnimationFrame(() => {
240
+ updateTooltipPosition();
241
+ });
233
242
  const handleScroll = () => {
234
243
  requestAnimationFrame(updateTooltipPosition);
235
244
  };
@@ -248,9 +257,9 @@ var useAnnotationTooltip = ({
248
257
  }
249
258
  window.removeEventListener("resize", handleResize);
250
259
  };
251
- }, [updateTooltipPosition, viewportRef]);
260
+ }, [updateTooltipPosition, viewportRef, scale, controlledIsOpen]);
252
261
  return {
253
- isOpen,
262
+ isOpen: effectiveIsOpen,
254
263
  setIsOpen,
255
264
  refs,
256
265
  floatingStyles,
@@ -282,7 +291,8 @@ var AnnotationTooltip = ({
282
291
  getReferenceProps
283
292
  } = useAnnotationTooltip({
284
293
  annotation,
285
- onOpenChange
294
+ onOpenChange,
295
+ isOpen: controlledIsOpen
286
296
  });
287
297
  const {
288
298
  isOpen: uncontrolledHoverIsOpen,
@@ -293,7 +303,8 @@ var AnnotationTooltip = ({
293
303
  getReferenceProps: getHoverReferenceProps
294
304
  } = useAnnotationTooltip({
295
305
  position: "bottom",
296
- annotation
306
+ annotation,
307
+ isOpen: controlledHoverIsOpen
297
308
  });
298
309
  const isOpen = controlledIsOpen ?? uncontrolledIsOpen;
299
310
  const hoverIsOpen = controlledHoverIsOpen || uncontrolledHoverIsOpen;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anaralabs/lector",
3
- "version": "3.5.6",
3
+ "version": "3.5.7",
4
4
  "description": "Headless PDF viewer for React",
5
5
  "author": "andrewdr (https://github.com/andrewdoro)",
6
6
  "license": "MIT",