@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/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +11 -0
- package/dist/index.d.mts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +208 -114
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +168 -73
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/src/components/ErrorOverlay.tsx +89 -0
- package/src/hooks.ts +39 -14
- package/src/inspector/StateInspector.tsx +2 -6
- package/src/inspector/useStateInspector.tsx +1 -1
- package/src/noyaApp.ts +3 -3
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
|
|
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
|
|
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
|
|
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
|
|
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] =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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,
|
|
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] =
|
|
487
|
-
(0,
|
|
561
|
+
const [didMount, setDidMount] = import_react5.default.useState(false);
|
|
562
|
+
(0, import_react5.useLayoutEffect)(() => {
|
|
488
563
|
setDidMount(true);
|
|
489
564
|
}, []);
|
|
490
|
-
const eventsContainerRef =
|
|
491
|
-
const historyContainerRef =
|
|
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,
|
|
595
|
+
(0, import_react5.useEffect)(() => {
|
|
521
596
|
shouldTrackEvents$.set(showEvents);
|
|
522
597
|
}, [showEvents]);
|
|
523
|
-
(0,
|
|
598
|
+
(0, import_react5.useEffect)(() => {
|
|
524
599
|
shouldTrackTasks$.set(showTasks);
|
|
525
600
|
}, [showTasks]);
|
|
526
|
-
(0,
|
|
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,
|
|
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,
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
743
|
+
/* @__PURE__ */ import_react5.default.createElement("span", null, "No connected users")
|
|
669
744
|
))
|
|
670
745
|
),
|
|
671
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
842
|
-
patch.op === "replace" && /* @__PURE__ */
|
|
843
|
-
patch.op === "remove" && /* @__PURE__ */
|
|
844
|
-
patch.op === "move" && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
902
|
-
(event, index) => event.type === "stateChange" ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
1052
|
+
), /* @__PURE__ */ import_react5.default.createElement(import_react_inspector.ObjectPreview, { data }));
|
|
978
1053
|
} else {
|
|
979
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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] =
|
|
1080
|
-
(0,
|
|
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,
|
|
1166
|
+
(0, import_react6.useLayoutEffect)(() => {
|
|
1092
1167
|
if (!root)
|
|
1093
1168
|
return;
|
|
1094
1169
|
root.render(
|
|
1095
|
-
/* @__PURE__ */
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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 (
|
|
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 (
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1309
|
+
const [multiplayerStateManager] = (0, import_react7.useState)(
|
|
1235
1310
|
() => new import_state_manager.MultiplayerStateManager(initialState, rest)
|
|
1236
1311
|
);
|
|
1237
|
-
const syncRef = (0,
|
|
1238
|
-
const [connectionEvents, setConnectionEvents] = (0,
|
|
1239
|
-
const [connectedUsers, setConnectedUsers] = (0,
|
|
1240
|
-
const [ephemeralUserData] = (0,
|
|
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,
|
|
1244
|
-
const [userId, setUserId] = (0,
|
|
1245
|
-
const extras = (0,
|
|
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,
|
|
1273
|
-
const trackConnectedUsersCallbackRef = (0,
|
|
1274
|
-
const trackTasksCallbackRef = (0,
|
|
1275
|
-
(0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
1309
|
-
const state2 =
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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];
|