@calimero-network/mero-react 1.0.2 → 1.1.0
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 +1527 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +270 -9
- package/dist/index.d.ts +270 -9
- package/dist/index.js +1486 -17
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createContext, useState, useRef, useCallback, useEffect, useMemo, useContext } from 'react';
|
|
2
2
|
import { parseAuthCallback, MeroJs, buildAuthLoginUrl, LocalStorageTokenStore } from '@calimero-network/mero-js';
|
|
3
3
|
export * from '@calimero-network/mero-js';
|
|
4
|
-
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
5
|
+
import { createPortal } from 'react-dom';
|
|
5
6
|
|
|
6
7
|
// src/context/MeroContext.tsx
|
|
7
8
|
|
|
@@ -368,6 +369,544 @@ function useMero() {
|
|
|
368
369
|
}
|
|
369
370
|
return context;
|
|
370
371
|
}
|
|
372
|
+
function isValidUrl(urlString) {
|
|
373
|
+
if (!urlString || urlString.trim() === "") {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
const urlToTest = urlString.startsWith("http://") || urlString.startsWith("https://") ? urlString : `https://${urlString}`;
|
|
378
|
+
const url = new URL(urlToTest);
|
|
379
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
if (!url.hostname) {
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
const hostname = url.hostname;
|
|
386
|
+
if (hostname === "localhost") {
|
|
387
|
+
return true;
|
|
388
|
+
}
|
|
389
|
+
const ipv4Regex = /^(\d{1,3}\.){3}\d{1,3}$/;
|
|
390
|
+
if (ipv4Regex.test(hostname)) {
|
|
391
|
+
const octets = hostname.split(".").map(Number);
|
|
392
|
+
return octets.every((octet) => octet >= 0 && octet <= 255);
|
|
393
|
+
}
|
|
394
|
+
const domainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
395
|
+
return domainRegex.test(hostname);
|
|
396
|
+
} catch {
|
|
397
|
+
return false;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
var styles = {
|
|
401
|
+
overlay: {
|
|
402
|
+
position: "fixed",
|
|
403
|
+
top: 0,
|
|
404
|
+
left: 0,
|
|
405
|
+
right: 0,
|
|
406
|
+
bottom: 0,
|
|
407
|
+
backgroundColor: "rgba(0, 0, 0, 0.75)",
|
|
408
|
+
display: "flex",
|
|
409
|
+
alignItems: "center",
|
|
410
|
+
justifyContent: "center",
|
|
411
|
+
zIndex: 1e4,
|
|
412
|
+
padding: "1rem"
|
|
413
|
+
},
|
|
414
|
+
content: {
|
|
415
|
+
backgroundColor: "#1f2937",
|
|
416
|
+
borderRadius: "12px",
|
|
417
|
+
padding: "2rem",
|
|
418
|
+
maxWidth: "400px",
|
|
419
|
+
width: "100%",
|
|
420
|
+
position: "relative",
|
|
421
|
+
border: "1px solid #374151",
|
|
422
|
+
boxShadow: "0 25px 50px -12px rgba(0, 0, 0, 0.5)"
|
|
423
|
+
},
|
|
424
|
+
closeButton: {
|
|
425
|
+
position: "absolute",
|
|
426
|
+
top: "1rem",
|
|
427
|
+
right: "1rem",
|
|
428
|
+
background: "none",
|
|
429
|
+
border: "none",
|
|
430
|
+
fontSize: "1.5rem",
|
|
431
|
+
color: "#9ca3af",
|
|
432
|
+
cursor: "pointer",
|
|
433
|
+
padding: "0.25rem",
|
|
434
|
+
lineHeight: 1
|
|
435
|
+
},
|
|
436
|
+
header: {
|
|
437
|
+
display: "flex",
|
|
438
|
+
flexDirection: "column",
|
|
439
|
+
alignItems: "center",
|
|
440
|
+
gap: "0.75rem",
|
|
441
|
+
marginBottom: "1.5rem"
|
|
442
|
+
},
|
|
443
|
+
title: {
|
|
444
|
+
fontSize: "1.25rem",
|
|
445
|
+
fontWeight: 600,
|
|
446
|
+
color: "#f3f4f6",
|
|
447
|
+
margin: 0
|
|
448
|
+
},
|
|
449
|
+
info: {
|
|
450
|
+
color: "#9ca3af",
|
|
451
|
+
textAlign: "center",
|
|
452
|
+
marginBottom: "1.5rem",
|
|
453
|
+
fontSize: "0.875rem"
|
|
454
|
+
},
|
|
455
|
+
error: {
|
|
456
|
+
color: "#ef4444",
|
|
457
|
+
backgroundColor: "rgba(239, 68, 68, 0.1)",
|
|
458
|
+
border: "1px solid rgba(239, 68, 68, 0.3)",
|
|
459
|
+
borderRadius: "6px",
|
|
460
|
+
padding: "0.75rem",
|
|
461
|
+
marginBottom: "1rem",
|
|
462
|
+
fontSize: "0.875rem",
|
|
463
|
+
textAlign: "center"
|
|
464
|
+
},
|
|
465
|
+
radioGroup: {
|
|
466
|
+
display: "flex",
|
|
467
|
+
gap: "1rem",
|
|
468
|
+
marginBottom: "1rem",
|
|
469
|
+
justifyContent: "center"
|
|
470
|
+
},
|
|
471
|
+
radioLabel: {
|
|
472
|
+
display: "flex",
|
|
473
|
+
alignItems: "center",
|
|
474
|
+
gap: "0.5rem",
|
|
475
|
+
color: "#e5e7eb",
|
|
476
|
+
cursor: "pointer",
|
|
477
|
+
padding: "0.5rem 1rem",
|
|
478
|
+
borderRadius: "6px",
|
|
479
|
+
border: "1px solid #374151",
|
|
480
|
+
backgroundColor: "#111827",
|
|
481
|
+
transition: "all 0.2s"
|
|
482
|
+
},
|
|
483
|
+
radioLabelActive: {
|
|
484
|
+
borderColor: "#3b82f6",
|
|
485
|
+
backgroundColor: "rgba(59, 130, 246, 0.1)"
|
|
486
|
+
},
|
|
487
|
+
input: {
|
|
488
|
+
width: "100%",
|
|
489
|
+
padding: "0.75rem 1rem",
|
|
490
|
+
borderRadius: "6px",
|
|
491
|
+
border: "1px solid #374151",
|
|
492
|
+
backgroundColor: "#111827",
|
|
493
|
+
color: "#f3f4f6",
|
|
494
|
+
fontSize: "0.875rem",
|
|
495
|
+
outline: "none",
|
|
496
|
+
marginBottom: "1rem",
|
|
497
|
+
boxSizing: "border-box"
|
|
498
|
+
},
|
|
499
|
+
localInfo: {
|
|
500
|
+
color: "#9ca3af",
|
|
501
|
+
fontSize: "0.875rem",
|
|
502
|
+
textAlign: "center",
|
|
503
|
+
padding: "0.75rem",
|
|
504
|
+
backgroundColor: "#111827",
|
|
505
|
+
borderRadius: "6px",
|
|
506
|
+
marginBottom: "1rem"
|
|
507
|
+
},
|
|
508
|
+
buttonGroup: {
|
|
509
|
+
display: "flex",
|
|
510
|
+
justifyContent: "center"
|
|
511
|
+
},
|
|
512
|
+
button: {
|
|
513
|
+
padding: "0.75rem 2rem",
|
|
514
|
+
borderRadius: "6px",
|
|
515
|
+
border: "none",
|
|
516
|
+
fontSize: "0.875rem",
|
|
517
|
+
fontWeight: 600,
|
|
518
|
+
cursor: "pointer",
|
|
519
|
+
backgroundColor: "#3b82f6",
|
|
520
|
+
color: "white",
|
|
521
|
+
transition: "all 0.2s"
|
|
522
|
+
},
|
|
523
|
+
buttonDisabled: {
|
|
524
|
+
opacity: 0.5,
|
|
525
|
+
cursor: "not-allowed"
|
|
526
|
+
},
|
|
527
|
+
loading: {
|
|
528
|
+
display: "flex",
|
|
529
|
+
flexDirection: "column",
|
|
530
|
+
alignItems: "center",
|
|
531
|
+
gap: "1rem",
|
|
532
|
+
padding: "2rem",
|
|
533
|
+
color: "#9ca3af"
|
|
534
|
+
},
|
|
535
|
+
spinner: {
|
|
536
|
+
width: "2rem",
|
|
537
|
+
height: "2rem",
|
|
538
|
+
border: "3px solid #374151",
|
|
539
|
+
borderTopColor: "#3b82f6",
|
|
540
|
+
borderRadius: "50%",
|
|
541
|
+
animation: "spin 1s linear infinite"
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
function LoginModal({
|
|
545
|
+
onConnect,
|
|
546
|
+
onClose,
|
|
547
|
+
connectionType,
|
|
548
|
+
isOpen
|
|
549
|
+
}) {
|
|
550
|
+
const [nodeType, setNodeType] = useState("local");
|
|
551
|
+
const [nodeUrl, setNodeUrl2] = useState("");
|
|
552
|
+
const [isValid, setIsValid] = useState(true);
|
|
553
|
+
const [loading, setLoading] = useState(false);
|
|
554
|
+
const [error, setError] = useState(null);
|
|
555
|
+
const shouldShowLocal = connectionType === "remote-and-local" /* RemoteAndLocal */ || connectionType === "local" /* Local */;
|
|
556
|
+
const shouldShowRemote = connectionType === "remote-and-local" /* RemoteAndLocal */ || connectionType === "remote" /* Remote */;
|
|
557
|
+
const shouldShowRadioGroup = shouldShowLocal && shouldShowRemote;
|
|
558
|
+
useEffect(() => {
|
|
559
|
+
const savedUrl = localStorage.getItem("mero:node_url");
|
|
560
|
+
if (savedUrl) {
|
|
561
|
+
setNodeUrl2(savedUrl);
|
|
562
|
+
}
|
|
563
|
+
}, []);
|
|
564
|
+
useEffect(() => {
|
|
565
|
+
if (connectionType === "local" /* Local */) {
|
|
566
|
+
setNodeType("local");
|
|
567
|
+
} else if (connectionType === "remote" /* Remote */) {
|
|
568
|
+
setNodeType("remote");
|
|
569
|
+
}
|
|
570
|
+
}, [connectionType]);
|
|
571
|
+
useEffect(() => {
|
|
572
|
+
if (nodeType === "remote") {
|
|
573
|
+
setIsValid(isValidUrl(nodeUrl));
|
|
574
|
+
} else {
|
|
575
|
+
setIsValid(true);
|
|
576
|
+
}
|
|
577
|
+
}, [nodeUrl, nodeType]);
|
|
578
|
+
const handleConnect = useCallback(async () => {
|
|
579
|
+
if (!isValid) return;
|
|
580
|
+
setLoading(true);
|
|
581
|
+
setError(null);
|
|
582
|
+
const baseUrl = nodeType === "local" ? "http://node1.127.0.0.1.nip.io" : nodeUrl;
|
|
583
|
+
try {
|
|
584
|
+
const response = await fetch(
|
|
585
|
+
new URL("admin-api/is-authed", baseUrl).toString()
|
|
586
|
+
);
|
|
587
|
+
if (response.ok || response.status === 401) {
|
|
588
|
+
setLoading(false);
|
|
589
|
+
const normalizedUrl = baseUrl.replace(/\/+$/, "");
|
|
590
|
+
onConnect(normalizedUrl);
|
|
591
|
+
} else {
|
|
592
|
+
throw new Error(`Connection failed: ${response.statusText}`);
|
|
593
|
+
}
|
|
594
|
+
} catch (err) {
|
|
595
|
+
console.error("Connection failed:", err);
|
|
596
|
+
setError("Failed to connect. Please check the URL and try again.");
|
|
597
|
+
setLoading(false);
|
|
598
|
+
}
|
|
599
|
+
}, [isValid, nodeType, nodeUrl, onConnect]);
|
|
600
|
+
if (!isOpen) {
|
|
601
|
+
return null;
|
|
602
|
+
}
|
|
603
|
+
const modalContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
604
|
+
/* @__PURE__ */ jsx("style", { children: `
|
|
605
|
+
@keyframes spin {
|
|
606
|
+
to { transform: rotate(360deg); }
|
|
607
|
+
}
|
|
608
|
+
` }),
|
|
609
|
+
/* @__PURE__ */ jsx("div", { style: styles.overlay, onClick: onClose, children: /* @__PURE__ */ jsxs("div", { style: styles.content, onClick: (e) => e.stopPropagation(), children: [
|
|
610
|
+
/* @__PURE__ */ jsx("button", { style: styles.closeButton, onClick: onClose, children: "\xD7" }),
|
|
611
|
+
/* @__PURE__ */ jsxs("div", { style: styles.header, children: [
|
|
612
|
+
/* @__PURE__ */ jsx(MeroLogo, {}),
|
|
613
|
+
/* @__PURE__ */ jsx("h1", { style: styles.title, children: "Connect to Calimero" })
|
|
614
|
+
] }),
|
|
615
|
+
loading ? /* @__PURE__ */ jsxs("div", { style: styles.loading, children: [
|
|
616
|
+
/* @__PURE__ */ jsx("p", { children: "Connecting to node..." }),
|
|
617
|
+
/* @__PURE__ */ jsx("div", { style: styles.spinner })
|
|
618
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
619
|
+
/* @__PURE__ */ jsx("p", { style: styles.info, children: shouldShowRadioGroup ? "Select your Calimero node type to continue." : connectionType === "local" /* Local */ ? "Connect to your local Calimero node." : "Enter your remote Calimero node URL." }),
|
|
620
|
+
error && /* @__PURE__ */ jsx("p", { style: styles.error, children: error }),
|
|
621
|
+
shouldShowRadioGroup && /* @__PURE__ */ jsxs("div", { style: styles.radioGroup, children: [
|
|
622
|
+
/* @__PURE__ */ jsxs(
|
|
623
|
+
"label",
|
|
624
|
+
{
|
|
625
|
+
style: {
|
|
626
|
+
...styles.radioLabel,
|
|
627
|
+
...nodeType === "local" ? styles.radioLabelActive : {}
|
|
628
|
+
},
|
|
629
|
+
onClick: () => setNodeType("local"),
|
|
630
|
+
children: [
|
|
631
|
+
/* @__PURE__ */ jsx(
|
|
632
|
+
"input",
|
|
633
|
+
{
|
|
634
|
+
type: "radio",
|
|
635
|
+
value: "local",
|
|
636
|
+
checked: nodeType === "local",
|
|
637
|
+
onChange: () => setNodeType("local"),
|
|
638
|
+
style: { display: "none" }
|
|
639
|
+
}
|
|
640
|
+
),
|
|
641
|
+
"\u{1F3E0} Local"
|
|
642
|
+
]
|
|
643
|
+
}
|
|
644
|
+
),
|
|
645
|
+
/* @__PURE__ */ jsxs(
|
|
646
|
+
"label",
|
|
647
|
+
{
|
|
648
|
+
style: {
|
|
649
|
+
...styles.radioLabel,
|
|
650
|
+
...nodeType === "remote" ? styles.radioLabelActive : {}
|
|
651
|
+
},
|
|
652
|
+
onClick: () => setNodeType("remote"),
|
|
653
|
+
children: [
|
|
654
|
+
/* @__PURE__ */ jsx(
|
|
655
|
+
"input",
|
|
656
|
+
{
|
|
657
|
+
type: "radio",
|
|
658
|
+
value: "remote",
|
|
659
|
+
checked: nodeType === "remote",
|
|
660
|
+
onChange: () => setNodeType("remote"),
|
|
661
|
+
style: { display: "none" }
|
|
662
|
+
}
|
|
663
|
+
),
|
|
664
|
+
"\u{1F310} Remote"
|
|
665
|
+
]
|
|
666
|
+
}
|
|
667
|
+
)
|
|
668
|
+
] }),
|
|
669
|
+
/* @__PURE__ */ jsx("div", { children: shouldShowRemote && nodeType === "remote" ? /* @__PURE__ */ jsx(
|
|
670
|
+
"input",
|
|
671
|
+
{
|
|
672
|
+
type: "text",
|
|
673
|
+
value: nodeUrl,
|
|
674
|
+
onChange: (e) => setNodeUrl2(e.target.value),
|
|
675
|
+
placeholder: "https://your-node-url.calimero.network",
|
|
676
|
+
style: styles.input,
|
|
677
|
+
onKeyDown: (e) => {
|
|
678
|
+
if (e.key === "Enter" && isValid) {
|
|
679
|
+
handleConnect();
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
) : shouldShowLocal ? /* @__PURE__ */ jsxs("p", { style: styles.localInfo, children: [
|
|
684
|
+
"Using default local node: ",
|
|
685
|
+
/* @__PURE__ */ jsx("br", {}),
|
|
686
|
+
/* @__PURE__ */ jsx("code", { style: { color: "#60a5fa" }, children: "http://node1.127.0.0.1.nip.io" })
|
|
687
|
+
] }) : null }),
|
|
688
|
+
/* @__PURE__ */ jsx("div", { style: styles.buttonGroup, children: /* @__PURE__ */ jsx(
|
|
689
|
+
"button",
|
|
690
|
+
{
|
|
691
|
+
onClick: handleConnect,
|
|
692
|
+
disabled: !isValid || loading,
|
|
693
|
+
style: {
|
|
694
|
+
...styles.button,
|
|
695
|
+
...!isValid || loading ? styles.buttonDisabled : {}
|
|
696
|
+
},
|
|
697
|
+
children: "Connect"
|
|
698
|
+
}
|
|
699
|
+
) })
|
|
700
|
+
] })
|
|
701
|
+
] }) })
|
|
702
|
+
] });
|
|
703
|
+
return createPortal(modalContent, document.body);
|
|
704
|
+
}
|
|
705
|
+
function MeroLogo() {
|
|
706
|
+
return /* @__PURE__ */ jsx(
|
|
707
|
+
"svg",
|
|
708
|
+
{
|
|
709
|
+
width: "40",
|
|
710
|
+
height: "40",
|
|
711
|
+
viewBox: "0 0 24 24",
|
|
712
|
+
fill: "#3b82f6",
|
|
713
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
714
|
+
children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z" })
|
|
715
|
+
}
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
function ConnectButton({
|
|
719
|
+
connectionType = "remote-and-local" /* RemoteAndLocal */,
|
|
720
|
+
className,
|
|
721
|
+
style
|
|
722
|
+
}) {
|
|
723
|
+
const { isAuthenticated, connectToNode, logout, nodeUrl, isOnline } = useMero();
|
|
724
|
+
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
|
|
725
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
726
|
+
const dropdownRef = useRef(null);
|
|
727
|
+
useEffect(() => {
|
|
728
|
+
const handleClickOutside = (event) => {
|
|
729
|
+
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
730
|
+
setIsDropdownOpen(false);
|
|
731
|
+
}
|
|
732
|
+
};
|
|
733
|
+
document.addEventListener("mousedown", handleClickOutside);
|
|
734
|
+
return () => document.removeEventListener("mousedown", handleClickOutside);
|
|
735
|
+
}, []);
|
|
736
|
+
const dashboardUrl = useMemo(() => {
|
|
737
|
+
if (!isAuthenticated || !nodeUrl) return "#";
|
|
738
|
+
return new URL("admin-dashboard/", nodeUrl).toString();
|
|
739
|
+
}, [isAuthenticated, nodeUrl]);
|
|
740
|
+
const handleConnect = () => {
|
|
741
|
+
if (typeof connectionType === "object" && connectionType.type === "custom" /* Custom */) {
|
|
742
|
+
connectToNode(connectionType.url);
|
|
743
|
+
return;
|
|
744
|
+
}
|
|
745
|
+
setIsModalOpen(true);
|
|
746
|
+
};
|
|
747
|
+
const handleModalConnect = (url) => {
|
|
748
|
+
setIsModalOpen(false);
|
|
749
|
+
connectToNode(url);
|
|
750
|
+
};
|
|
751
|
+
if (isAuthenticated && !isOnline) {
|
|
752
|
+
return /* @__PURE__ */ jsxs(
|
|
753
|
+
"button",
|
|
754
|
+
{
|
|
755
|
+
className: `mero-connect-button mero-reconnecting ${className || ""}`,
|
|
756
|
+
style,
|
|
757
|
+
disabled: true,
|
|
758
|
+
children: [
|
|
759
|
+
/* @__PURE__ */ jsx(MeroLogo2, {}),
|
|
760
|
+
"Reconnecting..."
|
|
761
|
+
]
|
|
762
|
+
}
|
|
763
|
+
);
|
|
764
|
+
}
|
|
765
|
+
if (isAuthenticated) {
|
|
766
|
+
return /* @__PURE__ */ jsxs("div", { ref: dropdownRef, className: "mero-connect-container", style: { position: "relative", display: "inline-block" }, children: [
|
|
767
|
+
/* @__PURE__ */ jsxs(
|
|
768
|
+
"button",
|
|
769
|
+
{
|
|
770
|
+
className: `mero-connect-button mero-connected ${className || ""}`,
|
|
771
|
+
style,
|
|
772
|
+
onClick: () => setIsDropdownOpen((prev) => !prev),
|
|
773
|
+
children: [
|
|
774
|
+
/* @__PURE__ */ jsx(MeroLogo2, {}),
|
|
775
|
+
"Connected"
|
|
776
|
+
]
|
|
777
|
+
}
|
|
778
|
+
),
|
|
779
|
+
isDropdownOpen && /* @__PURE__ */ jsxs("div", { className: "mero-dropdown", children: [
|
|
780
|
+
/* @__PURE__ */ jsx("div", { className: "mero-dropdown-info", title: nodeUrl || "", children: nodeUrl }),
|
|
781
|
+
/* @__PURE__ */ jsx(
|
|
782
|
+
"a",
|
|
783
|
+
{
|
|
784
|
+
href: dashboardUrl,
|
|
785
|
+
target: "_blank",
|
|
786
|
+
rel: "noopener noreferrer",
|
|
787
|
+
className: "mero-dropdown-item",
|
|
788
|
+
children: "Dashboard"
|
|
789
|
+
}
|
|
790
|
+
),
|
|
791
|
+
/* @__PURE__ */ jsx(
|
|
792
|
+
"button",
|
|
793
|
+
{
|
|
794
|
+
className: "mero-dropdown-item",
|
|
795
|
+
onClick: () => {
|
|
796
|
+
setIsDropdownOpen(false);
|
|
797
|
+
logout();
|
|
798
|
+
},
|
|
799
|
+
children: "Log out"
|
|
800
|
+
}
|
|
801
|
+
)
|
|
802
|
+
] })
|
|
803
|
+
] });
|
|
804
|
+
}
|
|
805
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
806
|
+
/* @__PURE__ */ jsxs(
|
|
807
|
+
"button",
|
|
808
|
+
{
|
|
809
|
+
className: `mero-connect-button ${className || ""}`,
|
|
810
|
+
style,
|
|
811
|
+
onClick: handleConnect,
|
|
812
|
+
children: [
|
|
813
|
+
/* @__PURE__ */ jsx(MeroLogo2, {}),
|
|
814
|
+
"Connect"
|
|
815
|
+
]
|
|
816
|
+
}
|
|
817
|
+
),
|
|
818
|
+
/* @__PURE__ */ jsx(
|
|
819
|
+
LoginModal,
|
|
820
|
+
{
|
|
821
|
+
isOpen: isModalOpen,
|
|
822
|
+
onConnect: handleModalConnect,
|
|
823
|
+
onClose: () => setIsModalOpen(false),
|
|
824
|
+
connectionType: typeof connectionType === "object" ? "remote-and-local" /* RemoteAndLocal */ : connectionType
|
|
825
|
+
}
|
|
826
|
+
)
|
|
827
|
+
] });
|
|
828
|
+
}
|
|
829
|
+
function MeroLogo2() {
|
|
830
|
+
return /* @__PURE__ */ jsx(
|
|
831
|
+
"svg",
|
|
832
|
+
{
|
|
833
|
+
className: "mero-logo",
|
|
834
|
+
width: "24",
|
|
835
|
+
height: "24",
|
|
836
|
+
viewBox: "0 0 24 24",
|
|
837
|
+
fill: "currentColor",
|
|
838
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
839
|
+
children: /* @__PURE__ */ jsx("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-1-13h2v6h-2zm0 8h2v2h-2z" })
|
|
840
|
+
}
|
|
841
|
+
);
|
|
842
|
+
}
|
|
843
|
+
function toError(err) {
|
|
844
|
+
return err instanceof Error ? err : new Error(String(err));
|
|
845
|
+
}
|
|
846
|
+
function mapApplicationContexts(contexts) {
|
|
847
|
+
return contexts.map((context) => ({
|
|
848
|
+
contextId: context.id,
|
|
849
|
+
applicationId: context.applicationId
|
|
850
|
+
}));
|
|
851
|
+
}
|
|
852
|
+
function useMountedRef() {
|
|
853
|
+
const mountedRef = useRef(true);
|
|
854
|
+
useEffect(() => {
|
|
855
|
+
mountedRef.current = true;
|
|
856
|
+
return () => {
|
|
857
|
+
mountedRef.current = false;
|
|
858
|
+
};
|
|
859
|
+
}, []);
|
|
860
|
+
return mountedRef;
|
|
861
|
+
}
|
|
862
|
+
function useAsyncMutation() {
|
|
863
|
+
const mountedRef = useMountedRef();
|
|
864
|
+
const [loading, setLoading] = useState(false);
|
|
865
|
+
const [error, setError] = useState(null);
|
|
866
|
+
const run = useCallback(
|
|
867
|
+
async (action) => {
|
|
868
|
+
if (mountedRef.current) {
|
|
869
|
+
setLoading(true);
|
|
870
|
+
setError(null);
|
|
871
|
+
}
|
|
872
|
+
try {
|
|
873
|
+
return await action();
|
|
874
|
+
} catch (err) {
|
|
875
|
+
const errorValue = toError(err);
|
|
876
|
+
if (mountedRef.current) {
|
|
877
|
+
setError(errorValue);
|
|
878
|
+
}
|
|
879
|
+
return null;
|
|
880
|
+
} finally {
|
|
881
|
+
if (mountedRef.current) {
|
|
882
|
+
setLoading(false);
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
},
|
|
886
|
+
[mountedRef]
|
|
887
|
+
);
|
|
888
|
+
return { loading, error, run, setError };
|
|
889
|
+
}
|
|
890
|
+
function sleep(ms) {
|
|
891
|
+
return new Promise((resolve) => {
|
|
892
|
+
setTimeout(resolve, ms);
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
function extractAliasContextId(value) {
|
|
896
|
+
if (typeof value === "string") {
|
|
897
|
+
return value;
|
|
898
|
+
}
|
|
899
|
+
if (!value || typeof value !== "object") {
|
|
900
|
+
return null;
|
|
901
|
+
}
|
|
902
|
+
if ("value" in value && typeof value.value === "string") {
|
|
903
|
+
return value.value;
|
|
904
|
+
}
|
|
905
|
+
if ("contextId" in value && typeof value.contextId === "string") {
|
|
906
|
+
return value.contextId;
|
|
907
|
+
}
|
|
908
|
+
return null;
|
|
909
|
+
}
|
|
371
910
|
function useExecute(contextId, executorId) {
|
|
372
911
|
const { mero } = useMero();
|
|
373
912
|
const [loading, setLoading] = useState(false);
|
|
@@ -435,13 +974,7 @@ function useContexts(applicationId) {
|
|
|
435
974
|
const [contexts, setContexts] = useState([]);
|
|
436
975
|
const [loading, setLoading] = useState(false);
|
|
437
976
|
const [error, setError] = useState(null);
|
|
438
|
-
const mountedRef =
|
|
439
|
-
useEffect(() => {
|
|
440
|
-
mountedRef.current = true;
|
|
441
|
-
return () => {
|
|
442
|
-
mountedRef.current = false;
|
|
443
|
-
};
|
|
444
|
-
}, []);
|
|
977
|
+
const mountedRef = useMountedRef();
|
|
445
978
|
const refetch = useCallback(async () => {
|
|
446
979
|
if (!mero) return;
|
|
447
980
|
if (mountedRef.current) {
|
|
@@ -449,17 +982,20 @@ function useContexts(applicationId) {
|
|
|
449
982
|
setError(null);
|
|
450
983
|
}
|
|
451
984
|
try {
|
|
452
|
-
const response = await mero.admin.getContexts();
|
|
453
|
-
|
|
454
|
-
if (
|
|
455
|
-
list
|
|
985
|
+
const response = applicationId ? await mero.admin.getContextsForApplication(applicationId) : await mero.admin.getContexts();
|
|
986
|
+
const list = mapApplicationContexts(response.contexts ?? []);
|
|
987
|
+
if (mountedRef.current) {
|
|
988
|
+
setContexts(list);
|
|
456
989
|
}
|
|
457
|
-
if (mountedRef.current) setContexts(list);
|
|
458
990
|
} catch (err) {
|
|
459
|
-
const
|
|
460
|
-
if (mountedRef.current)
|
|
991
|
+
const errorValue = toError(err);
|
|
992
|
+
if (mountedRef.current) {
|
|
993
|
+
setError(errorValue);
|
|
994
|
+
}
|
|
461
995
|
} finally {
|
|
462
|
-
if (mountedRef.current)
|
|
996
|
+
if (mountedRef.current) {
|
|
997
|
+
setLoading(false);
|
|
998
|
+
}
|
|
463
999
|
}
|
|
464
1000
|
}, [mero, applicationId]);
|
|
465
1001
|
useEffect(() => {
|
|
@@ -467,7 +1003,940 @@ function useContexts(applicationId) {
|
|
|
467
1003
|
}, [refetch]);
|
|
468
1004
|
return { contexts, loading, error, refetch };
|
|
469
1005
|
}
|
|
1006
|
+
function useApplicationContexts(applicationId) {
|
|
1007
|
+
return useContexts(applicationId);
|
|
1008
|
+
}
|
|
1009
|
+
function useGroupMembers(groupId) {
|
|
1010
|
+
const { mero } = useMero();
|
|
1011
|
+
const [members, setMembers] = useState([]);
|
|
1012
|
+
const [selfIdentity, setSelfIdentity] = useState(null);
|
|
1013
|
+
const [loading, setLoading] = useState(false);
|
|
1014
|
+
const [error, setError] = useState(null);
|
|
1015
|
+
const mountedRef = useMountedRef();
|
|
1016
|
+
const refetch = useCallback(async () => {
|
|
1017
|
+
if (!mero || !groupId) {
|
|
1018
|
+
if (mountedRef.current) {
|
|
1019
|
+
setMembers([]);
|
|
1020
|
+
setSelfIdentity(null);
|
|
1021
|
+
setError(null);
|
|
1022
|
+
setLoading(false);
|
|
1023
|
+
}
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
if (mountedRef.current) {
|
|
1027
|
+
setLoading(true);
|
|
1028
|
+
setError(null);
|
|
1029
|
+
}
|
|
1030
|
+
try {
|
|
1031
|
+
const response = await mero.admin.listGroupMembers(groupId);
|
|
1032
|
+
if (mountedRef.current) {
|
|
1033
|
+
setMembers(response.data ?? []);
|
|
1034
|
+
setSelfIdentity(response.selfIdentity ?? null);
|
|
1035
|
+
}
|
|
1036
|
+
} catch (err) {
|
|
1037
|
+
const errorValue = toError(err);
|
|
1038
|
+
if (mountedRef.current) {
|
|
1039
|
+
setError(errorValue);
|
|
1040
|
+
}
|
|
1041
|
+
} finally {
|
|
1042
|
+
if (mountedRef.current) {
|
|
1043
|
+
setLoading(false);
|
|
1044
|
+
}
|
|
1045
|
+
}
|
|
1046
|
+
}, [groupId, mero, mountedRef]);
|
|
1047
|
+
useEffect(() => {
|
|
1048
|
+
void refetch();
|
|
1049
|
+
}, [refetch]);
|
|
1050
|
+
return { members, selfIdentity, loading, error, refetch };
|
|
1051
|
+
}
|
|
1052
|
+
function useGroupContexts(groupId) {
|
|
1053
|
+
const { mero } = useMero();
|
|
1054
|
+
const [contexts, setContexts] = useState([]);
|
|
1055
|
+
const [loading, setLoading] = useState(false);
|
|
1056
|
+
const [error, setError] = useState(null);
|
|
1057
|
+
const mountedRef = useMountedRef();
|
|
1058
|
+
const refetch = useCallback(async () => {
|
|
1059
|
+
if (!mero || !groupId) {
|
|
1060
|
+
if (mountedRef.current) {
|
|
1061
|
+
setContexts([]);
|
|
1062
|
+
setError(null);
|
|
1063
|
+
setLoading(false);
|
|
1064
|
+
}
|
|
1065
|
+
return;
|
|
1066
|
+
}
|
|
1067
|
+
if (mountedRef.current) {
|
|
1068
|
+
setLoading(true);
|
|
1069
|
+
setError(null);
|
|
1070
|
+
}
|
|
1071
|
+
try {
|
|
1072
|
+
const nextContexts = await mero.admin.listGroupContexts(groupId);
|
|
1073
|
+
if (mountedRef.current) {
|
|
1074
|
+
setContexts(nextContexts);
|
|
1075
|
+
}
|
|
1076
|
+
} catch (err) {
|
|
1077
|
+
const errorValue = toError(err);
|
|
1078
|
+
if (mountedRef.current) {
|
|
1079
|
+
setError(errorValue);
|
|
1080
|
+
}
|
|
1081
|
+
} finally {
|
|
1082
|
+
if (mountedRef.current) {
|
|
1083
|
+
setLoading(false);
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
}, [groupId, mero, mountedRef]);
|
|
1087
|
+
useEffect(() => {
|
|
1088
|
+
void refetch();
|
|
1089
|
+
}, [refetch]);
|
|
1090
|
+
return { contexts, loading, error, refetch };
|
|
1091
|
+
}
|
|
1092
|
+
function useGroupInvitations() {
|
|
1093
|
+
const { mero } = useMero();
|
|
1094
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1095
|
+
const createInvitation = useCallback(
|
|
1096
|
+
async (groupId, request) => {
|
|
1097
|
+
if (!mero) {
|
|
1098
|
+
return null;
|
|
1099
|
+
}
|
|
1100
|
+
return run(() => mero.admin.createGroupInvitation(groupId, request));
|
|
1101
|
+
},
|
|
1102
|
+
[mero, run]
|
|
1103
|
+
);
|
|
1104
|
+
return { createInvitation, loading, error };
|
|
1105
|
+
}
|
|
1106
|
+
function useJoinGroup() {
|
|
1107
|
+
const { mero } = useMero();
|
|
1108
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1109
|
+
const joinGroup = useCallback(
|
|
1110
|
+
async (request) => {
|
|
1111
|
+
if (!mero) {
|
|
1112
|
+
return null;
|
|
1113
|
+
}
|
|
1114
|
+
return run(() => mero.admin.joinGroup(request));
|
|
1115
|
+
},
|
|
1116
|
+
[mero, run]
|
|
1117
|
+
);
|
|
1118
|
+
return { joinGroup, loading, error };
|
|
1119
|
+
}
|
|
1120
|
+
function useGroupCapabilities(groupId, memberId) {
|
|
1121
|
+
const { mero } = useMero();
|
|
1122
|
+
const [capabilities, setCapabilitiesState] = useState(null);
|
|
1123
|
+
const [loading, setLoading] = useState(false);
|
|
1124
|
+
const [error, setError] = useState(null);
|
|
1125
|
+
const mountedRef = useMountedRef();
|
|
1126
|
+
const refetch = useCallback(async () => {
|
|
1127
|
+
if (!mero || !groupId || !memberId) {
|
|
1128
|
+
if (mountedRef.current) {
|
|
1129
|
+
setCapabilitiesState(null);
|
|
1130
|
+
setError(null);
|
|
1131
|
+
setLoading(false);
|
|
1132
|
+
}
|
|
1133
|
+
return null;
|
|
1134
|
+
}
|
|
1135
|
+
if (mountedRef.current) {
|
|
1136
|
+
setLoading(true);
|
|
1137
|
+
setError(null);
|
|
1138
|
+
}
|
|
1139
|
+
try {
|
|
1140
|
+
const response = await mero.admin.getMemberCapabilities(groupId, memberId);
|
|
1141
|
+
if (mountedRef.current) {
|
|
1142
|
+
setCapabilitiesState(response.capabilities);
|
|
1143
|
+
}
|
|
1144
|
+
return response.capabilities;
|
|
1145
|
+
} catch (err) {
|
|
1146
|
+
const errorValue = toError(err);
|
|
1147
|
+
if (mountedRef.current) {
|
|
1148
|
+
setError(errorValue);
|
|
1149
|
+
}
|
|
1150
|
+
return null;
|
|
1151
|
+
} finally {
|
|
1152
|
+
if (mountedRef.current) {
|
|
1153
|
+
setLoading(false);
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
}, [groupId, memberId, mero, mountedRef]);
|
|
1157
|
+
useEffect(() => {
|
|
1158
|
+
void refetch();
|
|
1159
|
+
}, [refetch]);
|
|
1160
|
+
const setCapabilities = useCallback(
|
|
1161
|
+
async (nextCapabilities) => {
|
|
1162
|
+
if (!mero || !groupId || !memberId) {
|
|
1163
|
+
return null;
|
|
1164
|
+
}
|
|
1165
|
+
if (mountedRef.current) {
|
|
1166
|
+
setLoading(true);
|
|
1167
|
+
setError(null);
|
|
1168
|
+
}
|
|
1169
|
+
try {
|
|
1170
|
+
await mero.admin.setMemberCapabilities(groupId, memberId, { capabilities: nextCapabilities });
|
|
1171
|
+
if (mountedRef.current) {
|
|
1172
|
+
setCapabilitiesState(nextCapabilities);
|
|
1173
|
+
}
|
|
1174
|
+
return nextCapabilities;
|
|
1175
|
+
} catch (err) {
|
|
1176
|
+
const errorValue = toError(err);
|
|
1177
|
+
if (mountedRef.current) {
|
|
1178
|
+
setError(errorValue);
|
|
1179
|
+
}
|
|
1180
|
+
return null;
|
|
1181
|
+
} finally {
|
|
1182
|
+
if (mountedRef.current) {
|
|
1183
|
+
setLoading(false);
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
},
|
|
1187
|
+
[groupId, memberId, mero, mountedRef]
|
|
1188
|
+
);
|
|
1189
|
+
return { capabilities, loading, error, refetch, setCapabilities };
|
|
1190
|
+
}
|
|
1191
|
+
function useContextDiscovery(options) {
|
|
1192
|
+
const { mero } = useMero();
|
|
1193
|
+
const [context, setContext] = useState(null);
|
|
1194
|
+
const [loading, setLoading] = useState(false);
|
|
1195
|
+
const [error, setError] = useState(null);
|
|
1196
|
+
const mountedRef = useMountedRef();
|
|
1197
|
+
const knownContextIdsKey = JSON.stringify(options.knownContextIds ?? []);
|
|
1198
|
+
const discover = useCallback(async () => {
|
|
1199
|
+
if (!mero) {
|
|
1200
|
+
const notConnectedError = new Error("Not connected");
|
|
1201
|
+
if (mountedRef.current) {
|
|
1202
|
+
setError(notConnectedError);
|
|
1203
|
+
}
|
|
1204
|
+
return null;
|
|
1205
|
+
}
|
|
1206
|
+
const knownContextIds = new Set(options.knownContextIds ?? []);
|
|
1207
|
+
const pollIntervalMs = options.pollIntervalMs ?? 1e3;
|
|
1208
|
+
const timeoutMs = options.timeoutMs ?? 3e4;
|
|
1209
|
+
const deadline = Date.now() + timeoutMs;
|
|
1210
|
+
if (mountedRef.current) {
|
|
1211
|
+
setLoading(true);
|
|
1212
|
+
setError(null);
|
|
1213
|
+
}
|
|
1214
|
+
try {
|
|
1215
|
+
while (Date.now() <= deadline) {
|
|
1216
|
+
if (options.targetAlias) {
|
|
1217
|
+
const aliasMatch = extractAliasContextId(
|
|
1218
|
+
await mero.admin.lookupContextAlias(options.targetAlias)
|
|
1219
|
+
);
|
|
1220
|
+
if (aliasMatch && !knownContextIds.has(aliasMatch)) {
|
|
1221
|
+
const discoveredFromAlias = {
|
|
1222
|
+
contextId: aliasMatch,
|
|
1223
|
+
applicationId: options.applicationId
|
|
1224
|
+
};
|
|
1225
|
+
if (mountedRef.current) {
|
|
1226
|
+
setContext(discoveredFromAlias);
|
|
1227
|
+
}
|
|
1228
|
+
return discoveredFromAlias;
|
|
1229
|
+
}
|
|
1230
|
+
}
|
|
1231
|
+
const response = await mero.admin.getContextsForApplication(options.applicationId);
|
|
1232
|
+
const contexts = mapApplicationContexts(response.contexts ?? []);
|
|
1233
|
+
const discovered = contexts.find(
|
|
1234
|
+
(applicationContext) => !knownContextIds.has(applicationContext.contextId)
|
|
1235
|
+
);
|
|
1236
|
+
if (discovered) {
|
|
1237
|
+
if (mountedRef.current) {
|
|
1238
|
+
setContext(discovered);
|
|
1239
|
+
}
|
|
1240
|
+
return discovered;
|
|
1241
|
+
}
|
|
1242
|
+
if (Date.now() + pollIntervalMs > deadline) {
|
|
1243
|
+
break;
|
|
1244
|
+
}
|
|
1245
|
+
await sleep(pollIntervalMs);
|
|
1246
|
+
}
|
|
1247
|
+
const timeoutError = new Error(
|
|
1248
|
+
`Timed out discovering a context for application ${options.applicationId}`
|
|
1249
|
+
);
|
|
1250
|
+
if (mountedRef.current) {
|
|
1251
|
+
setContext(null);
|
|
1252
|
+
setError(timeoutError);
|
|
1253
|
+
}
|
|
1254
|
+
return null;
|
|
1255
|
+
} catch (err) {
|
|
1256
|
+
const errorValue = toError(err);
|
|
1257
|
+
if (mountedRef.current) {
|
|
1258
|
+
setContext(null);
|
|
1259
|
+
setError(errorValue);
|
|
1260
|
+
}
|
|
1261
|
+
return null;
|
|
1262
|
+
} finally {
|
|
1263
|
+
if (mountedRef.current) {
|
|
1264
|
+
setLoading(false);
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
}, [
|
|
1268
|
+
knownContextIdsKey,
|
|
1269
|
+
mero,
|
|
1270
|
+
mountedRef,
|
|
1271
|
+
options.applicationId,
|
|
1272
|
+
options.knownContextIds,
|
|
1273
|
+
options.pollIntervalMs,
|
|
1274
|
+
options.targetAlias,
|
|
1275
|
+
options.timeoutMs
|
|
1276
|
+
]);
|
|
1277
|
+
const reset = useCallback(() => {
|
|
1278
|
+
if (mountedRef.current) {
|
|
1279
|
+
setContext(null);
|
|
1280
|
+
setError(null);
|
|
1281
|
+
setLoading(false);
|
|
1282
|
+
}
|
|
1283
|
+
}, [mountedRef]);
|
|
1284
|
+
return { context, loading, error, discover, reset };
|
|
1285
|
+
}
|
|
1286
|
+
function useCreateContext() {
|
|
1287
|
+
const { mero } = useMero();
|
|
1288
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1289
|
+
const createContext2 = useCallback(
|
|
1290
|
+
async (request) => {
|
|
1291
|
+
if (!mero) return null;
|
|
1292
|
+
return run(() => mero.admin.createContext(request));
|
|
1293
|
+
},
|
|
1294
|
+
[mero, run]
|
|
1295
|
+
);
|
|
1296
|
+
return { createContext: createContext2, loading, error };
|
|
1297
|
+
}
|
|
1298
|
+
function useDeleteContext() {
|
|
1299
|
+
const { mero } = useMero();
|
|
1300
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1301
|
+
const deleteContext = useCallback(
|
|
1302
|
+
async (contextId) => {
|
|
1303
|
+
if (!mero) return null;
|
|
1304
|
+
return run(() => mero.admin.deleteContext(contextId));
|
|
1305
|
+
},
|
|
1306
|
+
[mero, run]
|
|
1307
|
+
);
|
|
1308
|
+
return { deleteContext, loading, error };
|
|
1309
|
+
}
|
|
1310
|
+
function useJoinContext() {
|
|
1311
|
+
const { mero } = useMero();
|
|
1312
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1313
|
+
const joinContext = useCallback(
|
|
1314
|
+
async (contextId) => {
|
|
1315
|
+
if (!mero) return null;
|
|
1316
|
+
return run(() => mero.admin.joinContext(contextId));
|
|
1317
|
+
},
|
|
1318
|
+
[mero, run]
|
|
1319
|
+
);
|
|
1320
|
+
return { joinContext, loading, error };
|
|
1321
|
+
}
|
|
1322
|
+
function useContextGroup(contextId) {
|
|
1323
|
+
const { mero } = useMero();
|
|
1324
|
+
const [groupId, setGroupId] = useState(null);
|
|
1325
|
+
const [loading, setLoading] = useState(false);
|
|
1326
|
+
const [error, setError] = useState(null);
|
|
1327
|
+
const mountedRef = useMountedRef();
|
|
1328
|
+
const refetch = useCallback(async () => {
|
|
1329
|
+
if (!mero || !contextId) {
|
|
1330
|
+
if (mountedRef.current) {
|
|
1331
|
+
setGroupId(null);
|
|
1332
|
+
setError(null);
|
|
1333
|
+
setLoading(false);
|
|
1334
|
+
}
|
|
1335
|
+
return;
|
|
1336
|
+
}
|
|
1337
|
+
if (mountedRef.current) {
|
|
1338
|
+
setLoading(true);
|
|
1339
|
+
setError(null);
|
|
1340
|
+
}
|
|
1341
|
+
try {
|
|
1342
|
+
const result = await mero.admin.getContextGroup(contextId);
|
|
1343
|
+
if (mountedRef.current) {
|
|
1344
|
+
setGroupId(result);
|
|
1345
|
+
}
|
|
1346
|
+
} catch (err) {
|
|
1347
|
+
const errorValue = toError(err);
|
|
1348
|
+
if (mountedRef.current) {
|
|
1349
|
+
setError(errorValue);
|
|
1350
|
+
}
|
|
1351
|
+
} finally {
|
|
1352
|
+
if (mountedRef.current) {
|
|
1353
|
+
setLoading(false);
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
}, [contextId, mero, mountedRef]);
|
|
1357
|
+
useEffect(() => {
|
|
1358
|
+
void refetch();
|
|
1359
|
+
}, [refetch]);
|
|
1360
|
+
return { groupId, loading, error, refetch };
|
|
1361
|
+
}
|
|
1362
|
+
function useGroupInfo(groupId) {
|
|
1363
|
+
const { mero } = useMero();
|
|
1364
|
+
const [groupInfo, setGroupInfo] = useState(null);
|
|
1365
|
+
const [loading, setLoading] = useState(false);
|
|
1366
|
+
const [error, setError] = useState(null);
|
|
1367
|
+
const mountedRef = useMountedRef();
|
|
1368
|
+
const refetch = useCallback(async () => {
|
|
1369
|
+
if (!mero || !groupId) {
|
|
1370
|
+
if (mountedRef.current) {
|
|
1371
|
+
setGroupInfo(null);
|
|
1372
|
+
setError(null);
|
|
1373
|
+
setLoading(false);
|
|
1374
|
+
}
|
|
1375
|
+
return;
|
|
1376
|
+
}
|
|
1377
|
+
if (mountedRef.current) {
|
|
1378
|
+
setLoading(true);
|
|
1379
|
+
setError(null);
|
|
1380
|
+
}
|
|
1381
|
+
try {
|
|
1382
|
+
const result = await mero.admin.getGroupInfo(groupId);
|
|
1383
|
+
if (mountedRef.current) {
|
|
1384
|
+
setGroupInfo(result);
|
|
1385
|
+
}
|
|
1386
|
+
} catch (err) {
|
|
1387
|
+
const errorValue = toError(err);
|
|
1388
|
+
if (mountedRef.current) {
|
|
1389
|
+
setError(errorValue);
|
|
1390
|
+
}
|
|
1391
|
+
} finally {
|
|
1392
|
+
if (mountedRef.current) {
|
|
1393
|
+
setLoading(false);
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
}, [groupId, mero, mountedRef]);
|
|
1397
|
+
useEffect(() => {
|
|
1398
|
+
void refetch();
|
|
1399
|
+
}, [refetch]);
|
|
1400
|
+
return { groupInfo, loading, error, refetch };
|
|
1401
|
+
}
|
|
1402
|
+
function useDeleteGroup() {
|
|
1403
|
+
const { mero } = useMero();
|
|
1404
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1405
|
+
const deleteGroup = useCallback(
|
|
1406
|
+
async (groupId, request) => {
|
|
1407
|
+
if (!mero) return null;
|
|
1408
|
+
return run(() => mero.admin.deleteGroup(groupId, request));
|
|
1409
|
+
},
|
|
1410
|
+
[mero, run]
|
|
1411
|
+
);
|
|
1412
|
+
return { deleteGroup, loading, error };
|
|
1413
|
+
}
|
|
1414
|
+
function useSyncGroup() {
|
|
1415
|
+
const { mero } = useMero();
|
|
1416
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1417
|
+
const syncGroup = useCallback(
|
|
1418
|
+
async (groupId, request) => {
|
|
1419
|
+
if (!mero) return null;
|
|
1420
|
+
return run(() => mero.admin.syncGroup(groupId, request));
|
|
1421
|
+
},
|
|
1422
|
+
[mero, run]
|
|
1423
|
+
);
|
|
1424
|
+
return { syncGroup, loading, error };
|
|
1425
|
+
}
|
|
1426
|
+
function useAddGroupMembers() {
|
|
1427
|
+
const { mero } = useMero();
|
|
1428
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1429
|
+
const addGroupMembers = useCallback(
|
|
1430
|
+
async (groupId, request) => {
|
|
1431
|
+
if (!mero) return null;
|
|
1432
|
+
return run(() => mero.admin.addGroupMembers(groupId, request));
|
|
1433
|
+
},
|
|
1434
|
+
[mero, run]
|
|
1435
|
+
);
|
|
1436
|
+
return { addGroupMembers, loading, error };
|
|
1437
|
+
}
|
|
1438
|
+
function useRemoveGroupMembers() {
|
|
1439
|
+
const { mero } = useMero();
|
|
1440
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1441
|
+
const removeGroupMembers = useCallback(
|
|
1442
|
+
async (groupId, request) => {
|
|
1443
|
+
if (!mero) return null;
|
|
1444
|
+
return run(() => mero.admin.removeGroupMembers(groupId, request));
|
|
1445
|
+
},
|
|
1446
|
+
[mero, run]
|
|
1447
|
+
);
|
|
1448
|
+
return { removeGroupMembers, loading, error };
|
|
1449
|
+
}
|
|
1450
|
+
function useNamespaces() {
|
|
1451
|
+
const { mero } = useMero();
|
|
1452
|
+
const [namespaces, setNamespaces] = useState([]);
|
|
1453
|
+
const [loading, setLoading] = useState(false);
|
|
1454
|
+
const [error, setError] = useState(null);
|
|
1455
|
+
const mountedRef = useMountedRef();
|
|
1456
|
+
const refetch = useCallback(async () => {
|
|
1457
|
+
if (!mero) return;
|
|
1458
|
+
if (mountedRef.current) {
|
|
1459
|
+
setLoading(true);
|
|
1460
|
+
setError(null);
|
|
1461
|
+
}
|
|
1462
|
+
try {
|
|
1463
|
+
const result = await mero.admin.listNamespaces();
|
|
1464
|
+
if (mountedRef.current) {
|
|
1465
|
+
setNamespaces(result);
|
|
1466
|
+
}
|
|
1467
|
+
} catch (err) {
|
|
1468
|
+
const errorValue = toError(err);
|
|
1469
|
+
if (mountedRef.current) {
|
|
1470
|
+
setError(errorValue);
|
|
1471
|
+
}
|
|
1472
|
+
} finally {
|
|
1473
|
+
if (mountedRef.current) {
|
|
1474
|
+
setLoading(false);
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
}, [mero, mountedRef]);
|
|
1478
|
+
useEffect(() => {
|
|
1479
|
+
void refetch();
|
|
1480
|
+
}, [refetch]);
|
|
1481
|
+
return { namespaces, loading, error, refetch };
|
|
1482
|
+
}
|
|
1483
|
+
function useNamespace(namespaceId) {
|
|
1484
|
+
const { mero } = useMero();
|
|
1485
|
+
const [namespace, setNamespace] = useState(null);
|
|
1486
|
+
const [loading, setLoading] = useState(false);
|
|
1487
|
+
const [error, setError] = useState(null);
|
|
1488
|
+
const mountedRef = useMountedRef();
|
|
1489
|
+
const refetch = useCallback(async () => {
|
|
1490
|
+
if (!mero || !namespaceId) {
|
|
1491
|
+
if (mountedRef.current) {
|
|
1492
|
+
setNamespace(null);
|
|
1493
|
+
setError(null);
|
|
1494
|
+
setLoading(false);
|
|
1495
|
+
}
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
if (mountedRef.current) {
|
|
1499
|
+
setLoading(true);
|
|
1500
|
+
setError(null);
|
|
1501
|
+
}
|
|
1502
|
+
try {
|
|
1503
|
+
const result = await mero.admin.getNamespace(namespaceId);
|
|
1504
|
+
if (mountedRef.current) {
|
|
1505
|
+
setNamespace(result);
|
|
1506
|
+
}
|
|
1507
|
+
} catch (err) {
|
|
1508
|
+
const errorValue = toError(err);
|
|
1509
|
+
if (mountedRef.current) {
|
|
1510
|
+
setError(errorValue);
|
|
1511
|
+
}
|
|
1512
|
+
} finally {
|
|
1513
|
+
if (mountedRef.current) {
|
|
1514
|
+
setLoading(false);
|
|
1515
|
+
}
|
|
1516
|
+
}
|
|
1517
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1518
|
+
useEffect(() => {
|
|
1519
|
+
void refetch();
|
|
1520
|
+
}, [refetch]);
|
|
1521
|
+
return { namespace, loading, error, refetch };
|
|
1522
|
+
}
|
|
1523
|
+
function useNamespaceIdentity(namespaceId) {
|
|
1524
|
+
const { mero } = useMero();
|
|
1525
|
+
const [identity, setIdentity] = useState(null);
|
|
1526
|
+
const [loading, setLoading] = useState(false);
|
|
1527
|
+
const [error, setError] = useState(null);
|
|
1528
|
+
const mountedRef = useMountedRef();
|
|
1529
|
+
const refetch = useCallback(async () => {
|
|
1530
|
+
if (!mero || !namespaceId) {
|
|
1531
|
+
if (mountedRef.current) {
|
|
1532
|
+
setIdentity(null);
|
|
1533
|
+
setError(null);
|
|
1534
|
+
setLoading(false);
|
|
1535
|
+
}
|
|
1536
|
+
return;
|
|
1537
|
+
}
|
|
1538
|
+
if (mountedRef.current) {
|
|
1539
|
+
setLoading(true);
|
|
1540
|
+
setError(null);
|
|
1541
|
+
}
|
|
1542
|
+
try {
|
|
1543
|
+
const result = await mero.admin.getNamespaceIdentity(namespaceId);
|
|
1544
|
+
if (mountedRef.current) {
|
|
1545
|
+
setIdentity(result);
|
|
1546
|
+
}
|
|
1547
|
+
} catch (err) {
|
|
1548
|
+
const errorValue = toError(err);
|
|
1549
|
+
if (mountedRef.current) {
|
|
1550
|
+
setError(errorValue);
|
|
1551
|
+
}
|
|
1552
|
+
} finally {
|
|
1553
|
+
if (mountedRef.current) {
|
|
1554
|
+
setLoading(false);
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1558
|
+
useEffect(() => {
|
|
1559
|
+
void refetch();
|
|
1560
|
+
}, [refetch]);
|
|
1561
|
+
return { identity, loading, error, refetch };
|
|
1562
|
+
}
|
|
1563
|
+
function useNamespacesForApplication(applicationId) {
|
|
1564
|
+
const { mero } = useMero();
|
|
1565
|
+
const [namespaces, setNamespaces] = useState([]);
|
|
1566
|
+
const [loading, setLoading] = useState(false);
|
|
1567
|
+
const [error, setError] = useState(null);
|
|
1568
|
+
const mountedRef = useMountedRef();
|
|
1569
|
+
const refetch = useCallback(async () => {
|
|
1570
|
+
if (!mero || !applicationId) {
|
|
1571
|
+
if (mountedRef.current) {
|
|
1572
|
+
setNamespaces([]);
|
|
1573
|
+
setError(null);
|
|
1574
|
+
setLoading(false);
|
|
1575
|
+
}
|
|
1576
|
+
return;
|
|
1577
|
+
}
|
|
1578
|
+
if (mountedRef.current) {
|
|
1579
|
+
setLoading(true);
|
|
1580
|
+
setError(null);
|
|
1581
|
+
}
|
|
1582
|
+
try {
|
|
1583
|
+
const result = await mero.admin.listNamespacesForApplication(applicationId);
|
|
1584
|
+
if (mountedRef.current) {
|
|
1585
|
+
setNamespaces(result);
|
|
1586
|
+
}
|
|
1587
|
+
} catch (err) {
|
|
1588
|
+
const errorValue = toError(err);
|
|
1589
|
+
if (mountedRef.current) {
|
|
1590
|
+
setError(errorValue);
|
|
1591
|
+
}
|
|
1592
|
+
} finally {
|
|
1593
|
+
if (mountedRef.current) {
|
|
1594
|
+
setLoading(false);
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
}, [applicationId, mero, mountedRef]);
|
|
1598
|
+
useEffect(() => {
|
|
1599
|
+
void refetch();
|
|
1600
|
+
}, [refetch]);
|
|
1601
|
+
return { namespaces, loading, error, refetch };
|
|
1602
|
+
}
|
|
1603
|
+
function useCreateNamespace() {
|
|
1604
|
+
const { mero } = useMero();
|
|
1605
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1606
|
+
const createNamespace = useCallback(
|
|
1607
|
+
async (request) => {
|
|
1608
|
+
if (!mero) return null;
|
|
1609
|
+
return run(() => mero.admin.createNamespace(request));
|
|
1610
|
+
},
|
|
1611
|
+
[mero, run]
|
|
1612
|
+
);
|
|
1613
|
+
return { createNamespace, loading, error };
|
|
1614
|
+
}
|
|
1615
|
+
function useDeleteNamespace() {
|
|
1616
|
+
const { mero } = useMero();
|
|
1617
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1618
|
+
const deleteNamespace = useCallback(
|
|
1619
|
+
async (namespaceId, request) => {
|
|
1620
|
+
if (!mero) return null;
|
|
1621
|
+
return run(() => mero.admin.deleteNamespace(namespaceId, request));
|
|
1622
|
+
},
|
|
1623
|
+
[mero, run]
|
|
1624
|
+
);
|
|
1625
|
+
return { deleteNamespace, loading, error };
|
|
1626
|
+
}
|
|
1627
|
+
function useCreateNamespaceInvitation() {
|
|
1628
|
+
const { mero } = useMero();
|
|
1629
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1630
|
+
const createNamespaceInvitation = useCallback(
|
|
1631
|
+
async (namespaceId, request) => {
|
|
1632
|
+
if (!mero) return null;
|
|
1633
|
+
return run(() => mero.admin.createNamespaceInvitation(namespaceId, request));
|
|
1634
|
+
},
|
|
1635
|
+
[mero, run]
|
|
1636
|
+
);
|
|
1637
|
+
return { createNamespaceInvitation, loading, error };
|
|
1638
|
+
}
|
|
1639
|
+
function useJoinNamespace() {
|
|
1640
|
+
const { mero } = useMero();
|
|
1641
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1642
|
+
const joinNamespace = useCallback(
|
|
1643
|
+
async (namespaceId, request) => {
|
|
1644
|
+
if (!mero) return null;
|
|
1645
|
+
return run(() => mero.admin.joinNamespace(namespaceId, request));
|
|
1646
|
+
},
|
|
1647
|
+
[mero, run]
|
|
1648
|
+
);
|
|
1649
|
+
return { joinNamespace, loading, error };
|
|
1650
|
+
}
|
|
1651
|
+
function useCreateGroupInNamespace() {
|
|
1652
|
+
const { mero } = useMero();
|
|
1653
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1654
|
+
const createGroupInNamespace = useCallback(
|
|
1655
|
+
async (namespaceId, request) => {
|
|
1656
|
+
if (!mero) return null;
|
|
1657
|
+
return run(() => mero.admin.createGroupInNamespace(namespaceId, request));
|
|
1658
|
+
},
|
|
1659
|
+
[mero, run]
|
|
1660
|
+
);
|
|
1661
|
+
return { createGroupInNamespace, loading, error };
|
|
1662
|
+
}
|
|
1663
|
+
function useNamespaceGroups(namespaceId) {
|
|
1664
|
+
const { mero } = useMero();
|
|
1665
|
+
const [groups, setGroups] = useState([]);
|
|
1666
|
+
const [loading, setLoading] = useState(false);
|
|
1667
|
+
const [error, setError] = useState(null);
|
|
1668
|
+
const mountedRef = useMountedRef();
|
|
1669
|
+
const refetch = useCallback(async () => {
|
|
1670
|
+
if (!mero || !namespaceId) {
|
|
1671
|
+
if (mountedRef.current) {
|
|
1672
|
+
setGroups([]);
|
|
1673
|
+
setError(null);
|
|
1674
|
+
setLoading(false);
|
|
1675
|
+
}
|
|
1676
|
+
return;
|
|
1677
|
+
}
|
|
1678
|
+
if (mountedRef.current) {
|
|
1679
|
+
setLoading(true);
|
|
1680
|
+
setError(null);
|
|
1681
|
+
}
|
|
1682
|
+
try {
|
|
1683
|
+
const result = await mero.admin.listNamespaceGroups(namespaceId);
|
|
1684
|
+
if (mountedRef.current) {
|
|
1685
|
+
setGroups(result);
|
|
1686
|
+
}
|
|
1687
|
+
} catch (err) {
|
|
1688
|
+
const errorValue = toError(err);
|
|
1689
|
+
if (mountedRef.current) {
|
|
1690
|
+
setError(errorValue);
|
|
1691
|
+
}
|
|
1692
|
+
} finally {
|
|
1693
|
+
if (mountedRef.current) {
|
|
1694
|
+
setLoading(false);
|
|
1695
|
+
}
|
|
1696
|
+
}
|
|
1697
|
+
}, [namespaceId, mero, mountedRef]);
|
|
1698
|
+
useEffect(() => {
|
|
1699
|
+
void refetch();
|
|
1700
|
+
}, [refetch]);
|
|
1701
|
+
return { groups, loading, error, refetch };
|
|
1702
|
+
}
|
|
1703
|
+
function useUpdateMemberRole() {
|
|
1704
|
+
const { mero } = useMero();
|
|
1705
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1706
|
+
const updateMemberRole = useCallback(
|
|
1707
|
+
async (groupId, identity, request) => {
|
|
1708
|
+
if (!mero) return null;
|
|
1709
|
+
return run(() => mero.admin.updateMemberRole(groupId, identity, request));
|
|
1710
|
+
},
|
|
1711
|
+
[mero, run]
|
|
1712
|
+
);
|
|
1713
|
+
return { updateMemberRole, loading, error };
|
|
1714
|
+
}
|
|
1715
|
+
function useSetDefaultCapabilities() {
|
|
1716
|
+
const { mero } = useMero();
|
|
1717
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1718
|
+
const setDefaultCapabilities = useCallback(
|
|
1719
|
+
async (groupId, request) => {
|
|
1720
|
+
if (!mero) return null;
|
|
1721
|
+
return run(() => mero.admin.setDefaultCapabilities(groupId, request));
|
|
1722
|
+
},
|
|
1723
|
+
[mero, run]
|
|
1724
|
+
);
|
|
1725
|
+
return { setDefaultCapabilities, loading, error };
|
|
1726
|
+
}
|
|
1727
|
+
function useSetDefaultVisibility() {
|
|
1728
|
+
const { mero } = useMero();
|
|
1729
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1730
|
+
const setDefaultVisibility = useCallback(
|
|
1731
|
+
async (groupId, request) => {
|
|
1732
|
+
if (!mero) return null;
|
|
1733
|
+
return run(() => mero.admin.setDefaultVisibility(groupId, request));
|
|
1734
|
+
},
|
|
1735
|
+
[mero, run]
|
|
1736
|
+
);
|
|
1737
|
+
return { setDefaultVisibility, loading, error };
|
|
1738
|
+
}
|
|
1739
|
+
function useSetTeeAdmissionPolicy() {
|
|
1740
|
+
const { mero } = useMero();
|
|
1741
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1742
|
+
const setTeeAdmissionPolicy = useCallback(
|
|
1743
|
+
async (groupId, request) => {
|
|
1744
|
+
if (!mero) return null;
|
|
1745
|
+
return run(() => mero.admin.setTeeAdmissionPolicy(groupId, request));
|
|
1746
|
+
},
|
|
1747
|
+
[mero, run]
|
|
1748
|
+
);
|
|
1749
|
+
return { setTeeAdmissionPolicy, loading, error };
|
|
1750
|
+
}
|
|
1751
|
+
function useUpdateGroupSettings() {
|
|
1752
|
+
const { mero } = useMero();
|
|
1753
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1754
|
+
const updateGroupSettings = useCallback(
|
|
1755
|
+
async (groupId, request) => {
|
|
1756
|
+
if (!mero) return null;
|
|
1757
|
+
return run(() => mero.admin.updateGroupSettings(groupId, request));
|
|
1758
|
+
},
|
|
1759
|
+
[mero, run]
|
|
1760
|
+
);
|
|
1761
|
+
return { updateGroupSettings, loading, error };
|
|
1762
|
+
}
|
|
1763
|
+
function useSetGroupAlias() {
|
|
1764
|
+
const { mero } = useMero();
|
|
1765
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1766
|
+
const setGroupAlias = useCallback(
|
|
1767
|
+
async (groupId, request) => {
|
|
1768
|
+
if (!mero) return null;
|
|
1769
|
+
return run(() => mero.admin.setGroupAlias(groupId, request));
|
|
1770
|
+
},
|
|
1771
|
+
[mero, run]
|
|
1772
|
+
);
|
|
1773
|
+
return { setGroupAlias, loading, error };
|
|
1774
|
+
}
|
|
1775
|
+
function useSetMemberAlias() {
|
|
1776
|
+
const { mero } = useMero();
|
|
1777
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1778
|
+
const setMemberAlias = useCallback(
|
|
1779
|
+
async (groupId, identity, request) => {
|
|
1780
|
+
if (!mero) return null;
|
|
1781
|
+
return run(() => mero.admin.setMemberAlias(groupId, identity, request));
|
|
1782
|
+
},
|
|
1783
|
+
[mero, run]
|
|
1784
|
+
);
|
|
1785
|
+
return { setMemberAlias, loading, error };
|
|
1786
|
+
}
|
|
1787
|
+
function useRegisterGroupSigningKey() {
|
|
1788
|
+
const { mero } = useMero();
|
|
1789
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1790
|
+
const registerGroupSigningKey = useCallback(
|
|
1791
|
+
async (groupId, request) => {
|
|
1792
|
+
if (!mero) return null;
|
|
1793
|
+
return run(() => mero.admin.registerGroupSigningKey(groupId, request));
|
|
1794
|
+
},
|
|
1795
|
+
[mero, run]
|
|
1796
|
+
);
|
|
1797
|
+
return { registerGroupSigningKey, loading, error };
|
|
1798
|
+
}
|
|
1799
|
+
function useUpgradeGroup() {
|
|
1800
|
+
const { mero } = useMero();
|
|
1801
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1802
|
+
const upgradeGroup = useCallback(
|
|
1803
|
+
async (groupId, request) => {
|
|
1804
|
+
if (!mero) return null;
|
|
1805
|
+
return run(() => mero.admin.upgradeGroup(groupId, request));
|
|
1806
|
+
},
|
|
1807
|
+
[mero, run]
|
|
1808
|
+
);
|
|
1809
|
+
return { upgradeGroup, loading, error };
|
|
1810
|
+
}
|
|
1811
|
+
function useGroupUpgradeStatus(groupId) {
|
|
1812
|
+
const { mero } = useMero();
|
|
1813
|
+
const [upgradeStatus, setUpgradeStatus] = useState(null);
|
|
1814
|
+
const [loading, setLoading] = useState(false);
|
|
1815
|
+
const [error, setError] = useState(null);
|
|
1816
|
+
const mountedRef = useMountedRef();
|
|
1817
|
+
const refetch = useCallback(async () => {
|
|
1818
|
+
if (!mero || !groupId) {
|
|
1819
|
+
if (mountedRef.current) {
|
|
1820
|
+
setUpgradeStatus(null);
|
|
1821
|
+
setError(null);
|
|
1822
|
+
setLoading(false);
|
|
1823
|
+
}
|
|
1824
|
+
return;
|
|
1825
|
+
}
|
|
1826
|
+
if (mountedRef.current) {
|
|
1827
|
+
setLoading(true);
|
|
1828
|
+
setError(null);
|
|
1829
|
+
}
|
|
1830
|
+
try {
|
|
1831
|
+
const result = await mero.admin.getGroupUpgradeStatus(groupId);
|
|
1832
|
+
if (mountedRef.current) {
|
|
1833
|
+
setUpgradeStatus(result);
|
|
1834
|
+
}
|
|
1835
|
+
} catch (err) {
|
|
1836
|
+
const errorValue = toError(err);
|
|
1837
|
+
if (mountedRef.current) {
|
|
1838
|
+
setError(errorValue);
|
|
1839
|
+
}
|
|
1840
|
+
} finally {
|
|
1841
|
+
if (mountedRef.current) {
|
|
1842
|
+
setLoading(false);
|
|
1843
|
+
}
|
|
1844
|
+
}
|
|
1845
|
+
}, [groupId, mero, mountedRef]);
|
|
1846
|
+
useEffect(() => {
|
|
1847
|
+
void refetch();
|
|
1848
|
+
}, [refetch]);
|
|
1849
|
+
return { upgradeStatus, loading, error, refetch };
|
|
1850
|
+
}
|
|
1851
|
+
function useRetryGroupUpgrade() {
|
|
1852
|
+
const { mero } = useMero();
|
|
1853
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1854
|
+
const retryGroupUpgrade = useCallback(
|
|
1855
|
+
async (groupId, request) => {
|
|
1856
|
+
if (!mero) return null;
|
|
1857
|
+
return run(() => mero.admin.retryGroupUpgrade(groupId, request));
|
|
1858
|
+
},
|
|
1859
|
+
[mero, run]
|
|
1860
|
+
);
|
|
1861
|
+
return { retryGroupUpgrade, loading, error };
|
|
1862
|
+
}
|
|
1863
|
+
function useNestGroup() {
|
|
1864
|
+
const { mero } = useMero();
|
|
1865
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1866
|
+
const nestGroup = useCallback(
|
|
1867
|
+
async (parentGroupId, request) => {
|
|
1868
|
+
if (!mero) return null;
|
|
1869
|
+
return run(() => mero.admin.nestGroup(parentGroupId, request));
|
|
1870
|
+
},
|
|
1871
|
+
[mero, run]
|
|
1872
|
+
);
|
|
1873
|
+
return { nestGroup, loading, error };
|
|
1874
|
+
}
|
|
1875
|
+
function useUnnestGroup() {
|
|
1876
|
+
const { mero } = useMero();
|
|
1877
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1878
|
+
const unnestGroup = useCallback(
|
|
1879
|
+
async (parentGroupId, request) => {
|
|
1880
|
+
if (!mero) return null;
|
|
1881
|
+
return run(() => mero.admin.unnestGroup(parentGroupId, request));
|
|
1882
|
+
},
|
|
1883
|
+
[mero, run]
|
|
1884
|
+
);
|
|
1885
|
+
return { unnestGroup, loading, error };
|
|
1886
|
+
}
|
|
1887
|
+
function useSubgroups(groupId) {
|
|
1888
|
+
const { mero } = useMero();
|
|
1889
|
+
const [subgroups, setSubgroups] = useState([]);
|
|
1890
|
+
const [loading, setLoading] = useState(false);
|
|
1891
|
+
const [error, setError] = useState(null);
|
|
1892
|
+
const mountedRef = useMountedRef();
|
|
1893
|
+
const refetch = useCallback(async () => {
|
|
1894
|
+
if (!mero || !groupId) {
|
|
1895
|
+
if (mountedRef.current) {
|
|
1896
|
+
setSubgroups([]);
|
|
1897
|
+
setError(null);
|
|
1898
|
+
setLoading(false);
|
|
1899
|
+
}
|
|
1900
|
+
return;
|
|
1901
|
+
}
|
|
1902
|
+
if (mountedRef.current) {
|
|
1903
|
+
setLoading(true);
|
|
1904
|
+
setError(null);
|
|
1905
|
+
}
|
|
1906
|
+
try {
|
|
1907
|
+
const result = await mero.admin.listSubgroups(groupId);
|
|
1908
|
+
if (mountedRef.current) {
|
|
1909
|
+
setSubgroups(result);
|
|
1910
|
+
}
|
|
1911
|
+
} catch (err) {
|
|
1912
|
+
const errorValue = toError(err);
|
|
1913
|
+
if (mountedRef.current) {
|
|
1914
|
+
setError(errorValue);
|
|
1915
|
+
}
|
|
1916
|
+
} finally {
|
|
1917
|
+
if (mountedRef.current) {
|
|
1918
|
+
setLoading(false);
|
|
1919
|
+
}
|
|
1920
|
+
}
|
|
1921
|
+
}, [groupId, mero, mountedRef]);
|
|
1922
|
+
useEffect(() => {
|
|
1923
|
+
void refetch();
|
|
1924
|
+
}, [refetch]);
|
|
1925
|
+
return { subgroups, loading, error, refetch };
|
|
1926
|
+
}
|
|
1927
|
+
function useDetachContextFromGroup() {
|
|
1928
|
+
const { mero } = useMero();
|
|
1929
|
+
const { loading, error, run } = useAsyncMutation();
|
|
1930
|
+
const detachContextFromGroup = useCallback(
|
|
1931
|
+
async (groupId, contextId, request) => {
|
|
1932
|
+
if (!mero) return null;
|
|
1933
|
+
return run(() => mero.admin.detachContextFromGroup(groupId, contextId, request));
|
|
1934
|
+
},
|
|
1935
|
+
[mero, run]
|
|
1936
|
+
);
|
|
1937
|
+
return { detachContextFromGroup, loading, error };
|
|
1938
|
+
}
|
|
470
1939
|
|
|
471
|
-
export { AppMode, ConnectionType, MeroContext, MeroProvider, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, setApplicationId, setContextId, setContextIdentity, setNodeUrl, useContexts, useExecute, useMero, useSubscription };
|
|
1940
|
+
export { AppMode, ConnectButton, ConnectionType, LoginModal, MeroContext, MeroProvider, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, getApplicationId, getContextId, getContextIdentity, getNodeUrl, localStorageTokenStorage, setApplicationId, setContextId, setContextIdentity, setNodeUrl, useAddGroupMembers, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupUpgradeStatus, useJoinContext, useJoinGroup, useJoinNamespace, useMero, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useNestGroup, useRegisterGroupSigningKey, useRemoveGroupMembers, useRetryGroupUpgrade, useSetDefaultCapabilities, useSetDefaultVisibility, useSetGroupAlias, useSetMemberAlias, useSetTeeAdmissionPolicy, useSubgroups, useSubscription, useSyncGroup, useUnnestGroup, useUpdateGroupSettings, useUpdateMemberRole, useUpgradeGroup };
|
|
472
1941
|
//# sourceMappingURL=index.js.map
|
|
473
1942
|
//# sourceMappingURL=index.js.map
|