canvu-react 0.4.59 → 0.4.60

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.
@@ -1,4 +1,4 @@
1
- import { P as PlacementPreview, r as VectorViewportHandle, V as VectorToolDefinition, s as VectorViewportProps, a as CanvasPlugin, f as CanvasPluginRenderContext } from './types-BFZpRGyr.cjs';
1
+ import { P as PlacementPreview, u as VectorViewportProps, t as VectorViewportHandle, V as VectorToolDefinition, p as VectorItemsChangeInfo, a as CanvasPlugin, f as CanvasPluginRenderContext } from './types--jCoyZIF.cjs';
2
2
  import { a as RemotePresenceMarkupStroke, R as RemotePresencePeer, b as RemotePresenceCamera, c as RealtimeConnectionState } from './types-DqsqQQVf.cjs';
3
3
  export { P as PresenceOverlayRenderContext } from './types-DqsqQQVf.cjs';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
@@ -175,7 +175,7 @@ type RealtimeCommentsAuthor = {
175
175
  };
176
176
  type UseRealtimeCommentsOptions = {
177
177
  items: readonly VectorSceneItem[];
178
- onItemsChange: (items: VectorSceneItem[]) => void;
178
+ onItemsChange: NonNullable<VectorViewportProps["onItemsChange"]>;
179
179
  author: RealtimeCommentsAuthor;
180
180
  viewportRef?: RefObject<VectorViewportHandle | null>;
181
181
  activeToolId?: string;
@@ -195,7 +195,7 @@ type UseRealtimeCommentsResult = {
195
195
  tools: VectorToolDefinition[];
196
196
  overlay: ReactNode;
197
197
  viewport: RealtimeCommentsViewportBindings;
198
- handleViewportItemsChange: (items: VectorSceneItem[], onItemsChange?: (items: VectorSceneItem[]) => void) => void;
198
+ handleViewportItemsChange: (items: VectorSceneItem[], onItemsChange?: NonNullable<VectorViewportProps["onItemsChange"]>, info?: VectorItemsChangeInfo) => void;
199
199
  isComposerOpen: boolean;
200
200
  closeComposer: () => void;
201
201
  };
@@ -284,7 +284,7 @@ type RealtimeCommentData = {
284
284
  };
285
285
  type RealtimeCommentsOverlayProps = {
286
286
  items: readonly VectorSceneItem[];
287
- onItemsChange?: (items: VectorSceneItem[]) => void;
287
+ onItemsChange?: (items: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
288
288
  isDragEnabled?: boolean;
289
289
  cameraVersion: number;
290
290
  viewportRef?: CanvasPluginRenderContext["viewportRef"];
@@ -331,14 +331,14 @@ declare function realtimeSessionPlugin(options: RealtimeSessionPluginOptions): C
331
331
  type UseRealtimeCanvasDocumentOptions = {
332
332
  session: Pick<UseRealtimeSessionResult, "connection" | "document" | "remoteAdapter" | "hasLocalOfflineDraft" | "hasPendingDocumentSync" | "syncState" | "conflict" | "resolveConflict" | "clearLocalDraft" | "flushDocumentSync"> | null;
333
333
  items: readonly VectorSceneItem[];
334
- onItemsChange?: (nextItems: VectorSceneItem[]) => void;
334
+ onItemsChange?: (nextItems: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
335
335
  normalizeItems?: (nextItems: readonly VectorSceneItem[]) => VectorSceneItem[];
336
336
  hydrateItems?: (nextItems: readonly VectorSceneItem[]) => Promise<VectorSceneItem[]>;
337
337
  enabled?: boolean;
338
338
  };
339
339
  type UseRealtimeCanvasDocumentResult = {
340
340
  items: readonly VectorSceneItem[];
341
- onItemsChange?: (nextItems: VectorSceneItem[]) => void;
341
+ onItemsChange?: (nextItems: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
342
342
  loading: boolean;
343
343
  saving: boolean;
344
344
  hasLocalOfflineDraft: boolean;
@@ -1,4 +1,4 @@
1
- import { P as PlacementPreview, r as VectorViewportHandle, V as VectorToolDefinition, s as VectorViewportProps, a as CanvasPlugin, f as CanvasPluginRenderContext } from './types-D2zesNI8.js';
1
+ import { P as PlacementPreview, u as VectorViewportProps, t as VectorViewportHandle, V as VectorToolDefinition, p as VectorItemsChangeInfo, a as CanvasPlugin, f as CanvasPluginRenderContext } from './types-C_PMen-D.js';
2
2
  import { a as RemotePresenceMarkupStroke, R as RemotePresencePeer, b as RemotePresenceCamera, c as RealtimeConnectionState } from './types-BXa2CIrc.js';
3
3
  export { P as PresenceOverlayRenderContext } from './types-BXa2CIrc.js';
4
4
  import * as react_jsx_runtime from 'react/jsx-runtime';
@@ -175,7 +175,7 @@ type RealtimeCommentsAuthor = {
175
175
  };
176
176
  type UseRealtimeCommentsOptions = {
177
177
  items: readonly VectorSceneItem[];
178
- onItemsChange: (items: VectorSceneItem[]) => void;
178
+ onItemsChange: NonNullable<VectorViewportProps["onItemsChange"]>;
179
179
  author: RealtimeCommentsAuthor;
180
180
  viewportRef?: RefObject<VectorViewportHandle | null>;
181
181
  activeToolId?: string;
@@ -195,7 +195,7 @@ type UseRealtimeCommentsResult = {
195
195
  tools: VectorToolDefinition[];
196
196
  overlay: ReactNode;
197
197
  viewport: RealtimeCommentsViewportBindings;
198
- handleViewportItemsChange: (items: VectorSceneItem[], onItemsChange?: (items: VectorSceneItem[]) => void) => void;
198
+ handleViewportItemsChange: (items: VectorSceneItem[], onItemsChange?: NonNullable<VectorViewportProps["onItemsChange"]>, info?: VectorItemsChangeInfo) => void;
199
199
  isComposerOpen: boolean;
200
200
  closeComposer: () => void;
201
201
  };
@@ -284,7 +284,7 @@ type RealtimeCommentData = {
284
284
  };
285
285
  type RealtimeCommentsOverlayProps = {
286
286
  items: readonly VectorSceneItem[];
287
- onItemsChange?: (items: VectorSceneItem[]) => void;
287
+ onItemsChange?: (items: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
288
288
  isDragEnabled?: boolean;
289
289
  cameraVersion: number;
290
290
  viewportRef?: CanvasPluginRenderContext["viewportRef"];
@@ -331,14 +331,14 @@ declare function realtimeSessionPlugin(options: RealtimeSessionPluginOptions): C
331
331
  type UseRealtimeCanvasDocumentOptions = {
332
332
  session: Pick<UseRealtimeSessionResult, "connection" | "document" | "remoteAdapter" | "hasLocalOfflineDraft" | "hasPendingDocumentSync" | "syncState" | "conflict" | "resolveConflict" | "clearLocalDraft" | "flushDocumentSync"> | null;
333
333
  items: readonly VectorSceneItem[];
334
- onItemsChange?: (nextItems: VectorSceneItem[]) => void;
334
+ onItemsChange?: (nextItems: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
335
335
  normalizeItems?: (nextItems: readonly VectorSceneItem[]) => VectorSceneItem[];
336
336
  hydrateItems?: (nextItems: readonly VectorSceneItem[]) => Promise<VectorSceneItem[]>;
337
337
  enabled?: boolean;
338
338
  };
339
339
  type UseRealtimeCanvasDocumentResult = {
340
340
  items: readonly VectorSceneItem[];
341
- onItemsChange?: (nextItems: VectorSceneItem[]) => void;
341
+ onItemsChange?: (nextItems: VectorSceneItem[], info?: VectorItemsChangeInfo) => void;
342
342
  loading: boolean;
343
343
  saving: boolean;
344
344
  hasLocalOfflineDraft: boolean;
package/dist/realtime.js CHANGED
@@ -1226,7 +1226,10 @@ function RealtimeCommentsOverlay({
1226
1226
  (item) => item.id === drag.itemId ? moveCommentItem(item, deltaX, deltaY) : item
1227
1227
  );
1228
1228
  itemsRef.current = nextItems;
1229
- onItemsChange(nextItems);
1229
+ onItemsChange(nextItems, {
1230
+ motive: "plugin",
1231
+ itemIds: [drag.itemId]
1232
+ });
1230
1233
  };
1231
1234
  const onPointerUp = () => {
1232
1235
  dragStateRef.current = null;
@@ -1732,20 +1735,20 @@ function useRealtimeComments({
1732
1735
  [author.color]
1733
1736
  );
1734
1737
  const handleViewportItemsChange = useCallback(
1735
- (nextItems, overrideOnItemsChange) => {
1738
+ (nextItems, overrideOnItemsChange, info) => {
1736
1739
  const applyItemsChange = overrideOnItemsChange ?? onItemsChange;
1737
1740
  const currentIds = new Set(items.map((item) => item.id));
1738
1741
  const draftItem = nextItems.find(
1739
1742
  (item) => !currentIds.has(item.id) && isRealtimeCommentDraftItem(item)
1740
1743
  );
1741
1744
  if (!draftItem) {
1742
- applyItemsChange(nextItems);
1745
+ applyItemsChange(nextItems, info);
1743
1746
  return;
1744
1747
  }
1745
1748
  const filteredItems = nextItems.filter((item) => item.id !== draftItem.id);
1746
1749
  const shouldPersistFiltered = filteredItems.length !== items.length || filteredItems.some((item, index) => items[index]?.id !== item.id);
1747
1750
  if (shouldPersistFiltered) {
1748
- applyItemsChange(filteredItems);
1751
+ applyItemsChange(filteredItems, info);
1749
1752
  }
1750
1753
  setCommentComposer({
1751
1754
  worldX: draftItem.bounds.x + draftItem.bounds.width / 2,
@@ -1787,7 +1790,10 @@ function useRealtimeComments({
1787
1790
  authorImage
1788
1791
  }
1789
1792
  );
1790
- onItemsChange(items.concat(nextItem));
1793
+ onItemsChange(items.concat(nextItem), {
1794
+ motive: "plugin",
1795
+ itemIds: [nextItem.id]
1796
+ });
1791
1797
  setCommentComposer(null);
1792
1798
  }, [
1793
1799
  author.color,
@@ -1845,7 +1851,7 @@ function useRealtimeComments({
1845
1851
  const viewport = useMemo(
1846
1852
  () => ({
1847
1853
  customPlacement,
1848
- onItemsChange: (nextItems) => handleViewportItemsChange(nextItems),
1854
+ onItemsChange: (nextItems, info) => handleViewportItemsChange(nextItems, void 0, info),
1849
1855
  onCameraChange
1850
1856
  }),
1851
1857
  [customPlacement, handleViewportItemsChange, onCameraChange]
@@ -3498,7 +3504,7 @@ function RealtimeCollaborationPluginComponent({
3498
3504
  );
3499
3505
  const handleCommentItemsChange = useCallback(
3500
3506
  (nextItems) => {
3501
- onItemsChange?.([...nextItems]);
3507
+ onItemsChange?.([...nextItems], { motive: "plugin" });
3502
3508
  session.remoteAdapter.send?.([...nextItems]);
3503
3509
  },
3504
3510
  [onItemsChange, session.remoteAdapter]
@@ -3548,7 +3554,7 @@ function RealtimeCollaborationPluginComponent({
3548
3554
  useEffect(() => {
3549
3555
  if (!onItemsChange || !session.document) return;
3550
3556
  if (session.document.updatedByClientId === session.connection.clientId) return;
3551
- onItemsChange(session.document.items);
3557
+ onItemsChange(session.document.items, { motive: "remote-sync" });
3552
3558
  }, [onItemsChange, session.connection.clientId, session.document]);
3553
3559
  const contribution = useMemo(
3554
3560
  () => ({
@@ -3563,15 +3569,19 @@ function RealtimeCollaborationPluginComponent({
3563
3569
  onPlacementPreviewChange: presenceBindings.onPlacementPreviewChange,
3564
3570
  onCameraChange: onViewportCameraChange
3565
3571
  },
3566
- wrapOnItemsChange: (nextItems, ctx) => {
3572
+ wrapOnItemsChange: (nextItems, ctx, info) => {
3567
3573
  if (commentOptions) {
3568
- comments.handleViewportItemsChange(nextItems, (processedItems) => {
3569
- ctx.next(processedItems);
3570
- session.remoteAdapter.send?.([...processedItems]);
3571
- });
3574
+ comments.handleViewportItemsChange(
3575
+ nextItems,
3576
+ (processedItems, processedInfo) => {
3577
+ ctx.next(processedItems, processedInfo);
3578
+ session.remoteAdapter.send?.([...processedItems]);
3579
+ },
3580
+ info
3581
+ );
3572
3582
  return;
3573
3583
  }
3574
- ctx.next(nextItems);
3584
+ ctx.next(nextItems, info);
3575
3585
  session.remoteAdapter.send?.(nextItems);
3576
3586
  }
3577
3587
  }),
@@ -3712,14 +3722,17 @@ function useRealtimeCanvasDocument(options) {
3712
3722
  [hydrateItems, normalizeItems]
3713
3723
  );
3714
3724
  const handleItemsChange = useCallback(
3715
- (nextItems) => {
3725
+ (nextItems, info) => {
3716
3726
  if (!enabled) {
3717
- onItemsChange?.(normalizeItems ? normalizeItems(nextItems) : nextItems);
3727
+ onItemsChange?.(
3728
+ normalizeItems ? normalizeItems(nextItems) : nextItems,
3729
+ info
3730
+ );
3718
3731
  return;
3719
3732
  }
3720
3733
  hasLocalChangeInFlightRef.current = true;
3721
3734
  const normalizedItems = normalizeItems ? normalizeItems(nextItems) : nextItems;
3722
- onItemsChange?.(normalizedItems);
3735
+ onItemsChange?.(normalizedItems, info);
3723
3736
  session?.remoteAdapter.send?.(normalizedItems);
3724
3737
  },
3725
3738
  [enabled, normalizeItems, onItemsChange, session]
@@ -3770,7 +3783,7 @@ function useRealtimeCanvasDocument(options) {
3770
3783
  if (resolvedItems.length > 0) {
3771
3784
  hasEverPropagatedItemsRef.current = true;
3772
3785
  }
3773
- onItemsChange(resolvedItems);
3786
+ onItemsChange(resolvedItems, { motive: "remote-sync" });
3774
3787
  }).finally(() => {
3775
3788
  if (inFlightRevisionRef.current === documentRevision) {
3776
3789
  inFlightRevisionRef.current = null;