@noya-app/noya-multiplayer-react 0.1.24 → 0.1.25

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
@@ -251,7 +251,82 @@ var UserPointerIcon = (0, import_react2.memo)(function CursorIcon({
251
251
 
252
252
  // src/hooks.ts
253
253
  var import_state_manager = require("@noya-app/state-manager");
254
- var import_react6 = require("react");
254
+ var import_react7 = require("react");
255
+ var import_client2 = require("react-dom/client");
256
+
257
+ // src/components/ErrorOverlay.tsx
258
+ var import_react3 = __toESM(require("react"));
259
+ function ErrorOverlay({
260
+ error
261
+ }) {
262
+ return /* @__PURE__ */ import_react3.default.createElement(
263
+ "div",
264
+ {
265
+ style: {
266
+ position: "fixed",
267
+ top: "20px",
268
+ left: "50%",
269
+ transform: "translateX(-50%)",
270
+ maxWidth: "80%",
271
+ width: "fit-content",
272
+ padding: "12px 20px",
273
+ background: "white",
274
+ color: "black",
275
+ zIndex: 1e4,
276
+ display: "flex",
277
+ flexDirection: "column",
278
+ justifyContent: "center",
279
+ borderRadius: "4px",
280
+ boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)",
281
+ fontFamily: "'__Inter_6b0edc', '__Inter_Fallback_6b0edc', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
282
+ fontSize: "14px",
283
+ fontWeight: 400,
284
+ lineHeight: "19px"
285
+ }
286
+ },
287
+ error.reason === "schemaMigration" ? /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("p", null, "An updated version of Noya is available. Please reload the page to continue.")) : /* @__PURE__ */ import_react3.default.createElement(import_react3.default.Fragment, null, /* @__PURE__ */ import_react3.default.createElement("p", null, "An error occurred:", " ", /* @__PURE__ */ import_react3.default.createElement(
288
+ "code",
289
+ {
290
+ style: {
291
+ background: "rgba(255, 0, 0, 0.1)",
292
+ color: "rgba(255, 0, 0, 0.5)",
293
+ padding: "2px 4px",
294
+ borderRadius: "4px"
295
+ }
296
+ },
297
+ error.reason
298
+ ), ". Please reload the page to continue.", /* @__PURE__ */ import_react3.default.createElement("br", null), /* @__PURE__ */ import_react3.default.createElement("br", null), "If this happens repeatedly, please get in touch and the Noya team can help.")),
299
+ /* @__PURE__ */ import_react3.default.createElement(
300
+ "div",
301
+ {
302
+ style: {
303
+ height: "1px",
304
+ background: "rgba(0, 0, 0, 0.1)",
305
+ margin: "12px -20px"
306
+ }
307
+ }
308
+ ),
309
+ /* @__PURE__ */ import_react3.default.createElement(
310
+ "button",
311
+ {
312
+ style: {
313
+ background: "black",
314
+ color: "white",
315
+ padding: "8px 16px",
316
+ borderRadius: "4px",
317
+ cursor: "pointer",
318
+ fontSize: "14px",
319
+ fontWeight: 700,
320
+ lineHeight: "19px"
321
+ },
322
+ onClick: () => {
323
+ window.location.reload();
324
+ }
325
+ },
326
+ "Reload"
327
+ )
328
+ );
329
+ }
255
330
 
256
331
  // src/globals.ts
257
332
  var import_observable = require("@noya-app/observable");
@@ -259,18 +334,18 @@ var shouldTrackEvents$ = new import_observable.Observable(false);
259
334
  var shouldTrackTasks$ = new import_observable.Observable(false);
260
335
 
261
336
  // src/inspector/useStateInspector.tsx
262
- var import_react5 = __toESM(require("react"));
337
+ var import_react6 = __toESM(require("react"));
263
338
  var import_client = require("react-dom/client");
264
339
 
265
340
  // src/inspector/StateInspector.tsx
266
- var import_react4 = __toESM(require("react"));
341
+ var import_react5 = __toESM(require("react"));
267
342
  var import_react_inspector = require("react-inspector");
268
343
 
269
344
  // src/inspector/useLocalStorageState.tsx
270
- var import_react3 = __toESM(require("react"));
345
+ var import_react4 = __toESM(require("react"));
271
346
  var localStorage = typeof window !== "undefined" ? window.localStorage : null;
272
347
  function useLocalStorageState(key, defaultValue) {
273
- const [state, setState] = import_react3.default.useState(() => {
348
+ const [state, setState] = import_react4.default.useState(() => {
274
349
  const value = localStorage?.getItem(key);
275
350
  let result = defaultValue;
276
351
  if (value) {
@@ -315,7 +390,7 @@ function ToggleButton({
315
390
  theme,
316
391
  anchor
317
392
  }) {
318
- return /* @__PURE__ */ import_react4.default.createElement(
393
+ return /* @__PURE__ */ import_react5.default.createElement(
319
394
  "span",
320
395
  {
321
396
  role: "button",
@@ -336,7 +411,7 @@ function ToggleButton({
336
411
  setShowInspector(!showInspector);
337
412
  }
338
413
  },
339
- /* @__PURE__ */ import_react4.default.createElement("span", { style: { width: "12px", height: "12px" } }, showInspector === (anchor === "right") ? /* @__PURE__ */ import_react4.default.createElement(
414
+ /* @__PURE__ */ import_react5.default.createElement("span", { style: { width: "12px", height: "12px" } }, showInspector === (anchor === "right") ? /* @__PURE__ */ import_react5.default.createElement(
340
415
  "svg",
341
416
  {
342
417
  xmlns: "http://www.w3.org/2000/svg",
@@ -346,7 +421,7 @@ function ToggleButton({
346
421
  stroke: "currentColor",
347
422
  className: "size-6"
348
423
  },
349
- /* @__PURE__ */ import_react4.default.createElement(
424
+ /* @__PURE__ */ import_react5.default.createElement(
350
425
  "path",
351
426
  {
352
427
  strokeLinecap: "round",
@@ -354,7 +429,7 @@ function ToggleButton({
354
429
  d: "m5.25 4.5 7.5 7.5-7.5 7.5m6-15 7.5 7.5-7.5 7.5"
355
430
  }
356
431
  )
357
- ) : /* @__PURE__ */ import_react4.default.createElement(
432
+ ) : /* @__PURE__ */ import_react5.default.createElement(
358
433
  "svg",
359
434
  {
360
435
  xmlns: "http://www.w3.org/2000/svg",
@@ -364,7 +439,7 @@ function ToggleButton({
364
439
  stroke: "currentColor",
365
440
  className: "size-6"
366
441
  },
367
- /* @__PURE__ */ import_react4.default.createElement(
442
+ /* @__PURE__ */ import_react5.default.createElement(
368
443
  "path",
369
444
  {
370
445
  strokeLinecap: "round",
@@ -387,7 +462,7 @@ function DisclosureSection({
387
462
  }) {
388
463
  const theme = colorScheme === "light" ? lightTheme : darkTheme;
389
464
  const borderColor = colorScheme === "light" ? "rgba(0,0,0,0.1)" : "rgba(255,255,255,0.1)";
390
- return /* @__PURE__ */ import_react4.default.createElement(
465
+ return /* @__PURE__ */ import_react5.default.createElement(
391
466
  "div",
392
467
  {
393
468
  style: {
@@ -397,7 +472,7 @@ function DisclosureSection({
397
472
  ...style
398
473
  }
399
474
  },
400
- /* @__PURE__ */ import_react4.default.createElement(
475
+ /* @__PURE__ */ import_react5.default.createElement(
401
476
  "div",
402
477
  {
403
478
  onClick: () => setOpen?.(!open),
@@ -411,7 +486,7 @@ function DisclosureSection({
411
486
  ...open && { borderBottom: `1px solid ${borderColor}` }
412
487
  }
413
488
  },
414
- setOpen && /* @__PURE__ */ import_react4.default.createElement(
489
+ setOpen && /* @__PURE__ */ import_react5.default.createElement(
415
490
  Arrow,
416
491
  {
417
492
  expanded: open,
@@ -422,7 +497,7 @@ function DisclosureSection({
422
497
  }
423
498
  }
424
499
  ),
425
- /* @__PURE__ */ import_react4.default.createElement("span", { style: { flex: "1 1 0", userSelect: "none" } }, title),
500
+ /* @__PURE__ */ import_react5.default.createElement("span", { style: { flex: "1 1 0", userSelect: "none" } }, title),
426
501
  right
427
502
  ),
428
503
  open && children
@@ -436,7 +511,7 @@ function InspectorRow({
436
511
  variant
437
512
  }) {
438
513
  const solidBorderColor = colorScheme === "light" ? "rgb(223 223 223)" : "rgb(29 29 29)";
439
- return /* @__PURE__ */ import_react4.default.createElement(
514
+ return /* @__PURE__ */ import_react5.default.createElement(
440
515
  "div",
441
516
  {
442
517
  style: {
@@ -454,7 +529,7 @@ function InspectorRow({
454
529
  ...style
455
530
  }
456
531
  },
457
- /* @__PURE__ */ import_react4.default.createElement(
532
+ /* @__PURE__ */ import_react5.default.createElement(
458
533
  "span",
459
534
  {
460
535
  style: {
@@ -469,7 +544,7 @@ function InspectorRow({
469
544
  );
470
545
  }
471
546
  var HISTORY_ELEMENT_PREFIX = "noya-multiplayer-history-";
472
- var StateInspector = (0, import_react4.memo)(function StateInspector2({
547
+ var StateInspector = (0, import_react5.memo)(function StateInspector2({
473
548
  state,
474
549
  connectionEvents,
475
550
  connectedUsers,
@@ -483,12 +558,12 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
483
558
  forceInit,
484
559
  ...props
485
560
  }) {
486
- const [didMount, setDidMount] = import_react4.default.useState(false);
487
- (0, import_react4.useLayoutEffect)(() => {
561
+ const [didMount, setDidMount] = import_react5.default.useState(false);
562
+ (0, import_react5.useLayoutEffect)(() => {
488
563
  setDidMount(true);
489
564
  }, []);
490
- const eventsContainerRef = import_react4.default.useRef(null);
491
- const historyContainerRef = import_react4.default.useRef(null);
565
+ const eventsContainerRef = import_react5.default.useRef(null);
566
+ const historyContainerRef = import_react5.default.useRef(null);
492
567
  const [showInspector, setShowInspector] = useLocalStorageState(
493
568
  "noya-multiplayer-react-show-inspector",
494
569
  true
@@ -517,25 +592,25 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
517
592
  "noya-multiplayer-react-show-ephemeral",
518
593
  false
519
594
  );
520
- (0, import_react4.useEffect)(() => {
595
+ (0, import_react5.useEffect)(() => {
521
596
  shouldTrackEvents$.set(showEvents);
522
597
  }, [showEvents]);
523
- (0, import_react4.useEffect)(() => {
598
+ (0, import_react5.useEffect)(() => {
524
599
  shouldTrackTasks$.set(showTasks);
525
600
  }, [showTasks]);
526
- (0, import_react4.useEffect)(() => {
601
+ (0, import_react5.useEffect)(() => {
527
602
  if (eventsContainerRef.current) {
528
603
  eventsContainerRef.current.scrollTop = eventsContainerRef.current.scrollHeight;
529
604
  }
530
605
  }, [connectionEvents]);
531
606
  const ephemeral = useEphemeralUserData(ephemeralUserData);
532
607
  const historySnapshot = useManagedHistory(multiplayerStateManager.sm);
533
- (0, import_react4.useEffect)(() => {
608
+ (0, import_react5.useEffect)(() => {
534
609
  if (historyContainerRef.current) {
535
610
  historyContainerRef.current.scrollTop = historyContainerRef.current.scrollHeight;
536
611
  }
537
612
  }, [historySnapshot]);
538
- (0, import_react4.useEffect)(() => {
613
+ (0, import_react5.useEffect)(() => {
539
614
  if (!historyContainerRef.current)
540
615
  return;
541
616
  const historyEntry = historyContainerRef.current.querySelector(
@@ -572,7 +647,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
572
647
  if (!didMount)
573
648
  return null;
574
649
  if (!showInspector) {
575
- return /* @__PURE__ */ import_react4.default.createElement(
650
+ return /* @__PURE__ */ import_react5.default.createElement(
576
651
  "div",
577
652
  {
578
653
  ...props,
@@ -584,7 +659,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
584
659
  },
585
660
  onClick: () => setShowInspector(true)
586
661
  },
587
- /* @__PURE__ */ import_react4.default.createElement(
662
+ /* @__PURE__ */ import_react5.default.createElement(
588
663
  ToggleButton,
589
664
  {
590
665
  showInspector,
@@ -595,7 +670,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
595
670
  )
596
671
  );
597
672
  }
598
- return /* @__PURE__ */ import_react4.default.createElement(
673
+ return /* @__PURE__ */ import_react5.default.createElement(
599
674
  "div",
600
675
  {
601
676
  ...props,
@@ -604,7 +679,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
604
679
  ...props.style
605
680
  }
606
681
  },
607
- /* @__PURE__ */ import_react4.default.createElement(
682
+ /* @__PURE__ */ import_react5.default.createElement(
608
683
  DisclosureSection,
609
684
  {
610
685
  isFirst: true,
@@ -616,7 +691,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
616
691
  flex: "0 0 auto",
617
692
  maxHeight: "200px"
618
693
  },
619
- right: /* @__PURE__ */ import_react4.default.createElement(
694
+ right: /* @__PURE__ */ import_react5.default.createElement(
620
695
  ToggleButton,
621
696
  {
622
697
  showInspector,
@@ -626,14 +701,14 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
626
701
  }
627
702
  )
628
703
  },
629
- /* @__PURE__ */ import_react4.default.createElement("div", { style: { ...styles.sectionInner, flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react4.default.createElement(
704
+ /* @__PURE__ */ import_react5.default.createElement("div", { style: { ...styles.sectionInner, flex: "0 0 auto" } }, connectedUsers?.map((user) => /* @__PURE__ */ import_react5.default.createElement(
630
705
  InspectorRow,
631
706
  {
632
707
  key: user.id,
633
708
  colorScheme,
634
709
  variant: user.id === userId ? "up" : void 0
635
710
  },
636
- user.image && /* @__PURE__ */ import_react4.default.createElement(
711
+ user.image && /* @__PURE__ */ import_react5.default.createElement(
637
712
  "img",
638
713
  {
639
714
  src: user.image,
@@ -654,7 +729,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
654
729
  " (",
655
730
  ellipsis(user.id.toString(), 8, "middle"),
656
731
  ")"
657
- )), !connectedUsers && /* @__PURE__ */ import_react4.default.createElement(
732
+ )), !connectedUsers && /* @__PURE__ */ import_react5.default.createElement(
658
733
  "div",
659
734
  {
660
735
  style: {
@@ -665,17 +740,17 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
665
740
  gap: "4px"
666
741
  }
667
742
  },
668
- /* @__PURE__ */ import_react4.default.createElement("span", null, "No connected users")
743
+ /* @__PURE__ */ import_react5.default.createElement("span", null, "No connected users")
669
744
  ))
670
745
  ),
671
- /* @__PURE__ */ import_react4.default.createElement(
746
+ /* @__PURE__ */ import_react5.default.createElement(
672
747
  DisclosureSection,
673
748
  {
674
749
  title: "Data",
675
750
  colorScheme,
676
751
  setOpen: setShowData,
677
752
  open: showData,
678
- right: /* @__PURE__ */ import_react4.default.createElement(
753
+ right: /* @__PURE__ */ import_react5.default.createElement(
679
754
  "span",
680
755
  {
681
756
  style: {
@@ -683,7 +758,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
683
758
  gap: "4px"
684
759
  }
685
760
  },
686
- /* @__PURE__ */ import_react4.default.createElement(
761
+ /* @__PURE__ */ import_react5.default.createElement(
687
762
  SmallButton,
688
763
  {
689
764
  theme,
@@ -695,14 +770,14 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
695
770
  )
696
771
  )
697
772
  },
698
- /* @__PURE__ */ import_react4.default.createElement("div", { style: styles.sectionInner }, /* @__PURE__ */ import_react4.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react4.default.createElement(
773
+ /* @__PURE__ */ import_react5.default.createElement("div", { style: styles.sectionInner }, /* @__PURE__ */ import_react5.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react5.default.createElement(
699
774
  import_react_inspector.ObjectInspector,
700
775
  {
701
776
  name: multiplayerStateManager.schema ? "state" : void 0,
702
777
  data: state,
703
778
  theme
704
779
  }
705
- )), multiplayerStateManager.schema && /* @__PURE__ */ import_react4.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react4.default.createElement(
780
+ )), multiplayerStateManager.schema && /* @__PURE__ */ import_react5.default.createElement(InspectorRow, { colorScheme }, /* @__PURE__ */ import_react5.default.createElement(
706
781
  import_react_inspector.ObjectInspector,
707
782
  {
708
783
  name: "schema",
@@ -711,14 +786,14 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
711
786
  }
712
787
  )))
713
788
  ),
714
- /* @__PURE__ */ import_react4.default.createElement(
789
+ /* @__PURE__ */ import_react5.default.createElement(
715
790
  DisclosureSection,
716
791
  {
717
792
  open: showHistory,
718
793
  setOpen: setShowHistory,
719
794
  title: "History",
720
795
  colorScheme,
721
- right: /* @__PURE__ */ import_react4.default.createElement(
796
+ right: /* @__PURE__ */ import_react5.default.createElement(
722
797
  "span",
723
798
  {
724
799
  style: {
@@ -726,7 +801,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
726
801
  gap: "4px"
727
802
  }
728
803
  },
729
- /* @__PURE__ */ import_react4.default.createElement(
804
+ /* @__PURE__ */ import_react5.default.createElement(
730
805
  SmallButton,
731
806
  {
732
807
  disabled: !historySnapshot.canUndo,
@@ -735,7 +810,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
735
810
  multiplayerStateManager.undo();
736
811
  }
737
812
  },
738
- /* @__PURE__ */ import_react4.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react4.default.createElement(
813
+ /* @__PURE__ */ import_react5.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react5.default.createElement(
739
814
  "svg",
740
815
  {
741
816
  xmlns: "http://www.w3.org/2000/svg",
@@ -743,7 +818,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
743
818
  height: "1em",
744
819
  viewBox: "0 0 20 20"
745
820
  },
746
- /* @__PURE__ */ import_react4.default.createElement(
821
+ /* @__PURE__ */ import_react5.default.createElement(
747
822
  "path",
748
823
  {
749
824
  fill: "currentColor",
@@ -752,7 +827,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
752
827
  )
753
828
  ))
754
829
  ),
755
- /* @__PURE__ */ import_react4.default.createElement(
830
+ /* @__PURE__ */ import_react5.default.createElement(
756
831
  SmallButton,
757
832
  {
758
833
  disabled: !historySnapshot.canRedo,
@@ -761,7 +836,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
761
836
  multiplayerStateManager.redo();
762
837
  }
763
838
  },
764
- /* @__PURE__ */ import_react4.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react4.default.createElement(
839
+ /* @__PURE__ */ import_react5.default.createElement("span", { style: { width: "12px", height: "12px" } }, /* @__PURE__ */ import_react5.default.createElement(
765
840
  "svg",
766
841
  {
767
842
  xmlns: "http://www.w3.org/2000/svg",
@@ -769,7 +844,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
769
844
  height: "1em",
770
845
  viewBox: "0 0 20 20"
771
846
  },
772
- /* @__PURE__ */ import_react4.default.createElement(
847
+ /* @__PURE__ */ import_react5.default.createElement(
773
848
  "path",
774
849
  {
775
850
  fill: "currentColor",
@@ -780,7 +855,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
780
855
  )
781
856
  )
782
857
  },
783
- /* @__PURE__ */ import_react4.default.createElement("div", { ref: historyContainerRef, style: styles.sectionInner }, /* @__PURE__ */ import_react4.default.createElement(
858
+ /* @__PURE__ */ import_react5.default.createElement("div", { ref: historyContainerRef, style: styles.sectionInner }, /* @__PURE__ */ import_react5.default.createElement(
784
859
  "div",
785
860
  {
786
861
  id: `${HISTORY_ELEMENT_PREFIX}0`,
@@ -794,7 +869,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
794
869
  background: historySnapshot.historyIndex === 0 ? "rgb(59 130 246 / 15%)" : void 0
795
870
  }
796
871
  },
797
- /* @__PURE__ */ import_react4.default.createElement(
872
+ /* @__PURE__ */ import_react5.default.createElement(
798
873
  "span",
799
874
  {
800
875
  style: {
@@ -806,7 +881,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
806
881
  },
807
882
  "Initial state"
808
883
  )
809
- ), historySnapshot.history.map((entry, index) => /* @__PURE__ */ import_react4.default.createElement(
884
+ ), historySnapshot.history.map((entry, index) => /* @__PURE__ */ import_react5.default.createElement(
810
885
  "div",
811
886
  {
812
887
  id: `${HISTORY_ELEMENT_PREFIX}${index + 1}`,
@@ -817,7 +892,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
817
892
  background: index + 1 === historySnapshot.historyIndex ? "rgb(59 130 246 / 15%)" : void 0
818
893
  }
819
894
  },
820
- "name" in entry.metadata && typeof entry.metadata.name === "string" && /* @__PURE__ */ import_react4.default.createElement(
895
+ "name" in entry.metadata && typeof entry.metadata.name === "string" && /* @__PURE__ */ import_react5.default.createElement(
821
896
  "pre",
822
897
  {
823
898
  style: {
@@ -828,7 +903,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
828
903
  },
829
904
  entry.metadata.name
830
905
  ),
831
- entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react4.default.createElement(
906
+ entry.redoPatches?.map((patch, j) => /* @__PURE__ */ import_react5.default.createElement(
832
907
  "pre",
833
908
  {
834
909
  key: j,
@@ -838,14 +913,14 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
838
913
  flexWrap: "wrap"
839
914
  }
840
915
  },
841
- patch.op === "add" && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
842
- patch.op === "replace" && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
843
- patch.op === "remove" && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement("span", { style: { color: theme.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
844
- patch.op === "move" && /* @__PURE__ */ import_react4.default.createElement(import_react4.default.Fragment, null, /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
916
+ patch.op === "add" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
917
+ patch.op === "replace" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)), " = ", /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectInspector, { data: patch.value, theme })),
918
+ patch.op === "remove" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("span", { style: { color: theme.OBJECT_VALUE_STRING_COLOR } }, "delete", " "), /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path))),
919
+ patch.op === "move" && /* @__PURE__ */ import_react5.default.createElement(import_react5.default.Fragment, null, /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.from)), " -> ", /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, pathToString(patch.path)))
845
920
  ))
846
921
  )))
847
922
  ),
848
- /* @__PURE__ */ import_react4.default.createElement(
923
+ /* @__PURE__ */ import_react5.default.createElement(
849
924
  DisclosureSection,
850
925
  {
851
926
  title: "Tasks",
@@ -853,7 +928,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
853
928
  open: showTasks,
854
929
  setOpen: setShowTasks
855
930
  },
856
- /* @__PURE__ */ import_react4.default.createElement("div", { style: styles.sectionInner }, tasks?.map((task) => /* @__PURE__ */ import_react4.default.createElement(
931
+ /* @__PURE__ */ import_react5.default.createElement("div", { style: styles.sectionInner }, tasks?.map((task) => /* @__PURE__ */ import_react5.default.createElement(
857
932
  InspectorRow,
858
933
  {
859
934
  key: task.id,
@@ -862,7 +937,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
862
937
  backgroundColor: task.status === "done" ? "rgba(0,255,0,0.2)" : task.status === "error" ? "rgba(255,0,0,0.2)" : void 0
863
938
  }
864
939
  },
865
- /* @__PURE__ */ import_react4.default.createElement(
940
+ /* @__PURE__ */ import_react5.default.createElement(
866
941
  import_react_inspector.ObjectInspector,
867
942
  {
868
943
  name: task.name,
@@ -872,7 +947,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
872
947
  )
873
948
  )))
874
949
  ),
875
- /* @__PURE__ */ import_react4.default.createElement(
950
+ /* @__PURE__ */ import_react5.default.createElement(
876
951
  DisclosureSection,
877
952
  {
878
953
  open: showEphemeral,
@@ -880,7 +955,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
880
955
  title: "Ephemeral User Data",
881
956
  colorScheme
882
957
  },
883
- /* @__PURE__ */ import_react4.default.createElement("div", { style: styles.sectionInner }, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react4.default.createElement(InspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react4.default.createElement(
958
+ /* @__PURE__ */ import_react5.default.createElement("div", { style: styles.sectionInner }, Object.entries(ephemeral).map(([key, value]) => /* @__PURE__ */ import_react5.default.createElement(InspectorRow, { key, colorScheme }, /* @__PURE__ */ import_react5.default.createElement(
884
959
  import_react_inspector.ObjectInspector,
885
960
  {
886
961
  name: key,
@@ -890,7 +965,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
890
965
  }
891
966
  ))))
892
967
  ),
893
- /* @__PURE__ */ import_react4.default.createElement(
968
+ /* @__PURE__ */ import_react5.default.createElement(
894
969
  DisclosureSection,
895
970
  {
896
971
  open: showEvents,
@@ -898,8 +973,8 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
898
973
  title: "Events",
899
974
  colorScheme
900
975
  },
901
- /* @__PURE__ */ import_react4.default.createElement("div", { ref: eventsContainerRef, style: styles.sectionInner }, connectionEvents?.map(
902
- (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react4.default.createElement(InspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react4.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react4.default.createElement(
976
+ /* @__PURE__ */ import_react5.default.createElement("div", { ref: eventsContainerRef, style: styles.sectionInner }, connectionEvents?.map(
977
+ (event, index) => event.type === "stateChange" ? /* @__PURE__ */ import_react5.default.createElement(InspectorRow, { key: index, colorScheme }, "connection:", " ", /* @__PURE__ */ import_react5.default.createElement("span", { style: { fontStyle: "italic" } }, event.state.toLowerCase())) : /* @__PURE__ */ import_react5.default.createElement(
903
978
  InspectorRow,
904
979
  {
905
980
  key: index,
@@ -909,10 +984,10 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
909
984
  padding: "0px 12px 1px"
910
985
  }
911
986
  },
912
- /* @__PURE__ */ import_react4.default.createElement(
987
+ /* @__PURE__ */ import_react5.default.createElement(
913
988
  import_react_inspector.ObjectInspector,
914
989
  {
915
- data: event.message,
990
+ data: event.type === "error" ? event.error : event.message,
916
991
  theme,
917
992
  nodeRenderer: ({
918
993
  depth,
@@ -922,7 +997,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
922
997
  expanded
923
998
  }) => {
924
999
  const direction = event.type === "send" ? "up" : "down";
925
- return depth === 0 ? /* @__PURE__ */ import_react4.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react4.default.createElement(
1000
+ return depth === 0 ? /* @__PURE__ */ import_react5.default.createElement(ObjectRootLabel, { direction, data }) : /* @__PURE__ */ import_react5.default.createElement(
926
1001
  import_react_inspector.ObjectLabel,
927
1002
  {
928
1003
  direction,
@@ -935,7 +1010,7 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
935
1010
  }
936
1011
  )
937
1012
  )
938
- ), !connectionEvents && /* @__PURE__ */ import_react4.default.createElement(
1013
+ ), !connectionEvents && /* @__PURE__ */ import_react5.default.createElement(
939
1014
  "div",
940
1015
  {
941
1016
  style: {
@@ -946,18 +1021,18 @@ var StateInspector = (0, import_react4.memo)(function StateInspector2({
946
1021
  gap: "4px"
947
1022
  }
948
1023
  },
949
- /* @__PURE__ */ import_react4.default.createElement("span", null, "No recorded events")
1024
+ /* @__PURE__ */ import_react5.default.createElement("span", null, "No recorded events")
950
1025
  ))
951
1026
  )
952
1027
  );
953
1028
  });
954
1029
  var ObjectRootLabel = ({ name, data, direction }) => {
955
1030
  if (typeof name === "string") {
956
- return /* @__PURE__ */ import_react4.default.createElement("span", null, /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectName, { name }), /* @__PURE__ */ import_react4.default.createElement("span", null, ": "), /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectPreview, { data }));
1031
+ return /* @__PURE__ */ import_react5.default.createElement("span", null, /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectName, { name }), /* @__PURE__ */ import_react5.default.createElement("span", null, ": "), /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectPreview, { data }));
957
1032
  }
958
1033
  if (direction === "up" || direction === "down") {
959
1034
  const arrow = direction === "up" ? "\u2191" : "\u2193";
960
- return /* @__PURE__ */ import_react4.default.createElement("span", null, /* @__PURE__ */ import_react4.default.createElement(
1035
+ return /* @__PURE__ */ import_react5.default.createElement("span", null, /* @__PURE__ */ import_react5.default.createElement(
961
1036
  "span",
962
1037
  {
963
1038
  style: {
@@ -974,9 +1049,9 @@ var ObjectRootLabel = ({ name, data, direction }) => {
974
1049
  }
975
1050
  },
976
1051
  arrow
977
- ), /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectPreview, { data }));
1052
+ ), /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectPreview, { data }));
978
1053
  } else {
979
- return /* @__PURE__ */ import_react4.default.createElement(import_react_inspector.ObjectPreview, { data });
1054
+ return /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectPreview, { data });
980
1055
  }
981
1056
  };
982
1057
  function Arrow({
@@ -984,7 +1059,7 @@ function Arrow({
984
1059
  onClick,
985
1060
  style
986
1061
  }) {
987
- return /* @__PURE__ */ import_react4.default.createElement(
1062
+ return /* @__PURE__ */ import_react5.default.createElement(
988
1063
  "span",
989
1064
  {
990
1065
  role: "button",
@@ -1027,7 +1102,7 @@ function SmallButton({
1027
1102
  theme,
1028
1103
  disabled
1029
1104
  }) {
1030
- return /* @__PURE__ */ import_react4.default.createElement(
1105
+ return /* @__PURE__ */ import_react5.default.createElement(
1031
1106
  "button",
1032
1107
  {
1033
1108
  type: "button",
@@ -1076,8 +1151,8 @@ function useStateInspector({
1076
1151
  ephemeralUserData,
1077
1152
  forceInit
1078
1153
  }) {
1079
- const [root, setRoot] = import_react5.default.useState(null);
1080
- (0, import_react5.useLayoutEffect)(() => {
1154
+ const [root, setRoot] = import_react6.default.useState(null);
1155
+ (0, import_react6.useLayoutEffect)(() => {
1081
1156
  if (disabled)
1082
1157
  return;
1083
1158
  const portalElement = createPortalElement();
@@ -1088,11 +1163,11 @@ function useStateInspector({
1088
1163
  document.body.removeChild(portalElement);
1089
1164
  };
1090
1165
  }, [disabled]);
1091
- (0, import_react5.useLayoutEffect)(() => {
1166
+ (0, import_react6.useLayoutEffect)(() => {
1092
1167
  if (!root)
1093
1168
  return;
1094
1169
  root.render(
1095
- /* @__PURE__ */ import_react5.default.createElement(
1170
+ /* @__PURE__ */ import_react6.default.createElement(
1096
1171
  StateInspector,
1097
1172
  {
1098
1173
  state,
@@ -1125,27 +1200,27 @@ function useStateInspector({
1125
1200
 
1126
1201
  // src/hooks.ts
1127
1202
  function useSyncStateManager(stateManager, path) {
1128
- const getSnapshot = (0, import_react6.useCallback)(
1203
+ const getSnapshot = (0, import_react7.useCallback)(
1129
1204
  () => typeof path === "string" ? stateManager.getState(path) : stateManager.getState(),
1130
1205
  [stateManager, path]
1131
1206
  );
1132
- return (0, import_react6.useSyncExternalStore)(
1207
+ return (0, import_react7.useSyncExternalStore)(
1133
1208
  stateManager.addListener,
1134
1209
  getSnapshot,
1135
1210
  getSnapshot
1136
1211
  );
1137
1212
  }
1138
1213
  function useManagedState(createInitialState, options) {
1139
- const [stateManager] = (0, import_react6.useState)(
1214
+ const [stateManager] = (0, import_react7.useState)(
1140
1215
  () => new import_state_manager.StateManager(createInitialState(), options)
1141
1216
  );
1142
1217
  const state = useSyncStateManager(stateManager);
1143
- const setState = (0, import_react6.useCallback)(
1218
+ const setState = (0, import_react7.useCallback)(
1144
1219
  (...args) => {
1145
1220
  const [metadata, action] = args.length === 1 ? [void 0, args[0]] : args;
1146
1221
  if (metadata === void 0) {
1147
1222
  const performActionNoMetadata = stateManager.performAction;
1148
- if (typeof action === "function") {
1223
+ if (action instanceof Function) {
1149
1224
  performActionNoMetadata({
1150
1225
  run: action,
1151
1226
  undo: () => state
@@ -1158,7 +1233,7 @@ function useManagedState(createInitialState, options) {
1158
1233
  }
1159
1234
  } else {
1160
1235
  const performActionWithMetadata = stateManager.performAction;
1161
- if (typeof action === "function") {
1236
+ if (action instanceof Function) {
1162
1237
  performActionWithMetadata(metadata, {
1163
1238
  run: action,
1164
1239
  undo: () => state
@@ -1176,14 +1251,14 @@ function useManagedState(createInitialState, options) {
1176
1251
  return [state, setState, stateManager];
1177
1252
  }
1178
1253
  function useManagedHistory(stateManager) {
1179
- return (0, import_react6.useSyncExternalStore)(
1254
+ return (0, import_react7.useSyncExternalStore)(
1180
1255
  stateManager.historyEmittor.addListener,
1181
1256
  stateManager.getHistorySnapshot,
1182
1257
  stateManager.getHistorySnapshot
1183
1258
  );
1184
1259
  }
1185
1260
  function useSyncMultiplayerStateManager(multiplayerStateManager) {
1186
- return (0, import_react6.useSyncExternalStore)(
1261
+ return (0, import_react7.useSyncExternalStore)(
1187
1262
  multiplayerStateManager.addListener,
1188
1263
  multiplayerStateManager.getOptimisticState,
1189
1264
  multiplayerStateManager.getOptimisticState
@@ -1211,7 +1286,7 @@ function throttle(fn, ms) {
1211
1286
  };
1212
1287
  }
1213
1288
  function useEphemeralUserData(ephemeralUserData, options) {
1214
- const throttledAddListener = (0, import_react6.useMemo)(() => {
1289
+ const throttledAddListener = (0, import_react7.useMemo)(() => {
1215
1290
  const throttleMs = options?.throttle ?? 0;
1216
1291
  if (throttleMs > 0) {
1217
1292
  const addListener = (fn) => {
@@ -1222,7 +1297,7 @@ function useEphemeralUserData(ephemeralUserData, options) {
1222
1297
  }
1223
1298
  return ephemeralUserData.addListener;
1224
1299
  }, [ephemeralUserData, options?.throttle]);
1225
- return (0, import_react6.useSyncExternalStore)(
1300
+ return (0, import_react7.useSyncExternalStore)(
1226
1301
  throttledAddListener,
1227
1302
  ephemeralUserData.getSnapshot,
1228
1303
  ephemeralUserData.getSnapshot
@@ -1231,18 +1306,18 @@ function useEphemeralUserData(ephemeralUserData, options) {
1231
1306
  var defaultStubSync = (0, import_state_manager.stubSync)();
1232
1307
  function useMultiplayerState(initialState, options) {
1233
1308
  const { sync = defaultStubSync, ...rest } = options ?? {};
1234
- const [multiplayerStateManager] = (0, import_react6.useState)(
1309
+ const [multiplayerStateManager] = (0, import_react7.useState)(
1235
1310
  () => new import_state_manager.MultiplayerStateManager(initialState, rest)
1236
1311
  );
1237
- const syncRef = (0, import_react6.useRef)(sync);
1238
- const [connectionEvents, setConnectionEvents] = (0, import_react6.useState)();
1239
- const [connectedUsers, setConnectedUsers] = (0, import_react6.useState)([]);
1240
- const [ephemeralUserData] = (0, import_react6.useState)(
1312
+ const syncRef = (0, import_react7.useRef)(sync);
1313
+ const [connectionEvents, setConnectionEvents] = (0, import_react7.useState)();
1314
+ const [connectedUsers, setConnectedUsers] = (0, import_react7.useState)([]);
1315
+ const [ephemeralUserData] = (0, import_react7.useState)(
1241
1316
  () => new import_state_manager.EphemeralUserData()
1242
1317
  );
1243
- const [tasks, setTasks] = (0, import_react6.useState)([]);
1244
- const [userId, setUserId] = (0, import_react6.useState)();
1245
- const extras = (0, import_react6.useMemo)(() => {
1318
+ const [tasks, setTasks] = (0, import_react7.useState)([]);
1319
+ const [userId, setUserId] = (0, import_react7.useState)();
1320
+ const extras = (0, import_react7.useMemo)(() => {
1246
1321
  return {
1247
1322
  tasks,
1248
1323
  userId,
@@ -1269,22 +1344,22 @@ function useMultiplayerState(initialState, options) {
1269
1344
  const globalTrackTasks = useObservable(shouldTrackTasks$);
1270
1345
  const shouldTrackEvents = options?.trackConnectionEvents ?? globalTrackEvents;
1271
1346
  const shouldTrackTasks = options?.trackTasks ?? globalTrackTasks;
1272
- const trackEventsCallbackRef = (0, import_react6.useRef)();
1273
- const trackConnectedUsersCallbackRef = (0, import_react6.useRef)();
1274
- const trackTasksCallbackRef = (0, import_react6.useRef)();
1275
- (0, import_react6.useEffect)(() => {
1347
+ const trackEventsCallbackRef = (0, import_react7.useRef)();
1348
+ const trackConnectedUsersCallbackRef = (0, import_react7.useRef)();
1349
+ const trackTasksCallbackRef = (0, import_react7.useRef)();
1350
+ (0, import_react7.useEffect)(() => {
1276
1351
  trackEventsCallbackRef.current = shouldTrackEvents ? (e) => setConnectionEvents((events) => {
1277
1352
  const updated = events ? [...events, e] : [e];
1278
1353
  return updated.length > 50 ? updated.slice(-50) : updated;
1279
1354
  }) : void 0;
1280
1355
  }, [shouldTrackEvents]);
1281
- (0, import_react6.useEffect)(() => {
1356
+ (0, import_react7.useEffect)(() => {
1282
1357
  trackConnectedUsersCallbackRef.current = (users, userId2) => {
1283
1358
  setConnectedUsers(users);
1284
1359
  setUserId(userId2);
1285
1360
  };
1286
1361
  }, []);
1287
- (0, import_react6.useEffect)(() => {
1362
+ (0, import_react7.useEffect)(() => {
1288
1363
  trackTasksCallbackRef.current = shouldTrackTasks ? (tasks2) => {
1289
1364
  setTasks((old) => {
1290
1365
  const newIds = new Set(tasks2.map((t) => t.id));
@@ -1293,7 +1368,7 @@ function useMultiplayerState(initialState, options) {
1293
1368
  });
1294
1369
  } : void 0;
1295
1370
  }, [shouldTrackTasks]);
1296
- (0, import_react6.useEffect)(() => {
1371
+ (0, import_react7.useEffect)(() => {
1297
1372
  if (syncRef.current) {
1298
1373
  return syncRef.current({
1299
1374
  ms: multiplayerStateManager,
@@ -1305,12 +1380,31 @@ function useMultiplayerState(initialState, options) {
1305
1380
  }
1306
1381
  }, [ephemeralUserData, multiplayerStateManager]);
1307
1382
  const state = useSyncMultiplayerStateManager(multiplayerStateManager);
1308
- const forceInit = (0, import_react6.useCallback)(() => {
1309
- const state2 = typeof initialState === "function" ? initialState() : initialState;
1383
+ const forceInit = (0, import_react7.useCallback)(() => {
1384
+ const state2 = initialState instanceof Function ? initialState() : initialState;
1310
1385
  const schema = options?.schema;
1311
1386
  multiplayerStateManager.sm.clearHistory();
1312
1387
  multiplayerStateManager.sendInit({ force: true, state: state2, schema });
1313
1388
  }, [initialState, multiplayerStateManager, options?.schema]);
1389
+ const [unrecoverableError, setUnrecoverableError] = (0, import_react7.useState)();
1390
+ (0, import_react7.useEffect)(() => {
1391
+ return multiplayerStateManager.errorEmitter.addListener((error) => {
1392
+ setUnrecoverableError(error);
1393
+ });
1394
+ }, [multiplayerStateManager]);
1395
+ (0, import_react7.useEffect)(() => {
1396
+ if (!unrecoverableError)
1397
+ return;
1398
+ const el = document.createElement("div");
1399
+ el.id = "noya-multiplayer-react-error-overlay";
1400
+ document.body.appendChild(el);
1401
+ const root = (0, import_client2.createRoot)(el);
1402
+ root.render((0, import_react7.createElement)(ErrorOverlay, { error: unrecoverableError }));
1403
+ return () => {
1404
+ root.unmount();
1405
+ el.remove();
1406
+ };
1407
+ });
1314
1408
  useStateInspector({
1315
1409
  ephemeralUserData,
1316
1410
  multiplayerStateManager,
@@ -1328,7 +1422,7 @@ function useMultiplayerState(initialState, options) {
1328
1422
 
1329
1423
  // src/noyaApp.ts
1330
1424
  var import_state_manager2 = require("@noya-app/state-manager");
1331
- var import_react7 = require("react");
1425
+ var import_react8 = require("react");
1332
1426
  function createDefaultAppData(initialState) {
1333
1427
  return {
1334
1428
  theme: "light",
@@ -1355,7 +1449,7 @@ function getAppData(initialState) {
1355
1449
  }
1356
1450
  }
1357
1451
  function useAppData(initialState, { schema } = {}) {
1358
- const appData = (0, import_react7.useMemo)(() => {
1452
+ const appData = (0, import_react8.useMemo)(() => {
1359
1453
  return getAppData(
1360
1454
  schema ? (0, import_state_manager2.createValue)(schema, initialState) : initialState
1361
1455
  );
@@ -1363,7 +1457,7 @@ function useAppData(initialState, { schema } = {}) {
1363
1457
  return appData;
1364
1458
  }
1365
1459
  function useBroadcastConnectedUsers(connectedUsers) {
1366
- (0, import_react7.useEffect)(() => {
1460
+ (0, import_react8.useEffect)(() => {
1367
1461
  if (!isEmbeddedApp())
1368
1462
  return;
1369
1463
  const message = {
@@ -1374,7 +1468,7 @@ function useBroadcastConnectedUsers(connectedUsers) {
1374
1468
  }, [connectedUsers]);
1375
1469
  }
1376
1470
  function useBroadcastMenuItems(menuItems, handleSelectMenuItem) {
1377
- (0, import_react7.useEffect)(() => {
1471
+ (0, import_react8.useEffect)(() => {
1378
1472
  if (!isEmbeddedApp())
1379
1473
  return;
1380
1474
  const message = {
@@ -1397,7 +1491,7 @@ function isEmbeddedApp() {
1397
1491
  return window.self !== window.top;
1398
1492
  }
1399
1493
  function useNoyaAppState(initialState, options) {
1400
- const [state] = (0, import_react7.useState)(initialState);
1494
+ const [state] = (0, import_react8.useState)(initialState);
1401
1495
  const {
1402
1496
  multiplayerUrl,
1403
1497
  inspector,
@@ -1407,7 +1501,7 @@ function useNoyaAppState(initialState, options) {
1407
1501
  } = useAppData(state, {
1408
1502
  schema: options.schema
1409
1503
  });
1410
- const sync = (0, import_react7.useMemo)(() => {
1504
+ const sync = (0, import_react8.useMemo)(() => {
1411
1505
  return multiplayerUrl ? (0, import_state_manager2.webSocketSync)(multiplayerUrl) : (0, import_state_manager2.localStorageSync)({ key: options.localStorageKey || "noya-app" });
1412
1506
  }, [multiplayerUrl, options.localStorageKey]);
1413
1507
  const result = useMultiplayerState(noyaAppInitialState, {
@@ -1417,7 +1511,7 @@ function useNoyaAppState(initialState, options) {
1417
1511
  });
1418
1512
  const [, , extras] = result;
1419
1513
  useBroadcastConnectedUsers(extras.connectedUsers);
1420
- const mergedExtras = (0, import_react7.useMemo)(() => {
1514
+ const mergedExtras = (0, import_react8.useMemo)(() => {
1421
1515
  return { ...extras, theme, viewType };
1422
1516
  }, [extras, theme, viewType]);
1423
1517
  return [result[0], result[1], mergedExtras];