rita-workspace 0.5.28 → 0.5.30

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.
package/dist/index.js CHANGED
@@ -530,6 +530,7 @@ function isDrawingOpenedEarlierInOtherTab(drawingId) {
530
530
  ([tabId, entry]) => tabId !== TAB_ID && entry.drawingId === drawingId && entry.openedAt <= myOpenedAt
531
531
  );
532
532
  }
533
+ var ownProbeIds = /* @__PURE__ */ new Set();
533
534
  function detectTabIdCollision() {
534
535
  return new Promise((resolve) => {
535
536
  let channel;
@@ -539,15 +540,18 @@ function detectTabIdCollision() {
539
540
  resolve(false);
540
541
  return;
541
542
  }
543
+ const probeId = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2);
544
+ ownProbeIds.add(probeId);
542
545
  let collided = false;
543
546
  channel.onmessage = (event) => {
544
547
  if (event.data?.type === "id-collision" && event.data?.tabId === TAB_ID) {
545
548
  collided = true;
546
549
  }
547
550
  };
548
- channel.postMessage({ type: "id-claim", tabId: TAB_ID });
551
+ channel.postMessage({ type: "id-claim", tabId: TAB_ID, probeId });
549
552
  setTimeout(() => {
550
553
  channel.close();
554
+ ownProbeIds.delete(probeId);
551
555
  resolve(collided);
552
556
  }, 300);
553
557
  });
@@ -634,6 +638,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
634
638
  if (event.data?.type === "ping") {
635
639
  channel?.postMessage({ type: "pong", tabId: TAB_ID });
636
640
  } else if (event.data?.type === "id-claim" && event.data?.tabId === TAB_ID) {
641
+ if (event.data?.probeId && ownProbeIds.has(event.data.probeId)) return;
637
642
  channel?.postMessage({ type: "id-collision", tabId: TAB_ID });
638
643
  } else if (event.data?.type === "workspace-changed" && event.data?.tabId !== TAB_ID) {
639
644
  refreshDrawingsRef.current();
@@ -961,6 +966,8 @@ function WorkspaceProvider({ children, lang = "en" }) {
961
966
  if (!activeDrawing) return;
962
967
  if (isDrawingOpenedEarlierInOtherTab(activeDrawing.id)) return;
963
968
  try {
969
+ const fresh = await getDrawing(activeDrawing.id);
970
+ if (fresh && fresh.updatedAt > (activeDrawing.updatedAt ?? 0)) return;
964
971
  const updateData = {
965
972
  elements,
966
973
  appState
@@ -985,6 +992,9 @@ function WorkspaceProvider({ children, lang = "en" }) {
985
992
  const saveDrawingById = (0, import_react.useCallback)(async (id, elements, appState, files) => {
986
993
  if (isDrawingOpenedEarlierInOtherTab(id)) return;
987
994
  try {
995
+ const inMem = drawingsRef.current.find((d) => d.id === id);
996
+ const fresh = await getDrawing(id);
997
+ if (fresh && inMem && fresh.updatedAt > (inMem.updatedAt ?? 0)) return;
988
998
  const updateData = {
989
999
  elements,
990
1000
  appState
package/dist/index.mjs CHANGED
@@ -459,6 +459,7 @@ function isDrawingOpenedEarlierInOtherTab(drawingId) {
459
459
  ([tabId, entry]) => tabId !== TAB_ID && entry.drawingId === drawingId && entry.openedAt <= myOpenedAt
460
460
  );
461
461
  }
462
+ var ownProbeIds = /* @__PURE__ */ new Set();
462
463
  function detectTabIdCollision() {
463
464
  return new Promise((resolve) => {
464
465
  let channel;
@@ -468,15 +469,18 @@ function detectTabIdCollision() {
468
469
  resolve(false);
469
470
  return;
470
471
  }
472
+ const probeId = typeof crypto !== "undefined" && crypto.randomUUID ? crypto.randomUUID() : Math.random().toString(36).slice(2);
473
+ ownProbeIds.add(probeId);
471
474
  let collided = false;
472
475
  channel.onmessage = (event) => {
473
476
  if (event.data?.type === "id-collision" && event.data?.tabId === TAB_ID) {
474
477
  collided = true;
475
478
  }
476
479
  };
477
- channel.postMessage({ type: "id-claim", tabId: TAB_ID });
480
+ channel.postMessage({ type: "id-claim", tabId: TAB_ID, probeId });
478
481
  setTimeout(() => {
479
482
  channel.close();
483
+ ownProbeIds.delete(probeId);
480
484
  resolve(collided);
481
485
  }, 300);
482
486
  });
@@ -563,6 +567,7 @@ function WorkspaceProvider({ children, lang = "en" }) {
563
567
  if (event.data?.type === "ping") {
564
568
  channel?.postMessage({ type: "pong", tabId: TAB_ID });
565
569
  } else if (event.data?.type === "id-claim" && event.data?.tabId === TAB_ID) {
570
+ if (event.data?.probeId && ownProbeIds.has(event.data.probeId)) return;
566
571
  channel?.postMessage({ type: "id-collision", tabId: TAB_ID });
567
572
  } else if (event.data?.type === "workspace-changed" && event.data?.tabId !== TAB_ID) {
568
573
  refreshDrawingsRef.current();
@@ -890,6 +895,8 @@ function WorkspaceProvider({ children, lang = "en" }) {
890
895
  if (!activeDrawing) return;
891
896
  if (isDrawingOpenedEarlierInOtherTab(activeDrawing.id)) return;
892
897
  try {
898
+ const fresh = await getDrawing(activeDrawing.id);
899
+ if (fresh && fresh.updatedAt > (activeDrawing.updatedAt ?? 0)) return;
893
900
  const updateData = {
894
901
  elements,
895
902
  appState
@@ -914,6 +921,9 @@ function WorkspaceProvider({ children, lang = "en" }) {
914
921
  const saveDrawingById = useCallback(async (id, elements, appState, files) => {
915
922
  if (isDrawingOpenedEarlierInOtherTab(id)) return;
916
923
  try {
924
+ const inMem = drawingsRef.current.find((d) => d.id === id);
925
+ const fresh = await getDrawing(id);
926
+ if (fresh && inMem && fresh.updatedAt > (inMem.updatedAt ?? 0)) return;
917
927
  const updateData = {
918
928
  elements,
919
929
  appState
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rita-workspace",
3
- "version": "0.5.28",
3
+ "version": "0.5.30",
4
4
  "description": "Multi-drawing workspace feature for Rita (Excalidraw fork)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",