@retinalabsllc/zairusjs 0.6.0 → 0.6.1
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.d.mts +15 -21
- package/dist/index.d.ts +15 -21
- package/dist/index.js +351 -356
- package/dist/index.mjs +329 -332
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -63,7 +63,6 @@ __export(index_exports, {
|
|
|
63
63
|
UniversalDashboardPage: () => UniversalDashboardPage,
|
|
64
64
|
UniversalDirectoryPage: () => UniversalDirectoryPage,
|
|
65
65
|
UniversalErrorView: () => UniversalErrorView,
|
|
66
|
-
UniversalHeader: () => UniversalHeader,
|
|
67
66
|
UniversalIdentityPage: () => UniversalIdentityPage,
|
|
68
67
|
UniversalLookupPage: () => UniversalLookupPage,
|
|
69
68
|
UniversalMembersPage: () => UniversalMembersPage,
|
|
@@ -740,13 +739,13 @@ var import_react13 = __toESM(require("react"));
|
|
|
740
739
|
var import_image3 = __toESM(require("next/image"));
|
|
741
740
|
var import_react14 = require("@hugeicons/react");
|
|
742
741
|
var import_core_free_icons3 = require("@hugeicons/core-free-icons");
|
|
743
|
-
var FeatureCard = ({ feature }) => {
|
|
742
|
+
var FeatureCard = ({ feature, bgImage }) => {
|
|
744
743
|
const [isBgLoading, setIsBgLoading] = (0, import_react13.useState)(true);
|
|
745
744
|
const [isFgLoading, setIsFgLoading] = (0, import_react13.useState)(!!feature.image);
|
|
746
745
|
return /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col shrink-0 w-[90vw] sm:w-150 snap-center md:snap-start group cursor-grab active:cursor-grabbing" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative w-full aspect-16/10 bg-neutral-100 rounded-2xl overflow-hidden mb-6 flex items-center justify-center" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
747
746
|
import_image3.default,
|
|
748
747
|
{
|
|
749
|
-
src:
|
|
748
|
+
src: bgImage,
|
|
750
749
|
alt: "Card Background",
|
|
751
750
|
fill: true,
|
|
752
751
|
sizes: "(max-width: 768px) 90vw, 600px",
|
|
@@ -801,6 +800,11 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
801
800
|
scrollRef.current.scrollBy({ left: scrollAmount, behavior: "smooth" });
|
|
802
801
|
}
|
|
803
802
|
};
|
|
803
|
+
const bgImages = [
|
|
804
|
+
"/assets/webp/card-bg.webp",
|
|
805
|
+
"/assets/webp/card-bg2.webp",
|
|
806
|
+
"/assets/webp/card-bg3.webp"
|
|
807
|
+
];
|
|
804
808
|
return /* @__PURE__ */ import_react13.default.createElement("section", { className: "py-24 w-full flex justify-center relative z-10 overflow-hidden" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "max-w-6xl w-full flex flex-col px-4 md:px-8" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex flex-col md:flex-row md:items-end justify-between gap-6 mb-12" }, /* @__PURE__ */ import_react13.default.createElement("div", { className: "relative z-10 text-left" }, /* @__PURE__ */ import_react13.default.createElement("span", { className: "text-[10px] tracking-[0.4em] text-neutral-500 block mb-4" }, tagline), /* @__PURE__ */ import_react13.default.createElement("h2", { className: " font-serif text-3xl md:text-5xl tracking-tight text-black leading-[1.05]" }, headline)), /* @__PURE__ */ import_react13.default.createElement("div", { className: "hidden md:flex items-center gap-3" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
805
809
|
"button",
|
|
806
810
|
{
|
|
@@ -826,7 +830,7 @@ var FeatureScroll = ({ tagline, headline, features }) => {
|
|
|
826
830
|
onScroll: checkScroll,
|
|
827
831
|
className: "flex gap-6 overflow-x-auto snap-x snap-mandatory [&::-webkit-scrollbar]:hidden [-ms-overflow-style:none] scrollbar-none pb-8 -mx-4 px-4 md:mx-0 md:px-0"
|
|
828
832
|
},
|
|
829
|
-
features.map((feature, idx) => /* @__PURE__ */ import_react13.default.createElement(FeatureCard, { key: idx, feature }))
|
|
833
|
+
features.slice(0, 3).map((feature, idx) => /* @__PURE__ */ import_react13.default.createElement(FeatureCard, { key: idx, feature, bgImage: bgImages[idx] }))
|
|
830
834
|
), /* @__PURE__ */ import_react13.default.createElement("div", { className: "flex md:hidden items-center justify-center gap-4 mt-2" }, /* @__PURE__ */ import_react13.default.createElement(
|
|
831
835
|
"button",
|
|
832
836
|
{
|
|
@@ -1521,12 +1525,27 @@ var import_react37 = __toESM(require("react"));
|
|
|
1521
1525
|
var import_link9 = __toESM(require("next/link"));
|
|
1522
1526
|
var import_react38 = require("@hugeicons/react");
|
|
1523
1527
|
var import_core_free_icons9 = require("@hugeicons/core-free-icons");
|
|
1528
|
+
var ButtonSpinner = () => /* @__PURE__ */ import_react37.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react37.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react37.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1524
1529
|
var UniversalSidebar = ({
|
|
1525
1530
|
navItems,
|
|
1526
1531
|
currentPath,
|
|
1527
1532
|
isMobileOpen,
|
|
1528
1533
|
closeMobile,
|
|
1534
|
+
openMobile,
|
|
1529
1535
|
onNavClick,
|
|
1536
|
+
// Header integrations
|
|
1537
|
+
title = "App",
|
|
1538
|
+
subtitle,
|
|
1539
|
+
homeUrl = "/app",
|
|
1540
|
+
showBackButton = false,
|
|
1541
|
+
backUrl = "/app",
|
|
1542
|
+
showWorkspaceSwitcher = false,
|
|
1543
|
+
workspaces = [],
|
|
1544
|
+
activeWorkspaceId,
|
|
1545
|
+
onSwitchWorkspace,
|
|
1546
|
+
showLogoutAction = false,
|
|
1547
|
+
onLogout,
|
|
1548
|
+
// Intercept
|
|
1530
1549
|
showInterceptDialog = false,
|
|
1531
1550
|
onCancelIntercept,
|
|
1532
1551
|
onConfirmIntercept,
|
|
@@ -1534,6 +1553,9 @@ var UniversalSidebar = ({
|
|
|
1534
1553
|
interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
|
|
1535
1554
|
}) => {
|
|
1536
1555
|
const [isCollapsed, setIsCollapsed] = (0, import_react37.useState)(false);
|
|
1556
|
+
const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react37.useState)(false);
|
|
1557
|
+
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react37.useState)(false);
|
|
1558
|
+
const [isLoggingOut, setIsLoggingOut] = (0, import_react37.useState)(false);
|
|
1537
1559
|
(0, import_react37.useEffect)(() => {
|
|
1538
1560
|
if (isMobileOpen) {
|
|
1539
1561
|
closeMobile();
|
|
@@ -1542,7 +1564,25 @@ var UniversalSidebar = ({
|
|
|
1542
1564
|
const hasActiveMatch = navItems.some(
|
|
1543
1565
|
(item) => item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`)
|
|
1544
1566
|
);
|
|
1567
|
+
const handleLogoutInitiation = async () => {
|
|
1568
|
+
if (isLoggingOut || !onLogout) return;
|
|
1569
|
+
setIsLoggingOut(true);
|
|
1570
|
+
try {
|
|
1571
|
+
await onLogout();
|
|
1572
|
+
} catch (error) {
|
|
1573
|
+
setIsLoggingOut(false);
|
|
1574
|
+
setShowLogoutDialog(false);
|
|
1575
|
+
}
|
|
1576
|
+
};
|
|
1545
1577
|
return /* @__PURE__ */ import_react37.default.createElement(import_react37.default.Fragment, null, /* @__PURE__ */ import_react37.default.createElement(
|
|
1578
|
+
"button",
|
|
1579
|
+
{
|
|
1580
|
+
onClick: openMobile,
|
|
1581
|
+
className: `md:hidden fixed top-4 left-4 z-40 w-10 h-10 bg-white rounded-full flex items-center justify-center shadow-[0_4px_20px_rgba(0,0,0,0.08)] border border-neutral-100 text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
|
|
1582
|
+
"aria-label": "Open Menu"
|
|
1583
|
+
},
|
|
1584
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.SidebarLeft01Icon, size: 18 })
|
|
1585
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1546
1586
|
"div",
|
|
1547
1587
|
{
|
|
1548
1588
|
className: `fixed inset-0 bg-black/30 shadow-2xl transition-opacity duration-300 md:hidden z-90 ${isMobileOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
|
|
@@ -1558,16 +1598,16 @@ var UniversalSidebar = ({
|
|
|
1558
1598
|
${isCollapsed ? "md:w-16 w-64" : "w-64"}
|
|
1559
1599
|
`
|
|
1560
1600
|
},
|
|
1561
|
-
/* @__PURE__ */ import_react37.default.createElement("div", { className: "
|
|
1601
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center" : "justify-between"}` }, !isCollapsed || isMobileOpen ? /* @__PURE__ */ import_react37.default.createElement(import_link9.default, { href: homeUrl, className: "flex flex-col justify-center outline-none group min-w-0 pr-2" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)) : /* @__PURE__ */ import_react37.default.createElement(import_link9.default, { href: homeUrl, className: "w-8 h-8 bg-neutral-100 rounded-full flex items-center justify-center text-black font-serif text-xs font-medium hover:opacity-70 transition-opacity outline-none" }, title.charAt(0).toUpperCase()), /* @__PURE__ */ import_react37.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1562
1602
|
"button",
|
|
1563
1603
|
{
|
|
1564
1604
|
onClick: closeMobile,
|
|
1565
1605
|
className: "text-neutral-400 hover:text-black transition-colors outline-none",
|
|
1566
1606
|
"aria-label": "Close Menu"
|
|
1567
1607
|
},
|
|
1568
|
-
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CancelCircleIcon, size:
|
|
1569
|
-
)),
|
|
1570
|
-
/* @__PURE__ */ import_react37.default.createElement("nav", { className: "flex-1 py-
|
|
1608
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CancelCircleIcon, size: 24 })
|
|
1609
|
+
))),
|
|
1610
|
+
/* @__PURE__ */ import_react37.default.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar" }, navItems.map((item, index) => {
|
|
1571
1611
|
const isExactOrSubMatch = item.path === "/mod" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
|
|
1572
1612
|
const isCurrentRoute = isExactOrSubMatch || !hasActiveMatch && index === 0;
|
|
1573
1613
|
return /* @__PURE__ */ import_react37.default.createElement(
|
|
@@ -1576,7 +1616,7 @@ var UniversalSidebar = ({
|
|
|
1576
1616
|
key: item.name,
|
|
1577
1617
|
href: item.path,
|
|
1578
1618
|
onClick: (e) => onNavClick ? onNavClick(e, item.path) : void 0,
|
|
1579
|
-
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
|
|
1619
|
+
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group shrink-0 ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
|
|
1580
1620
|
title: isCollapsed && !isMobileOpen ? item.name : void 0
|
|
1581
1621
|
},
|
|
1582
1622
|
/* @__PURE__ */ import_react37.default.createElement(
|
|
@@ -1590,7 +1630,31 @@ var UniversalSidebar = ({
|
|
|
1590
1630
|
(!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs tracking-wide truncate" }, item.name)
|
|
1591
1631
|
);
|
|
1592
1632
|
})),
|
|
1593
|
-
/* @__PURE__ */ import_react37.default.createElement("div", { className: "p-4
|
|
1633
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2 border-t border-neutral-100/50" }, (showBackButton || showWorkspaceSwitcher || showLogoutAction) && /* @__PURE__ */ import_react37.default.createElement("div", { className: `flex gap-2 px-1 pb-2 ${isCollapsed && !isMobileOpen ? "flex-col items-center" : "items-center"}` }, showBackButton && /* @__PURE__ */ import_react37.default.createElement(
|
|
1634
|
+
import_link9.default,
|
|
1635
|
+
{
|
|
1636
|
+
href: backUrl,
|
|
1637
|
+
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none group",
|
|
1638
|
+
title: "Go Back"
|
|
1639
|
+
},
|
|
1640
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.ArrowLeft01Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1641
|
+
), showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react37.default.createElement(
|
|
1642
|
+
"button",
|
|
1643
|
+
{
|
|
1644
|
+
onClick: () => setShowSwitcherDialog(true),
|
|
1645
|
+
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
1646
|
+
title: "Switch Workspace"
|
|
1647
|
+
},
|
|
1648
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.UserIcon, size: 16 })
|
|
1649
|
+
), showLogoutAction && /* @__PURE__ */ import_react37.default.createElement(
|
|
1650
|
+
"button",
|
|
1651
|
+
{
|
|
1652
|
+
onClick: () => setShowLogoutDialog(true),
|
|
1653
|
+
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
1654
|
+
title: "Secure Logout"
|
|
1655
|
+
},
|
|
1656
|
+
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.LogoutCircle02Icon, size: 16 })
|
|
1657
|
+
)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1594
1658
|
"button",
|
|
1595
1659
|
{
|
|
1596
1660
|
onClick: () => setIsCollapsed(!isCollapsed),
|
|
@@ -1598,102 +1662,14 @@ var UniversalSidebar = ({
|
|
|
1598
1662
|
},
|
|
1599
1663
|
/* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
|
|
1600
1664
|
!isCollapsed && /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-xs" }, "Collapse")
|
|
1601
|
-
))
|
|
1602
|
-
),
|
|
1603
|
-
"div",
|
|
1604
|
-
{
|
|
1605
|
-
className: "absolute inset-0 bg-black/30",
|
|
1606
|
-
onClick: onCancelIntercept
|
|
1607
|
-
}
|
|
1608
|
-
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, interceptTitle), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, interceptMessage)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1609
|
-
"button",
|
|
1610
|
-
{
|
|
1611
|
-
onClick: onCancelIntercept,
|
|
1612
|
-
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1613
|
-
},
|
|
1614
|
-
"Cancel"
|
|
1615
|
-
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1616
|
-
"button",
|
|
1617
|
-
{
|
|
1618
|
-
onClick: onConfirmIntercept,
|
|
1619
|
-
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors flex justify-center items-center outline-none"
|
|
1620
|
-
},
|
|
1621
|
-
"Leave"
|
|
1622
|
-
)))));
|
|
1623
|
-
};
|
|
1624
|
-
|
|
1625
|
-
// src/components/UniversalHeader.tsx
|
|
1626
|
-
var import_react39 = __toESM(require("react"));
|
|
1627
|
-
var import_link10 = __toESM(require("next/link"));
|
|
1628
|
-
var import_react40 = require("@hugeicons/react");
|
|
1629
|
-
var import_core_free_icons10 = require("@hugeicons/core-free-icons");
|
|
1630
|
-
var ButtonSpinner = () => /* @__PURE__ */ import_react39.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react39.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react39.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1631
|
-
var UniversalHeader = ({
|
|
1632
|
-
onOpenMobile,
|
|
1633
|
-
title,
|
|
1634
|
-
subtitle,
|
|
1635
|
-
homeUrl = "/app",
|
|
1636
|
-
showBackButton = false,
|
|
1637
|
-
backUrl = "/app",
|
|
1638
|
-
showWorkspaceSwitcher = false,
|
|
1639
|
-
workspaces = [],
|
|
1640
|
-
activeWorkspaceId,
|
|
1641
|
-
onSwitchWorkspace,
|
|
1642
|
-
showLogoutAction = false,
|
|
1643
|
-
onLogout
|
|
1644
|
-
}) => {
|
|
1645
|
-
const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react39.useState)(false);
|
|
1646
|
-
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react39.useState)(false);
|
|
1647
|
-
const [isLoggingOut, setIsLoggingOut] = (0, import_react39.useState)(false);
|
|
1648
|
-
const handleLogoutInitiation = async () => {
|
|
1649
|
-
if (isLoggingOut || !onLogout) return;
|
|
1650
|
-
setIsLoggingOut(true);
|
|
1651
|
-
try {
|
|
1652
|
-
await onLogout();
|
|
1653
|
-
} catch (error) {
|
|
1654
|
-
setIsLoggingOut(false);
|
|
1655
|
-
setShowLogoutDialog(false);
|
|
1656
|
-
}
|
|
1657
|
-
};
|
|
1658
|
-
return /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full shrink-0 z-50 flex flex-col absolute top-0 left-0 pointer-events-none" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full pointer-events-auto relative z-20" }, /* @__PURE__ */ import_react39.default.createElement("header", { className: "w-full pt-6 pb-3" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "max-w-7xl mx-auto px-6 flex justify-between items-center" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1659
|
-
"button",
|
|
1660
|
-
{
|
|
1661
|
-
className: "md:hidden bg-white rounded-full w-8 h-8 text-neutral-500 hover:text-black transition-colors outline-none",
|
|
1662
|
-
onClick: onOpenMobile,
|
|
1663
|
-
"aria-label": "Open Menu"
|
|
1664
|
-
},
|
|
1665
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.SidebarLeft01Icon, size: 16 })
|
|
1666
|
-
), /* @__PURE__ */ import_react39.default.createElement(import_link10.default, { href: homeUrl, className: "flex items-center gap-3 transition-opacity hover:opacity-70 outline-none" }, /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col justify-center" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate tracking-wide mb-1" }, title), subtitle && /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center gap-3" }, showWorkspaceSwitcher && workspaces.length > 0 && /* @__PURE__ */ import_react39.default.createElement(
|
|
1667
|
-
"button",
|
|
1668
|
-
{
|
|
1669
|
-
onClick: () => setShowSwitcherDialog(true),
|
|
1670
|
-
className: "w-8 h-8 rounded-full bg-white flex items-center justify-center text-black transition-all group outline-none",
|
|
1671
|
-
"aria-label": "Switch Workspace"
|
|
1672
|
-
},
|
|
1673
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.UserIcon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1674
|
-
), showLogoutAction && /* @__PURE__ */ import_react39.default.createElement(
|
|
1675
|
-
"button",
|
|
1676
|
-
{
|
|
1677
|
-
onClick: () => setShowLogoutDialog(true),
|
|
1678
|
-
className: "w-8 h-8 rounded-full bg-white flex items-center justify-center text-black transition-all group outline-none",
|
|
1679
|
-
"aria-label": "Secure Logout"
|
|
1680
|
-
},
|
|
1681
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.LogoutCircle02Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1682
|
-
), showBackButton && /* @__PURE__ */ import_react39.default.createElement(
|
|
1683
|
-
import_link10.default,
|
|
1684
|
-
{
|
|
1685
|
-
href: backUrl,
|
|
1686
|
-
className: "flex items-center bg-white justify-center w-8 h-8 rounded-full text-black transition-all group outline-none",
|
|
1687
|
-
"aria-label": "Go Back"
|
|
1688
|
-
},
|
|
1689
|
-
/* @__PURE__ */ import_react39.default.createElement(import_react40.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 16, className: "transition-transform group-hover:-translate-x-0.5" })
|
|
1690
|
-
))))), showSwitcherDialog && showWorkspaceSwitcher && workspaces.length > 0 && /* @__PURE__ */ import_react39.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1665
|
+
)))
|
|
1666
|
+
), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1691
1667
|
"div",
|
|
1692
1668
|
{
|
|
1693
1669
|
className: "absolute inset-0 bg-black/30",
|
|
1694
1670
|
onClick: () => setShowSwitcherDialog(false)
|
|
1695
1671
|
}
|
|
1696
|
-
), /* @__PURE__ */
|
|
1672
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-5 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Switch Workspace"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-snug" }, "Select an organization to switch your current context.")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "max-h-75 overflow-y-auto w-full custom-scrollbar" }, workspaces.map((org) => /* @__PURE__ */ import_react37.default.createElement(
|
|
1697
1673
|
"button",
|
|
1698
1674
|
{
|
|
1699
1675
|
key: org.id,
|
|
@@ -1703,22 +1679,22 @@ var UniversalHeader = ({
|
|
|
1703
1679
|
},
|
|
1704
1680
|
className: "w-full text-left px-5 py-4 flex items-center justify-between hover:bg-neutral-50 transition-colors group outline-none last:border-0"
|
|
1705
1681
|
},
|
|
1706
|
-
/* @__PURE__ */
|
|
1707
|
-
activeWorkspaceId === org.id && /* @__PURE__ */
|
|
1708
|
-
))), /* @__PURE__ */
|
|
1682
|
+
/* @__PURE__ */ import_react37.default.createElement("div", { className: "flex flex-col truncate pr-4" }, /* @__PURE__ */ import_react37.default.createElement("span", { className: `text-[13px] truncate ${activeWorkspaceId === org.id ? "text-black" : "text-neutral-600 group-hover:text-black"}` }, org.name), /* @__PURE__ */ import_react37.default.createElement("span", { className: "text-[9px] text-neutral-400 tracking-[0.2em] mt-1" }, "Role: ", org.role)),
|
|
1683
|
+
activeWorkspaceId === org.id && /* @__PURE__ */ import_react37.default.createElement(import_react38.HugeiconsIcon, { icon: import_core_free_icons9.CheckmarkCircle01Icon, size: 16, className: "text-black shrink-0" })
|
|
1684
|
+
))), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex mt-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1709
1685
|
"button",
|
|
1710
1686
|
{
|
|
1711
1687
|
onClick: () => setShowSwitcherDialog(false),
|
|
1712
1688
|
className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1713
1689
|
},
|
|
1714
1690
|
"Cancel"
|
|
1715
|
-
)))), showLogoutDialog && showLogoutAction && /* @__PURE__ */
|
|
1691
|
+
)))), showLogoutDialog && showLogoutAction && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1716
1692
|
"div",
|
|
1717
1693
|
{
|
|
1718
1694
|
className: "absolute inset-0 bg-black/30",
|
|
1719
1695
|
onClick: () => !isLoggingOut && setShowLogoutDialog(false)
|
|
1720
1696
|
}
|
|
1721
|
-
), /* @__PURE__ */
|
|
1697
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Secure Logout"), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to log out? You will need to authenticate to return.")), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1722
1698
|
"button",
|
|
1723
1699
|
{
|
|
1724
1700
|
onClick: () => setShowLogoutDialog(false),
|
|
@@ -1726,21 +1702,41 @@ var UniversalHeader = ({
|
|
|
1726
1702
|
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
1727
1703
|
},
|
|
1728
1704
|
"Cancel"
|
|
1729
|
-
), /* @__PURE__ */
|
|
1705
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1730
1706
|
"button",
|
|
1731
1707
|
{
|
|
1732
1708
|
onClick: handleLogoutInitiation,
|
|
1733
1709
|
disabled: isLoggingOut,
|
|
1734
1710
|
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center items-center outline-none"
|
|
1735
1711
|
},
|
|
1736
|
-
isLoggingOut ? /* @__PURE__ */
|
|
1712
|
+
isLoggingOut ? /* @__PURE__ */ import_react37.default.createElement(ButtonSpinner, null) : "Log Out"
|
|
1713
|
+
)))), showInterceptDialog && /* @__PURE__ */ import_react37.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1714
|
+
"div",
|
|
1715
|
+
{
|
|
1716
|
+
className: "absolute inset-0 bg-black/30",
|
|
1717
|
+
onClick: onCancelIntercept
|
|
1718
|
+
}
|
|
1719
|
+
), /* @__PURE__ */ import_react37.default.createElement("div", { className: "relative w-72 bg-white rounded-2xl flex flex-col items-center overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react37.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react37.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, interceptTitle), /* @__PURE__ */ import_react37.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, interceptMessage)), /* @__PURE__ */ import_react37.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react37.default.createElement(
|
|
1720
|
+
"button",
|
|
1721
|
+
{
|
|
1722
|
+
onClick: onCancelIntercept,
|
|
1723
|
+
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
1724
|
+
},
|
|
1725
|
+
"Cancel"
|
|
1726
|
+
), /* @__PURE__ */ import_react37.default.createElement(
|
|
1727
|
+
"button",
|
|
1728
|
+
{
|
|
1729
|
+
onClick: onConfirmIntercept,
|
|
1730
|
+
className: "flex-1 py-2 text-[13px] text-[#F16A50] hover:bg-neutral-50 transition-colors flex justify-center items-center outline-none"
|
|
1731
|
+
},
|
|
1732
|
+
"Leave"
|
|
1737
1733
|
)))));
|
|
1738
1734
|
};
|
|
1739
1735
|
|
|
1740
1736
|
// src/components/UniversalOrganizationPage.tsx
|
|
1741
|
-
var
|
|
1737
|
+
var import_react39 = __toESM(require("react"));
|
|
1742
1738
|
var import_react_hot_toast3 = __toESM(require("react-hot-toast"));
|
|
1743
|
-
var InputSpinner2 = () => /* @__PURE__ */
|
|
1739
|
+
var InputSpinner2 = () => /* @__PURE__ */ import_react39.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react39.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react39.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1744
1740
|
var UniversalOrganizationPage = ({
|
|
1745
1741
|
initialOrgName,
|
|
1746
1742
|
initialSlug,
|
|
@@ -1750,12 +1746,12 @@ var UniversalOrganizationPage = ({
|
|
|
1750
1746
|
onSaveConfiguration,
|
|
1751
1747
|
onCheckSlugAvailability
|
|
1752
1748
|
}) => {
|
|
1753
|
-
const [orgName, setOrgName] = (0,
|
|
1754
|
-
const [slug, setSlug] = (0,
|
|
1755
|
-
const [isCheckingSlug, setIsCheckingSlug] = (0,
|
|
1756
|
-
const [slugAvailable, setSlugAvailable] = (0,
|
|
1757
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
1758
|
-
(0,
|
|
1749
|
+
const [orgName, setOrgName] = (0, import_react39.useState)(initialOrgName);
|
|
1750
|
+
const [slug, setSlug] = (0, import_react39.useState)(initialSlug);
|
|
1751
|
+
const [isCheckingSlug, setIsCheckingSlug] = (0, import_react39.useState)(false);
|
|
1752
|
+
const [slugAvailable, setSlugAvailable] = (0, import_react39.useState)(null);
|
|
1753
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react39.useState)(false);
|
|
1754
|
+
(0, import_react39.useEffect)(() => {
|
|
1759
1755
|
setOrgName(initialOrgName || "");
|
|
1760
1756
|
setSlug(initialSlug || "");
|
|
1761
1757
|
}, [initialOrgName, initialSlug]);
|
|
@@ -1765,7 +1761,7 @@ var UniversalOrganizationPage = ({
|
|
|
1765
1761
|
const handleSlugChange = (val) => {
|
|
1766
1762
|
setSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
|
|
1767
1763
|
};
|
|
1768
|
-
(0,
|
|
1764
|
+
(0, import_react39.useEffect)(() => {
|
|
1769
1765
|
if (!slug || slug === initialSlug) {
|
|
1770
1766
|
setSlugAvailable(null);
|
|
1771
1767
|
setIsCheckingSlug(false);
|
|
@@ -1819,7 +1815,7 @@ var UniversalOrganizationPage = ({
|
|
|
1819
1815
|
};
|
|
1820
1816
|
const hasChanges = orgName !== initialOrgName || slug !== initialSlug;
|
|
1821
1817
|
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || orgName.length < 3 || slug.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
1822
|
-
return /* @__PURE__ */
|
|
1818
|
+
return /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react39.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react39.default.createElement("div", null, /* @__PURE__ */ import_react39.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, "Organization"), /* @__PURE__ */ import_react39.default.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your tenant workspace details and identity.")), isReadOnly && /* @__PURE__ */ import_react39.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0" }, "Read Only Access")), /* @__PURE__ */ import_react39.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react39.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1823
1819
|
TextInput,
|
|
1824
1820
|
{
|
|
1825
1821
|
label: "Organization Name",
|
|
@@ -1829,7 +1825,7 @@ var UniversalOrganizationPage = ({
|
|
|
1829
1825
|
placeholder: "Acme Corporation",
|
|
1830
1826
|
maxLength: 50
|
|
1831
1827
|
}
|
|
1832
|
-
), /* @__PURE__ */
|
|
1828
|
+
), /* @__PURE__ */ import_react39.default.createElement("div", { className: "space-y-2 relative w-full" }, /* @__PURE__ */ import_react39.default.createElement("label", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block uppercase" }, "Organization Slug"), /* @__PURE__ */ import_react39.default.createElement("div", { className: "flex items-center relative w-full" }, /* @__PURE__ */ import_react39.default.createElement("span", { className: "text-neutral-400 text-sm py-3 pr-2 border-b border-neutral-100 shrink-0" }, slugPrefixUrl), /* @__PURE__ */ import_react39.default.createElement(
|
|
1833
1829
|
"input",
|
|
1834
1830
|
{
|
|
1835
1831
|
type: "text",
|
|
@@ -1841,7 +1837,7 @@ var UniversalOrganizationPage = ({
|
|
|
1841
1837
|
className: "w-full px-2 py-3 text-sm bg-transparent border-b border-neutral-100 text-black transition-all outline-none focus:border-black pr-8 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
1842
1838
|
placeholder: "acme-corp"
|
|
1843
1839
|
}
|
|
1844
|
-
), /* @__PURE__ */
|
|
1840
|
+
), /* @__PURE__ */ import_react39.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react39.default.createElement(InputSpinner2, null), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react39.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-red-100" }, /* @__PURE__ */ import_react39.default.createElement("svg", { className: "w-2 h-2 text-red-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react39.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" }))), !isCheckingSlug && !isReadOnly && slug !== initialSlug && slug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react39.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react39.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react39.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 10-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z" })))))), /* @__PURE__ */ import_react39.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react39.default.createElement(
|
|
1845
1841
|
ThreeDActionButton,
|
|
1846
1842
|
{
|
|
1847
1843
|
type: "submit",
|
|
@@ -1850,7 +1846,7 @@ var UniversalOrganizationPage = ({
|
|
|
1850
1846
|
className: "min-w-32"
|
|
1851
1847
|
},
|
|
1852
1848
|
"Save Changes"
|
|
1853
|
-
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */
|
|
1849
|
+
), hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react39.default.createElement(
|
|
1854
1850
|
"button",
|
|
1855
1851
|
{
|
|
1856
1852
|
type: "button",
|
|
@@ -1865,9 +1861,9 @@ var UniversalOrganizationPage = ({
|
|
|
1865
1861
|
};
|
|
1866
1862
|
|
|
1867
1863
|
// src/components/UniversalIdentityPage.tsx
|
|
1868
|
-
var
|
|
1864
|
+
var import_react40 = __toESM(require("react"));
|
|
1869
1865
|
var import_react_hot_toast4 = __toESM(require("react-hot-toast"));
|
|
1870
|
-
var ButtonSpinner2 = () => /* @__PURE__ */
|
|
1866
|
+
var ButtonSpinner2 = () => /* @__PURE__ */ import_react40.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react40.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react40.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
|
|
1871
1867
|
var UniversalIdentityPage = ({
|
|
1872
1868
|
headerTitle,
|
|
1873
1869
|
headerDescription,
|
|
@@ -1883,12 +1879,12 @@ var UniversalIdentityPage = ({
|
|
|
1883
1879
|
onDeleteResource,
|
|
1884
1880
|
onSuccessfulDeleteRedirect = "/app"
|
|
1885
1881
|
}) => {
|
|
1886
|
-
const [primaryValue, setPrimaryValue] = (0,
|
|
1887
|
-
const [secondaryValue, setSecondaryValue] = (0,
|
|
1888
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
1889
|
-
const [isDeleteModalOpen, setIsDeleteModalOpen] = (0,
|
|
1890
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
1891
|
-
(0,
|
|
1882
|
+
const [primaryValue, setPrimaryValue] = (0, import_react40.useState)(initialPrimaryValue);
|
|
1883
|
+
const [secondaryValue, setSecondaryValue] = (0, import_react40.useState)(initialSecondaryValue);
|
|
1884
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react40.useState)(false);
|
|
1885
|
+
const [isDeleteModalOpen, setIsDeleteModalOpen] = (0, import_react40.useState)(false);
|
|
1886
|
+
const [isDeleting, setIsDeleting] = (0, import_react40.useState)(false);
|
|
1887
|
+
(0, import_react40.useEffect)(() => {
|
|
1892
1888
|
setPrimaryValue(initialPrimaryValue || "");
|
|
1893
1889
|
setSecondaryValue(initialSecondaryValue || "");
|
|
1894
1890
|
}, [initialPrimaryValue, initialSecondaryValue]);
|
|
@@ -1939,7 +1935,7 @@ var UniversalIdentityPage = ({
|
|
|
1939
1935
|
};
|
|
1940
1936
|
const hasChanges = primaryValue !== initialPrimaryValue || secondaryValue !== initialSecondaryValue;
|
|
1941
1937
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || primaryValue.trim().length < 3;
|
|
1942
|
-
return /* @__PURE__ */
|
|
1938
|
+
return /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react40.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react40.default.createElement("div", null, /* @__PURE__ */ import_react40.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react40.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), isReadOnly && /* @__PURE__ */ import_react40.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0" }, "Read Only Access")), /* @__PURE__ */ import_react40.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react40.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1943
1939
|
TextInput,
|
|
1944
1940
|
{
|
|
1945
1941
|
label: primaryInputLabel,
|
|
@@ -1948,7 +1944,7 @@ var UniversalIdentityPage = ({
|
|
|
1948
1944
|
disabled: isReadOnly || isSubmitting,
|
|
1949
1945
|
maxLength: 50
|
|
1950
1946
|
}
|
|
1951
|
-
), secondaryInputLabel && /* @__PURE__ */
|
|
1947
|
+
), secondaryInputLabel && /* @__PURE__ */ import_react40.default.createElement(
|
|
1952
1948
|
TextInput,
|
|
1953
1949
|
{
|
|
1954
1950
|
label: secondaryInputLabel,
|
|
@@ -1957,7 +1953,7 @@ var UniversalIdentityPage = ({
|
|
|
1957
1953
|
disabled: isReadOnly || isSubmitting,
|
|
1958
1954
|
maxLength: 150
|
|
1959
1955
|
}
|
|
1960
|
-
), !isReadOnly && /* @__PURE__ */
|
|
1956
|
+
), !isReadOnly && /* @__PURE__ */ import_react40.default.createElement("div", { className: "pt-8 mt-2 flex flex-col sm:flex-row sm:items-center justify-between gap-6" }, /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex items-center gap-4 w-full sm:w-auto" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1961
1957
|
ThreeDActionButton,
|
|
1962
1958
|
{
|
|
1963
1959
|
type: "submit",
|
|
@@ -1966,7 +1962,7 @@ var UniversalIdentityPage = ({
|
|
|
1966
1962
|
className: "min-w-32 w-full sm:w-auto"
|
|
1967
1963
|
},
|
|
1968
1964
|
"Save Changes"
|
|
1969
|
-
), hasChanges && !isSubmitting && /* @__PURE__ */
|
|
1965
|
+
), hasChanges && !isSubmitting && /* @__PURE__ */ import_react40.default.createElement(
|
|
1970
1966
|
"button",
|
|
1971
1967
|
{
|
|
1972
1968
|
type: "button",
|
|
@@ -1977,7 +1973,7 @@ var UniversalIdentityPage = ({
|
|
|
1977
1973
|
className: "text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
1978
1974
|
},
|
|
1979
1975
|
"Cancel"
|
|
1980
|
-
)), allowDeletion && /* @__PURE__ */
|
|
1976
|
+
)), allowDeletion && /* @__PURE__ */ import_react40.default.createElement(
|
|
1981
1977
|
"button",
|
|
1982
1978
|
{
|
|
1983
1979
|
type: "button",
|
|
@@ -1986,7 +1982,7 @@ var UniversalIdentityPage = ({
|
|
|
1986
1982
|
},
|
|
1987
1983
|
"Delete ",
|
|
1988
1984
|
headerTitle.split(" ")[0]
|
|
1989
|
-
)))), isDeleteModalOpen && !isReadOnly && allowDeletion && /* @__PURE__ */
|
|
1985
|
+
)))), isDeleteModalOpen && !isReadOnly && allowDeletion && /* @__PURE__ */ import_react40.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react40.default.createElement("div", { className: "absolute inset-0 bg-black/30 shadow-2xl", onClick: () => !isDeleting && setIsDeleteModalOpen(false) }), /* @__PURE__ */ import_react40.default.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react40.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react40.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Confirm Deletion"), /* @__PURE__ */ import_react40.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, deleteWarningText)), /* @__PURE__ */ import_react40.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
1990
1986
|
"button",
|
|
1991
1987
|
{
|
|
1992
1988
|
type: "button",
|
|
@@ -1995,7 +1991,7 @@ var UniversalIdentityPage = ({
|
|
|
1995
1991
|
className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
1996
1992
|
},
|
|
1997
1993
|
"Cancel"
|
|
1998
|
-
), /* @__PURE__ */
|
|
1994
|
+
), /* @__PURE__ */ import_react40.default.createElement(
|
|
1999
1995
|
"button",
|
|
2000
1996
|
{
|
|
2001
1997
|
type: "button",
|
|
@@ -2003,17 +1999,17 @@ var UniversalIdentityPage = ({
|
|
|
2003
1999
|
disabled: isDeleting,
|
|
2004
2000
|
className: "flex-1 py-2 text-[13px] text-red-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center items-center outline-none"
|
|
2005
2001
|
},
|
|
2006
|
-
isDeleting ? /* @__PURE__ */
|
|
2002
|
+
isDeleting ? /* @__PURE__ */ import_react40.default.createElement(ButtonSpinner2, null) : "Delete"
|
|
2007
2003
|
)))));
|
|
2008
2004
|
};
|
|
2009
2005
|
|
|
2010
2006
|
// src/components/UniversalMembersPage.tsx
|
|
2011
|
-
var
|
|
2007
|
+
var import_react41 = __toESM(require("react"));
|
|
2012
2008
|
var import_react_hot_toast5 = __toESM(require("react-hot-toast"));
|
|
2013
|
-
var
|
|
2014
|
-
var
|
|
2015
|
-
var ButtonSpinner3 = () => /* @__PURE__ */
|
|
2016
|
-
var PageSpinner2 = () => /* @__PURE__ */
|
|
2009
|
+
var import_react42 = require("@hugeicons/react");
|
|
2010
|
+
var import_core_free_icons10 = require("@hugeicons/core-free-icons");
|
|
2011
|
+
var ButtonSpinner3 = () => /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Loading03Icon, size: 16, className: "animate-spin text-white" });
|
|
2012
|
+
var PageSpinner2 = () => /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2017
2013
|
var getInitials = (name) => {
|
|
2018
2014
|
if (!name) return "U";
|
|
2019
2015
|
const parts = name.trim().split(" ");
|
|
@@ -2056,18 +2052,18 @@ var UniversalMembersPage = ({
|
|
|
2056
2052
|
onRemoveMember,
|
|
2057
2053
|
onUpdateRole
|
|
2058
2054
|
}) => {
|
|
2059
|
-
const [currentView, setCurrentView] = (0,
|
|
2060
|
-
const [selectedMember, setSelectedMember] = (0,
|
|
2061
|
-
const [inviteEmail, setInviteEmail] = (0,
|
|
2062
|
-
const [inviteFirst, setInviteFirst] = (0,
|
|
2063
|
-
const [inviteLast, setInviteLast] = (0,
|
|
2064
|
-
const [isInviting, setIsInviting] = (0,
|
|
2065
|
-
const [isRoleModalOpen, setIsRoleModalOpen] = (0,
|
|
2066
|
-
const [isUpdatingRole, setIsUpdatingRole] = (0,
|
|
2067
|
-
const [memberToDelete, setMemberToDelete] = (0,
|
|
2068
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
2069
|
-
const dropdownRef = (0,
|
|
2070
|
-
(0,
|
|
2055
|
+
const [currentView, setCurrentView] = (0, import_react41.useState)("list");
|
|
2056
|
+
const [selectedMember, setSelectedMember] = (0, import_react41.useState)(null);
|
|
2057
|
+
const [inviteEmail, setInviteEmail] = (0, import_react41.useState)("");
|
|
2058
|
+
const [inviteFirst, setInviteFirst] = (0, import_react41.useState)("");
|
|
2059
|
+
const [inviteLast, setInviteLast] = (0, import_react41.useState)("");
|
|
2060
|
+
const [isInviting, setIsInviting] = (0, import_react41.useState)(false);
|
|
2061
|
+
const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react41.useState)(false);
|
|
2062
|
+
const [isUpdatingRole, setIsUpdatingRole] = (0, import_react41.useState)(false);
|
|
2063
|
+
const [memberToDelete, setMemberToDelete] = (0, import_react41.useState)(null);
|
|
2064
|
+
const [isDeleting, setIsDeleting] = (0, import_react41.useState)(false);
|
|
2065
|
+
const dropdownRef = (0, import_react41.useRef)(null);
|
|
2066
|
+
(0, import_react41.useEffect)(() => {
|
|
2071
2067
|
function handleClickOutside(event) {
|
|
2072
2068
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
2073
2069
|
setIsRoleModalOpen(false);
|
|
@@ -2141,15 +2137,15 @@ var UniversalMembersPage = ({
|
|
|
2141
2137
|
setSelectedMember(null);
|
|
2142
2138
|
setIsRoleModalOpen(false);
|
|
2143
2139
|
};
|
|
2144
|
-
return /* @__PURE__ */
|
|
2140
|
+
return /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white " }, /* @__PURE__ */ import_react41.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" && /* @__PURE__ */ import_react41.default.createElement(import_react41.default.Fragment, null, /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), canManage && /* @__PURE__ */ import_react41.default.createElement(
|
|
2145
2141
|
ThreeDActionButton,
|
|
2146
2142
|
{
|
|
2147
2143
|
onClick: () => setCurrentView("invite"),
|
|
2148
2144
|
className: "w-fit shrink-0 gap-2"
|
|
2149
2145
|
},
|
|
2150
|
-
/* @__PURE__ */
|
|
2146
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.UserAdd01Icon, size: 12 }),
|
|
2151
2147
|
"Add Member"
|
|
2152
|
-
)), currentView !== "list" && /* @__PURE__ */
|
|
2148
|
+
)), currentView !== "list" && /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react41.default.createElement("button", { onClick: goBack, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 12 }), " Back"), /* @__PURE__ */ import_react41.default.createElement("h1", { className: " font-serif text-lg text-black tracking-tight" }, currentView === "invite" ? "Add New Member" : "Member Profile"))), currentView === "list" && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react41.default.createElement(PageSpinner2, null) : /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "divide-y divide-neutral-100" }, members.map((member) => /* @__PURE__ */ import_react41.default.createElement(
|
|
2153
2149
|
"div",
|
|
2154
2150
|
{
|
|
2155
2151
|
key: member.id,
|
|
@@ -2159,7 +2155,7 @@ var UniversalMembersPage = ({
|
|
|
2159
2155
|
},
|
|
2160
2156
|
className: "flex items-center justify-between p-4 sm:p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0"
|
|
2161
2157
|
},
|
|
2162
|
-
/* @__PURE__ */
|
|
2158
|
+
/* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, member.displayImage && member.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2163
2159
|
"img",
|
|
2164
2160
|
{
|
|
2165
2161
|
src: member.displayImage,
|
|
@@ -2167,25 +2163,25 @@ var UniversalMembersPage = ({
|
|
|
2167
2163
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2168
2164
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2169
2165
|
}
|
|
2170
|
-
)) : /* @__PURE__ */
|
|
2171
|
-
/* @__PURE__ */
|
|
2172
|
-
))), /* @__PURE__ */
|
|
2166
|
+
)) : /* @__PURE__ */ import_react41.default.createElement("div", { className: `w-10 h-10 shrink-0 rounded-full flex items-center justify-center text-black text-xs ${resolveThemeColor(member.profileColor)}` }, getInitials(member.fullName)), /* @__PURE__ */ import_react41.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-sm text-black truncate pr-2 sm:pr-4" }, member.fullName, " ", member.userId === currentUserId && /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-neutral-400 ml-1 sm:ml-2" }, "(You)")), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-xs text-neutral-500 truncate pr-2 sm:pr-4 mt-0.5" }, member.email))),
|
|
2167
|
+
/* @__PURE__ */ import_react41.default.createElement("div", { className: `shrink-0 pl-2 sm:pl-4 transition-opacity hidden sm:block ${canManage ? "opacity-0 group-hover:opacity-100" : "opacity-100"}` }, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-black border border-neutral-100 px-4 py-2 rounded-full bg-white whitespace-nowrap" }, canManage ? "Manage" : "View"))
|
|
2168
|
+
))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2173
2169
|
"button",
|
|
2174
2170
|
{
|
|
2175
2171
|
onClick: () => onPageChange(currentPage - 1),
|
|
2176
2172
|
disabled: currentPage === 1 || isLoading,
|
|
2177
2173
|
className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2178
2174
|
},
|
|
2179
|
-
/* @__PURE__ */
|
|
2180
|
-
), /* @__PURE__ */
|
|
2175
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowLeft01Icon, size: 14 })
|
|
2176
|
+
), /* @__PURE__ */ import_react41.default.createElement(
|
|
2181
2177
|
"button",
|
|
2182
2178
|
{
|
|
2183
2179
|
onClick: () => onPageChange(currentPage + 1),
|
|
2184
2180
|
disabled: currentPage >= totalPages || isLoading,
|
|
2185
2181
|
className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black hover:border-black disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
2186
2182
|
},
|
|
2187
|
-
/* @__PURE__ */
|
|
2188
|
-
))))), currentView === "details" && selectedMember && /* @__PURE__ */
|
|
2183
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowRight01Icon, size: 14 })
|
|
2184
|
+
))))), currentView === "details" && selectedMember && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex items-center gap-5" }, selectedMember.displayImage && selectedMember.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-16 h-16 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2189
2185
|
"img",
|
|
2190
2186
|
{
|
|
2191
2187
|
src: selectedMember.displayImage,
|
|
@@ -2193,7 +2189,7 @@ var UniversalMembersPage = ({
|
|
|
2193
2189
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2194
2190
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2195
2191
|
}
|
|
2196
|
-
)) : /* @__PURE__ */
|
|
2192
|
+
)) : /* @__PURE__ */ import_react41.default.createElement("div", { className: `w-16 h-16 shrink-0 rounded-full flex items-center justify-center text-black text-sm ${resolveThemeColor(selectedMember.profileColor)}` }, getInitials(selectedMember.fullName)), /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("h2", { className: " font-serif text-lg text-black" }, selectedMember.fullName), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-sm text-neutral-500 mt-1" }, selectedMember.email))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "grid grid-cols-2 gap-6 border-t border-neutral-100 pt-8" }, /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Role"), canChangeRoles && selectedMember.userId !== currentUserId ? /* @__PURE__ */ import_react41.default.createElement(
|
|
2197
2193
|
"button",
|
|
2198
2194
|
{
|
|
2199
2195
|
onClick: () => !isUpdatingRole && setIsRoleModalOpen(true),
|
|
@@ -2201,16 +2197,16 @@ var UniversalMembersPage = ({
|
|
|
2201
2197
|
className: `flex items-center gap-3 text-xs text-black pl-4 pr-3 py-2 border rounded-full transition-colors disabled:opacity-50 outline-none ${isRoleModalOpen ? "bg-neutral-50 border-neutral-300" : "bg-white border-neutral-100 hover:bg-neutral-50"}`
|
|
2202
2198
|
},
|
|
2203
2199
|
selectedMember.role,
|
|
2204
|
-
isUpdatingRole ? /* @__PURE__ */
|
|
2205
|
-
) : /* @__PURE__ */
|
|
2200
|
+
isUpdatingRole ? /* @__PURE__ */ import_react41.default.createElement(ButtonSpinner3, null) : /* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2201
|
+
) : /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-xs text-black bg-neutral-50 px-4 py-2 rounded-full inline-block" }, selectedMember.role)), /* @__PURE__ */ import_react41.default.createElement("div", null, /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Joined Date"), /* @__PURE__ */ import_react41.default.createElement("span", { className: "text-sm text-black" }, new Date(selectedMember.joinedAt).toLocaleDateString()))), canManage && selectedMember.userId !== currentUserId && /* @__PURE__ */ import_react41.default.createElement("div", { className: "pt-8 mt-2 border-t border-neutral-100" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2206
2202
|
"button",
|
|
2207
2203
|
{
|
|
2208
2204
|
onClick: () => setMemberToDelete(selectedMember),
|
|
2209
2205
|
className: "flex items-center gap-2 text-[11px] tracking-widest text-red-600 hover:text-red-700 transition-colors w-fit outline-none"
|
|
2210
2206
|
},
|
|
2211
|
-
/* @__PURE__ */
|
|
2207
|
+
/* @__PURE__ */ import_react41.default.createElement(import_react42.HugeiconsIcon, { icon: import_core_free_icons10.Delete01Icon, size: 14 }),
|
|
2212
2208
|
" Remove Member"
|
|
2213
|
-
)))), currentView === "invite" && canManage && /* @__PURE__ */
|
|
2209
|
+
)))), currentView === "invite" && canManage && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full max-w-2xl text-left" }, /* @__PURE__ */ import_react41.default.createElement("form", { onSubmit: handleInvite, className: "space-y-8", autoComplete: "off" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2214
2210
|
TextInput,
|
|
2215
2211
|
{
|
|
2216
2212
|
label: "Email Address",
|
|
@@ -2219,7 +2215,7 @@ var UniversalMembersPage = ({
|
|
|
2219
2215
|
disabled: isInviting,
|
|
2220
2216
|
placeholder: "developer@acme.com"
|
|
2221
2217
|
}
|
|
2222
|
-
), requireNamesForInvite && /* @__PURE__ */
|
|
2218
|
+
), requireNamesForInvite && /* @__PURE__ */ import_react41.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2223
2219
|
TextInput,
|
|
2224
2220
|
{
|
|
2225
2221
|
label: "First Name",
|
|
@@ -2228,7 +2224,7 @@ var UniversalMembersPage = ({
|
|
|
2228
2224
|
disabled: isInviting,
|
|
2229
2225
|
placeholder: "Jane"
|
|
2230
2226
|
}
|
|
2231
|
-
), /* @__PURE__ */
|
|
2227
|
+
), /* @__PURE__ */ import_react41.default.createElement(
|
|
2232
2228
|
TextInput,
|
|
2233
2229
|
{
|
|
2234
2230
|
label: "Last Name",
|
|
@@ -2237,7 +2233,7 @@ var UniversalMembersPage = ({
|
|
|
2237
2233
|
disabled: isInviting,
|
|
2238
2234
|
placeholder: "Doe"
|
|
2239
2235
|
}
|
|
2240
|
-
)), /* @__PURE__ */
|
|
2236
|
+
)), /* @__PURE__ */ import_react41.default.createElement("div", { className: "pt-8 mt-2" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2241
2237
|
ThreeDActionButton,
|
|
2242
2238
|
{
|
|
2243
2239
|
type: "submit",
|
|
@@ -2246,7 +2242,7 @@ var UniversalMembersPage = ({
|
|
|
2246
2242
|
className: "min-w-40"
|
|
2247
2243
|
},
|
|
2248
2244
|
"Send Invitation"
|
|
2249
|
-
)))), isRoleModalOpen && canChangeRoles && /* @__PURE__ */
|
|
2245
|
+
)))), isRoleModalOpen && canChangeRoles && /* @__PURE__ */ import_react41.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isUpdatingRole && setIsRoleModalOpen(false) }), /* @__PURE__ */ import_react41.default.createElement("div", { ref: dropdownRef, className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react41.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight" }, "Update Role")), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, availableRoles.map((roleOption) => /* @__PURE__ */ import_react41.default.createElement(
|
|
2250
2246
|
"button",
|
|
2251
2247
|
{
|
|
2252
2248
|
key: roleOption,
|
|
@@ -2254,9 +2250,9 @@ var UniversalMembersPage = ({
|
|
|
2254
2250
|
disabled: isUpdatingRole,
|
|
2255
2251
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedMember?.role === roleOption ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2256
2252
|
},
|
|
2257
|
-
/* @__PURE__ */
|
|
2258
|
-
selectedMember?.role === roleOption && /* @__PURE__ */
|
|
2259
|
-
))), /* @__PURE__ */
|
|
2253
|
+
/* @__PURE__ */ import_react41.default.createElement("span", { className: "truncate pr-2" }, roleOption),
|
|
2254
|
+
selectedMember?.role === roleOption && /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-1.5 h-1.5 rounded-full shrink-0 bg-black" })
|
|
2255
|
+
))), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react41.default.createElement(
|
|
2260
2256
|
"button",
|
|
2261
2257
|
{
|
|
2262
2258
|
onClick: () => setIsRoleModalOpen(false),
|
|
@@ -2264,11 +2260,11 @@ var UniversalMembersPage = ({
|
|
|
2264
2260
|
className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
2265
2261
|
},
|
|
2266
2262
|
"Cancel"
|
|
2267
|
-
)))), memberToDelete && canManage && /* @__PURE__ */
|
|
2263
|
+
)))), memberToDelete && canManage && /* @__PURE__ */ import_react41.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isDeleting && setMemberToDelete(null) }), /* @__PURE__ */ import_react41.default.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react41.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react41.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Remove Member"), /* @__PURE__ */ import_react41.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to remove this member? They will lose access instantly.")), /* @__PURE__ */ import_react41.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react41.default.createElement("button", { onClick: () => setMemberToDelete(null), disabled: isDeleting, className: "flex-1 py-2 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none" }, "Cancel"), /* @__PURE__ */ import_react41.default.createElement("button", { onClick: handleDelete, disabled: isDeleting, className: "flex-1 py-2 text-[13px] text-red-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center outline-none" }, isDeleting ? /* @__PURE__ */ import_react41.default.createElement(ButtonSpinner3, null) : "Remove")))));
|
|
2268
2264
|
};
|
|
2269
2265
|
|
|
2270
2266
|
// src/components/UniversalProfileSettings.tsx
|
|
2271
|
-
var
|
|
2267
|
+
var import_react43 = __toESM(require("react"));
|
|
2272
2268
|
var import_react_hot_toast6 = __toESM(require("react-hot-toast"));
|
|
2273
2269
|
var UniversalProfileSettings = ({
|
|
2274
2270
|
initialFirstName,
|
|
@@ -2279,10 +2275,10 @@ var UniversalProfileSettings = ({
|
|
|
2279
2275
|
isReadOnly = false,
|
|
2280
2276
|
onSaveProfile
|
|
2281
2277
|
}) => {
|
|
2282
|
-
const [firstName, setFirstName] = (0,
|
|
2283
|
-
const [lastName, setLastName] = (0,
|
|
2284
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
2285
|
-
(0,
|
|
2278
|
+
const [firstName, setFirstName] = (0, import_react43.useState)(initialFirstName);
|
|
2279
|
+
const [lastName, setLastName] = (0, import_react43.useState)(initialLastName);
|
|
2280
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react43.useState)(false);
|
|
2281
|
+
(0, import_react43.useEffect)(() => {
|
|
2286
2282
|
setFirstName(initialFirstName || "");
|
|
2287
2283
|
setLastName(initialLastName || "");
|
|
2288
2284
|
}, [initialFirstName, initialLastName]);
|
|
@@ -2312,7 +2308,7 @@ var UniversalProfileSettings = ({
|
|
|
2312
2308
|
};
|
|
2313
2309
|
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
2314
2310
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
2315
|
-
return /* @__PURE__ */
|
|
2311
|
+
return /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react43.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ import_react43.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit" }, "Read Only Access")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react43.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2316
2312
|
TextInput,
|
|
2317
2313
|
{
|
|
2318
2314
|
label: "First Name",
|
|
@@ -2321,7 +2317,7 @@ var UniversalProfileSettings = ({
|
|
|
2321
2317
|
disabled: isReadOnly || isSubmitting,
|
|
2322
2318
|
placeholder: "System"
|
|
2323
2319
|
}
|
|
2324
|
-
)), /* @__PURE__ */
|
|
2320
|
+
)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2325
2321
|
TextInput,
|
|
2326
2322
|
{
|
|
2327
2323
|
label: "Last Name",
|
|
@@ -2330,7 +2326,7 @@ var UniversalProfileSettings = ({
|
|
|
2330
2326
|
disabled: isReadOnly || isSubmitting,
|
|
2331
2327
|
placeholder: "Admin"
|
|
2332
2328
|
}
|
|
2333
|
-
))), /* @__PURE__ */
|
|
2329
|
+
))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement(
|
|
2334
2330
|
TextInput,
|
|
2335
2331
|
{
|
|
2336
2332
|
label: "Email ID",
|
|
@@ -2339,7 +2335,7 @@ var UniversalProfileSettings = ({
|
|
|
2339
2335
|
},
|
|
2340
2336
|
disabled: true
|
|
2341
2337
|
}
|
|
2342
|
-
), /* @__PURE__ */
|
|
2338
|
+
), /* @__PURE__ */ import_react43.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Account Status"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-xs text-black block truncate" }, accountStatus)), /* @__PURE__ */ import_react43.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Member Since"), /* @__PURE__ */ import_react43.default.createElement("span", { className: "text-xs text-black block truncate" }, memberSince ? new Date(memberSince).toLocaleDateString("en-US", { month: "long", day: "numeric", year: "numeric" }) : "N/A"))), /* @__PURE__ */ import_react43.default.createElement("div", { className: "flex flex-col-reverse sm:flex-row items-center gap-3 sm:gap-4 w-full sm:w-auto shrink-0" }, hasChanges && !isSubmitting && !isReadOnly && /* @__PURE__ */ import_react43.default.createElement(
|
|
2343
2339
|
"button",
|
|
2344
2340
|
{
|
|
2345
2341
|
type: "button",
|
|
@@ -2350,7 +2346,7 @@ var UniversalProfileSettings = ({
|
|
|
2350
2346
|
className: "text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors w-full sm:w-auto py-2 sm:py-0 outline-none"
|
|
2351
2347
|
},
|
|
2352
2348
|
"Cancel"
|
|
2353
|
-
), /* @__PURE__ */
|
|
2349
|
+
), /* @__PURE__ */ import_react43.default.createElement(
|
|
2354
2350
|
ThreeDActionButton,
|
|
2355
2351
|
{
|
|
2356
2352
|
type: "submit",
|
|
@@ -2363,11 +2359,11 @@ var UniversalProfileSettings = ({
|
|
|
2363
2359
|
};
|
|
2364
2360
|
|
|
2365
2361
|
// src/components/UniversalBillingPage.tsx
|
|
2366
|
-
var
|
|
2367
|
-
var
|
|
2368
|
-
var
|
|
2369
|
-
var PageSpinner3 = () => /* @__PURE__ */
|
|
2370
|
-
var ButtonSpinner4 = () => /* @__PURE__ */
|
|
2362
|
+
var import_react44 = __toESM(require("react"));
|
|
2363
|
+
var import_react45 = require("@hugeicons/react");
|
|
2364
|
+
var import_core_free_icons11 = require("@hugeicons/core-free-icons");
|
|
2365
|
+
var PageSpinner3 = () => /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.Loading03Icon, size: 32, className: "animate-spin mb-4 text-neutral-400" }));
|
|
2366
|
+
var ButtonSpinner4 = () => /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.Loading03Icon, size: 16, className: "animate-spin text-neutral-500" });
|
|
2371
2367
|
var formatDate = (dateString) => {
|
|
2372
2368
|
if (!dateString) return "N/A";
|
|
2373
2369
|
return new Date(dateString).toLocaleDateString("en-US", {
|
|
@@ -2409,13 +2405,13 @@ var UniversalBillingPage = ({
|
|
|
2409
2405
|
onPayInvoice,
|
|
2410
2406
|
onUpdateInvoiceStatus
|
|
2411
2407
|
}) => {
|
|
2412
|
-
const [currentView, setCurrentView] = (0,
|
|
2413
|
-
const [selectedInvoice, setSelectedInvoice] = (0,
|
|
2414
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2415
|
-
const [isPaying, setIsPaying] = (0,
|
|
2416
|
-
const [isActionModalOpen, setIsActionModalOpen] = (0,
|
|
2417
|
-
const [isUpdating, setIsUpdating] = (0,
|
|
2418
|
-
const [twoFactorCode, setTwoFactorCode] = (0,
|
|
2408
|
+
const [currentView, setCurrentView] = (0, import_react44.useState)("list");
|
|
2409
|
+
const [selectedInvoice, setSelectedInvoice] = (0, import_react44.useState)(null);
|
|
2410
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react44.useState)(false);
|
|
2411
|
+
const [isPaying, setIsPaying] = (0, import_react44.useState)(false);
|
|
2412
|
+
const [isActionModalOpen, setIsActionModalOpen] = (0, import_react44.useState)(false);
|
|
2413
|
+
const [isUpdating, setIsUpdating] = (0, import_react44.useState)(false);
|
|
2414
|
+
const [twoFactorCode, setTwoFactorCode] = (0, import_react44.useState)("");
|
|
2419
2415
|
const handlePayment = async () => {
|
|
2420
2416
|
if (!selectedInvoice || isReadOnly || !onPayInvoice || isPaying) return;
|
|
2421
2417
|
setIsPaying(true);
|
|
@@ -2442,14 +2438,14 @@ var UniversalBillingPage = ({
|
|
|
2442
2438
|
setIsUpdating(false);
|
|
2443
2439
|
}
|
|
2444
2440
|
};
|
|
2445
|
-
return /* @__PURE__ */
|
|
2441
|
+
return /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex max-w-3xl rounded-2xl bg-white p-6 flex-col gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react44.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0 w-full" }, /* @__PURE__ */ import_react44.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 truncate mb-6" }, headerDescription), showSearchAndFilter && onSearchChange && onTimeframeChange && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row gap-4 mb-4" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2446
2442
|
TextInput,
|
|
2447
2443
|
{
|
|
2448
2444
|
placeholder: "Search by ID or Name...",
|
|
2449
2445
|
value: searchQuery,
|
|
2450
2446
|
onChange: onSearchChange
|
|
2451
2447
|
}
|
|
2452
|
-
), /* @__PURE__ */
|
|
2448
|
+
), /* @__PURE__ */ import_react44.default.createElement(
|
|
2453
2449
|
"button",
|
|
2454
2450
|
{
|
|
2455
2451
|
type: "button",
|
|
@@ -2457,10 +2453,10 @@ var UniversalBillingPage = ({
|
|
|
2457
2453
|
className: "px-4 py-3 text-sm bg-transparent border-b border-neutral-100 text-black outline-none focus:border-black shrink-0 text-left"
|
|
2458
2454
|
},
|
|
2459
2455
|
timeframe === "ALL" ? "All Time" : timeframe === "24H" ? "Past 24 Hours" : timeframe === "7D" ? "Past 7 Days" : "Past 30 Days"
|
|
2460
|
-
))) : /* @__PURE__ */
|
|
2456
|
+
))) : /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setCurrentView("list"), className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowLeft01Icon, size: 12 }), " Back")), isReadOnly && currentView === "list" && /* @__PURE__ */ import_react44.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit" }, "Read Only Access")), currentView === "list" && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-2xl" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-8 w-full" }, (metricPrimaryLabel || metricSecondaryLabel) && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between sm:items-start pb-8 border-b border-neutral-100 gap-6 sm:gap-0" }, metricPrimaryLabel && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricPrimaryLabel), /* @__PURE__ */ import_react44.default.createElement("div", { className: "text-xl text-black tracking-tight truncate" }, formatNaira(metricPrimaryValue)), metricPrimarySubtext && /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricPrimarySubtext)), metricSecondaryLabel && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0 sm:text-right" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-2 truncate block uppercase" }, metricSecondaryLabel), /* @__PURE__ */ import_react44.default.createElement("div", { className: "text-xl text-emerald-600 tracking-tight truncate" }, formatNaira(metricSecondaryValue)), metricSecondarySubtext && /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[10px] text-neutral-500 mt-1 tracking-widest uppercase" }, metricSecondarySubtext))), !isReadOnly && showBillingOverview && /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-8 sm:gap-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Billing Status"), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center gap-2 min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: `w-2 h-2 rounded-full shrink-0 ${billingStatus === "ACTIVE" ? "bg-green-500" : "bg-neutral-300"}` }), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-black tracking-widest truncate" }, billingStatus || "UNKNOWN"))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Next Billing Date"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black truncate" }, formatDate(nextBillingDate))), lastPaidDate && /* @__PURE__ */ import_react44.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-3 truncate block uppercase" }, "Last Paid Date"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-neutral-600 truncate" }, formatDate(lastPaidDate)))), !isReadOnly && showUsageMetrics && usageMetrics.length > 0 && /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 truncate block uppercase" }, "Usage & Limits"), /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-x-8 gap-y-4 text-sm text-black" }, usageMetrics.map((metric, idx) => /* @__PURE__ */ import_react44.default.createElement("div", { key: idx, className: "flex justify-between border-b border-neutral-50 pb-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-neutral-500 text-xs" }, metric.label), /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-xs text-black" }, metric.value))))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-4 truncate block uppercase" }, "Transaction History"), isLoading ? /* @__PURE__ */ import_react44.default.createElement(PageSpinner3, null) : invoices.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, "No records found.")) : /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "divide-y divide-neutral-100" }, invoices.map((inv) => /* @__PURE__ */ import_react44.default.createElement("div", { key: inv.id, onClick: () => {
|
|
2461
2457
|
setSelectedInvoice(inv);
|
|
2462
2458
|
setCurrentView("details");
|
|
2463
|
-
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */
|
|
2459
|
+
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-1 min-w-0 flex-1" }, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, inv.name), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, inv.subtext)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black" }, formatNaira(inv.amountDue)), /* @__PURE__ */ import_react44.default.createElement("span", { className: `text-[9px] tracking-widest px-2 py-0.5 rounded-full ${inv.status === "PAID" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, inv.status))))), totalPages > 1 && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center justify-between pt-4 mt-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowRight01Icon, size: 14 })))))))), currentView === "details" && selectedInvoice && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-2xl animate-in fade-in duration-300" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-6 w-full" }, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Breakdown"), /* @__PURE__ */ import_react44.default.createElement("h2", { className: " font-serif text-xl text-black mb-1" }, selectedInvoice.name), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500" }, "Generated on ", formatDate(selectedInvoice.createdAt))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 p-6 sm:p-8 rounded-2xl border border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Amount"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xl text-black" }, formatNaira(selectedInvoice.amountDue))), /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Status"), isModMode ? /* @__PURE__ */ import_react44.default.createElement(
|
|
2464
2460
|
"button",
|
|
2465
2461
|
{
|
|
2466
2462
|
onClick: () => !isUpdating && setIsActionModalOpen(true),
|
|
@@ -2468,8 +2464,8 @@ var UniversalBillingPage = ({
|
|
|
2468
2464
|
className: `flex items-center gap-3 text-xs text-black px-3 py-1.5 mt-1 border rounded-full transition-colors disabled:opacity-50 outline-none ${isActionModalOpen ? "bg-neutral-50 border-neutral-300" : "bg-white border-neutral-100 hover:bg-neutral-50"}`
|
|
2469
2465
|
},
|
|
2470
2466
|
selectedInvoice.status,
|
|
2471
|
-
isUpdating ? /* @__PURE__ */
|
|
2472
|
-
) : /* @__PURE__ */
|
|
2467
|
+
isUpdating ? /* @__PURE__ */ import_react44.default.createElement(ButtonSpinner4, null) : /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons11.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2468
|
+
) : /* @__PURE__ */ import_react44.default.createElement("span", { className: `text-[10px] tracking-widest px-3 py-1 mt-1 inline-block rounded-full ${selectedInvoice.status === "PAID" ? "bg-emerald-100 text-emerald-700" : "bg-neutral-100 text-neutral-700"}` }, selectedInvoice.status)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "md:col-span-2 pt-4 border-t border-neutral-100/60 mt-2" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 block mb-1 uppercase" }, "Reference ID"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 bg-white px-3 py-2 rounded-full border border-neutral-100 inline-block" }, selectedInvoice.id))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-end gap-4 pt-4" }, !isModMode && selectedInvoice.status === "SCHEDULED" && onPayInvoice && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-end gap-2 w-full sm:w-auto" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2473
2469
|
ThreeDActionButton,
|
|
2474
2470
|
{
|
|
2475
2471
|
onClick: handlePayment,
|
|
@@ -2478,12 +2474,12 @@ var UniversalBillingPage = ({
|
|
|
2478
2474
|
className: "w-full sm:w-auto"
|
|
2479
2475
|
},
|
|
2480
2476
|
"Pay Invoice"
|
|
2481
|
-
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */
|
|
2477
|
+
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[11px] tracking-widest text-emerald-600 px-6 py-3 bg-emerald-50 rounded-full" }, "Invoice Completed")))), isTimeframeModalOpen && showSearchAndFilter && onTimeframeChange && /* @__PURE__ */ import_react44.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react44.default.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Select Timeframe"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[12px] text-neutral-500" }, "Choose the range of transactions to display.")), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, [
|
|
2482
2478
|
{ value: "ALL", label: "All Time" },
|
|
2483
2479
|
{ value: "24H", label: "Past 24 Hours" },
|
|
2484
2480
|
{ value: "7D", label: "Past 7 Days" },
|
|
2485
2481
|
{ value: "30D", label: "Past 30 Days" }
|
|
2486
|
-
].map((option) => /* @__PURE__ */
|
|
2482
|
+
].map((option) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2487
2483
|
"button",
|
|
2488
2484
|
{
|
|
2489
2485
|
key: option.value,
|
|
@@ -2494,9 +2490,9 @@ var UniversalBillingPage = ({
|
|
|
2494
2490
|
},
|
|
2495
2491
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${timeframe === option.value ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2496
2492
|
},
|
|
2497
|
-
/* @__PURE__ */
|
|
2498
|
-
timeframe === option.value && /* @__PURE__ */
|
|
2499
|
-
))), /* @__PURE__ */
|
|
2493
|
+
/* @__PURE__ */ import_react44.default.createElement("span", { className: "truncate pr-2" }, option.label),
|
|
2494
|
+
timeframe === option.value && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2495
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setIsTimeframeModalOpen(false), className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none" }, "Cancel")))), isActionModalOpen && isModMode && /* @__PURE__ */ import_react44.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isUpdating && setIsActionModalOpen(false) }), /* @__PURE__ */ import_react44.default.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Update Invoice Status"), /* @__PURE__ */ import_react44.default.createElement(
|
|
2500
2496
|
TextInput,
|
|
2501
2497
|
{
|
|
2502
2498
|
placeholder: "Enter 2FA Code...",
|
|
@@ -2504,7 +2500,7 @@ var UniversalBillingPage = ({
|
|
|
2504
2500
|
onChange: setTwoFactorCode,
|
|
2505
2501
|
type: "password"
|
|
2506
2502
|
}
|
|
2507
|
-
)), /* @__PURE__ */
|
|
2503
|
+
)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, ["SCHEDULED", "PAID", "FAILED", "CANCELED"].map((statusOption) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2508
2504
|
"button",
|
|
2509
2505
|
{
|
|
2510
2506
|
key: statusOption,
|
|
@@ -2512,15 +2508,15 @@ var UniversalBillingPage = ({
|
|
|
2512
2508
|
disabled: isUpdating || !twoFactorCode,
|
|
2513
2509
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedInvoice?.status === statusOption ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2514
2510
|
},
|
|
2515
|
-
/* @__PURE__ */
|
|
2516
|
-
selectedInvoice?.status === statusOption && /* @__PURE__ */
|
|
2517
|
-
))), /* @__PURE__ */
|
|
2511
|
+
/* @__PURE__ */ import_react44.default.createElement("span", { className: "truncate pr-2" }, statusOption),
|
|
2512
|
+
selectedInvoice?.status === statusOption && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2513
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setIsActionModalOpen(false), disabled: isUpdating, className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none" }, "Cancel")))));
|
|
2518
2514
|
};
|
|
2519
2515
|
|
|
2520
2516
|
// src/components/UniversalDashboardPage.tsx
|
|
2521
|
-
var
|
|
2522
|
-
var
|
|
2523
|
-
var
|
|
2517
|
+
var import_react46 = __toESM(require("react"));
|
|
2518
|
+
var import_react47 = require("@hugeicons/react");
|
|
2519
|
+
var import_core_free_icons12 = require("@hugeicons/core-free-icons");
|
|
2524
2520
|
var UniversalDashboardPage = ({
|
|
2525
2521
|
headerTitle,
|
|
2526
2522
|
headerDescription,
|
|
@@ -2531,20 +2527,20 @@ var UniversalDashboardPage = ({
|
|
|
2531
2527
|
lists,
|
|
2532
2528
|
isLoading = false
|
|
2533
2529
|
}) => {
|
|
2534
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2530
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react46.useState)(false);
|
|
2535
2531
|
const selectedTimeframe = timeframes.find((t) => t.id === activeTimeframe) || timeframes[0];
|
|
2536
2532
|
if (isLoading) {
|
|
2537
|
-
return /* @__PURE__ */
|
|
2533
|
+
return /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react46.default.createElement(import_react47.HugeiconsIcon, { icon: import_core_free_icons12.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2538
2534
|
}
|
|
2539
|
-
return /* @__PURE__ */
|
|
2535
|
+
return /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react46.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4" }, /* @__PURE__ */ import_react46.default.createElement("div", null, /* @__PURE__ */ import_react46.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), timeframes.length > 0 && selectedTimeframe && onTimeframeChange && /* @__PURE__ */ import_react46.default.createElement(
|
|
2540
2536
|
"button",
|
|
2541
2537
|
{
|
|
2542
2538
|
onClick: () => setIsTimeframeModalOpen(true),
|
|
2543
2539
|
className: "flex items-center gap-3 px-4 py-2 text-xs bg-white text-black outline-none rounded-full transition-colors hover:bg-neutral-50 shrink-0"
|
|
2544
2540
|
},
|
|
2545
|
-
/* @__PURE__ */
|
|
2546
|
-
/* @__PURE__ */
|
|
2547
|
-
)), stats.length > 0 && /* @__PURE__ */
|
|
2541
|
+
/* @__PURE__ */ import_react46.default.createElement("span", null, selectedTimeframe.label),
|
|
2542
|
+
/* @__PURE__ */ import_react46.default.createElement(import_react47.HugeiconsIcon, { icon: import_core_free_icons12.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2543
|
+
)), stats.length > 0 && /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "grid grid-cols-2 md:grid-cols-5 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, stats.map((stat, idx) => /* @__PURE__ */ import_react46.default.createElement("div", { key: idx, className: "p-6 flex flex-col gap-1 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react46.default.createElement("p", { className: `text-xl tracking-tight truncate ${stat.valueClass || "text-black"}` }, stat.value))))), lists.length > 0 && /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col gap-8 w-full max-w-4xl" }, lists.map((list, idx) => /* @__PURE__ */ import_react46.default.createElement("div", { key: idx, className: "bg-white rounded-2xl p-6 flex flex-col min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "text-neutral-400" }, list.icon), /* @__PURE__ */ import_react46.default.createElement("h2", { className: " font-serif text-[11px] text-black tracking-[0.2em] uppercase" }, list.title)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1 overflow-y-auto" }, list.items.length === 0 ? /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, list.emptyMessage) : list.items.map((item) => /* @__PURE__ */ import_react46.default.createElement("div", { key: item.id, className: "flex flex-col sm:flex-row sm:items-center justify-between py-4 gap-2 min-w-0 group" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.primaryText), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-[10px] text-neutral-500 truncate tracking-widest mt-0.5" }, item.secondaryText)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex items-center gap-4 shrink-0 pl-4" }, item.rightText && /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-black" }, item.rightText), item.rightBadge && /* @__PURE__ */ import_react46.default.createElement("span", { className: `text-[9px] tracking-widest px-2.5 py-1 rounded-full ${item.rightBadgeClass || "bg-neutral-50 text-neutral-600"}` }, item.rightBadge)))))))), isTimeframeModalOpen && timeframes.length > 0 && onTimeframeChange && /* @__PURE__ */ import_react46.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react46.default.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react46.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight" }, "Select Timeframe")), /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, timeframes.map((tf) => /* @__PURE__ */ import_react46.default.createElement(
|
|
2548
2544
|
"button",
|
|
2549
2545
|
{
|
|
2550
2546
|
key: tf.id,
|
|
@@ -2554,9 +2550,9 @@ var UniversalDashboardPage = ({
|
|
|
2554
2550
|
},
|
|
2555
2551
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${activeTimeframe === tf.id ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2556
2552
|
},
|
|
2557
|
-
/* @__PURE__ */
|
|
2558
|
-
activeTimeframe === tf.id && /* @__PURE__ */
|
|
2559
|
-
))), /* @__PURE__ */
|
|
2553
|
+
/* @__PURE__ */ import_react46.default.createElement("span", { className: "truncate pr-2" }, tf.label),
|
|
2554
|
+
activeTimeframe === tf.id && /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2555
|
+
))), /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full flex border-t border-neutral-50" }, /* @__PURE__ */ import_react46.default.createElement(
|
|
2560
2556
|
"button",
|
|
2561
2557
|
{
|
|
2562
2558
|
onClick: () => setIsTimeframeModalOpen(false),
|
|
@@ -2567,9 +2563,9 @@ var UniversalDashboardPage = ({
|
|
|
2567
2563
|
};
|
|
2568
2564
|
|
|
2569
2565
|
// src/components/UniversalAgentConsole.tsx
|
|
2570
|
-
var
|
|
2571
|
-
var
|
|
2572
|
-
var
|
|
2566
|
+
var import_react48 = __toESM(require("react"));
|
|
2567
|
+
var import_react49 = require("@hugeicons/react");
|
|
2568
|
+
var import_core_free_icons13 = require("@hugeicons/core-free-icons");
|
|
2573
2569
|
var formatKeyName = (key) => key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
2574
2570
|
var toTitleCaseSafe = (str) => {
|
|
2575
2571
|
if (!str) return "";
|
|
@@ -2598,13 +2594,13 @@ var UniversalAgentConsole = ({
|
|
|
2598
2594
|
onUploadArchives,
|
|
2599
2595
|
onDeleteArchive
|
|
2600
2596
|
}) => {
|
|
2601
|
-
const archiveRef = (0,
|
|
2602
|
-
const [pendingFiles, setPendingFiles] = (0,
|
|
2603
|
-
const [isUploading, setIsUploading] = (0,
|
|
2604
|
-
const [isActioning, setIsActioning] = (0,
|
|
2605
|
-
const [actionModal, setActionModal] = (0,
|
|
2606
|
-
const [actionMessage, setActionMessage] = (0,
|
|
2607
|
-
const [archiveToDelete, setArchiveToDelete] = (0,
|
|
2597
|
+
const archiveRef = (0, import_react48.useRef)(null);
|
|
2598
|
+
const [pendingFiles, setPendingFiles] = (0, import_react48.useState)([]);
|
|
2599
|
+
const [isUploading, setIsUploading] = (0, import_react48.useState)(false);
|
|
2600
|
+
const [isActioning, setIsActioning] = (0, import_react48.useState)(false);
|
|
2601
|
+
const [actionModal, setActionModal] = (0, import_react48.useState)(null);
|
|
2602
|
+
const [actionMessage, setActionMessage] = (0, import_react48.useState)("");
|
|
2603
|
+
const [archiveToDelete, setArchiveToDelete] = (0, import_react48.useState)(null);
|
|
2608
2604
|
const handleFileSelect = (e) => {
|
|
2609
2605
|
if (e.target.files && e.target.files.length > 0) {
|
|
2610
2606
|
setPendingFiles((prev) => [...prev, ...Array.from(e.target.files)]);
|
|
@@ -2633,36 +2629,36 @@ var UniversalAgentConsole = ({
|
|
|
2633
2629
|
}
|
|
2634
2630
|
};
|
|
2635
2631
|
const DynamicArrayAccordion = ({ items, parentKey }) => {
|
|
2636
|
-
const [activeFAQ, setActiveFAQ] = (0,
|
|
2637
|
-
return /* @__PURE__ */
|
|
2632
|
+
const [activeFAQ, setActiveFAQ] = (0, import_react48.useState)(null);
|
|
2633
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col relative z-10 bg-transparent w-full mt-2 border-t border-neutral-100" }, items.map((item, index) => {
|
|
2638
2634
|
const isOpen = activeFAQ === index;
|
|
2639
2635
|
let label = `${parentKey ? formatKeyName(parentKey) : "Item"} ${index + 1}`;
|
|
2640
2636
|
if (item.fullName) label = toTitleCaseSafe(item.fullName);
|
|
2641
2637
|
else if (item.role) label = item.role;
|
|
2642
2638
|
else if (item.proposedName) label = toTitleCaseSafe(item.proposedName);
|
|
2643
|
-
return /* @__PURE__ */
|
|
2639
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { key: index, className: `transition-all duration-300 ${index !== items.length - 1 ? "border-b border-neutral-100" : ""}` }, /* @__PURE__ */ import_react48.default.createElement("button", { className: "flex items-center justify-between w-full gap-4 text-left py-5 md:py-6 group outline-none bg-transparent", onClick: () => setActiveFAQ(isOpen ? null : index) }, /* @__PURE__ */ import_react48.default.createElement("span", { className: `text-[13px] md:text-[14px] transition-colors ${isOpen ? "text-black" : "text-neutral-700 group-hover:text-black"}` }, label), /* @__PURE__ */ import_react48.default.createElement("div", { className: `shrink-0 flex items-center justify-center w-8 h-8 rounded-full border transition-all duration-300 ${isOpen ? "rotate-180 border-black text-black" : "border-neutral-300 text-neutral-500"}` }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowDown01Icon, size: 16 }))), /* @__PURE__ */ import_react48.default.createElement("div", { className: `grid transition-all duration-300 ease-in-out ${isOpen ? "grid-rows-[1fr] pb-6 md:pb-8 opacity-100" : "grid-rows-[0fr] opacity-0"}` }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "pt-2 flex flex-col gap-3 pr-4 md:pr-12" }, renderDynamicObject(item)))));
|
|
2644
2640
|
}));
|
|
2645
2641
|
};
|
|
2646
2642
|
const renderValue = (key, value) => {
|
|
2647
2643
|
if (value === null || value === void 0 || value === "") return null;
|
|
2648
2644
|
if (typeof value === "string") {
|
|
2649
|
-
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */
|
|
2650
|
-
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */
|
|
2651
|
-
return /* @__PURE__ */
|
|
2645
|
+
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */ import_react48.default.createElement("a", { href: value, download: true, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-2 px-5 py-2 bg-white border border-neutral-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors w-fit outline-none mt-2" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Download01Icon, size: 14 }), " Download File");
|
|
2646
|
+
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(value));
|
|
2647
|
+
return /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, value);
|
|
2652
2648
|
}
|
|
2653
2649
|
if (Array.isArray(value)) {
|
|
2654
2650
|
const validItems = value.filter((item) => item !== null && item !== void 0 && item !== "");
|
|
2655
2651
|
if (validItems.length === 0) return null;
|
|
2656
|
-
if (typeof validItems[0] === "string") return /* @__PURE__ */
|
|
2657
|
-
return /* @__PURE__ */
|
|
2652
|
+
if (typeof validItems[0] === "string") return /* @__PURE__ */ import_react48.default.createElement("ul", { className: "list-disc pl-4 mt-1" }, validItems.map((v, i) => /* @__PURE__ */ import_react48.default.createElement("li", { key: i, className: "text-[12px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(v))));
|
|
2653
|
+
return /* @__PURE__ */ import_react48.default.createElement(DynamicArrayAccordion, { items: validItems, parentKey: key });
|
|
2658
2654
|
}
|
|
2659
2655
|
if (typeof value === "object") {
|
|
2660
2656
|
if (Object.keys(value).length === 0) return null;
|
|
2661
2657
|
const renderedObj = renderDynamicObject(value);
|
|
2662
2658
|
if (!renderedObj || Array.isArray(renderedObj) && renderedObj.length === 0) return null;
|
|
2663
|
-
return /* @__PURE__ */
|
|
2659
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-3 mt-1 w-full border-l border-neutral-100 pl-4 py-2" }, renderedObj);
|
|
2664
2660
|
}
|
|
2665
|
-
return /* @__PURE__ */
|
|
2661
|
+
return /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-sm text-black" }, String(value));
|
|
2666
2662
|
};
|
|
2667
2663
|
const renderDynamicObject = (obj) => {
|
|
2668
2664
|
if (!obj) return null;
|
|
@@ -2673,22 +2669,22 @@ var UniversalAgentConsole = ({
|
|
|
2673
2669
|
return true;
|
|
2674
2670
|
});
|
|
2675
2671
|
if (entries.length === 0) return null;
|
|
2676
|
-
return entries.map(([k, v]) => /* @__PURE__ */
|
|
2672
|
+
return entries.map(([k, v]) => /* @__PURE__ */ import_react48.default.createElement("div", { key: k, className: "flex flex-col items-start min-w-0 wrap-break-word w-full mb-3 last:mb-0" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 uppercase" }, formatKeyName(k)), renderValue(k, v)));
|
|
2677
2673
|
};
|
|
2678
|
-
return /* @__PURE__ */
|
|
2674
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react48.default.createElement(ManagedToaster, null), currentView === "list" && /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-start gap-1" }, /* @__PURE__ */ import_react48.default.createElement("h1", { className: " font-serif text-xl text-black tracking-tight" }, headerTitle), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-500" }, headerDescription)), stats.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, stats.map((stat, idx) => /* @__PURE__ */ import_react48.default.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-100 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xl text-black tracking-tight truncate" }, stat.value)))))), tabs.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-6" }, tabs.map((tab) => /* @__PURE__ */ import_react48.default.createElement("button", { key: tab.id, onClick: () => onTabChange(tab.id), className: `pb-3 text-sm transition-colors outline-none ${activeTab === tab.id ? "text-black border-b border-black" : "text-neutral-400 hover:text-black"}` }, tab.label))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full bg-white rounded-2xl max-w-3xl overflow-hidden flex flex-col min-h-100" }, isLoadingList ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Loading03Icon, size: 32, className: "animate-spin text-black" })) : listData.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex-1 flex justify-center items-center text-neutral-500 text-sm py-20" }, "No matching applications found.")) : /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1" }, listData.map((item) => /* @__PURE__ */ import_react48.default.createElement("div", { key: item.id, onClick: () => onRowClick(item.id), className: "flex items-center justify-between p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.title), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 truncate mt-1" }, item.subtitle)), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: `text-[10px] tracking-widest px-3 py-1 rounded-full uppercase ${item.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, item.status.replace(/_/g, " ")), /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[10px] text-neutral-400 mt-1" }, item.date))))), totalPages > 1 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center justify-between p-5 bg-neutral-50/50" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowRight01Icon, size: 14 }))))))), currentView === "details" && selectedApp && /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full bg-white rounded-2xl p-6 sm:p-10 animate-in fade-in duration-300 max-w-3xl flex flex-col" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center justify-between gap-4 pb-6" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => {
|
|
2679
2675
|
onBackToList();
|
|
2680
2676
|
setPendingFiles([]);
|
|
2681
|
-
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */
|
|
2677
|
+
}, className: "flex items-center gap-2 text-[10px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none uppercase" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.ArrowLeft01Icon, size: 14 }), " Back to List"), /* @__PURE__ */ import_react48.default.createElement("span", { className: `text-[10px] tracking-widest px-4 py-1.5 rounded-full uppercase ${selectedApp.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, selectedApp.status.replace(/_/g, " "))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-2 mb-8" }, /* @__PURE__ */ import_react48.default.createElement("h2", { className: " font-serif text-xl text-black tracking-tight" }, selectedApp.name || selectedApp.title), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-500" }, selectedApp.type ? selectedApp.type.replace(/_/g, " ").toLowerCase().replace(/\b\w/g, (c) => c.toUpperCase()) : selectedApp.subtitle)), selectedApp.agentId === currentAgentId && selectedApp.metadata && Object.keys(selectedApp.metadata).length > 0 ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-5" }, renderDynamicObject(selectedApp.metadata)) : selectedApp.agentId === currentAgentId ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-5" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-500" }, "No application data extracted.")) : null, selectedApp.agentId && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-4 pt-8 mt-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-1 mb-4" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-sm text-black" }, "Official Archives"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload final certificates or documents. Once marked completed, the archive unlocks for the user.")), selectedApp.archives?.map((arch) => /* @__PURE__ */ import_react48.default.createElement("div", { key: arch.id, className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.File02Icon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, arch.name)), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setArchiveToDelete(arch), className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Delete02Icon, size: 16 })))), pendingFiles.map((file, idx) => /* @__PURE__ */ import_react48.default.createElement("div", { key: idx, className: "flex items-center justify-between text-neutral-600 text-sm w-full" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.AttachmentIcon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, file.name)), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setPendingFiles((p) => p.filter((_, i) => i !== idx)), className: "text-neutral-400 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Cancel01Icon, size: 16 })))), /* @__PURE__ */ import_react48.default.createElement("input", { type: "file", multiple: true, ref: archiveRef, onChange: handleFileSelect, className: "hidden", accept: "application/pdf,image/*" }), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => archiveRef.current?.click(), disabled: selectedApp.status !== "COMPLETED" || isUploading, className: "flex items-center justify-center gap-3 p-4 border border-neutral-100 rounded-full hover:bg-neutral-50 transition-colors text-black text-sm w-full outline-none disabled:opacity-50" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Upload01Icon, size: 18, className: "text-neutral-400" }), " Select Files to Upload"), pendingFiles.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full sm:w-auto shrink-0" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setPendingFiles([]), disabled: isUploading, className: "px-6 py-2 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-200 outline-none w-full sm:w-auto uppercase" }, "Clear All"), /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: executeUpload, disabled: isUploading, isLoading: isUploading, className: "w-full sm:w-auto" }, "Upload ", pendingFiles.length, " File(s)")))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 mt-8 pt-6" }, !selectedApp.agentId ? /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2682
2678
|
setIsActioning(true);
|
|
2683
2679
|
await onAcceptApplication(selectedApp.id);
|
|
2684
2680
|
setIsActioning(false);
|
|
2685
|
-
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */
|
|
2681
|
+
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full p-4 border border-red-100 bg-red-50/30 rounded-xl flex items-start gap-3" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons13.Cancel01Icon, size: 16, className: "text-red-500 shrink-0 mt-0.5" }), /* @__PURE__ */ import_react48.default.createElement("div", null, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-red-700" }, "Application Taken"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-red-600 mt-1" }, "Currently handled by ", selectedApp.agentName || "another agent", "."))) : /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex flex-col sm:flex-row items-center gap-4 justify-between" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, "You are the assigned agent."), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-end gap-3 w-full sm:w-auto" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setActionModal("query"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Query"), /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setActionModal("reject"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto px-6 py-2 bg-white border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-30 uppercase" }, "Reject"), /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: () => setActionModal("success"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto" }, "Mark Success"))))), actionModal && /* @__PURE__ */ import_react48.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setActionModal(null) }), /* @__PURE__ */ import_react48.default.createElement("div", { className: "relative w-full max-w-md bg-white rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 text-left" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-lg text-black tracking-tight capitalize mb-2" }, actionModal === "success" ? "Complete Application" : `${actionModal} Application`), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, actionModal === "success" ? "Are you sure you want to mark this application as successfully completed?" : `Please provide a clear reason for the user. They will see this message and be asked to fix their application.`)), (actionModal === "query" || actionModal === "reject") && /* @__PURE__ */ import_react48.default.createElement("div", { className: "p-6 pb-2" }, /* @__PURE__ */ import_react48.default.createElement(TextInput, { label: "Reason for Action", value: actionMessage, onChange: setActionMessage, placeholder: "Enter your reason here...", disabled: isActioning })), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center p-6 pt-4 gap-3" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setActionModal(null), disabled: isActioning, className: "flex-1 py-3 text-[11px] tracking-widest uppercase text-neutral-600 rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2686
2682
|
setIsActioning(true);
|
|
2687
2683
|
await onUpdateStatus(selectedApp.id, actionModal === "success" ? "COMPLETED" : actionModal === "reject" ? "REJECTED" : "QUEUED", actionMessage);
|
|
2688
2684
|
setIsActioning(false);
|
|
2689
2685
|
setActionModal(null);
|
|
2690
2686
|
setActionMessage("");
|
|
2691
|
-
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */
|
|
2687
|
+
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */ import_react48.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setArchiveToDelete(null) }), /* @__PURE__ */ import_react48.default.createElement("div", { className: "relative w-full max-w-md bg-white rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 text-left" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: " font-serif text-lg text-black tracking-tight mb-2" }, "Delete Document?"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, 'Are you sure you want to permanently delete "', archiveToDelete.name, '"?')), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center p-6 gap-3" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setArchiveToDelete(null), disabled: isActioning, className: "flex-1 py-3 text-[11px] tracking-widest uppercase text-neutral-600 rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react48.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2692
2688
|
setIsActioning(true);
|
|
2693
2689
|
await onDeleteArchive(selectedApp.id, archiveToDelete.id);
|
|
2694
2690
|
setIsActioning(false);
|
|
@@ -2697,7 +2693,7 @@ var UniversalAgentConsole = ({
|
|
|
2697
2693
|
};
|
|
2698
2694
|
|
|
2699
2695
|
// src/components/UniversalOverviewPage.tsx
|
|
2700
|
-
var
|
|
2696
|
+
var import_react50 = __toESM(require("react"));
|
|
2701
2697
|
var UniversalOverviewPage = ({
|
|
2702
2698
|
headerTitle,
|
|
2703
2699
|
headerDescription,
|
|
@@ -2707,7 +2703,7 @@ var UniversalOverviewPage = ({
|
|
|
2707
2703
|
primaryAction,
|
|
2708
2704
|
alerts = []
|
|
2709
2705
|
}) => {
|
|
2710
|
-
return /* @__PURE__ */
|
|
2706
|
+
return /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react50.default.createElement("div", null, /* @__PURE__ */ import_react50.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription))), quickStats.length > 0 && /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden max-w-3xl bg-white" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-3 divide-y md:divide-y-0 md:divide-x divide-neutral-100" }, quickStats.map((stat, idx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: "p-6 flex items-center gap-4 hover:bg-neutral-50/50 transition-colors min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-12 h-12 rounded-full border border-neutral-100 bg-white flex items-center justify-center text-black shrink-0" }, stat.icon), /* @__PURE__ */ import_react50.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1 truncate uppercase" }, stat.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-lg md:text-xl text-black tracking-tight truncate" }, stat.value)))))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "w-full rounded-2xl max-w-3xl overflow-hidden bg-white min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "p-6 sm:p-8 flex flex-col h-full min-w-0 gap-6" }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-wrap items-center justify-between gap-4 border-b border-neutral-100 pb-4" }, /* @__PURE__ */ import_react50.default.createElement("h3", { className: " font-serif text-[11px] text-black tracking-[0.2em] uppercase" }, detailsTitle), primaryAction && (primaryAction.href ? /* @__PURE__ */ import_react50.default.createElement(
|
|
2711
2707
|
ThreeDButton,
|
|
2712
2708
|
{
|
|
2713
2709
|
href: primaryAction.href,
|
|
@@ -2716,7 +2712,7 @@ var UniversalOverviewPage = ({
|
|
|
2716
2712
|
},
|
|
2717
2713
|
primaryAction.label,
|
|
2718
2714
|
primaryAction.icon
|
|
2719
|
-
) : /* @__PURE__ */
|
|
2715
|
+
) : /* @__PURE__ */ import_react50.default.createElement(
|
|
2720
2716
|
ThreeDActionButton,
|
|
2721
2717
|
{
|
|
2722
2718
|
onClick: primaryAction.onClick,
|
|
@@ -2725,19 +2721,19 @@ var UniversalOverviewPage = ({
|
|
|
2725
2721
|
},
|
|
2726
2722
|
primaryAction.label,
|
|
2727
2723
|
primaryAction.icon
|
|
2728
|
-
))), /* @__PURE__ */
|
|
2724
|
+
))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-8" }, details.map((detail, idx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: "min-w-0" }, /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[10px] tracking-[0.2em] text-neutral-400 mb-1.5 uppercase" }, detail.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-[13px] text-black truncate" }, detail.value)))), alerts.map((alert, idx) => {
|
|
2729
2725
|
const bgClass = alert.type === "warning" ? "bg-amber-50/50" : alert.type === "info" ? "bg-blue-50/50" : "bg-red-50/50";
|
|
2730
2726
|
const textClass = alert.type === "warning" ? "text-amber-600" : alert.type === "info" ? "text-blue-600" : "text-red-600";
|
|
2731
2727
|
const valClass = alert.type === "warning" ? "text-amber-700" : alert.type === "info" ? "text-blue-700" : "text-red-700";
|
|
2732
2728
|
const lblClass = alert.type === "warning" ? "text-amber-400" : alert.type === "info" ? "text-blue-400" : "text-red-400";
|
|
2733
|
-
return /* @__PURE__ */
|
|
2729
|
+
return /* @__PURE__ */ import_react50.default.createElement("div", { key: idx, className: `mt-4 p-5 rounded-xl flex flex-col gap-4 ${bgClass}` }, /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react50.default.createElement("span", { className: `text-[11px] tracking-widest uppercase ${textClass}` }, alert.title)), alert.items.map((item, itemIdx) => /* @__PURE__ */ import_react50.default.createElement("div", { key: itemIdx }, /* @__PURE__ */ import_react50.default.createElement("span", { className: `text-[10px] tracking-[0.2em] block mb-1 uppercase ${lblClass}` }, item.label), /* @__PURE__ */ import_react50.default.createElement("p", { className: `text-[13px] leading-relaxed ${valClass}` }, item.text))));
|
|
2734
2730
|
}))));
|
|
2735
2731
|
};
|
|
2736
2732
|
|
|
2737
2733
|
// src/components/UniversalErrorView.tsx
|
|
2738
|
-
var
|
|
2739
|
-
var
|
|
2740
|
-
var
|
|
2734
|
+
var import_react51 = __toESM(require("react"));
|
|
2735
|
+
var import_react52 = require("@hugeicons/react");
|
|
2736
|
+
var import_core_free_icons14 = require("@hugeicons/core-free-icons");
|
|
2741
2737
|
var UniversalErrorView = ({
|
|
2742
2738
|
isBooting,
|
|
2743
2739
|
isLoading,
|
|
@@ -2749,7 +2745,7 @@ var UniversalErrorView = ({
|
|
|
2749
2745
|
returnLabel = "Return to Workspace"
|
|
2750
2746
|
}) => {
|
|
2751
2747
|
if (isBooting || isLoading && !activeData) {
|
|
2752
|
-
return /* @__PURE__ */
|
|
2748
|
+
return /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex items-center justify-center h-screen w-full bg-transparent" }, /* @__PURE__ */ import_react51.default.createElement(PageSpinner, null));
|
|
2753
2749
|
}
|
|
2754
2750
|
if (!isLoading && (!activeData || activeError)) {
|
|
2755
2751
|
const errorString = typeof activeError === "string" ? activeError : JSON.stringify(activeError || "");
|
|
@@ -2760,7 +2756,7 @@ var UniversalErrorView = ({
|
|
|
2760
2756
|
const apiMessage = typeof activeError === "string" && activeError.trim() !== "" ? activeError : null;
|
|
2761
2757
|
let title = "Oops Connection Error";
|
|
2762
2758
|
let description = apiMessage || `We could not load your request. Please check your connection and try again.`;
|
|
2763
|
-
let IconComponent =
|
|
2759
|
+
let IconComponent = import_core_free_icons14.ConfusedIcon;
|
|
2764
2760
|
if (isNotFoundError) {
|
|
2765
2761
|
title = "Oops its not your fault";
|
|
2766
2762
|
description = apiMessage || `We could not reach the ${envName} you just loaded. Our team has been notified.`;
|
|
@@ -2768,7 +2764,7 @@ var UniversalErrorView = ({
|
|
|
2768
2764
|
title = "Access Restricted";
|
|
2769
2765
|
description = apiMessage || `You have insufficient permissions to view this ${envName}. Please contact your administrator.`;
|
|
2770
2766
|
}
|
|
2771
|
-
return /* @__PURE__ */
|
|
2767
|
+
return /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex flex-col items-center justify-center h-screen w-full px-4 animate-in fade-in duration-500" }, /* @__PURE__ */ import_react51.default.createElement("div", { className: "mb-4 flex justify-center" }, /* @__PURE__ */ import_react51.default.createElement(import_react52.HugeiconsIcon, { icon: IconComponent, size: 48, className: "text-neutral-300" })), /* @__PURE__ */ import_react51.default.createElement("h2", { className: " font-serif text-lg text-black tracking-tight " }, title), /* @__PURE__ */ import_react51.default.createElement("p", { className: "text-xs mt-2 mb-8 text-neutral-500 max-w-sm text-center leading-relaxed" }, description), /* @__PURE__ */ import_react51.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full justify-center sm:w-auto" }, isNotFoundError || isPermissionError ? /* @__PURE__ */ import_react51.default.createElement(
|
|
2772
2768
|
"button",
|
|
2773
2769
|
{
|
|
2774
2770
|
onClick: () => window.location.href = returnUrl,
|
|
@@ -2777,14 +2773,14 @@ var UniversalErrorView = ({
|
|
|
2777
2773
|
returnLabel
|
|
2778
2774
|
) : (
|
|
2779
2775
|
// Soft errors (Network timeouts) allow them to retry or optionally retreat
|
|
2780
|
-
/* @__PURE__ */
|
|
2776
|
+
/* @__PURE__ */ import_react51.default.createElement(import_react51.default.Fragment, null, envName.toLowerCase().includes("application") && /* @__PURE__ */ import_react51.default.createElement(
|
|
2781
2777
|
"button",
|
|
2782
2778
|
{
|
|
2783
2779
|
onClick: () => window.location.href = returnUrl,
|
|
2784
2780
|
className: "px-6 py-2 bg-transparent border border-neutral-100 hover:bg-neutral-50 text-neutral-600 hover:text-black rounded-full text-[11px] tracking-widest transition-colors w-full sm:w-auto outline-none"
|
|
2785
2781
|
},
|
|
2786
2782
|
"Back Home"
|
|
2787
|
-
), /* @__PURE__ */
|
|
2783
|
+
), /* @__PURE__ */ import_react51.default.createElement(
|
|
2788
2784
|
"button",
|
|
2789
2785
|
{
|
|
2790
2786
|
onClick: onRetry,
|
|
@@ -2799,9 +2795,9 @@ var UniversalErrorView = ({
|
|
|
2799
2795
|
};
|
|
2800
2796
|
|
|
2801
2797
|
// src/components/UniversalLookupPage.tsx
|
|
2802
|
-
var
|
|
2803
|
-
var
|
|
2804
|
-
var
|
|
2798
|
+
var import_react53 = __toESM(require("react"));
|
|
2799
|
+
var import_react54 = require("@hugeicons/react");
|
|
2800
|
+
var import_core_free_icons15 = require("@hugeicons/core-free-icons");
|
|
2805
2801
|
var UniversalLookupPage = ({
|
|
2806
2802
|
headerTitle,
|
|
2807
2803
|
headerDescription,
|
|
@@ -2815,9 +2811,9 @@ var UniversalLookupPage = ({
|
|
|
2815
2811
|
resultContent,
|
|
2816
2812
|
modals
|
|
2817
2813
|
}) => {
|
|
2818
|
-
const [isTypeModalOpen, setIsTypeModalOpen] = (0,
|
|
2814
|
+
const [isTypeModalOpen, setIsTypeModalOpen] = (0, import_react53.useState)(false);
|
|
2819
2815
|
const currentOptionLabel = searchOptions.find((opt) => opt.value === selectedSearchType)?.label || "Select Type";
|
|
2820
|
-
return /* @__PURE__ */
|
|
2816
|
+
return /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 pb-20" }, /* @__PURE__ */ import_react53.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react53.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react53.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, headerDescription))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full max-w-2xl pb-8" }, /* @__PURE__ */ import_react53.default.createElement("form", { className: "flex flex-col gap-6", onSubmit: onSearch, autoComplete: "off" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2821
2817
|
"button",
|
|
2822
2818
|
{
|
|
2823
2819
|
type: "button",
|
|
@@ -2825,7 +2821,7 @@ var UniversalLookupPage = ({
|
|
|
2825
2821
|
className: "mt-2 text-[12px] tracking-widest bg-transparent border-b border-neutral-100 text-black text-left outline-none focus:border-black shrink-0 uppercase"
|
|
2826
2822
|
},
|
|
2827
2823
|
currentOptionLabel
|
|
2828
|
-
), /* @__PURE__ */
|
|
2824
|
+
), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2829
2825
|
TextInput,
|
|
2830
2826
|
{
|
|
2831
2827
|
placeholder: "Enter Exact ID, Email, or Slug...",
|
|
@@ -2833,7 +2829,7 @@ var UniversalLookupPage = ({
|
|
|
2833
2829
|
onChange: onSearchQueryChange,
|
|
2834
2830
|
disabled: isSearching
|
|
2835
2831
|
}
|
|
2836
|
-
))), /* @__PURE__ */
|
|
2832
|
+
))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react53.default.createElement(
|
|
2837
2833
|
ThreeDActionButton,
|
|
2838
2834
|
{
|
|
2839
2835
|
type: "submit",
|
|
@@ -2841,9 +2837,9 @@ var UniversalLookupPage = ({
|
|
|
2841
2837
|
isLoading: isSearching,
|
|
2842
2838
|
className: "min-w-32"
|
|
2843
2839
|
},
|
|
2844
|
-
/* @__PURE__ */
|
|
2840
|
+
/* @__PURE__ */ import_react53.default.createElement(import_react54.HugeiconsIcon, { icon: import_core_free_icons15.Search01Icon, size: 14, className: "mr-2" }),
|
|
2845
2841
|
" Lookup"
|
|
2846
|
-
)))), resultContent && /* @__PURE__ */
|
|
2842
|
+
)))), resultContent && /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full max-w-2xl bg-white text-left animate-in fade-in slide-in-from-bottom-4" }, /* @__PURE__ */ import_react53.default.createElement("h3", { className: " font-serif text-[10px] text-neutral-400 tracking-[0.2em] mb-6 uppercase" }, "Entity Record Found"), resultContent), isTypeModalOpen && /* @__PURE__ */ import_react53.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTypeModalOpen(false) }), /* @__PURE__ */ import_react53.default.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react53.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react53.default.createElement("h3", { className: " font-serif text-[14px] text-black tracking-tight mb-2" }, "Select Entity Type")), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, searchOptions.map((option) => /* @__PURE__ */ import_react53.default.createElement(
|
|
2847
2843
|
"button",
|
|
2848
2844
|
{
|
|
2849
2845
|
key: option.value,
|
|
@@ -2854,16 +2850,16 @@ var UniversalLookupPage = ({
|
|
|
2854
2850
|
},
|
|
2855
2851
|
className: `text-left px-4 py-3 text-[12px] tracking-wide transition-colors rounded-full flex items-center justify-between outline-none ${selectedSearchType === option.value ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}`
|
|
2856
2852
|
},
|
|
2857
|
-
/* @__PURE__ */
|
|
2858
|
-
selectedSearchType === option.value && /* @__PURE__ */
|
|
2859
|
-
))), /* @__PURE__ */
|
|
2853
|
+
/* @__PURE__ */ import_react53.default.createElement("span", { className: "truncate pr-2" }, option.label),
|
|
2854
|
+
selectedSearchType === option.value && /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-1.5 h-1.5 bg-black rounded-full shrink-0" })
|
|
2855
|
+
))), /* @__PURE__ */ import_react53.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react53.default.createElement("button", { type: "button", onClick: () => setIsTypeModalOpen(false), className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none" }, "Cancel")))), modals);
|
|
2860
2856
|
};
|
|
2861
2857
|
|
|
2862
2858
|
// src/components/UniversalDirectoryPage.tsx
|
|
2863
|
-
var
|
|
2864
|
-
var
|
|
2865
|
-
var
|
|
2866
|
-
var PageSpinner4 = () => /* @__PURE__ */
|
|
2859
|
+
var import_react55 = __toESM(require("react"));
|
|
2860
|
+
var import_react56 = require("@hugeicons/react");
|
|
2861
|
+
var import_core_free_icons16 = require("@hugeicons/core-free-icons");
|
|
2862
|
+
var PageSpinner4 = () => /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2867
2863
|
var UniversalDirectoryPage = ({
|
|
2868
2864
|
headerTitle,
|
|
2869
2865
|
headerDescription,
|
|
@@ -2885,33 +2881,33 @@ var UniversalDirectoryPage = ({
|
|
|
2885
2881
|
detailsContent,
|
|
2886
2882
|
modals
|
|
2887
2883
|
}) => {
|
|
2888
|
-
return /* @__PURE__ */
|
|
2884
|
+
return /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ import_react55.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, /* @__PURE__ */ import_react55.default.createElement("div", { className: "w-full" }, /* @__PURE__ */ import_react55.default.createElement("h1", { className: " font-serif text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react55.default.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ import_react55.default.createElement(
|
|
2889
2885
|
TextInput,
|
|
2890
2886
|
{
|
|
2891
2887
|
placeholder: searchPlaceholder,
|
|
2892
2888
|
value: searchQuery,
|
|
2893
2889
|
onChange: onSearchChange
|
|
2894
2890
|
}
|
|
2895
|
-
)), headerAction && /* @__PURE__ */
|
|
2891
|
+
)), headerAction && /* @__PURE__ */ import_react55.default.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react55.default.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowLeft01Icon, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ import_react55.default.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ import_react55.default.createElement(PageSpinner4, null) : /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ import_react55.default.createElement(import_react55.default.Fragment, null, /* @__PURE__ */ import_react55.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.")) : items.map((item) => /* @__PURE__ */ import_react55.default.createElement(
|
|
2896
2892
|
"div",
|
|
2897
2893
|
{
|
|
2898
2894
|
key: item.id,
|
|
2899
2895
|
onClick: () => onRowClick(item.id),
|
|
2900
2896
|
className: "flex items-center justify-between p-4 sm:p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0"
|
|
2901
2897
|
},
|
|
2902
|
-
/* @__PURE__ */
|
|
2903
|
-
item.rightBadge && /* @__PURE__ */
|
|
2904
|
-
))), totalPages > 1 && /* @__PURE__ */
|
|
2898
|
+
/* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-100 text-black text-xs" }, item.icon), /* @__PURE__ */ import_react55.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "text-sm text-black truncate pr-2" }, item.primaryText), /* @__PURE__ */ import_react55.default.createElement("div", { className: "text-xs text-neutral-500 truncate pr-2 mt-0.5" }, item.secondaryText))),
|
|
2899
|
+
item.rightBadge && /* @__PURE__ */ import_react55.default.createElement("div", { className: "shrink-0 pl-2" }, /* @__PURE__ */ import_react55.default.createElement("span", { className: `text-[10px] tracking-[0.2em] px-3 py-1 rounded-full whitespace-nowrap uppercase ${item.rightBadgeClass || "text-neutral-500 border border-neutral-100 bg-white"}` }, item.rightBadge))
|
|
2900
|
+
))), totalPages > 1 && /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react55.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react55.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react55.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react55.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-100 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react55.default.createElement(import_react56.HugeiconsIcon, { icon: import_core_free_icons16.ArrowRight01Icon, size: 14 })))))), currentView === "details" && detailsContent, modals);
|
|
2905
2901
|
};
|
|
2906
2902
|
|
|
2907
2903
|
// src/components/AiApproveDecline.tsx
|
|
2908
|
-
var
|
|
2909
|
-
var
|
|
2910
|
-
var
|
|
2904
|
+
var import_react57 = __toESM(require("react"));
|
|
2905
|
+
var import_react58 = require("@hugeicons/react");
|
|
2906
|
+
var import_core_free_icons17 = require("@hugeicons/core-free-icons");
|
|
2911
2907
|
var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline, onEdit }) => {
|
|
2912
|
-
const [isEditing, setIsEditing] = (0,
|
|
2913
|
-
const [editVal, setEditVal] = (0,
|
|
2914
|
-
return /* @__PURE__ */
|
|
2908
|
+
const [isEditing, setIsEditing] = (0, import_react57.useState)(false);
|
|
2909
|
+
const [editVal, setEditVal] = (0, import_react57.useState)(typeof suggestionValue === "string" ? suggestionValue : "");
|
|
2910
|
+
return /* @__PURE__ */ import_react57.default.createElement("div", { className: "border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react57.default.createElement("div", null, /* @__PURE__ */ import_react57.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1 uppercase" }, "AI Suggestion: ", suggestionTitle), !isEditing ? /* @__PURE__ */ import_react57.default.createElement("div", { className: "text-sm text-black" }, suggestionValue) : /* @__PURE__ */ import_react57.default.createElement(
|
|
2915
2911
|
"input",
|
|
2916
2912
|
{
|
|
2917
2913
|
type: "text",
|
|
@@ -2920,45 +2916,45 @@ var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline
|
|
|
2920
2916
|
className: "w-full text-sm p-2 border-b border-purple-200 bg-transparent outline-none focus:border-purple-400 transition-colors",
|
|
2921
2917
|
autoFocus: true
|
|
2922
2918
|
}
|
|
2923
|
-
)), /* @__PURE__ */
|
|
2919
|
+
)), /* @__PURE__ */ import_react57.default.createElement("div", { className: "flex items-center gap-1 mt-2" }, !isEditing ? /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement("button", { onClick: onApprove, title: "Approve", className: "p-1.5 text-black hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CheckmarkCircle01Icon, size: 28 })), /* @__PURE__ */ import_react57.default.createElement("button", { onClick: onDecline, title: "Decline", className: "p-1.5 text-neutral-400 hover:text-neutral-400 hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CancelCircleIcon, size: 28 })), onEdit && /* @__PURE__ */ import_react57.default.createElement("button", { onClick: () => setIsEditing(true), title: "Edit", className: "ml-auto p-1.5 text-neutral-400 hover:text-black hover:bg-neutral-100 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.PencilEdit01Icon, size: 18 }))) : /* @__PURE__ */ import_react57.default.createElement(import_react57.default.Fragment, null, /* @__PURE__ */ import_react57.default.createElement("button", { onClick: () => {
|
|
2924
2920
|
onEdit?.(editVal);
|
|
2925
2921
|
setIsEditing(false);
|
|
2926
|
-
}, title: "Save Edit", className: "p-1.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */
|
|
2922
|
+
}, title: "Save Edit", className: "p-1.5 text-emerald-500 hover:text-emerald-600 hover:bg-emerald-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CheckmarkCircle01Icon, size: 28 })), /* @__PURE__ */ import_react57.default.createElement("button", { onClick: () => setIsEditing(false), title: "Cancel Edit", className: "p-1.5 text-neutral-400 hover:text-black hover:bg-neutral-100 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react57.default.createElement(import_react58.HugeiconsIcon, { icon: import_core_free_icons17.CancelCircleIcon, size: 28 })))));
|
|
2927
2923
|
};
|
|
2928
2924
|
|
|
2929
2925
|
// src/components/AiStageCheck.tsx
|
|
2930
|
-
var
|
|
2931
|
-
var
|
|
2932
|
-
var
|
|
2926
|
+
var import_react59 = __toESM(require("react"));
|
|
2927
|
+
var import_react60 = require("@hugeicons/react");
|
|
2928
|
+
var import_core_free_icons18 = require("@hugeicons/core-free-icons");
|
|
2933
2929
|
var AiStageCheck = ({ tasks }) => {
|
|
2934
|
-
return /* @__PURE__ */
|
|
2930
|
+
return /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col gap-3 p-5 rounded-2xl border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white relative overflow-hidden" }, /* @__PURE__ */ import_react59.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 mb-1 uppercase" }, "AI Processing"), tasks.map((task) => /* @__PURE__ */ import_react59.default.createElement("div", { key: task.id, className: "flex items-center gap-3" }, task.status === "pending" && /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-4 h-4 rounded-full border border-purple-200" }), task.status === "loading" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.Loading03Icon, size: 16, className: "animate-spin text-purple-500" }), task.status === "success" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.CheckmarkCircle02Icon, size: 16, className: "text-emerald-500" }), task.status === "error" && /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons18.CancelCircleIcon, size: 16, className: "text-red-500" }), /* @__PURE__ */ import_react59.default.createElement("span", { className: `text-xs transition-colors ${task.status === "success" ? "text-black" : task.status === "loading" ? "text-purple-700" : "text-neutral-500"}` }, task.label))));
|
|
2935
2931
|
};
|
|
2936
2932
|
|
|
2937
2933
|
// src/components/Stagger.tsx
|
|
2938
|
-
var
|
|
2939
|
-
var
|
|
2940
|
-
var
|
|
2934
|
+
var import_react61 = __toESM(require("react"));
|
|
2935
|
+
var import_react62 = require("@hugeicons/react");
|
|
2936
|
+
var import_core_free_icons19 = require("@hugeicons/core-free-icons");
|
|
2941
2937
|
var Stagger = ({ steps, currentStep }) => {
|
|
2942
2938
|
const getIconForStep = (stepName) => {
|
|
2943
2939
|
const lowerName = stepName.toLowerCase();
|
|
2944
|
-
if (lowerName.includes("document")) return
|
|
2945
|
-
if (lowerName.includes("review")) return
|
|
2946
|
-
if (lowerName.includes("submit")) return
|
|
2947
|
-
return
|
|
2940
|
+
if (lowerName.includes("document")) return import_core_free_icons19.Upload01Icon;
|
|
2941
|
+
if (lowerName.includes("review")) return import_core_free_icons19.FileSyncIcon;
|
|
2942
|
+
if (lowerName.includes("submit")) return import_core_free_icons19.CloudUploadIcon;
|
|
2943
|
+
return import_core_free_icons19.Briefcase02Icon;
|
|
2948
2944
|
};
|
|
2949
|
-
return /* @__PURE__ */
|
|
2945
|
+
return /* @__PURE__ */ import_react61.default.createElement("div", { className: "w-full flex items-center justify-between relative z-0" }, /* @__PURE__ */ import_react61.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 w-full h-px bg-neutral-200 -z-10" }), /* @__PURE__ */ import_react61.default.createElement("div", { className: "absolute left-0 top-1/2 -translate-y-1/2 h-px bg-emerald-500 -z-10 transition-all duration-500", style: { width: `${currentStep / (steps.length - 1) * 100}%` } }), steps.map((step, idx) => {
|
|
2950
2946
|
const isActive = idx === currentStep;
|
|
2951
2947
|
const isPassed = idx < currentStep;
|
|
2952
2948
|
const colorClass = isPassed ? "bg-emerald-500 text-white" : isActive ? "bg-neutral-200 text-neutral-500" : "bg-neutral-200 text-neutral-500";
|
|
2953
|
-
return /* @__PURE__ */
|
|
2949
|
+
return /* @__PURE__ */ import_react61.default.createElement("div", { key: step, className: `w-6 h-6 rounded-full flex items-center justify-center transition-colors duration-300 ${colorClass}` }, /* @__PURE__ */ import_react61.default.createElement(import_react62.HugeiconsIcon, { icon: getIconForStep(step), size: 11 }));
|
|
2954
2950
|
}));
|
|
2955
2951
|
};
|
|
2956
2952
|
|
|
2957
2953
|
// src/components/UniversalRegistrationFlow.tsx
|
|
2958
|
-
var
|
|
2954
|
+
var import_react63 = __toESM(require("react"));
|
|
2959
2955
|
var import_react_hot_toast7 = __toESM(require("react-hot-toast"));
|
|
2960
|
-
var
|
|
2961
|
-
var
|
|
2956
|
+
var import_react64 = require("@hugeicons/react");
|
|
2957
|
+
var import_core_free_icons20 = require("@hugeicons/core-free-icons");
|
|
2962
2958
|
var MACRO_STEPS = ["Details", "Documents", "Review", "Submit"];
|
|
2963
2959
|
var NIGERIAN_STATES = ["Abia", "Adamawa", "Akwa Ibom", "Anambra", "Bauchi", "Bayelsa", "Benue", "Borno", "Cross River", "Delta", "Ebonyi", "Edo", "Ekiti", "Enugu", "FCT - Abuja", "Gombe", "Imo", "Jigawa", "Kaduna", "Kano", "Katsina", "Kebbi", "Kogi", "Kwara", "Lagos", "Nasarawa", "Niger", "Ogun", "Ondo", "Osun", "Oyo", "Plateau", "Rivers", "Sokoto", "Taraba", "Yobe", "Zamfara"];
|
|
2964
2960
|
var MEMBER_ROLES = ["Director Only", "Shareholder Only", "Both Director & Shareholder"];
|
|
@@ -2971,12 +2967,12 @@ var UniversalRegistrationFlow = ({
|
|
|
2971
2967
|
onRedirectToBilling,
|
|
2972
2968
|
onRedirectToApplication
|
|
2973
2969
|
}) => {
|
|
2974
|
-
const [isBooting, setIsBooting] = (0,
|
|
2975
|
-
const [macroStep, setMacroStep] = (0,
|
|
2976
|
-
const [appStatus, setAppStatus] = (0,
|
|
2977
|
-
const [isAbortModalOpen, setIsAbortModalOpen] = (0,
|
|
2978
|
-
const [isAborting, setIsAborting] = (0,
|
|
2979
|
-
const [formState, setFormState] = (0,
|
|
2970
|
+
const [isBooting, setIsBooting] = (0, import_react63.useState)(true);
|
|
2971
|
+
const [macroStep, setMacroStep] = (0, import_react63.useState)(0);
|
|
2972
|
+
const [appStatus, setAppStatus] = (0, import_react63.useState)("");
|
|
2973
|
+
const [isAbortModalOpen, setIsAbortModalOpen] = (0, import_react63.useState)(false);
|
|
2974
|
+
const [isAborting, setIsAborting] = (0, import_react63.useState)(false);
|
|
2975
|
+
const [formState, setFormState] = (0, import_react63.useState)({
|
|
2980
2976
|
natureApproved: false,
|
|
2981
2977
|
nameApproved: false,
|
|
2982
2978
|
addressApproved: false,
|
|
@@ -2987,13 +2983,13 @@ var UniversalRegistrationFlow = ({
|
|
|
2987
2983
|
passportApproved: false,
|
|
2988
2984
|
signatureApproved: false
|
|
2989
2985
|
});
|
|
2990
|
-
const idRef = (0,
|
|
2991
|
-
const passportRef = (0,
|
|
2992
|
-
const signatureRef = (0,
|
|
2993
|
-
const other1Ref = (0,
|
|
2994
|
-
const other2Ref = (0,
|
|
2995
|
-
const other3Ref = (0,
|
|
2996
|
-
const [formData, setFormData] = (0,
|
|
2986
|
+
const idRef = (0, import_react63.useRef)(null);
|
|
2987
|
+
const passportRef = (0, import_react63.useRef)(null);
|
|
2988
|
+
const signatureRef = (0, import_react63.useRef)(null);
|
|
2989
|
+
const other1Ref = (0, import_react63.useRef)(null);
|
|
2990
|
+
const other2Ref = (0, import_react63.useRef)(null);
|
|
2991
|
+
const other3Ref = (0, import_react63.useRef)(null);
|
|
2992
|
+
const [formData, setFormData] = (0, import_react63.useState)({
|
|
2997
2993
|
businessDesc: "",
|
|
2998
2994
|
natureOfBusiness: null,
|
|
2999
2995
|
proposedName: "",
|
|
@@ -3020,22 +3016,22 @@ var UniversalRegistrationFlow = ({
|
|
|
3020
3016
|
otherDoc3Url: "",
|
|
3021
3017
|
otherDoc3Meta: null
|
|
3022
3018
|
});
|
|
3023
|
-
const [activeModal, setActiveModal] = (0,
|
|
3024
|
-
const [iAgree, setIAgree] = (0,
|
|
3025
|
-
const [isAnalyzingNature, setIsAnalyzingNature] = (0,
|
|
3026
|
-
const [suggestedNature, setSuggestedNature] = (0,
|
|
3027
|
-
const [isCheckingQualifier, setIsCheckingQualifier] = (0,
|
|
3028
|
-
const [qualifierCheckResult, setQualifierCheckResult] = (0,
|
|
3029
|
-
const [isCheckingName, setIsCheckingName] = (0,
|
|
3030
|
-
const [nameCheckResult, setNameCheckResult] = (0,
|
|
3031
|
-
const [globalExtractingId, setGlobalExtractingId] = (0,
|
|
3032
|
-
const [globalUploadingPassport, setGlobalUploadingPassport] = (0,
|
|
3033
|
-
const [globalUploadingSignature, setGlobalUploadingSignature] = (0,
|
|
3034
|
-
const [isUploadingOther1, setIsUploadingOther1] = (0,
|
|
3035
|
-
const [isUploadingOther2, setIsUploadingOther2] = (0,
|
|
3036
|
-
const [isUploadingOther3, setIsUploadingOther3] = (0,
|
|
3037
|
-
const [aiTasks, setAiTasks] = (0,
|
|
3038
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
3019
|
+
const [activeModal, setActiveModal] = (0, import_react63.useState)({ isOpen: false, type: null, memberIndex: null });
|
|
3020
|
+
const [iAgree, setIAgree] = (0, import_react63.useState)(false);
|
|
3021
|
+
const [isAnalyzingNature, setIsAnalyzingNature] = (0, import_react63.useState)(false);
|
|
3022
|
+
const [suggestedNature, setSuggestedNature] = (0, import_react63.useState)(null);
|
|
3023
|
+
const [isCheckingQualifier, setIsCheckingQualifier] = (0, import_react63.useState)(false);
|
|
3024
|
+
const [qualifierCheckResult, setQualifierCheckResult] = (0, import_react63.useState)(null);
|
|
3025
|
+
const [isCheckingName, setIsCheckingName] = (0, import_react63.useState)(false);
|
|
3026
|
+
const [nameCheckResult, setNameCheckResult] = (0, import_react63.useState)(null);
|
|
3027
|
+
const [globalExtractingId, setGlobalExtractingId] = (0, import_react63.useState)(false);
|
|
3028
|
+
const [globalUploadingPassport, setGlobalUploadingPassport] = (0, import_react63.useState)(false);
|
|
3029
|
+
const [globalUploadingSignature, setGlobalUploadingSignature] = (0, import_react63.useState)(false);
|
|
3030
|
+
const [isUploadingOther1, setIsUploadingOther1] = (0, import_react63.useState)(false);
|
|
3031
|
+
const [isUploadingOther2, setIsUploadingOther2] = (0, import_react63.useState)(false);
|
|
3032
|
+
const [isUploadingOther3, setIsUploadingOther3] = (0, import_react63.useState)(false);
|
|
3033
|
+
const [aiTasks, setAiTasks] = (0, import_react63.useState)([]);
|
|
3034
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react63.useState)(false);
|
|
3039
3035
|
const isReadOnly = ["PENDING", "AWAITING_PAYMENT", "COMPLETED"].includes(appStatus);
|
|
3040
3036
|
const isAnyUploading = globalExtractingId || globalUploadingPassport || globalUploadingSignature || isUploadingOther1 || isUploadingOther2 || isUploadingOther3;
|
|
3041
3037
|
const baseApi = async (action, payload = {}) => {
|
|
@@ -3050,7 +3046,7 @@ var UniversalRegistrationFlow = ({
|
|
|
3050
3046
|
return { success: false, error: "Network communication failed." };
|
|
3051
3047
|
}
|
|
3052
3048
|
};
|
|
3053
|
-
(0,
|
|
3049
|
+
(0, import_react63.useEffect)(() => {
|
|
3054
3050
|
baseApi("progress_load").then((data) => {
|
|
3055
3051
|
if (data.success && data.data) {
|
|
3056
3052
|
const meta = data.data;
|
|
@@ -3526,23 +3522,23 @@ var UniversalRegistrationFlow = ({
|
|
|
3526
3522
|
const isStep0Valid = type === "company" ? formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.membersDetailsApproved : formState.natureApproved && formState.nameApproved && formState.addressApproved && formState.ownerApproved;
|
|
3527
3523
|
const isStep1Valid = type === "company" ? formState.membersDocsApproved : formState.idApproved && formState.passportApproved && formState.signatureApproved;
|
|
3528
3524
|
const titleText = type === "company" ? "Company Incorporation (LLC)" : "Business Name Registration";
|
|
3529
|
-
if (isBooting) return /* @__PURE__ */
|
|
3525
|
+
if (isBooting) return /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-center py-20" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 32, className: "animate-spin text-black" }));
|
|
3530
3526
|
if (!["DRAFT", "QUEUED", "REJECTED"].includes(appStatus) && appStatus !== "") {
|
|
3531
|
-
return /* @__PURE__ */
|
|
3527
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-4xl p-6 sm:p-10 flex flex-col items-center justify-center text-center gap-5 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20 py-24" }, appStatus === "COMPLETED" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.CheckmarkBadge01Icon, size: 35 })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Registration Completed"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application has been successfully verified and registered.")) : appStatus === "PENDING" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35, className: "animate-spin" })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Application is Pending"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is currently pending review.")) : appStatus === "AWAITING_PAYMENT" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-amber-50 text-amber-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35, className: "animate-pulse" })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Awaiting Payment"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is complete and awaiting government fee settlement. Please go to the Billing tab to authorize payment."), /* @__PURE__ */ import_react63.default.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: onRedirectToBilling, className: "px-8 py-3 bg-black text-white text-[11px] tracking-widest rounded-full hover:bg-neutral-800 outline-none" }, "Go to Billing & Invoices"), /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort & Edit Application"))) : /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-20 h-20 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center mb-2" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.HourglassIcon, size: 35 })), /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black" }, "Application Submitted"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500 max-w-md" }, "Your application is currently ", appStatus.replace(/_/g, " ").toLowerCase(), "."), ["AWAITING_PAYMENT", "READY_FOR_SUBMISSION", "AWAITING_CONFIRMATION"].includes(appStatus) && /* @__PURE__ */ import_react63.default.createElement("div", { className: "mt-6 flex flex-col items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setIsAbortModalOpen(true), className: "px-8 py-3 border border-neutral-100 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-50 outline-none" }, "Abort Application"))), isAbortModalOpen && /* @__PURE__ */ import_react63.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isAborting && setIsAbortModalOpen(false) }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "relative w-100 bg-white shadow-2xl rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 text-left" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "p-6 flex flex-col gap-4 text-center" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-[17px] font-serif text-black tracking-tight" }, "Abort Application?"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-relaxed" }, "Are you sure you want to abort? If you have already made a payment, returning to draft may cause issues. Your invoice will be deleted.")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full flex " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setIsAbortModalOpen(false), disabled: isAborting, className: "flex-1 py-4 text-[13px] text-neutral-500 hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react63.default.createElement("button", { onClick: handleAbort, disabled: isAborting, className: "flex-1 py-4 text-[13px] text-red-500 hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, isAborting ? "Aborting..." : "Yes, Abort")))));
|
|
3532
3528
|
}
|
|
3533
|
-
return /* @__PURE__ */
|
|
3529
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full max-w-3xl mx-auto bg-white rounded-4xl p-6 sm:p-10 flex flex-col gap-10 animate-in fade-in slide-in-from-bottom-2 duration-500 mb-20" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-xl font-serif text-black tracking-tight mb-1" }, titleText), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500" }, "Answer the questions below to build your official application.")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "px-2" }, /* @__PURE__ */ import_react63.default.createElement(Stagger, { steps: MACRO_STEPS, currentStep: macroStep }))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8" }, macroStep === 0 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "What does your ", type === "company" ? "company" : "business", " do?")), !formState.natureApproved ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3 " }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: type === "company" ? "Company Description" : "Business Description", placeholder: "e.g. We provide professional services to clients.", value: formData.businessDesc, onChange: (v) => setFormData({ ...formData, businessDesc: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleAnalyzeNature, disabled: formData.businessDesc.length < 5 || isAnalyzingNature || isReadOnly, isLoading: isAnalyzingNature, className: "w-fit" }, "Analyze Nature")), isAnalyzingNature && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: [{ id: "1", label: "Matching with Official Categories...", status: "loading" }] })), suggestedNature && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement(AiApproveDecline, { suggestionTitle: "Classification Found", suggestionValue: /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: " text-black" }, suggestedNature.specificLabel), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Category: ", suggestedNature.categoryLabel)), onApprove: () => {
|
|
3534
3530
|
const newForm = { ...formData, natureOfBusiness: suggestedNature };
|
|
3535
3531
|
setFormData(newForm);
|
|
3536
3532
|
approveSection("natureApproved", newForm);
|
|
3537
|
-
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */
|
|
3533
|
+
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "pr-4" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.natureApproved && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "What name would you like to register?")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide two options. We will verify availability against the official registry."), !formState.nameApproved ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Proposed Name 1 (Preferred)", value: formData.proposedName, onChange: (v) => setFormData({ ...formData, proposedName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Proposed Name 2 (Alternative)", value: formData.proposedName2, onChange: (v) => setFormData({ ...formData, proposedName2: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => handleCheckNames(formData.proposedName), disabled: !formData.proposedName || !formData.proposedName2 || isCheckingName || isCheckingQualifier || isReadOnly, isLoading: isCheckingQualifier || isCheckingName, className: "w-fit" }, "Check Availability")), (isCheckingQualifier || isCheckingName) && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: [{ id: "1", label: "AI Qualifier Pre-check...", status: isCheckingQualifier ? "loading" : "success" }, { id: "2", label: "Checking Official Registry Database...", status: isCheckingName ? "loading" : "pending" }, { id: "3", label: "Fallback Checking Public Database...", status: isCheckingName ? "loading" : "pending" }, { id: "4", label: "Validation Status...", status: isCheckingName ? "loading" : "pending" }] })), qualifierCheckResult && /* @__PURE__ */ import_react63.default.createElement("div", { className: "mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-1" }, "AI Suggestion: Structural Qualifier Missing"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black mb-3" }, "Nigerian registrations require a structural qualifier to be approved."), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, (qualifierCheckResult.suggestions || []).map((alt, i) => /* @__PURE__ */ import_react63.default.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-100 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setQualifierCheckResult(null), className: "w-fit text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors mt-2 outline-none" }, "Edit Name Manually"))), nameCheckResult && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in" }, nameCheckResult.status === "APPROVED" || nameCheckResult.status === "APPROVED_WARNING" || nameCheckResult.status === "SKIPPED" ? /* @__PURE__ */ import_react63.default.createElement(AiApproveDecline, { suggestionTitle: nameCheckResult.status === "APPROVED" ? "Name Available!" : "Fallback Approval", suggestionValue: /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: `mb-1 ${nameCheckResult.status === "APPROVED" ? "text-emerald-600 " : "text-orange-500 "}` }, nameCheckResult.status === "APPROVED" ? "Excellent chance of approval." : "Validation Bypassed / Fallback."), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-600" }, nameCheckResult.message), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-600 mt-2 " }, "Proposed Option: ", nameCheckResult.approvedOption)), onApprove: () => {
|
|
3538
3534
|
const newForm = { ...formData, approvedName: nameCheckResult.approvedOption };
|
|
3539
3535
|
setFormData(newForm);
|
|
3540
3536
|
approveSection("nameApproved", newForm);
|
|
3541
|
-
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */
|
|
3542
|
-
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */
|
|
3543
|
-
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */
|
|
3544
|
-
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */
|
|
3545
|
-
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex border-b border-neutral-100 items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " border-b border-neutral-100 flex items-center justify-between" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react65.default.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload valid means of identification, passport photographs, and signatures for every director and shareholder.")), !formState.membersDocsApproved ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react65.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react65.default.createElement("input", { id: `id-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "id"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement("input", { id: `pass-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "passport"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement("input", { id: `sig-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "signature"), disabled: isReadOnly || isAnyUploading }), !member.idExtractedData && !globalExtractingId ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react65.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload ID"))) : null, !member.passportFileUrl && !globalUploadingPassport ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-2xl" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-emerald-800" }, "All Member Documents Verified"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and ready for submission.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: idRef, onChange: (e) => handleBusinessUpload(e, "id"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: passportRef, onChange: (e) => handleBusinessUpload(e, "passport"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: signatureRef, onChange: (e) => handleBusinessUpload(e, "signature"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Upload your NIN, Driver's License, Voter's Card, or Int'l Passport (JPG/PNG/WEBP)."), !formState.idApproved ? /* @__PURE__ */ import_react65.default.createElement(import_react65.default.Fragment, null, /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-100 rounded-full flex flex-col items-center justify-center gap-2 transition-colors outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "hover:bg-neutral-50 text-black"}` }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react65.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react65.default.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Full Name on ID", value: formData.idExtractedData.fullName, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, fullName: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react65.default.createElement(TextInput, { label: "Date of Birth (YYYY-MM-DD)", value: formData.idExtractedData.dob, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, dob: v } })), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react65.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload")))) : /* @__PURE__ */ import_react65.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react65.default.createElement("div", null, /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteBusinessDocument("passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react65.default.createElement("button", { onClick: () => deleteBusinessDocument("signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react65.default.createElement(import_react66.HugeiconsIcon, { icon: import_core_free_icons21.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-100 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other1Ref, onChange: (e) => handleOptionalUpload(e, "other1"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other2Ref, onChange: (e) => handleOptionalUpload(e, "other2"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other3Ref, onChange: (e) => handleOptionalUpload(e, "other3"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react65.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react65.default.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "If your ", type === "company" ? "company" : "business", " involves regulated professional services, please upload relevant licenses, certificates, or permits here (up to 3 documents).")), /* @__PURE__ */ import_react65.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3537
|
+
}, onDecline: () => setNameCheckResult(null) }) : /* @__PURE__ */ import_react63.default.createElement("div", { className: "border border-red-100 bg-linear-to-bl from-red-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-red-600 block mb-1" }, "Registry Conflict Detected"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black mb-3" }, nameCheckResult.message), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, (nameCheckResult.alternatives || []).map((alt, i) => /* @__PURE__ */ import_react63.default.createElement("button", { key: i, onClick: () => setFormData({ ...formData, proposedName: alt }), className: "text-left px-4 py-2 border border-neutral-100 rounded-full hover:border-black text-sm transition-colors outline-none" }, alt)))), /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setNameCheckResult(null), className: "w-fit text-[11px] tracking-widest text-neutral-500 hover:text-black transition-colors mt-2 outline-none" }, "Try New Name")))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.approvedName), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Verified against registry")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("nameApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.nameApproved && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Where is your head office located?")), !formState.addressApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Street Address", value: formData.address, onChange: (v) => setFormData({ ...formData, address: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "City", value: formData.city, onChange: (v) => setFormData({ ...formData, city: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "State", value: formData.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: null, isGlobalState: true }), placeholder: "Select State", onChange: () => {
|
|
3538
|
+
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("addressApproved"), disabled: !formData.address || !formData.city || !formData.state || isReadOnly, className: "w-fit mt-2" }, "Confirm Address")) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-neutral-500" }, formData.address, ", ", formData.city, ", ", formData.state), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("addressApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "company" && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between gap-2 text-black border-b border-neutral-100 pb-3" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Directors & Shareholders")), !formState.membersDetailsApproved && /* @__PURE__ */ import_react63.default.createElement("div", { className: `text-xs px-3 py-1 rounded-full ${getCompanyTotalShares() === 100 ? "bg-emerald-50 text-emerald-600" : "bg-red-50 text-red-500"}` }, "Total Shares: ", getCompanyTotalShares(), "%")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide details for all individuals. Ensure total share percentage equals 100%."), !formState.membersDetailsApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 " }, formData.members.map((member, i) => /* @__PURE__ */ import_react63.default.createElement("div", { key: member.id, className: "flex flex-col gap-4 border border-neutral-100 p-5 rounded-2xl bg-neutral-50/30" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-between items-center mb-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-neutral-400" }, "Member ", i + 1), formData.members.length > 1 && !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => removeCompanyMember(i), className: "text-red-500 text-xs hover:text-red-600" }, "Remove")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Role", value: member.role, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "role", memberIndex: i }), onChange: () => {
|
|
3539
|
+
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Share Percentage (%)", value: member.sharePercentage, onChange: (v) => updateCompanyMemberInfo(i, "sharePercentage", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name", value: member.fullName, onChange: (v) => updateCompanyMemberInfo(i, "fullName", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Phone Number", value: member.phone, onChange: (v) => updateCompanyMemberInfo(i, "phone", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Email Address", value: member.email, onChange: (v) => updateCompanyMemberInfo(i, "email", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Nationality", value: member.nationality, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "nationality", memberIndex: i }), onChange: () => {
|
|
3540
|
+
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Residential Address", value: member.address, onChange: (v) => updateCompanyMemberInfo(i, "address", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "City", value: member.city, onChange: (v) => updateCompanyMemberInfo(i, "city", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "State", value: member.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: i }), onChange: () => {
|
|
3541
|
+
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex border-b border-neutral-100 items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: addCompanyMember, className: "px-6 py-2 bg-white border border-neutral-100 text-black text-[11px] tracking-widest rounded-full hover:bg-neutral-50 transition-colors outline-none" }, "+ Add Member"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex border-b border-neutral-100 items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " border-b border-neutral-100 flex items-center justify-between" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "Upload valid means of identification, passport photographs, and signatures for every director and shareholder.")), !formState.membersDocsApproved ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react63.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react63.default.createElement("input", { id: `id-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "id"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement("input", { id: `pass-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "passport"), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement("input", { id: `sig-upload-${i}`, type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", className: "hidden", onChange: (e) => handleCompanyMemberUpload(e, i, "signature"), disabled: isReadOnly || isAnyUploading }), !member.idExtractedData && !globalExtractingId ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`id-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name on ID", value: member.idExtractedData.fullName, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, fullName: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Date of Birth", value: member.idExtractedData.dob, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, dob: v }), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload ID"))) : null, !member.passportFileUrl && !globalUploadingPassport ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`pass-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && document.getElementById(`sig-upload-${i}`)?.click(), className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}`, disabled: isReadOnly || isAnyUploading }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteCompanyMemberDocument(i, "signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-2xl" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-emerald-800" }, "All Member Documents Verified"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and ready for submission.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: idRef, onChange: (e) => handleBusinessUpload(e, "id"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: passportRef, onChange: (e) => handleBusinessUpload(e, "passport"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: signatureRef, onChange: (e) => handleBusinessUpload(e, "signature"), disabled: isReadOnly || isAnyUploading, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 -mt-2" }, "Upload your NIN, Driver's License, Voter's Card, or Int'l Passport (JPG/PNG/WEBP)."), !formState.idApproved ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && idRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `w-full h-32 border border-neutral-100 rounded-full flex flex-col items-center justify-center gap-2 transition-colors outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "hover:bg-neutral-50 text-black"}` }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react63.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react63.default.createElement("div", { className: " mt-2 animate-in fade-in border border-purple-100 bg-linear-to-bl from-purple-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[10px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 mb-4" }, "Please verify the extracted information and correct any OCR mistakes before approving."), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Full Name on ID", value: formData.idExtractedData.fullName, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, fullName: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "ID Number", value: formData.idExtractedData.idNumber, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, idNumber: v } })), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react63.default.createElement(TextInput, { label: "Date of Birth (YYYY-MM-DD)", value: formData.idExtractedData.dob, onChange: (v) => setFormData((f) => ({ ...f, idExtractedData: { ...f.idExtractedData, dob: v } })), disabled: isReadOnly || isAnyUploading })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteBusinessDocument("id"), disabled: isAnyUploading, className: "px-6 py-2 bg-white border border-neutral-100 text-neutral-500 text-[11px] rounded-full tracking-widest hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, "Delete & Re-upload")))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && passportRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteBusinessDocument("passport"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => !isReadOnly && !isAnyUploading && signatureRef.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteBusinessDocument("signature"), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 pt-6 border-t border-neutral-100 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other1Ref, onChange: (e) => handleOptionalUpload(e, "other1"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other2Ref, onChange: (e) => handleOptionalUpload(e, "other2"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("input", { type: "file", accept: "image/jpeg, image/png, image/webp, application/pdf", ref: other3Ref, onChange: (e) => handleOptionalUpload(e, "other3"), disabled: isAnyUploading || isReadOnly, className: "hidden" }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "text-xs text-neutral-500 leading-relaxed" }, "If your ", type === "company" ? "company" : "business", " involves regulated professional services, please upload relevant licenses, certificates, or permits here (up to 3 documents).")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
3546
3542
|
const docType = `other${num}`;
|
|
3547
3543
|
const ref = num === 1 ? other1Ref : num === 2 ? other2Ref : other3Ref;
|
|
3548
3544
|
const isUploading = num === 1 ? isUploadingOther1 : num === 2 ? isUploadingOther2 : isUploadingOther3;
|
|
@@ -3550,20 +3546,20 @@ var UniversalRegistrationFlow = ({
|
|
|
3550
3546
|
if (!fileUrl && !isUploading) {
|
|
3551
3547
|
const prevUrl = num > 1 ? formData[`otherDoc${num - 1}Url`] : true;
|
|
3552
3548
|
if (!prevUrl) return null;
|
|
3553
|
-
return /* @__PURE__ */
|
|
3549
|
+
return /* @__PURE__ */ import_react63.default.createElement("button", { key: num, onClick: () => !isReadOnly && !isAnyUploading && ref.current?.click(), disabled: isReadOnly || isAnyUploading, className: `flex items-center gap-3 p-4 border border-neutral-100 rounded-full transition-colors text-sm w-full outline-none ${isAnyUploading ? "opacity-50 cursor-not-allowed bg-neutral-50 text-neutral-400" : "text-black hover:bg-neutral-50"}` }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Optional Document ", num);
|
|
3554
3550
|
}
|
|
3555
3551
|
if (isUploading) {
|
|
3556
|
-
return /* @__PURE__ */
|
|
3552
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { key: num, className: "flex items-center gap-3 p-4 border border-neutral-100 rounded-full bg-neutral-50 text-neutral-500 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Document ", num, "...");
|
|
3557
3553
|
}
|
|
3558
|
-
return /* @__PURE__ */
|
|
3559
|
-
}))), /* @__PURE__ */
|
|
3554
|
+
return /* @__PURE__ */ import_react63.default.createElement("div", { key: num, className: "flex items-center justify-between p-4 bg-emerald-50 rounded-full text-emerald-800 text-sm w-full" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.CheckmarkBadge01Icon, size: 18 }), " Optional Document ", num, " Uploaded"), !isReadOnly && /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => deleteOptionalDocument(docType), disabled: isAnyUploading, className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0 disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.Delete02Icon, size: 16 })));
|
|
3555
|
+
}))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: handleBack, disabled: isAnyUploading, className: "flex items-center gap-2 px-6 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none disabled:opacity-50 disabled:cursor-not-allowed" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Back"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep1Valid || isAnyUploading, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 2 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 animate-in fade-in" }, /* @__PURE__ */ import_react63.default.createElement("div", null, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-sm mb-5 text-black" }, "Application Summary"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-4 text-sm" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 truncate text-[13px] " }, type === "company" ? "Company Name" : "Business Name"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black text-[13px]" }, formData.approvedName)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Classification"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate sm:text-right text-[13px] " }, formData.natureOfBusiness?.specificLabel || "Pending")), type === "company" ? /* @__PURE__ */ import_react63.default.createElement(import_react63.default.Fragment, null, /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Total Members"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, formData.members.length, " Directors/Shareholders")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Share Capital"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, "100% Allocated"))) : /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between border-b border-neutral-100 pb-3 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Proprietor"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-black truncate text-[13px] " }, formData.ownerName)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Documents Attached"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-neutral-400 text-[13px] " }, "ID, Passport, Signature")), formData.otherDoc1Url && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between pb-2 gap-1" }, /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-neutral-500 text-[13px] " }, "Optional Documents"), /* @__PURE__ */ import_react63.default.createElement("span", { className: " text-neutral-400 text-[13px] " }, [formData.otherDoc1Url, formData.otherDoc2Url, formData.otherDoc3Url].filter(Boolean).length, " Attached")))), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex items-center justify-between mt-4 pt-4 " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: handleBack, className: "flex items-center gap-2 px-6 py-2 rounded-full text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 transition-colors outline-none" }, /* @__PURE__ */ import_react63.default.createElement(import_react64.HugeiconsIcon, { icon: import_core_free_icons20.ArrowLeft01Icon, size: 14 }), " Back"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleNext, className: "w-fit shrink-0" }, "Confirm & Proceed"))), macroStep === 3 && /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col gap-6 py-6 animate-in zoom-in-95 duration-500" }, /* @__PURE__ */ import_react63.default.createElement("h2", { className: "text-lg font-serif text-black tracking-tight mb-2" }, "Terms and Conditions of Application"), /* @__PURE__ */ import_react63.default.createElement("div", { className: "text-xs text-neutral-500 mb-4" }, /* @__PURE__ */ import_react63.default.createElement("p", { className: " mb-3" }, "Declaration and Consent"), /* @__PURE__ */ import_react63.default.createElement("p", { className: "mb-3 leading-relaxed" }, "By proceeding with this application, you acknowledge and agree that all data, documents, and identification materials provided herein will be securely transmitted to the relevant official registries and authorized agents for the purpose of ", type === "company" ? "company" : "business", " incorporation and compliance verification."), /* @__PURE__ */ import_react63.default.createElement("p", { className: "mb-3 leading-relaxed" }, "You confirm that all information provided is accurate and authentic. Any falsification of identity or corporate data may result in immediate rejection, and you may be held liable under applicable laws and regulations."), /* @__PURE__ */ import_react63.default.createElement("p", { className: "mb-3 leading-relaxed" }, "This service operates strictly as a digital intermediary connecting you with official registries. The final approval of the ", type === "company" ? "company" : "business", " name and registration rests solely with the regulatory authorities. We are not liable for rejections arising from pre existing conflicts, non compliance, or regulatory policy changes not flagged during the AI pre check stages."), /* @__PURE__ */ import_react63.default.createElement("p", { className: "leading-relaxed" }, "Proceeding to generate the invoice confirms your acceptance of these terms and initiates the formal filing process.")), /* @__PURE__ */ import_react63.default.createElement("label", { className: "flex items-start gap-3 mt-2 cursor-pointer group" }, /* @__PURE__ */ import_react63.default.createElement("input", { type: "checkbox", checked: iAgree, onChange: (e) => setIAgree(e.target.checked), disabled: isReadOnly, className: "mt-0.5 w-4 h-4 accent-black rounded cursor-pointer" }), /* @__PURE__ */ import_react63.default.createElement("span", { className: "text-[13px] text-red-500 group-hover:text-red-600 transition-colors" }, "I have read, understood, and agree to the terms of data transfer and processing.")), /* @__PURE__ */ import_react63.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-4 mt-8 w-full justify-end pt-6" }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: onCancelOrClose, disabled: isSubmitting, className: "px-8 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none w-full sm:w-auto" }, "Cancel"), /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setMacroStep(0), disabled: isSubmitting || isReadOnly, className: "px-8 py-2 text-[11px] tracking-widest text-neutral-500 hover:text-black hover:bg-neutral-50 rounded-full transition-colors outline-none w-full sm:w-auto" }, "Edit Application"), /* @__PURE__ */ import_react63.default.createElement(ThreeDActionButton, { onClick: handleFinalSubmit, disabled: isSubmitting || !iAgree || isReadOnly, isLoading: isSubmitting, className: "min-w-40 w-full sm:w-auto" }, "Submit")))), activeModal.isOpen && /* @__PURE__ */ import_react63.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setActiveModal({ isOpen: false, type: null, memberIndex: null }) }), /* @__PURE__ */ import_react63.default.createElement("div", { className: "relative w-80 bg-white shadow-2xl rounded-3xl flex flex-col overflow-hidden animate-in zoom-in-95 duration-200 max-h-[80vh]" }, /* @__PURE__ */ import_react63.default.createElement("div", { className: "p-4 text-center w-full shrink-0" }, /* @__PURE__ */ import_react63.default.createElement("h3", { className: "text-[14px] text-black tracking-tight capitalize" }, "Select ", activeModal.type)), /* @__PURE__ */ import_react63.default.createElement("div", { className: "p-4 flex flex-col gap-2 overflow-y-auto custom-scrollbar" }, (activeModal.type === "state" ? NIGERIAN_STATES : activeModal.type === "role" ? MEMBER_ROLES : NATIONALITIES).map((opt) => {
|
|
3560
3556
|
const isSelected = activeModal.isGlobalState ? formData.state === opt : formData.members[activeModal.memberIndex][activeModal.type] === opt;
|
|
3561
|
-
return /* @__PURE__ */
|
|
3557
|
+
return /* @__PURE__ */ import_react63.default.createElement("button", { key: opt, onClick: () => {
|
|
3562
3558
|
if (activeModal.isGlobalState) setFormData({ ...formData, state: opt });
|
|
3563
3559
|
else updateCompanyMemberInfo(activeModal.memberIndex, activeModal.type, opt);
|
|
3564
3560
|
setActiveModal({ isOpen: false, type: null, memberIndex: null });
|
|
3565
3561
|
}, className: `text-left px-4 py-3 rounded-full text-[13px] transition-colors outline-none ${isSelected ? "bg-neutral-100 text-black" : "text-neutral-500 hover:bg-neutral-50 hover:text-black"}` }, opt);
|
|
3566
|
-
})), /* @__PURE__ */
|
|
3562
|
+
})), /* @__PURE__ */ import_react63.default.createElement("div", { className: "w-full flex mt-auto shrink-0 " }, /* @__PURE__ */ import_react63.default.createElement("button", { onClick: () => setActiveModal({ isOpen: false, type: null, memberIndex: null }), className: "w-full py-4 text-[13px] text-neutral-500 hover:bg-neutral-50 transition-colors outline-none" }, "Close")))));
|
|
3567
3563
|
};
|
|
3568
3564
|
// Annotate the CommonJS export names for ESM import in node:
|
|
3569
3565
|
0 && (module.exports = {
|
|
@@ -3599,7 +3595,6 @@ var UniversalRegistrationFlow = ({
|
|
|
3599
3595
|
UniversalDashboardPage,
|
|
3600
3596
|
UniversalDirectoryPage,
|
|
3601
3597
|
UniversalErrorView,
|
|
3602
|
-
UniversalHeader,
|
|
3603
3598
|
UniversalIdentityPage,
|
|
3604
3599
|
UniversalLookupPage,
|
|
3605
3600
|
UniversalMembersPage,
|