@manyrows/appkit-react 0.1.5 → 0.1.6
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.cjs +434 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -3
- package/dist/index.d.ts +10 -3
- package/dist/index.js +435 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -283,6 +283,7 @@ function AppKit(props) {
|
|
|
283
283
|
workspace: props.workspace.trim(),
|
|
284
284
|
appId: props.appId.trim(),
|
|
285
285
|
baseURL: props.baseURL,
|
|
286
|
+
theme: props.theme,
|
|
286
287
|
silent: props.silent,
|
|
287
288
|
throwOnError: props.throwOnError,
|
|
288
289
|
// ✅ If host provides children, hide runtime default authed UI.
|
|
@@ -379,9 +380,442 @@ function AppKit(props) {
|
|
|
379
380
|
/* @__PURE__ */ jsxRuntime.jsx("div", { id: containerId })
|
|
380
381
|
] }) });
|
|
381
382
|
}
|
|
383
|
+
function Toast({ toast, onClose }) {
|
|
384
|
+
React.useEffect(() => {
|
|
385
|
+
if (toast) {
|
|
386
|
+
const timer = setTimeout(onClose, 4e3);
|
|
387
|
+
return () => clearTimeout(timer);
|
|
388
|
+
}
|
|
389
|
+
}, [toast, onClose]);
|
|
390
|
+
if (!toast) return null;
|
|
391
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
392
|
+
"div",
|
|
393
|
+
{
|
|
394
|
+
style: {
|
|
395
|
+
position: "fixed",
|
|
396
|
+
bottom: 24,
|
|
397
|
+
left: "50%",
|
|
398
|
+
transform: "translateX(-50%)",
|
|
399
|
+
padding: "12px 20px",
|
|
400
|
+
borderRadius: 8,
|
|
401
|
+
backgroundColor: toast.type === "success" ? "#2e7d32" : "#d32f2f",
|
|
402
|
+
color: "#fff",
|
|
403
|
+
fontSize: 14,
|
|
404
|
+
fontWeight: 500,
|
|
405
|
+
boxShadow: "0 4px 12px rgba(0,0,0,0.2)",
|
|
406
|
+
zIndex: 1e4,
|
|
407
|
+
display: "flex",
|
|
408
|
+
alignItems: "center",
|
|
409
|
+
gap: 12
|
|
410
|
+
},
|
|
411
|
+
children: [
|
|
412
|
+
toast.message,
|
|
413
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
414
|
+
"button",
|
|
415
|
+
{
|
|
416
|
+
onClick: onClose,
|
|
417
|
+
style: {
|
|
418
|
+
background: "none",
|
|
419
|
+
border: "none",
|
|
420
|
+
color: "#fff",
|
|
421
|
+
cursor: "pointer",
|
|
422
|
+
fontSize: 18,
|
|
423
|
+
lineHeight: 1,
|
|
424
|
+
padding: 0,
|
|
425
|
+
opacity: 0.8
|
|
426
|
+
},
|
|
427
|
+
children: "\xD7"
|
|
428
|
+
}
|
|
429
|
+
)
|
|
430
|
+
]
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
function getInitials(name, email) {
|
|
435
|
+
if (name) {
|
|
436
|
+
const parts = name.trim().split(/\s+/);
|
|
437
|
+
if (parts.length >= 2) {
|
|
438
|
+
return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
|
|
439
|
+
}
|
|
440
|
+
return name.slice(0, 2).toUpperCase();
|
|
441
|
+
}
|
|
442
|
+
if (email) {
|
|
443
|
+
return email.slice(0, 2).toUpperCase();
|
|
444
|
+
}
|
|
445
|
+
return "?";
|
|
446
|
+
}
|
|
447
|
+
function stringToColor(str) {
|
|
448
|
+
let hash = 0;
|
|
449
|
+
for (let i = 0; i < str.length; i++) {
|
|
450
|
+
hash = str.charCodeAt(i) + ((hash << 5) - hash);
|
|
451
|
+
}
|
|
452
|
+
const colors = [
|
|
453
|
+
"#1976d2",
|
|
454
|
+
"#388e3c",
|
|
455
|
+
"#d32f2f",
|
|
456
|
+
"#7b1fa2",
|
|
457
|
+
"#c2185b",
|
|
458
|
+
"#0288d1",
|
|
459
|
+
"#00796b",
|
|
460
|
+
"#f57c00"
|
|
461
|
+
];
|
|
462
|
+
return colors[Math.abs(hash) % colors.length];
|
|
463
|
+
}
|
|
464
|
+
function UserButton({ size = "medium" }) {
|
|
465
|
+
const { snapshot, logout, refresh, readyInfo } = useAppKit();
|
|
466
|
+
const [open, setOpen] = React.useState(false);
|
|
467
|
+
const [loggingOut, setLoggingOut] = React.useState(false);
|
|
468
|
+
const account = snapshot?.appData?.account;
|
|
469
|
+
const initials = getInitials(account?.name, account?.email);
|
|
470
|
+
const avatarColor = stringToColor(account?.email || "user");
|
|
471
|
+
const sizeMap = { small: 32, medium: 40, large: 48 };
|
|
472
|
+
const fontSizeMap = { small: 14, medium: 16, large: 20 };
|
|
473
|
+
const avatarSize = sizeMap[size];
|
|
474
|
+
const handleLogout = async () => {
|
|
475
|
+
setLoggingOut(true);
|
|
476
|
+
try {
|
|
477
|
+
await logout();
|
|
478
|
+
} finally {
|
|
479
|
+
setLoggingOut(false);
|
|
480
|
+
setOpen(false);
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
484
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
485
|
+
"button",
|
|
486
|
+
{
|
|
487
|
+
onClick: () => setOpen(true),
|
|
488
|
+
"aria-label": "Open profile",
|
|
489
|
+
style: {
|
|
490
|
+
display: "flex",
|
|
491
|
+
alignItems: "center",
|
|
492
|
+
justifyContent: "center",
|
|
493
|
+
width: avatarSize,
|
|
494
|
+
height: avatarSize,
|
|
495
|
+
borderRadius: "50%",
|
|
496
|
+
backgroundColor: avatarColor,
|
|
497
|
+
color: "#fff",
|
|
498
|
+
border: "none",
|
|
499
|
+
cursor: "pointer",
|
|
500
|
+
fontSize: fontSizeMap[size],
|
|
501
|
+
fontWeight: 600,
|
|
502
|
+
fontFamily: "inherit",
|
|
503
|
+
padding: 0
|
|
504
|
+
},
|
|
505
|
+
children: initials
|
|
506
|
+
}
|
|
507
|
+
),
|
|
508
|
+
open && /* @__PURE__ */ jsxRuntime.jsx(
|
|
509
|
+
ProfileModal,
|
|
510
|
+
{
|
|
511
|
+
account,
|
|
512
|
+
onClose: () => setOpen(false),
|
|
513
|
+
onLogout: handleLogout,
|
|
514
|
+
loggingOut,
|
|
515
|
+
avatarColor,
|
|
516
|
+
initials,
|
|
517
|
+
baseURL: readyInfo?.baseURL,
|
|
518
|
+
jwtToken: snapshot?.jwtToken,
|
|
519
|
+
onNameUpdated: refresh
|
|
520
|
+
}
|
|
521
|
+
)
|
|
522
|
+
] });
|
|
523
|
+
}
|
|
524
|
+
function ProfileModal({
|
|
525
|
+
account,
|
|
526
|
+
onClose,
|
|
527
|
+
onLogout,
|
|
528
|
+
loggingOut,
|
|
529
|
+
avatarColor,
|
|
530
|
+
initials,
|
|
531
|
+
baseURL,
|
|
532
|
+
jwtToken,
|
|
533
|
+
onNameUpdated
|
|
534
|
+
}) {
|
|
535
|
+
const [editing, setEditing] = React.useState(false);
|
|
536
|
+
const [editName, setEditName] = React.useState(account?.name || "");
|
|
537
|
+
const [saving, setSaving] = React.useState(false);
|
|
538
|
+
const [error, setError] = React.useState(null);
|
|
539
|
+
const [toast, setToast] = React.useState(null);
|
|
540
|
+
const clearToast = React.useCallback(() => setToast(null), []);
|
|
541
|
+
React.useEffect(() => {
|
|
542
|
+
setEditName(account?.name || "");
|
|
543
|
+
setEditing(false);
|
|
544
|
+
setError(null);
|
|
545
|
+
}, [account?.name]);
|
|
546
|
+
const handleSave = async () => {
|
|
547
|
+
const trimmed = editName.trim();
|
|
548
|
+
if (!trimmed) {
|
|
549
|
+
setError("Display name is required");
|
|
550
|
+
return;
|
|
551
|
+
}
|
|
552
|
+
if (trimmed.length > 200) {
|
|
553
|
+
setError("Display name is too long");
|
|
554
|
+
return;
|
|
555
|
+
}
|
|
556
|
+
if (trimmed === account?.name) {
|
|
557
|
+
setEditing(false);
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
setSaving(true);
|
|
561
|
+
setError(null);
|
|
562
|
+
try {
|
|
563
|
+
const res = await fetch(`${baseURL}/a/profile/display-name`, {
|
|
564
|
+
method: "POST",
|
|
565
|
+
headers: {
|
|
566
|
+
Authorization: `Bearer ${jwtToken}`,
|
|
567
|
+
"Content-Type": "application/json"
|
|
568
|
+
},
|
|
569
|
+
body: JSON.stringify({ displayName: trimmed })
|
|
570
|
+
});
|
|
571
|
+
if (!res.ok) {
|
|
572
|
+
const text = await res.text();
|
|
573
|
+
throw new Error(text || "Failed to update name");
|
|
574
|
+
}
|
|
575
|
+
setEditing(false);
|
|
576
|
+
onNameUpdated();
|
|
577
|
+
setToast({ message: "Display name updated", type: "success" });
|
|
578
|
+
} catch (err) {
|
|
579
|
+
const msg = err.message || "Failed to update name";
|
|
580
|
+
setError(msg);
|
|
581
|
+
setToast({ message: msg, type: "error" });
|
|
582
|
+
} finally {
|
|
583
|
+
setSaving(false);
|
|
584
|
+
}
|
|
585
|
+
};
|
|
586
|
+
const handleKeyDown = (e) => {
|
|
587
|
+
if (e.key === "Enter") {
|
|
588
|
+
e.preventDefault();
|
|
589
|
+
handleSave();
|
|
590
|
+
} else if (e.key === "Escape") {
|
|
591
|
+
setEditing(false);
|
|
592
|
+
setEditName(account?.name || "");
|
|
593
|
+
setError(null);
|
|
594
|
+
}
|
|
595
|
+
};
|
|
596
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
597
|
+
"div",
|
|
598
|
+
{
|
|
599
|
+
style: {
|
|
600
|
+
position: "fixed",
|
|
601
|
+
inset: 0,
|
|
602
|
+
zIndex: 9999,
|
|
603
|
+
display: "flex",
|
|
604
|
+
alignItems: "center",
|
|
605
|
+
justifyContent: "center"
|
|
606
|
+
},
|
|
607
|
+
children: [
|
|
608
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
609
|
+
"div",
|
|
610
|
+
{
|
|
611
|
+
onClick: onClose,
|
|
612
|
+
style: {
|
|
613
|
+
position: "absolute",
|
|
614
|
+
inset: 0,
|
|
615
|
+
backgroundColor: "rgba(0, 0, 0, 0.5)"
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
),
|
|
619
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
620
|
+
"div",
|
|
621
|
+
{
|
|
622
|
+
style: {
|
|
623
|
+
position: "relative",
|
|
624
|
+
backgroundColor: "#fff",
|
|
625
|
+
borderRadius: 12,
|
|
626
|
+
boxShadow: "0 8px 32px rgba(0,0,0,0.2)",
|
|
627
|
+
width: "100%",
|
|
628
|
+
maxWidth: 360,
|
|
629
|
+
margin: 16,
|
|
630
|
+
overflow: "hidden"
|
|
631
|
+
},
|
|
632
|
+
children: [
|
|
633
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
634
|
+
"div",
|
|
635
|
+
{
|
|
636
|
+
style: {
|
|
637
|
+
display: "flex",
|
|
638
|
+
alignItems: "center",
|
|
639
|
+
justifyContent: "space-between",
|
|
640
|
+
padding: "16px 20px",
|
|
641
|
+
borderBottom: "1px solid #eee"
|
|
642
|
+
},
|
|
643
|
+
children: [
|
|
644
|
+
/* @__PURE__ */ jsxRuntime.jsx("h2", { style: { margin: 0, fontSize: 18, fontWeight: 600 }, children: "Profile" }),
|
|
645
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
646
|
+
"button",
|
|
647
|
+
{
|
|
648
|
+
onClick: onClose,
|
|
649
|
+
style: {
|
|
650
|
+
background: "none",
|
|
651
|
+
border: "none",
|
|
652
|
+
cursor: "pointer",
|
|
653
|
+
padding: 4,
|
|
654
|
+
fontSize: 20,
|
|
655
|
+
lineHeight: 1,
|
|
656
|
+
color: "#666"
|
|
657
|
+
},
|
|
658
|
+
children: "\xD7"
|
|
659
|
+
}
|
|
660
|
+
)
|
|
661
|
+
]
|
|
662
|
+
}
|
|
663
|
+
),
|
|
664
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { padding: 20 }, children: [
|
|
665
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 16, marginBottom: 20 }, children: [
|
|
666
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
667
|
+
"div",
|
|
668
|
+
{
|
|
669
|
+
style: {
|
|
670
|
+
width: 64,
|
|
671
|
+
height: 64,
|
|
672
|
+
borderRadius: "50%",
|
|
673
|
+
backgroundColor: avatarColor,
|
|
674
|
+
color: "#fff",
|
|
675
|
+
display: "flex",
|
|
676
|
+
alignItems: "center",
|
|
677
|
+
justifyContent: "center",
|
|
678
|
+
fontSize: 24,
|
|
679
|
+
fontWeight: 600,
|
|
680
|
+
flexShrink: 0
|
|
681
|
+
},
|
|
682
|
+
children: initials
|
|
683
|
+
}
|
|
684
|
+
),
|
|
685
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { minWidth: 0, flex: 1 }, children: [
|
|
686
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 18, fontWeight: 600, marginBottom: 2 }, children: account?.name || "User" }),
|
|
687
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
688
|
+
"div",
|
|
689
|
+
{
|
|
690
|
+
style: {
|
|
691
|
+
fontSize: 14,
|
|
692
|
+
color: "#666",
|
|
693
|
+
overflow: "hidden",
|
|
694
|
+
textOverflow: "ellipsis",
|
|
695
|
+
whiteSpace: "nowrap"
|
|
696
|
+
},
|
|
697
|
+
children: account?.email
|
|
698
|
+
}
|
|
699
|
+
)
|
|
700
|
+
] })
|
|
701
|
+
] }),
|
|
702
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { style: { border: "none", borderTop: "1px solid #eee", margin: "16px 0" } }),
|
|
703
|
+
error && /* @__PURE__ */ jsxRuntime.jsx(
|
|
704
|
+
"div",
|
|
705
|
+
{
|
|
706
|
+
style: {
|
|
707
|
+
padding: "10px 14px",
|
|
708
|
+
marginBottom: 16,
|
|
709
|
+
backgroundColor: "#ffebee",
|
|
710
|
+
color: "#c62828",
|
|
711
|
+
borderRadius: 6,
|
|
712
|
+
fontSize: 14
|
|
713
|
+
},
|
|
714
|
+
children: error
|
|
715
|
+
}
|
|
716
|
+
),
|
|
717
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: 16 }, children: [
|
|
718
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", marginBottom: 4 }, children: [
|
|
719
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: "#888", fontWeight: 600 }, children: "Display Name" }),
|
|
720
|
+
!editing && /* @__PURE__ */ jsxRuntime.jsx(
|
|
721
|
+
"button",
|
|
722
|
+
{
|
|
723
|
+
onClick: () => setEditing(true),
|
|
724
|
+
style: {
|
|
725
|
+
background: "none",
|
|
726
|
+
border: "none",
|
|
727
|
+
cursor: "pointer",
|
|
728
|
+
padding: 2,
|
|
729
|
+
fontSize: 12,
|
|
730
|
+
color: "#1976d2"
|
|
731
|
+
},
|
|
732
|
+
children: "Edit"
|
|
733
|
+
}
|
|
734
|
+
)
|
|
735
|
+
] }),
|
|
736
|
+
editing ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8 }, children: [
|
|
737
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
738
|
+
"input",
|
|
739
|
+
{
|
|
740
|
+
type: "text",
|
|
741
|
+
value: editName,
|
|
742
|
+
onChange: (e) => setEditName(e.target.value),
|
|
743
|
+
onKeyDown: handleKeyDown,
|
|
744
|
+
disabled: saving,
|
|
745
|
+
autoFocus: true,
|
|
746
|
+
placeholder: "Enter display name",
|
|
747
|
+
style: {
|
|
748
|
+
flex: 1,
|
|
749
|
+
padding: "8px 12px",
|
|
750
|
+
fontSize: 14,
|
|
751
|
+
border: `1px solid ${error ? "#d32f2f" : "#ddd"}`,
|
|
752
|
+
borderRadius: 6,
|
|
753
|
+
outline: "none"
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
),
|
|
757
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
758
|
+
"button",
|
|
759
|
+
{
|
|
760
|
+
onClick: handleSave,
|
|
761
|
+
disabled: saving,
|
|
762
|
+
style: {
|
|
763
|
+
padding: "8px 14px",
|
|
764
|
+
fontSize: 14,
|
|
765
|
+
backgroundColor: "#1976d2",
|
|
766
|
+
color: "#fff",
|
|
767
|
+
border: "none",
|
|
768
|
+
borderRadius: 6,
|
|
769
|
+
cursor: saving ? "not-allowed" : "pointer",
|
|
770
|
+
opacity: saving ? 0.6 : 1
|
|
771
|
+
},
|
|
772
|
+
children: saving ? "\u2026" : "Save"
|
|
773
|
+
}
|
|
774
|
+
)
|
|
775
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 15 }, children: account?.name || "\u2014" })
|
|
776
|
+
] }),
|
|
777
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginBottom: 20 }, children: [
|
|
778
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 12, color: "#888", fontWeight: 600, marginBottom: 4 }, children: "Email" }),
|
|
779
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontSize: 15 }, children: account?.email || "\u2014" })
|
|
780
|
+
] }),
|
|
781
|
+
/* @__PURE__ */ jsxRuntime.jsx("hr", { style: { border: "none", borderTop: "1px solid #eee", margin: "16px 0" } }),
|
|
782
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
783
|
+
"button",
|
|
784
|
+
{
|
|
785
|
+
onClick: onLogout,
|
|
786
|
+
disabled: loggingOut,
|
|
787
|
+
style: {
|
|
788
|
+
width: "100%",
|
|
789
|
+
padding: "10px 16px",
|
|
790
|
+
fontSize: 15,
|
|
791
|
+
fontWeight: 500,
|
|
792
|
+
color: "#d32f2f",
|
|
793
|
+
backgroundColor: "#fff",
|
|
794
|
+
border: "1px solid #d32f2f",
|
|
795
|
+
borderRadius: 8,
|
|
796
|
+
cursor: loggingOut ? "not-allowed" : "pointer",
|
|
797
|
+
opacity: loggingOut ? 0.6 : 1,
|
|
798
|
+
display: "flex",
|
|
799
|
+
alignItems: "center",
|
|
800
|
+
justifyContent: "center",
|
|
801
|
+
gap: 8
|
|
802
|
+
},
|
|
803
|
+
children: loggingOut ? "Logging out\u2026" : "Log out"
|
|
804
|
+
}
|
|
805
|
+
)
|
|
806
|
+
] })
|
|
807
|
+
]
|
|
808
|
+
}
|
|
809
|
+
),
|
|
810
|
+
/* @__PURE__ */ jsxRuntime.jsx(Toast, { toast, onClose: clearToast })
|
|
811
|
+
]
|
|
812
|
+
}
|
|
813
|
+
);
|
|
814
|
+
}
|
|
382
815
|
|
|
383
816
|
exports.AppKit = AppKit;
|
|
384
817
|
exports.AppKitAuthed = AppKitAuthed;
|
|
818
|
+
exports.UserButton = UserButton;
|
|
385
819
|
exports.useAppKit = useAppKit;
|
|
386
820
|
//# sourceMappingURL=index.cjs.map
|
|
387
821
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime.ts","../src/AppKit.tsx"],"names":["createContext","useContext","jsx","Fragment","jsxs","useId","React","useMemo","useRef","useState","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AppKitRuntime } from \"./types\";\n\nexport function getManyRowsAppKitRuntime(): AppKitRuntime | null {\n const w = window as any;\n\n // Preferred: namespaced\n if (w.ManyRows?.AppKit?.init) return w.ManyRows.AppKit;\n\n // Back-compat: function globals\n if (w.initManyRowsAppKit) {\n return {\n init: w.initManyRowsAppKit,\n destroy: w.destroyManyRowsAppKit,\n info: w.getManyRowsAppKitInfo,\n };\n }\n\n return null;\n}\n\nexport function ensureScriptLoaded(src: string, timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n resolve(); // SSR: noop\n return;\n }\n\n // Already present?\n if (document.querySelector(`script[data-manyrows-appkit=\"true\"][src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n // If runtime already exists, we’re good.\n if (getManyRowsAppKitRuntime()) {\n resolve();\n return;\n }\n\n const s = document.createElement(\"script\");\n s.src = src;\n s.async = true;\n s.crossOrigin = \"anonymous\";\n s.setAttribute(\"data-manyrows-appkit\", \"true\");\n\n const timer = window.setTimeout(() => {\n cleanup();\n reject(new Error(`Timed out loading AppKit script after ${timeoutMs}ms: ${src}`));\n }, timeoutMs);\n\n function cleanup() {\n window.clearTimeout(timer);\n s.onload = null;\n s.onerror = null;\n }\n\n s.onload = () => {\n cleanup();\n resolve();\n };\n\n s.onerror = (e) => {\n cleanup();\n reject(e);\n };\n\n document.head.appendChild(s);\n });\n}\n","// appkit-react/AppKit.tsx\nimport React, {\n createContext,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ManyRowsAppKitError,\n ManyRowsAppKitReady,\n ManyRowsAppKitHandle,\n ManyRowsAppKitSnapshot,\n} from \"./types\";\nimport { ensureScriptLoaded, getManyRowsAppKitRuntime } from \"./runtime\";\n\n// -----------------------------\n// Tiny semver helpers (no deps)\n// -----------------------------\n\ntype Semver = { major: number; minor: number; patch: number };\n\nfunction parseSemver(v: unknown): Semver | null {\n if (typeof v !== \"string\") return null;\n const s = v.trim();\n const m = /^v?(\\d+)\\.(\\d+)\\.(\\d+)/.exec(s);\n if (!m) return null;\n const major = Number(m[1]);\n const minor = Number(m[2]);\n const patch = Number(m[3]);\n if (!Number.isFinite(major) || !Number.isFinite(minor) || !Number.isFinite(patch)) return null;\n return { major, minor, patch };\n}\n\nfunction cmpSemver(a: Semver, b: Semver): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n return a.patch - b.patch;\n}\n\nfunction semverGte(runtimeVersion: unknown, minVersion: string): boolean {\n const r = parseSemver(runtimeVersion);\n const m = parseSemver(minVersion);\n if (!r || !m) return false;\n return cmpSemver(r, m) >= 0;\n}\n\n// -----------------------------\n// Prod/dev safety helpers\n// -----------------------------\n\nfunction isProbablyProdBuild(): boolean {\n const p = (globalThis as any)?.process;\n const env = p?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction looksLikeLocalhost(url: string): boolean {\n const s = (url || \"\").trim().toLowerCase();\n return (\n s.startsWith(\"http://localhost\") ||\n s.startsWith(\"https://localhost\") ||\n s.startsWith(\"http://127.0.0.1\") ||\n s.startsWith(\"https://127.0.0.1\") ||\n s.startsWith(\"http://0.0.0.0\") ||\n s.startsWith(\"https://0.0.0.0\")\n );\n}\n\n// -----------------------------\n// Auth predicate (snapshot is loose)\n// -----------------------------\n\nfunction isAuthedSnapshot(s: ManyRowsAppKitSnapshot | null | undefined): boolean {\n if (!s || typeof s !== \"object\") return false;\n const status = (s as any).status;\n if (status !== \"authenticated\") return false;\n\n const appData = (s as any).appData;\n if (!appData || typeof appData !== \"object\") return false;\n\n // don’t over-constrain v0\n return true;\n}\n\n// -----------------------------\n// AppKit context + hook\n// -----------------------------\n\nexport type AppKitContextValue = {\n status: \"idle\" | \"loading\" | \"mounted\" | \"error\";\n error: ManyRowsAppKitError | null;\n\n readyInfo: ManyRowsAppKitReady | null;\n snapshot: ManyRowsAppKitSnapshot | null;\n\n // convenience derived flag\n isAuthenticated: boolean;\n\n // present when runtime supports handle API\n handle: ManyRowsAppKitHandle | null;\n\n // convenience methods (safe no-ops if handle missing)\n refresh: () => void;\n logout: () => Promise<void>;\n setToken: (tok: string | null) => void;\n destroy: () => void;\n info: () => ManyRowsAppKitReady | null;\n};\n\nconst Ctx = createContext<AppKitContextValue | null>(null);\n\nexport function useAppKit(): AppKitContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useAppKit() must be used under <AppKit />\");\n return v;\n}\n\n/**\n * Render children only when the AppKit runtime is authenticated and appData exists.\n * Use this to mount your customer app \"behind\" the AppKit login screen.\n */\nexport function AppKitAuthed(props: {\n children: React.ReactNode;\n /**\n * Optional: shown when not authenticated (or still checking).\n * Default: null (render nothing).\n */\n fallback?: React.ReactNode;\n}) {\n const { isAuthenticated } = useAppKit();\n if (!isAuthenticated) return <>{props.fallback ?? null}</>;\n return <>{props.children}</>;\n}\n\n// -----------------------------\n// Props\n// -----------------------------\n\nexport type AppKitProps = {\n workspace: string;\n\n // ✅ replaces project+env\n appId: string;\n\n baseURL?: string;\n\n src?: string;\n timeoutMs?: number;\n\n silent?: boolean;\n throwOnError?: boolean;\n\n onReady?: (info: ManyRowsAppKitReady) => void;\n onError?: (err: ManyRowsAppKitError) => void;\n\n /**\n * Fired for every snapshot update from the runtime (checking/unauth/authed/etc).\n */\n onState?: (snapshot: ManyRowsAppKitSnapshot | null) => void;\n\n /**\n * Fired when AppKit is authenticated and appData is available.\n * This is the correct place to render the customer app (imperative style).\n */\n onReadyState?: (snapshot: ManyRowsAppKitSnapshot) => void;\n\n className?: string;\n style?: React.CSSProperties;\n containerId?: string;\n\n runtimeMinVersion?: string;\n runtimeExactVersion?: string;\n\n loading?: React.ReactNode;\n errorUI?: (err: ManyRowsAppKitError) => React.ReactNode;\n hideLoadingUI?: boolean;\n hideErrorUI?: boolean;\n\n // kept for future (no longer used now that env is arbitrary)\n allowDevEnvInProd?: boolean;\n blockLocalhostBaseURLInProd?: boolean;\n\n // ✅ allow <AppKit>children</AppKit>\n children?: React.ReactNode;\n};\n\n// -----------------------------\n// Errors / UI\n// -----------------------------\n\nfunction mkErr(\n code: ManyRowsAppKitError[\"code\"],\n message: string,\n details?: unknown\n): ManyRowsAppKitError {\n return { code, message, details };\n}\n\nfunction DefaultError({ err }: { err: ManyRowsAppKitError }) {\n return (\n <div\n role=\"alert\"\n style={{\n width: \"100%\",\n borderRadius: 10,\n border: \"1px solid rgba(220, 38, 38, 0.35)\",\n background: \"rgba(220, 38, 38, 0.06)\",\n padding: 12,\n fontFamily:\n 'ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 6 }}>ManyRows AppKit failed to load</div>\n <div style={{ fontSize: 13, marginBottom: 8 }}>\n <span style={{ fontWeight: 600 }}>{err.code}</span>: {err.message}\n </div>\n {err.details !== undefined ? (\n <pre\n style={{\n fontSize: 12,\n margin: 0,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n opacity: 0.8,\n }}\n >\n {typeof err.details === \"string\" ? err.details : JSON.stringify(err.details, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n}\n\n// -----------------------------\n// Component\n// -----------------------------\n\nexport function AppKit(props: AppKitProps) {\n const autoId = useId();\n const containerId = props.containerId ?? `manyrows-appkit-${autoId.replace(/[:]/g, \"\")}`;\n\n // If host supplies children, we assume host wants to own the authed UI.\n // In that case, suppress the runtime's *default* authed screen by passing renderAuthed={() => null}.\n const hasChildren = React.Children.count(props.children) > 0;\n\n const initKey = useMemo(\n () =>\n [\n containerId,\n props.workspace,\n props.appId,\n props.baseURL ?? \"\",\n props.src ?? \"\",\n props.runtimeMinVersion ?? \"\",\n props.runtimeExactVersion ?? \"\",\n props.allowDevEnvInProd ? \"1\" : \"0\",\n props.blockLocalhostBaseURLInProd === false ? \"0\" : \"1\",\n hasChildren ? \"children:1\" : \"children:0\",\n ].join(\"|\"),\n [\n containerId,\n props.workspace,\n props.appId,\n props.baseURL,\n props.src,\n props.runtimeMinVersion,\n props.runtimeExactVersion,\n props.allowDevEnvInProd,\n props.blockLocalhostBaseURLInProd,\n hasChildren,\n ]\n );\n\n const handleRef = useRef<ManyRowsAppKitHandle | null>(null);\n\n const [status, setStatus] = useState<\"idle\" | \"loading\" | \"mounted\" | \"error\">(\"idle\");\n const [lastError, setLastError] = useState<ManyRowsAppKitError | null>(null);\n\n const [readyInfo, setReadyInfo] = useState<ManyRowsAppKitReady | null>(null);\n const [snapshot, setSnapshot] = useState<ManyRowsAppKitSnapshot | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n setStatus(\"loading\");\n setLastError(null);\n setReadyInfo(null);\n setSnapshot(null);\n handleRef.current = null;\n\n const report = (err: ManyRowsAppKitError) => {\n setLastError(err);\n setStatus(\"error\");\n\n if (!props.silent) {\n // eslint-disable-next-line no-console\n console.warn(\"[@manyrows/appkit-react]\", err.code, err.message, err.details ?? \"\");\n }\n props.onError?.(err);\n };\n\n const init = async () => {\n if (!props.workspace?.trim() || !props.appId?.trim()) {\n report(\n mkErr(\"INVALID_PROPS\", \"workspace and appId are required.\", {\n workspace: props.workspace,\n appId: props.appId,\n })\n );\n return;\n }\n\n const prod = isProbablyProdBuild();\n\n if (\n prod &&\n props.blockLocalhostBaseURLInProd !== false &&\n props.baseURL &&\n looksLikeLocalhost(props.baseURL)\n ) {\n report(\n mkErr(\n \"BASE_URL_NOT_ALLOWED_IN_PROD\",\n \"localhost baseURL is not allowed in production builds.\",\n { baseURL: props.baseURL }\n )\n );\n return;\n }\n\n try {\n const timeoutMs = props.timeoutMs ?? (props.src ? 4000 : 2500);\n\n if (props.src) {\n await ensureScriptLoaded(props.src, timeoutMs);\n }\n\n const start = Date.now();\n while (!getManyRowsAppKitRuntime() && Date.now() - start < timeoutMs) {\n if (cancelled) return;\n await new Promise((r) => setTimeout(r, 25));\n }\n\n const api = getManyRowsAppKitRuntime();\n if (!api) {\n report(\n mkErr(\n props.src ? \"SCRIPT_TIMEOUT\" : \"RUNTIME_NOT_FOUND\",\n props.src\n ? `AppKit runtime not found after loading script: ${props.src}`\n : \"AppKit runtime not found.\",\n { src: props.src }\n )\n );\n return;\n }\n\n const runtimeVersion: unknown = (api as any)?.version;\n\n if (props.runtimeExactVersion) {\n const expected = props.runtimeExactVersion.trim();\n if (!expected) {\n report(mkErr(\"INVALID_PROPS\", \"runtimeExactVersion must be a non-empty string.\"));\n return;\n }\n const found = typeof runtimeVersion === \"string\" ? runtimeVersion.trim() : \"\";\n if (found !== expected) {\n report(\n mkErr(\"RUNTIME_VERSION_MISMATCH\", \"AppKit runtime version mismatch.\", {\n expected,\n found: runtimeVersion,\n })\n );\n return;\n }\n } else if (props.runtimeMinVersion) {\n const min = props.runtimeMinVersion.trim();\n if (!min) {\n report(mkErr(\"INVALID_PROPS\", \"runtimeMinVersion must be a non-empty string.\"));\n return;\n }\n const ok = semverGte(runtimeVersion, min);\n if (!ok) {\n report(\n mkErr(\"RUNTIME_VERSION_TOO_OLD\", \"AppKit runtime is too old.\", {\n requiredMin: min,\n found: runtimeVersion,\n parsedFound: parseSemver(runtimeVersion),\n })\n );\n return;\n }\n }\n\n const handle = (api as any).init({\n containerId,\n workspace: props.workspace.trim(),\n appId: props.appId.trim(),\n baseURL: props.baseURL,\n silent: props.silent,\n throwOnError: props.throwOnError,\n\n // ✅ If host provides children, hide runtime default authed UI.\n // Runtime will still render login / errors / forbidden screens as normal.\n renderAuthed: hasChildren ? (() => null) : undefined,\n\n onReady: (info: ManyRowsAppKitReady) => {\n if (cancelled) return;\n setStatus(\"mounted\");\n setLastError(null);\n setReadyInfo(info);\n props.onReady?.(info);\n },\n\n onState: (s: ManyRowsAppKitSnapshot | null) => {\n if (cancelled) return;\n setSnapshot(s);\n props.onState?.(s);\n },\n\n onReadyState: (s: ManyRowsAppKitSnapshot) => {\n if (cancelled) return;\n props.onReadyState?.(s);\n },\n\n onError: (e: any) => {\n report(mkErr(\"RUNTIME_ERROR\", \"AppKit runtime error.\", e));\n },\n });\n\n handleRef.current = handle ?? null;\n } catch (e) {\n report(mkErr(\"SCRIPT_LOAD_FAILED\", \"Failed to load AppKit script.\", { error: e }));\n }\n };\n\n void init();\n\n return () => {\n cancelled = true;\n\n try {\n handleRef.current?.destroy?.();\n } catch {\n // ignore\n }\n\n try {\n const api = getManyRowsAppKitRuntime();\n api?.destroy?.(containerId);\n } catch {\n // ignore\n }\n\n handleRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initKey]);\n\n const showLoading = status === \"loading\" && !props.hideLoadingUI;\n const showError = status === \"error\" && !!lastError && !props.hideErrorUI;\n\n const ctx: AppKitContextValue = useMemo(() => {\n const h = handleRef.current;\n\n return {\n status,\n error: lastError,\n readyInfo,\n snapshot,\n isAuthenticated: isAuthedSnapshot(snapshot),\n handle: h,\n\n refresh: () => {\n try {\n h?.refresh?.();\n } catch {\n // ignore\n }\n },\n logout: async () => {\n try {\n await h?.logout?.();\n } catch {\n // ignore\n }\n },\n setToken: (tok: string | null) => {\n try {\n h?.setToken?.(tok);\n } catch {\n // ignore\n }\n },\n destroy: () => {\n try {\n h?.destroy?.();\n } catch {\n // ignore\n }\n },\n info: () => {\n try {\n return h?.info?.() ?? null;\n } catch {\n return null;\n }\n },\n };\n }, [status, lastError, readyInfo, snapshot]);\n\n return (\n <Ctx.Provider value={ctx}>\n <div className={props.className} style={props.style}>\n {showLoading && props.loading ? props.loading : null}\n {showError && lastError\n ? props.errorUI\n ? props.errorUI(lastError)\n : <DefaultError err={lastError} />\n : null}\n\n {/* Host-side children (can use AppKitAuthed/useAppKit) */}\n {props.children}\n\n {/* Runtime owns all UI inside this container */}\n <div id={containerId} />\n </div>\n </Ctx.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runtime.ts","../src/AppKit.tsx","../src/UserButton.tsx"],"names":["createContext","useContext","jsx","Fragment","jsxs","useId","React","useMemo","useRef","useState","useEffect","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { AppKitRuntime } from \"./types\";\n\nexport function getManyRowsAppKitRuntime(): AppKitRuntime | null {\n const w = window as any;\n\n // Preferred: namespaced\n if (w.ManyRows?.AppKit?.init) return w.ManyRows.AppKit;\n\n // Back-compat: function globals\n if (w.initManyRowsAppKit) {\n return {\n init: w.initManyRowsAppKit,\n destroy: w.destroyManyRowsAppKit,\n info: w.getManyRowsAppKitInfo,\n };\n }\n\n return null;\n}\n\nexport function ensureScriptLoaded(src: string, timeoutMs: number): Promise<void> {\n return new Promise((resolve, reject) => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n resolve(); // SSR: noop\n return;\n }\n\n // Already present?\n if (document.querySelector(`script[data-manyrows-appkit=\"true\"][src=\"${src}\"]`)) {\n resolve();\n return;\n }\n\n // If runtime already exists, we’re good.\n if (getManyRowsAppKitRuntime()) {\n resolve();\n return;\n }\n\n const s = document.createElement(\"script\");\n s.src = src;\n s.async = true;\n s.crossOrigin = \"anonymous\";\n s.setAttribute(\"data-manyrows-appkit\", \"true\");\n\n const timer = window.setTimeout(() => {\n cleanup();\n reject(new Error(`Timed out loading AppKit script after ${timeoutMs}ms: ${src}`));\n }, timeoutMs);\n\n function cleanup() {\n window.clearTimeout(timer);\n s.onload = null;\n s.onerror = null;\n }\n\n s.onload = () => {\n cleanup();\n resolve();\n };\n\n s.onerror = (e) => {\n cleanup();\n reject(e);\n };\n\n document.head.appendChild(s);\n });\n}\n","// appkit-react/AppKit.tsx\nimport React, {\n createContext,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ManyRowsAppKitError,\n ManyRowsAppKitReady,\n ManyRowsAppKitHandle,\n ManyRowsAppKitSnapshot,\n} from \"./types\";\nimport { ensureScriptLoaded, getManyRowsAppKitRuntime } from \"./runtime\";\n\n// -----------------------------\n// Tiny semver helpers (no deps)\n// -----------------------------\n\ntype Semver = { major: number; minor: number; patch: number };\n\nfunction parseSemver(v: unknown): Semver | null {\n if (typeof v !== \"string\") return null;\n const s = v.trim();\n const m = /^v?(\\d+)\\.(\\d+)\\.(\\d+)/.exec(s);\n if (!m) return null;\n const major = Number(m[1]);\n const minor = Number(m[2]);\n const patch = Number(m[3]);\n if (!Number.isFinite(major) || !Number.isFinite(minor) || !Number.isFinite(patch)) return null;\n return { major, minor, patch };\n}\n\nfunction cmpSemver(a: Semver, b: Semver): number {\n if (a.major !== b.major) return a.major - b.major;\n if (a.minor !== b.minor) return a.minor - b.minor;\n return a.patch - b.patch;\n}\n\nfunction semverGte(runtimeVersion: unknown, minVersion: string): boolean {\n const r = parseSemver(runtimeVersion);\n const m = parseSemver(minVersion);\n if (!r || !m) return false;\n return cmpSemver(r, m) >= 0;\n}\n\n// -----------------------------\n// Prod/dev safety helpers\n// -----------------------------\n\nfunction isProbablyProdBuild(): boolean {\n const p = (globalThis as any)?.process;\n const env = p?.env?.NODE_ENV;\n return env === \"production\";\n}\n\nfunction looksLikeLocalhost(url: string): boolean {\n const s = (url || \"\").trim().toLowerCase();\n return (\n s.startsWith(\"http://localhost\") ||\n s.startsWith(\"https://localhost\") ||\n s.startsWith(\"http://127.0.0.1\") ||\n s.startsWith(\"https://127.0.0.1\") ||\n s.startsWith(\"http://0.0.0.0\") ||\n s.startsWith(\"https://0.0.0.0\")\n );\n}\n\n// -----------------------------\n// Auth predicate (snapshot is loose)\n// -----------------------------\n\nfunction isAuthedSnapshot(s: ManyRowsAppKitSnapshot | null | undefined): boolean {\n if (!s || typeof s !== \"object\") return false;\n const status = (s as any).status;\n if (status !== \"authenticated\") return false;\n\n const appData = (s as any).appData;\n if (!appData || typeof appData !== \"object\") return false;\n\n // don’t over-constrain v0\n return true;\n}\n\n// -----------------------------\n// AppKit context + hook\n// -----------------------------\n\nexport type AppKitContextValue = {\n status: \"idle\" | \"loading\" | \"mounted\" | \"error\";\n error: ManyRowsAppKitError | null;\n\n readyInfo: ManyRowsAppKitReady | null;\n snapshot: ManyRowsAppKitSnapshot | null;\n\n // convenience derived flag\n isAuthenticated: boolean;\n\n // present when runtime supports handle API\n handle: ManyRowsAppKitHandle | null;\n\n // convenience methods (safe no-ops if handle missing)\n refresh: () => void;\n logout: () => Promise<void>;\n setToken: (tok: string | null) => void;\n destroy: () => void;\n info: () => ManyRowsAppKitReady | null;\n};\n\nconst Ctx = createContext<AppKitContextValue | null>(null);\n\nexport function useAppKit(): AppKitContextValue {\n const v = useContext(Ctx);\n if (!v) throw new Error(\"useAppKit() must be used under <AppKit />\");\n return v;\n}\n\n/**\n * Render children only when the AppKit runtime is authenticated and appData exists.\n * Use this to mount your customer app \"behind\" the AppKit login screen.\n */\nexport function AppKitAuthed(props: {\n children: React.ReactNode;\n /**\n * Optional: shown when not authenticated (or still checking).\n * Default: null (render nothing).\n */\n fallback?: React.ReactNode;\n}) {\n const { isAuthenticated } = useAppKit();\n if (!isAuthenticated) return <>{props.fallback ?? null}</>;\n return <>{props.children}</>;\n}\n\n// -----------------------------\n// Props\n// -----------------------------\n\nexport type AppKitTheme = {\n primaryColor?: string;\n};\n\nexport type AppKitProps = {\n workspace: string;\n\n // ✅ replaces project+env\n appId: string;\n\n baseURL?: string;\n\n // ✅ Theme customization\n theme?: AppKitTheme;\n\n src?: string;\n timeoutMs?: number;\n\n silent?: boolean;\n throwOnError?: boolean;\n\n onReady?: (info: ManyRowsAppKitReady) => void;\n onError?: (err: ManyRowsAppKitError) => void;\n\n /**\n * Fired for every snapshot update from the runtime (checking/unauth/authed/etc).\n */\n onState?: (snapshot: ManyRowsAppKitSnapshot | null) => void;\n\n /**\n * Fired when AppKit is authenticated and appData is available.\n * This is the correct place to render the customer app (imperative style).\n */\n onReadyState?: (snapshot: ManyRowsAppKitSnapshot) => void;\n\n className?: string;\n style?: React.CSSProperties;\n containerId?: string;\n\n runtimeMinVersion?: string;\n runtimeExactVersion?: string;\n\n loading?: React.ReactNode;\n errorUI?: (err: ManyRowsAppKitError) => React.ReactNode;\n hideLoadingUI?: boolean;\n hideErrorUI?: boolean;\n\n // kept for future (no longer used now that env is arbitrary)\n allowDevEnvInProd?: boolean;\n blockLocalhostBaseURLInProd?: boolean;\n\n // ✅ allow <AppKit>children</AppKit>\n children?: React.ReactNode;\n};\n\n// -----------------------------\n// Errors / UI\n// -----------------------------\n\nfunction mkErr(\n code: ManyRowsAppKitError[\"code\"],\n message: string,\n details?: unknown\n): ManyRowsAppKitError {\n return { code, message, details };\n}\n\nfunction DefaultError({ err }: { err: ManyRowsAppKitError }) {\n return (\n <div\n role=\"alert\"\n style={{\n width: \"100%\",\n borderRadius: 10,\n border: \"1px solid rgba(220, 38, 38, 0.35)\",\n background: \"rgba(220, 38, 38, 0.06)\",\n padding: 12,\n fontFamily:\n 'ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n }}\n >\n <div style={{ fontWeight: 700, marginBottom: 6 }}>ManyRows AppKit failed to load</div>\n <div style={{ fontSize: 13, marginBottom: 8 }}>\n <span style={{ fontWeight: 600 }}>{err.code}</span>: {err.message}\n </div>\n {err.details !== undefined ? (\n <pre\n style={{\n fontSize: 12,\n margin: 0,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n opacity: 0.8,\n }}\n >\n {typeof err.details === \"string\" ? err.details : JSON.stringify(err.details, null, 2)}\n </pre>\n ) : null}\n </div>\n );\n}\n\n// -----------------------------\n// Component\n// -----------------------------\n\nexport function AppKit(props: AppKitProps) {\n const autoId = useId();\n const containerId = props.containerId ?? `manyrows-appkit-${autoId.replace(/[:]/g, \"\")}`;\n\n // If host supplies children, we assume host wants to own the authed UI.\n // In that case, suppress the runtime's *default* authed screen by passing renderAuthed={() => null}.\n const hasChildren = React.Children.count(props.children) > 0;\n\n const initKey = useMemo(\n () =>\n [\n containerId,\n props.workspace,\n props.appId,\n props.baseURL ?? \"\",\n props.src ?? \"\",\n props.runtimeMinVersion ?? \"\",\n props.runtimeExactVersion ?? \"\",\n props.allowDevEnvInProd ? \"1\" : \"0\",\n props.blockLocalhostBaseURLInProd === false ? \"0\" : \"1\",\n hasChildren ? \"children:1\" : \"children:0\",\n ].join(\"|\"),\n [\n containerId,\n props.workspace,\n props.appId,\n props.baseURL,\n props.src,\n props.runtimeMinVersion,\n props.runtimeExactVersion,\n props.allowDevEnvInProd,\n props.blockLocalhostBaseURLInProd,\n hasChildren,\n ]\n );\n\n const handleRef = useRef<ManyRowsAppKitHandle | null>(null);\n\n const [status, setStatus] = useState<\"idle\" | \"loading\" | \"mounted\" | \"error\">(\"idle\");\n const [lastError, setLastError] = useState<ManyRowsAppKitError | null>(null);\n\n const [readyInfo, setReadyInfo] = useState<ManyRowsAppKitReady | null>(null);\n const [snapshot, setSnapshot] = useState<ManyRowsAppKitSnapshot | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n setStatus(\"loading\");\n setLastError(null);\n setReadyInfo(null);\n setSnapshot(null);\n handleRef.current = null;\n\n const report = (err: ManyRowsAppKitError) => {\n setLastError(err);\n setStatus(\"error\");\n\n if (!props.silent) {\n // eslint-disable-next-line no-console\n console.warn(\"[@manyrows/appkit-react]\", err.code, err.message, err.details ?? \"\");\n }\n props.onError?.(err);\n };\n\n const init = async () => {\n if (!props.workspace?.trim() || !props.appId?.trim()) {\n report(\n mkErr(\"INVALID_PROPS\", \"workspace and appId are required.\", {\n workspace: props.workspace,\n appId: props.appId,\n })\n );\n return;\n }\n\n const prod = isProbablyProdBuild();\n\n if (\n prod &&\n props.blockLocalhostBaseURLInProd !== false &&\n props.baseURL &&\n looksLikeLocalhost(props.baseURL)\n ) {\n report(\n mkErr(\n \"BASE_URL_NOT_ALLOWED_IN_PROD\",\n \"localhost baseURL is not allowed in production builds.\",\n { baseURL: props.baseURL }\n )\n );\n return;\n }\n\n try {\n const timeoutMs = props.timeoutMs ?? (props.src ? 4000 : 2500);\n\n if (props.src) {\n await ensureScriptLoaded(props.src, timeoutMs);\n }\n\n const start = Date.now();\n while (!getManyRowsAppKitRuntime() && Date.now() - start < timeoutMs) {\n if (cancelled) return;\n await new Promise((r) => setTimeout(r, 25));\n }\n\n const api = getManyRowsAppKitRuntime();\n if (!api) {\n report(\n mkErr(\n props.src ? \"SCRIPT_TIMEOUT\" : \"RUNTIME_NOT_FOUND\",\n props.src\n ? `AppKit runtime not found after loading script: ${props.src}`\n : \"AppKit runtime not found.\",\n { src: props.src }\n )\n );\n return;\n }\n\n const runtimeVersion: unknown = (api as any)?.version;\n\n if (props.runtimeExactVersion) {\n const expected = props.runtimeExactVersion.trim();\n if (!expected) {\n report(mkErr(\"INVALID_PROPS\", \"runtimeExactVersion must be a non-empty string.\"));\n return;\n }\n const found = typeof runtimeVersion === \"string\" ? runtimeVersion.trim() : \"\";\n if (found !== expected) {\n report(\n mkErr(\"RUNTIME_VERSION_MISMATCH\", \"AppKit runtime version mismatch.\", {\n expected,\n found: runtimeVersion,\n })\n );\n return;\n }\n } else if (props.runtimeMinVersion) {\n const min = props.runtimeMinVersion.trim();\n if (!min) {\n report(mkErr(\"INVALID_PROPS\", \"runtimeMinVersion must be a non-empty string.\"));\n return;\n }\n const ok = semverGte(runtimeVersion, min);\n if (!ok) {\n report(\n mkErr(\"RUNTIME_VERSION_TOO_OLD\", \"AppKit runtime is too old.\", {\n requiredMin: min,\n found: runtimeVersion,\n parsedFound: parseSemver(runtimeVersion),\n })\n );\n return;\n }\n }\n\n const handle = (api as any).init({\n containerId,\n workspace: props.workspace.trim(),\n appId: props.appId.trim(),\n baseURL: props.baseURL,\n theme: props.theme,\n silent: props.silent,\n throwOnError: props.throwOnError,\n\n // ✅ If host provides children, hide runtime default authed UI.\n // Runtime will still render login / errors / forbidden screens as normal.\n renderAuthed: hasChildren ? (() => null) : undefined,\n\n onReady: (info: ManyRowsAppKitReady) => {\n if (cancelled) return;\n setStatus(\"mounted\");\n setLastError(null);\n setReadyInfo(info);\n props.onReady?.(info);\n },\n\n onState: (s: ManyRowsAppKitSnapshot | null) => {\n if (cancelled) return;\n setSnapshot(s);\n props.onState?.(s);\n },\n\n onReadyState: (s: ManyRowsAppKitSnapshot) => {\n if (cancelled) return;\n props.onReadyState?.(s);\n },\n\n onError: (e: any) => {\n report(mkErr(\"RUNTIME_ERROR\", \"AppKit runtime error.\", e));\n },\n });\n\n handleRef.current = handle ?? null;\n } catch (e) {\n report(mkErr(\"SCRIPT_LOAD_FAILED\", \"Failed to load AppKit script.\", { error: e }));\n }\n };\n\n void init();\n\n return () => {\n cancelled = true;\n\n try {\n handleRef.current?.destroy?.();\n } catch {\n // ignore\n }\n\n try {\n const api = getManyRowsAppKitRuntime();\n api?.destroy?.(containerId);\n } catch {\n // ignore\n }\n\n handleRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initKey]);\n\n const showLoading = status === \"loading\" && !props.hideLoadingUI;\n const showError = status === \"error\" && !!lastError && !props.hideErrorUI;\n\n const ctx: AppKitContextValue = useMemo(() => {\n const h = handleRef.current;\n\n return {\n status,\n error: lastError,\n readyInfo,\n snapshot,\n isAuthenticated: isAuthedSnapshot(snapshot),\n handle: h,\n\n refresh: () => {\n try {\n h?.refresh?.();\n } catch {\n // ignore\n }\n },\n logout: async () => {\n try {\n await h?.logout?.();\n } catch {\n // ignore\n }\n },\n setToken: (tok: string | null) => {\n try {\n h?.setToken?.(tok);\n } catch {\n // ignore\n }\n },\n destroy: () => {\n try {\n h?.destroy?.();\n } catch {\n // ignore\n }\n },\n info: () => {\n try {\n return h?.info?.() ?? null;\n } catch {\n return null;\n }\n },\n };\n }, [status, lastError, readyInfo, snapshot]);\n\n return (\n <Ctx.Provider value={ctx}>\n <div className={props.className} style={props.style}>\n {showLoading && props.loading ? props.loading : null}\n {showError && lastError\n ? props.errorUI\n ? props.errorUI(lastError)\n : <DefaultError err={lastError} />\n : null}\n\n {/* Host-side children (can use AppKitAuthed/useAppKit) */}\n {props.children}\n\n {/* Runtime owns all UI inside this container */}\n <div id={containerId} />\n </div>\n </Ctx.Provider>\n );\n}\n","import React, { useState, useEffect, useCallback } from \"react\";\nimport { useAppKit } from \"./AppKit\";\n\ntype ToastType = { message: string; type: \"success\" | \"error\" } | null;\n\nfunction Toast({ toast, onClose }: { toast: ToastType; onClose: () => void }) {\n useEffect(() => {\n if (toast) {\n const timer = setTimeout(onClose, 4000);\n return () => clearTimeout(timer);\n }\n }, [toast, onClose]);\n\n if (!toast) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 24,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n padding: \"12px 20px\",\n borderRadius: 8,\n backgroundColor: toast.type === \"success\" ? \"#2e7d32\" : \"#d32f2f\",\n color: \"#fff\",\n fontSize: 14,\n fontWeight: 500,\n boxShadow: \"0 4px 12px rgba(0,0,0,0.2)\",\n zIndex: 10000,\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n }}\n >\n {toast.message}\n <button\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n color: \"#fff\",\n cursor: \"pointer\",\n fontSize: 18,\n lineHeight: 1,\n padding: 0,\n opacity: 0.8,\n }}\n >\n ×\n </button>\n </div>\n );\n}\n\nfunction getInitials(name?: string, email?: string): string {\n if (name) {\n const parts = name.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return name.slice(0, 2).toUpperCase();\n }\n if (email) {\n return email.slice(0, 2).toUpperCase();\n }\n return \"?\";\n}\n\nfunction stringToColor(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = str.charCodeAt(i) + ((hash << 5) - hash);\n }\n const colors = [\n \"#1976d2\", \"#388e3c\", \"#d32f2f\", \"#7b1fa2\",\n \"#c2185b\", \"#0288d1\", \"#00796b\", \"#f57c00\",\n ];\n return colors[Math.abs(hash) % colors.length];\n}\n\nexport interface UserButtonProps {\n size?: \"small\" | \"medium\" | \"large\";\n}\n\nexport function UserButton({ size = \"medium\" }: UserButtonProps) {\n const { snapshot, logout, refresh, readyInfo } = useAppKit();\n const [open, setOpen] = useState(false);\n const [loggingOut, setLoggingOut] = useState(false);\n\n const account = snapshot?.appData?.account;\n const initials = getInitials(account?.name, account?.email);\n const avatarColor = stringToColor(account?.email || \"user\");\n\n const sizeMap = { small: 32, medium: 40, large: 48 };\n const fontSizeMap = { small: 14, medium: 16, large: 20 };\n const avatarSize = sizeMap[size];\n\n const handleLogout = async () => {\n setLoggingOut(true);\n try {\n await logout();\n } finally {\n setLoggingOut(false);\n setOpen(false);\n }\n };\n\n return (\n <>\n <button\n onClick={() => setOpen(true)}\n aria-label=\"Open profile\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: avatarSize,\n height: avatarSize,\n borderRadius: \"50%\",\n backgroundColor: avatarColor,\n color: \"#fff\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: fontSizeMap[size],\n fontWeight: 600,\n fontFamily: \"inherit\",\n padding: 0,\n }}\n >\n {initials}\n </button>\n\n {open && (\n <ProfileModal\n account={account}\n onClose={() => setOpen(false)}\n onLogout={handleLogout}\n loggingOut={loggingOut}\n avatarColor={avatarColor}\n initials={initials}\n baseURL={readyInfo?.baseURL}\n jwtToken={snapshot?.jwtToken}\n onNameUpdated={refresh}\n />\n )}\n </>\n );\n}\n\ninterface ProfileModalProps {\n account?: { email?: string; name?: string };\n onClose: () => void;\n onLogout: () => void;\n loggingOut: boolean;\n avatarColor: string;\n initials: string;\n baseURL?: string;\n jwtToken?: string | null;\n onNameUpdated: () => void;\n}\n\nfunction ProfileModal({\n account,\n onClose,\n onLogout,\n loggingOut,\n avatarColor,\n initials,\n baseURL,\n jwtToken,\n onNameUpdated,\n}: ProfileModalProps) {\n const [editing, setEditing] = useState(false);\n const [editName, setEditName] = useState(account?.name || \"\");\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [toast, setToast] = useState<ToastType>(null);\n\n const clearToast = useCallback(() => setToast(null), []);\n\n useEffect(() => {\n setEditName(account?.name || \"\");\n setEditing(false);\n setError(null);\n }, [account?.name]);\n\n const handleSave = async () => {\n const trimmed = editName.trim();\n if (!trimmed) {\n setError(\"Display name is required\");\n return;\n }\n if (trimmed.length > 200) {\n setError(\"Display name is too long\");\n return;\n }\n if (trimmed === account?.name) {\n setEditing(false);\n return;\n }\n\n setSaving(true);\n setError(null);\n\n try {\n const res = await fetch(`${baseURL}/a/profile/display-name`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${jwtToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({ displayName: trimmed }),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(text || \"Failed to update name\");\n }\n setEditing(false);\n onNameUpdated();\n setToast({ message: \"Display name updated\", type: \"success\" });\n } catch (err: any) {\n const msg = err.message || \"Failed to update name\";\n setError(msg);\n setToast({ message: msg, type: \"error\" });\n } finally {\n setSaving(false);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleSave();\n } else if (e.key === \"Escape\") {\n setEditing(false);\n setEditName(account?.name || \"\");\n setError(null);\n }\n };\n\n return (\n <div\n style={{\n position: \"fixed\",\n inset: 0,\n zIndex: 9999,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {/* Backdrop */}\n <div\n onClick={onClose}\n style={{\n position: \"absolute\",\n inset: 0,\n backgroundColor: \"rgba(0, 0, 0, 0.5)\",\n }}\n />\n\n {/* Modal */}\n <div\n style={{\n position: \"relative\",\n backgroundColor: \"#fff\",\n borderRadius: 12,\n boxShadow: \"0 8px 32px rgba(0,0,0,0.2)\",\n width: \"100%\",\n maxWidth: 360,\n margin: 16,\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: \"16px 20px\",\n borderBottom: \"1px solid #eee\",\n }}\n >\n <h2 style={{ margin: 0, fontSize: 18, fontWeight: 600 }}>Profile</h2>\n <button\n onClick={onClose}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 4,\n fontSize: 20,\n lineHeight: 1,\n color: \"#666\",\n }}\n >\n ×\n </button>\n </div>\n\n {/* Content */}\n <div style={{ padding: 20 }}>\n {/* Avatar and name */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 16, marginBottom: 20 }}>\n <div\n style={{\n width: 64,\n height: 64,\n borderRadius: \"50%\",\n backgroundColor: avatarColor,\n color: \"#fff\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: 24,\n fontWeight: 600,\n flexShrink: 0,\n }}\n >\n {initials}\n </div>\n <div style={{ minWidth: 0, flex: 1 }}>\n <div style={{ fontSize: 18, fontWeight: 600, marginBottom: 2 }}>\n {account?.name || \"User\"}\n </div>\n <div\n style={{\n fontSize: 14,\n color: \"#666\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {account?.email}\n </div>\n </div>\n </div>\n\n <hr style={{ border: \"none\", borderTop: \"1px solid #eee\", margin: \"16px 0\" }} />\n\n {/* Error */}\n {error && (\n <div\n style={{\n padding: \"10px 14px\",\n marginBottom: 16,\n backgroundColor: \"#ffebee\",\n color: \"#c62828\",\n borderRadius: 6,\n fontSize: 14,\n }}\n >\n {error}\n </div>\n )}\n\n {/* Account details */}\n <div style={{ marginBottom: 16 }}>\n <div style={{ display: \"flex\", alignItems: \"center\", justifyContent: \"space-between\", marginBottom: 4 }}>\n <div style={{ fontSize: 12, color: \"#888\", fontWeight: 600 }}>\n Display Name\n </div>\n {!editing && (\n <button\n onClick={() => setEditing(true)}\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 2,\n fontSize: 12,\n color: \"#1976d2\",\n }}\n >\n Edit\n </button>\n )}\n </div>\n {editing ? (\n <div style={{ display: \"flex\", gap: 8 }}>\n <input\n type=\"text\"\n value={editName}\n onChange={(e) => setEditName(e.target.value)}\n onKeyDown={handleKeyDown}\n disabled={saving}\n autoFocus\n placeholder=\"Enter display name\"\n style={{\n flex: 1,\n padding: \"8px 12px\",\n fontSize: 14,\n border: `1px solid ${error ? \"#d32f2f\" : \"#ddd\"}`,\n borderRadius: 6,\n outline: \"none\",\n }}\n />\n <button\n onClick={handleSave}\n disabled={saving}\n style={{\n padding: \"8px 14px\",\n fontSize: 14,\n backgroundColor: \"#1976d2\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: 6,\n cursor: saving ? \"not-allowed\" : \"pointer\",\n opacity: saving ? 0.6 : 1,\n }}\n >\n {saving ? \"…\" : \"Save\"}\n </button>\n </div>\n ) : (\n <div style={{ fontSize: 15 }}>{account?.name || \"—\"}</div>\n )}\n </div>\n <div style={{ marginBottom: 20 }}>\n <div style={{ fontSize: 12, color: \"#888\", fontWeight: 600, marginBottom: 4 }}>\n Email\n </div>\n <div style={{ fontSize: 15 }}>{account?.email || \"—\"}</div>\n </div>\n\n <hr style={{ border: \"none\", borderTop: \"1px solid #eee\", margin: \"16px 0\" }} />\n\n {/* Logout button */}\n <button\n onClick={onLogout}\n disabled={loggingOut}\n style={{\n width: \"100%\",\n padding: \"10px 16px\",\n fontSize: 15,\n fontWeight: 500,\n color: \"#d32f2f\",\n backgroundColor: \"#fff\",\n border: \"1px solid #d32f2f\",\n borderRadius: 8,\n cursor: loggingOut ? \"not-allowed\" : \"pointer\",\n opacity: loggingOut ? 0.6 : 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: 8,\n }}\n >\n {loggingOut ? \"Logging out…\" : \"Log out\"}\n </button>\n </div>\n </div>\n\n <Toast toast={toast} onClose={clearToast} />\n </div>\n );\n}\n\nexport default UserButton;\n"]}
|