@retinalabsllc/zairusjs 4.0.15 → 4.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +208 -196
- package/dist/index.mjs +206 -194
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1723,7 +1723,7 @@ var import_react37 = require("@hugeicons/react");
|
|
|
1723
1723
|
var import_core_free_icons8 = require("@hugeicons/core-free-icons");
|
|
1724
1724
|
var ButtonSpinner = () => /* @__PURE__ */ import_react36.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_react36.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react36.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" }));
|
|
1725
1725
|
var ECOSYSTEM_APPS = [
|
|
1726
|
-
{ id: "desktop", name: "Retina", description: "Ai Document Editor", iconSrc: "https://retinalabs.company/assets/images/
|
|
1726
|
+
{ id: "desktop", name: "Retina", description: "Ai Document Editor", iconSrc: "https://retinalabs.company/assets/images/retina_.avif", url: "https://app.retinaapps.com/" },
|
|
1727
1727
|
{ id: "audditur", name: "Audditur", description: "AI Legal & Compliance", iconSrc: "https://retinalabs.company/assets/images/audditur.avif", url: "https://app.audditur.com/" }
|
|
1728
1728
|
];
|
|
1729
1729
|
var UniversalSidebar = ({
|
|
@@ -1819,9 +1819,9 @@ var UniversalSidebar = ({
|
|
|
1819
1819
|
{
|
|
1820
1820
|
src: currentAppConfig.iconSrc,
|
|
1821
1821
|
alt: currentAppConfig.name,
|
|
1822
|
-
className: "w-
|
|
1822
|
+
className: "w-7 h-7 rounded-md object-contain shrink-0"
|
|
1823
1823
|
}
|
|
1824
|
-
) : /* @__PURE__ */ import_react36.default.createElement("div", { className: " rounded-md shrink-0 flex items-center justify-center" }), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex flex-col justify-center min-w-0 pr-2 flex-1" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[13px] text
|
|
1824
|
+
) : /* @__PURE__ */ import_react36.default.createElement("div", { className: " rounded-md shrink-0 flex items-center justify-center" }), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex flex-col justify-center min-w-0 pr-2 flex-1" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[13px] gradient-text leading-none truncate tracking-wide mb-1" }, title), subtitle && /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none " }, subtitle))), /* @__PURE__ */ import_react36.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(
|
|
1825
1825
|
"button",
|
|
1826
1826
|
{
|
|
1827
1827
|
onClick: closeMobile,
|
|
@@ -2041,7 +2041,7 @@ var UniversalOrganizationPage = ({
|
|
|
2041
2041
|
};
|
|
2042
2042
|
const hasChanges = orgName !== initialOrgName || slug !== initialSlug;
|
|
2043
2043
|
const isSaveDisabled = isSubmitting || isReadOnly || isCheckingSlug || !hasChanges || orgName.length < 3 || slug.length < 3 || slug !== initialSlug && slugAvailable === false;
|
|
2044
|
-
return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react38.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react38.default.createElement("div", null, /* @__PURE__ */ import_react38.default.createElement("h1", { className: "
|
|
2044
|
+
return /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl rounded-2xl p-6 bg-white fade-in duration-300 " }, /* @__PURE__ */ import_react38.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react38.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react38.default.createElement("div", null, /* @__PURE__ */ import_react38.default.createElement("h1", { className: " gradient-text text-xl mb-1 tracking-tight" }, "Organization"), /* @__PURE__ */ import_react38.default.createElement("p", { className: "text-xs text-neutral-500" }, "Manage your tenant workspace details and identity.")), isReadOnly && /* @__PURE__ */ import_react38.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ import_react38.default.createElement(import_react39.HugeiconsIcon, { icon: import_core_free_icons9.CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ import_react38.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react38.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react38.default.createElement(
|
|
2045
2045
|
TextInput,
|
|
2046
2046
|
{
|
|
2047
2047
|
label: "Organization Name",
|
|
@@ -2163,7 +2163,7 @@ var UniversalIdentityPage = ({
|
|
|
2163
2163
|
};
|
|
2164
2164
|
const hasChanges = primaryValue !== initialPrimaryValue || secondaryValue !== initialSecondaryValue;
|
|
2165
2165
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || primaryValue.trim().length < 3;
|
|
2166
|
-
return /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl 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: "
|
|
2166
|
+
return /* @__PURE__ */ import_react40.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl 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: " gradient-text text-xl 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: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ import_react40.default.createElement(import_react41.HugeiconsIcon, { icon: import_core_free_icons10.CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ import_react40.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react40.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react40.default.createElement(
|
|
2167
2167
|
TextInput,
|
|
2168
2168
|
{
|
|
2169
2169
|
label: primaryInputLabel,
|
|
@@ -2232,12 +2232,72 @@ var UniversalIdentityPage = ({
|
|
|
2232
2232
|
};
|
|
2233
2233
|
|
|
2234
2234
|
// src/components/UniversalMembersPage.tsx
|
|
2235
|
-
var
|
|
2235
|
+
var import_react44 = __toESM(require("react"));
|
|
2236
2236
|
var import_react_hot_toast5 = __toESM(require("react-hot-toast"));
|
|
2237
|
+
var import_react45 = require("@hugeicons/react");
|
|
2238
|
+
var import_core_free_icons12 = require("@hugeicons/core-free-icons");
|
|
2239
|
+
|
|
2240
|
+
// src/components/Banner.tsx
|
|
2241
|
+
var import_react42 = __toESM(require("react"));
|
|
2237
2242
|
var import_react43 = require("@hugeicons/react");
|
|
2238
2243
|
var import_core_free_icons11 = require("@hugeicons/core-free-icons");
|
|
2239
|
-
var
|
|
2240
|
-
|
|
2244
|
+
var Banner = ({
|
|
2245
|
+
title,
|
|
2246
|
+
message,
|
|
2247
|
+
type,
|
|
2248
|
+
icon,
|
|
2249
|
+
isDismissible = true,
|
|
2250
|
+
onDismiss,
|
|
2251
|
+
action
|
|
2252
|
+
}) => {
|
|
2253
|
+
const [isVisible, setIsVisible] = (0, import_react42.useState)(true);
|
|
2254
|
+
if (!isVisible) return null;
|
|
2255
|
+
const handleDismiss = () => {
|
|
2256
|
+
setIsVisible(false);
|
|
2257
|
+
if (onDismiss) onDismiss();
|
|
2258
|
+
};
|
|
2259
|
+
const config = {
|
|
2260
|
+
success: {
|
|
2261
|
+
bg: "bg-emerald-50",
|
|
2262
|
+
iconColor: "text-emerald-600",
|
|
2263
|
+
titleColor: "text-emerald-900",
|
|
2264
|
+
msgColor: "text-emerald-700",
|
|
2265
|
+
defaultIcon: import_core_free_icons11.CheckmarkBadge01Icon,
|
|
2266
|
+
closeHover: "hover:bg-emerald-100 text-emerald-500"
|
|
2267
|
+
},
|
|
2268
|
+
warning: {
|
|
2269
|
+
bg: "bg-amber-50",
|
|
2270
|
+
iconColor: "text-amber-600",
|
|
2271
|
+
titleColor: "text-amber-900",
|
|
2272
|
+
msgColor: "text-amber-700",
|
|
2273
|
+
defaultIcon: import_core_free_icons11.InformationCircleIcon,
|
|
2274
|
+
closeHover: "hover:bg-amber-100 text-amber-500"
|
|
2275
|
+
},
|
|
2276
|
+
alert: {
|
|
2277
|
+
bg: "bg-red-50",
|
|
2278
|
+
iconColor: "text-red-600",
|
|
2279
|
+
titleColor: "text-red-900",
|
|
2280
|
+
msgColor: "text-red-700",
|
|
2281
|
+
defaultIcon: import_core_free_icons11.Alert02Icon,
|
|
2282
|
+
closeHover: "hover:bg-red-100 text-red-500"
|
|
2283
|
+
}
|
|
2284
|
+
};
|
|
2285
|
+
const currentConfig = config[type];
|
|
2286
|
+
const IconToUse = icon || currentConfig.defaultIcon;
|
|
2287
|
+
return /* @__PURE__ */ import_react42.default.createElement("div", { className: `relative w-full rounded-2xl p-4 flex items-start gap-4 transition-all duration-300 animate-in fade-in slide-in-from-top-2 ${currentConfig.bg}` }, /* @__PURE__ */ import_react42.default.createElement("div", { className: `shrink-0 mt-0.5 ${currentConfig.iconColor}` }, /* @__PURE__ */ import_react42.default.createElement(import_react43.HugeiconsIcon, { icon: IconToUse, size: 20 })), /* @__PURE__ */ import_react42.default.createElement("div", { className: "flex-1 flex flex-col min-w-0 pr-6" }, /* @__PURE__ */ import_react42.default.createElement("h4", { className: `text-sm tracking-tight mb-1 ${currentConfig.titleColor}` }, title), /* @__PURE__ */ import_react42.default.createElement("p", { className: `text-xs leading-relaxed ${currentConfig.msgColor}` }, message), action && /* @__PURE__ */ import_react42.default.createElement("div", { className: "mt-3" }, action)), isDismissible && /* @__PURE__ */ import_react42.default.createElement(
|
|
2288
|
+
"button",
|
|
2289
|
+
{
|
|
2290
|
+
onClick: handleDismiss,
|
|
2291
|
+
className: `absolute top-3 right-3 p-1.5 rounded-full transition-colors outline-none shrink-0 ${currentConfig.closeHover}`,
|
|
2292
|
+
"aria-label": "Dismiss banner"
|
|
2293
|
+
},
|
|
2294
|
+
/* @__PURE__ */ import_react42.default.createElement(import_react43.HugeiconsIcon, { icon: import_core_free_icons11.Cancel01Icon, size: 16 })
|
|
2295
|
+
));
|
|
2296
|
+
};
|
|
2297
|
+
|
|
2298
|
+
// src/components/UniversalMembersPage.tsx
|
|
2299
|
+
var ButtonSpinner3 = () => /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.Loading03Icon, size: 16, className: "animate-spin text-white" });
|
|
2300
|
+
var PageSpinner2 = () => /* @__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_icons12.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2241
2301
|
var getInitials = (name) => {
|
|
2242
2302
|
if (!name) return "U";
|
|
2243
2303
|
const parts = name.trim().split(" ");
|
|
@@ -2280,18 +2340,18 @@ var UniversalMembersPage = ({
|
|
|
2280
2340
|
onRemoveMember,
|
|
2281
2341
|
onUpdateRole
|
|
2282
2342
|
}) => {
|
|
2283
|
-
const [currentView, setCurrentView] = (0,
|
|
2284
|
-
const [selectedMember, setSelectedMember] = (0,
|
|
2285
|
-
const [inviteEmail, setInviteEmail] = (0,
|
|
2286
|
-
const [inviteFirst, setInviteFirst] = (0,
|
|
2287
|
-
const [inviteLast, setInviteLast] = (0,
|
|
2288
|
-
const [isInviting, setIsInviting] = (0,
|
|
2289
|
-
const [isRoleModalOpen, setIsRoleModalOpen] = (0,
|
|
2290
|
-
const [isUpdatingRole, setIsUpdatingRole] = (0,
|
|
2291
|
-
const [memberToDelete, setMemberToDelete] = (0,
|
|
2292
|
-
const [isDeleting, setIsDeleting] = (0,
|
|
2293
|
-
const dropdownRef = (0,
|
|
2294
|
-
(0,
|
|
2343
|
+
const [currentView, setCurrentView] = (0, import_react44.useState)("list");
|
|
2344
|
+
const [selectedMember, setSelectedMember] = (0, import_react44.useState)(null);
|
|
2345
|
+
const [inviteEmail, setInviteEmail] = (0, import_react44.useState)("");
|
|
2346
|
+
const [inviteFirst, setInviteFirst] = (0, import_react44.useState)("");
|
|
2347
|
+
const [inviteLast, setInviteLast] = (0, import_react44.useState)("");
|
|
2348
|
+
const [isInviting, setIsInviting] = (0, import_react44.useState)(false);
|
|
2349
|
+
const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react44.useState)(false);
|
|
2350
|
+
const [isUpdatingRole, setIsUpdatingRole] = (0, import_react44.useState)(false);
|
|
2351
|
+
const [memberToDelete, setMemberToDelete] = (0, import_react44.useState)(null);
|
|
2352
|
+
const [isDeleting, setIsDeleting] = (0, import_react44.useState)(false);
|
|
2353
|
+
const dropdownRef = (0, import_react44.useRef)(null);
|
|
2354
|
+
(0, import_react44.useEffect)(() => {
|
|
2295
2355
|
function handleClickOutside(event) {
|
|
2296
2356
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
2297
2357
|
setIsRoleModalOpen(false);
|
|
@@ -2365,15 +2425,15 @@ var UniversalMembersPage = ({
|
|
|
2365
2425
|
setSelectedMember(null);
|
|
2366
2426
|
setIsRoleModalOpen(false);
|
|
2367
2427
|
};
|
|
2368
|
-
return /* @__PURE__ */
|
|
2428
|
+
return /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-5xl fade-in duration-300 p-6 rounded-2xl bg-white " }, /* @__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-4" }, currentView === "list" && /* @__PURE__ */ import_react44.default.createElement(import_react44.default.Fragment, null, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("h1", { className: " gradient-text text-xl mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), canManage && /* @__PURE__ */ import_react44.default.createElement(
|
|
2369
2429
|
ThreeDActionButton,
|
|
2370
2430
|
{
|
|
2371
2431
|
onClick: () => setCurrentView("invite"),
|
|
2372
2432
|
className: "w-fit shrink-0 gap-2"
|
|
2373
2433
|
},
|
|
2374
|
-
/* @__PURE__ */
|
|
2434
|
+
/* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.UserAdd01Icon, size: 12 }),
|
|
2375
2435
|
"Add Member"
|
|
2376
|
-
)), currentView !== "list" && /* @__PURE__ */
|
|
2436
|
+
)), currentView !== "list" && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: goBack, className: "text-[11px] 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_icons12.ArrowLeft01Icon, size: 12 }), " Back"), /* @__PURE__ */ import_react44.default.createElement("h1", { className: " text-lg text-black tracking-tight" }, currentView === "invite" ? "Add New Member" : "Member Profile"))), currentView === "list" && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react44.default.createElement(PageSpinner2, null) : /* @__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" }, members.length === 0 ? /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No organization member") : members.map((member) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2377
2437
|
"div",
|
|
2378
2438
|
{
|
|
2379
2439
|
key: member.id,
|
|
@@ -2383,7 +2443,7 @@ var UniversalMembersPage = ({
|
|
|
2383
2443
|
},
|
|
2384
2444
|
className: "flex items-center justify-between p-4 sm:p-5 hover:bg-neutral-50/50 transition-colors cursor-pointer group min-w-0"
|
|
2385
2445
|
},
|
|
2386
|
-
/* @__PURE__ */
|
|
2446
|
+
/* @__PURE__ */ import_react44.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_react44.default.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2387
2447
|
"img",
|
|
2388
2448
|
{
|
|
2389
2449
|
src: member.displayImage,
|
|
@@ -2391,25 +2451,25 @@ var UniversalMembersPage = ({
|
|
|
2391
2451
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2392
2452
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2393
2453
|
}
|
|
2394
|
-
)) : /* @__PURE__ */
|
|
2395
|
-
/* @__PURE__ */
|
|
2396
|
-
))), /* @__PURE__ */
|
|
2454
|
+
)) : /* @__PURE__ */ import_react44.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_react44.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-black truncate pr-2 sm:pr-4" }, member.fullName, " ", member.userId === currentUserId && /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-neutral-400 ml-1 sm:ml-2" }, "(You)")), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-xs text-neutral-500 truncate pr-2 sm:pr-4 mt-0.5" }, member.email))),
|
|
2455
|
+
/* @__PURE__ */ import_react44.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_react44.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-black border border-neutral-100 px-4 py-2 rounded-full bg-white whitespace-nowrap" }, canManage ? "Manage" : "View"))
|
|
2456
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[11px] 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(
|
|
2397
2457
|
"button",
|
|
2398
2458
|
{
|
|
2399
2459
|
onClick: () => onPageChange(currentPage - 1),
|
|
2400
2460
|
disabled: currentPage === 1 || isLoading,
|
|
2401
2461
|
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"
|
|
2402
2462
|
},
|
|
2403
|
-
/* @__PURE__ */
|
|
2404
|
-
), /* @__PURE__ */
|
|
2463
|
+
/* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.ArrowLeft01Icon, size: 14 })
|
|
2464
|
+
), /* @__PURE__ */ import_react44.default.createElement(
|
|
2405
2465
|
"button",
|
|
2406
2466
|
{
|
|
2407
2467
|
onClick: () => onPageChange(currentPage + 1),
|
|
2408
2468
|
disabled: currentPage >= totalPages || isLoading,
|
|
2409
2469
|
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"
|
|
2410
2470
|
},
|
|
2411
|
-
/* @__PURE__ */
|
|
2412
|
-
))))), currentView === "details" && selectedMember && /* @__PURE__ */
|
|
2471
|
+
/* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.ArrowRight01Icon, size: 14 })
|
|
2472
|
+
))))), currentView === "details" && selectedMember && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-5xl text-left" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col gap-8" }, /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex items-center gap-5" }, selectedMember.displayImage && selectedMember.displayImage !== "NO_IMAGE" ? /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-16 h-16 shrink-0 rounded-full overflow-hidden bg-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2413
2473
|
"img",
|
|
2414
2474
|
{
|
|
2415
2475
|
src: selectedMember.displayImage,
|
|
@@ -2417,7 +2477,7 @@ var UniversalMembersPage = ({
|
|
|
2417
2477
|
className: "w-full h-full object-cover blur-sm transition-all duration-300",
|
|
2418
2478
|
onLoad: (e) => e.currentTarget.classList.remove("blur-sm")
|
|
2419
2479
|
}
|
|
2420
|
-
)) : /* @__PURE__ */
|
|
2480
|
+
)) : /* @__PURE__ */ import_react44.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_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("h2", { className: " text-lg text-black" }, selectedMember.fullName), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-sm text-neutral-500 mt-1" }, selectedMember.email))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "grid grid-cols-2 gap-6 border-t border-neutral-100 pt-8" }, /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Role"), canChangeRoles && selectedMember.userId !== currentUserId ? /* @__PURE__ */ import_react44.default.createElement(
|
|
2421
2481
|
"button",
|
|
2422
2482
|
{
|
|
2423
2483
|
onClick: () => !isUpdatingRole && setIsRoleModalOpen(true),
|
|
@@ -2425,16 +2485,24 @@ var UniversalMembersPage = ({
|
|
|
2425
2485
|
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"}`
|
|
2426
2486
|
},
|
|
2427
2487
|
selectedMember.role,
|
|
2428
|
-
isUpdatingRole ? /* @__PURE__ */
|
|
2429
|
-
) : /* @__PURE__ */
|
|
2488
|
+
isUpdatingRole ? /* @__PURE__ */ import_react44.default.createElement(ButtonSpinner3, null) : /* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2489
|
+
) : /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-xs text-black bg-neutral-50 px-4 py-2 rounded-full inline-block" }, selectedMember.role)), /* @__PURE__ */ import_react44.default.createElement("div", null, /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-3" }, "Joined Date"), /* @__PURE__ */ import_react44.default.createElement("span", { className: "text-sm text-black" }, new Date(selectedMember.joinedAt).toLocaleDateString()))), canManage && selectedMember.userId !== currentUserId && /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-8 mt-2 border-t border-neutral-100" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2430
2490
|
"button",
|
|
2431
2491
|
{
|
|
2432
2492
|
onClick: () => setMemberToDelete(selectedMember),
|
|
2433
2493
|
className: "flex items-center gap-2 text-[11px] tracking-widest text-red-600 hover:text-red-700 transition-colors w-fit outline-none"
|
|
2434
2494
|
},
|
|
2435
|
-
/* @__PURE__ */
|
|
2495
|
+
/* @__PURE__ */ import_react44.default.createElement(import_react45.HugeiconsIcon, { icon: import_core_free_icons12.Delete01Icon, size: 14 }),
|
|
2436
2496
|
" Remove Member"
|
|
2437
|
-
)))), currentView === "invite" && canManage && /* @__PURE__ */
|
|
2497
|
+
)))), currentView === "invite" && canManage && /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full max-w-5xl text-left" }, /* @__PURE__ */ import_react44.default.createElement("form", { onSubmit: handleInvite, className: "space-y-8", autoComplete: "off" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2498
|
+
Banner,
|
|
2499
|
+
{
|
|
2500
|
+
title: "Universal Workspace Access",
|
|
2501
|
+
message: "Any member you add here will be granted access across your Retina Organization accounts. These permissions are universal.",
|
|
2502
|
+
type: "warning",
|
|
2503
|
+
isDismissible: false
|
|
2504
|
+
}
|
|
2505
|
+
), /* @__PURE__ */ import_react44.default.createElement(
|
|
2438
2506
|
TextInput,
|
|
2439
2507
|
{
|
|
2440
2508
|
label: "Email Address",
|
|
@@ -2443,7 +2511,7 @@ var UniversalMembersPage = ({
|
|
|
2443
2511
|
disabled: isInviting,
|
|
2444
2512
|
placeholder: "developer@acme.com"
|
|
2445
2513
|
}
|
|
2446
|
-
), requireNamesForInvite && /* @__PURE__ */
|
|
2514
|
+
), requireNamesForInvite && /* @__PURE__ */ import_react44.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2447
2515
|
TextInput,
|
|
2448
2516
|
{
|
|
2449
2517
|
label: "First Name",
|
|
@@ -2452,7 +2520,7 @@ var UniversalMembersPage = ({
|
|
|
2452
2520
|
disabled: isInviting,
|
|
2453
2521
|
placeholder: "Jane"
|
|
2454
2522
|
}
|
|
2455
|
-
), /* @__PURE__ */
|
|
2523
|
+
), /* @__PURE__ */ import_react44.default.createElement(
|
|
2456
2524
|
TextInput,
|
|
2457
2525
|
{
|
|
2458
2526
|
label: "Last Name",
|
|
@@ -2461,7 +2529,7 @@ var UniversalMembersPage = ({
|
|
|
2461
2529
|
disabled: isInviting,
|
|
2462
2530
|
placeholder: "Doe"
|
|
2463
2531
|
}
|
|
2464
|
-
)), /* @__PURE__ */
|
|
2532
|
+
)), /* @__PURE__ */ import_react44.default.createElement("div", { className: "pt-4 mt-2" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2465
2533
|
ThreeDActionButton,
|
|
2466
2534
|
{
|
|
2467
2535
|
type: "submit",
|
|
@@ -2470,7 +2538,7 @@ var UniversalMembersPage = ({
|
|
|
2470
2538
|
className: "min-w-40"
|
|
2471
2539
|
},
|
|
2472
2540
|
"Send Invitation"
|
|
2473
|
-
)))), isRoleModalOpen && canChangeRoles && /* @__PURE__ */
|
|
2541
|
+
)))), isRoleModalOpen && canChangeRoles && /* @__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: () => !isUpdatingRole && setIsRoleModalOpen(false) }), /* @__PURE__ */ import_react44.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_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " text-[14px] text-black tracking-tight" }, "Update Role")), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, availableRoles.map((roleOption) => /* @__PURE__ */ import_react44.default.createElement(
|
|
2474
2542
|
"button",
|
|
2475
2543
|
{
|
|
2476
2544
|
key: roleOption,
|
|
@@ -2478,9 +2546,9 @@ var UniversalMembersPage = ({
|
|
|
2478
2546
|
disabled: isUpdatingRole,
|
|
2479
2547
|
className: `text-left px-4 py-3 text-[11px] 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"}`
|
|
2480
2548
|
},
|
|
2481
|
-
/* @__PURE__ */
|
|
2482
|
-
selectedMember?.role === roleOption && /* @__PURE__ */
|
|
2483
|
-
))), /* @__PURE__ */
|
|
2549
|
+
/* @__PURE__ */ import_react44.default.createElement("span", { className: "truncate pr-2" }, roleOption),
|
|
2550
|
+
selectedMember?.role === roleOption && /* @__PURE__ */ import_react44.default.createElement("div", null)
|
|
2551
|
+
))), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react44.default.createElement(
|
|
2484
2552
|
"button",
|
|
2485
2553
|
{
|
|
2486
2554
|
onClick: () => setIsRoleModalOpen(false),
|
|
@@ -2488,14 +2556,14 @@ var UniversalMembersPage = ({
|
|
|
2488
2556
|
className: "w-full py-2.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
|
|
2489
2557
|
},
|
|
2490
2558
|
"Cancel"
|
|
2491
|
-
)))), memberToDelete && canManage && /* @__PURE__ */
|
|
2559
|
+
)))), memberToDelete && canManage && /* @__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: () => !isDeleting && setMemberToDelete(null) }), /* @__PURE__ */ import_react44.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_react44.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react44.default.createElement("h3", { className: " text-[17px] text-black tracking-tight mb-1" }, "Remove Member"), /* @__PURE__ */ import_react44.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to remove this member? They will lose access instantly.")), /* @__PURE__ */ import_react44.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react44.default.createElement("button", { onClick: () => setMemberToDelete(null), disabled: isDeleting, className: "flex-1 py-3 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none" }, "Cancel"), /* @__PURE__ */ import_react44.default.createElement("button", { onClick: handleDelete, disabled: isDeleting, className: "flex-1 py-3 text-[13px] text-red-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 flex justify-center outline-none" }, isDeleting ? /* @__PURE__ */ import_react44.default.createElement(ButtonSpinner3, null) : "Remove")))));
|
|
2492
2560
|
};
|
|
2493
2561
|
|
|
2494
2562
|
// src/components/UniversalProfileSettings.tsx
|
|
2495
|
-
var
|
|
2563
|
+
var import_react46 = __toESM(require("react"));
|
|
2496
2564
|
var import_react_hot_toast6 = __toESM(require("react-hot-toast"));
|
|
2497
|
-
var
|
|
2498
|
-
var
|
|
2565
|
+
var import_react47 = require("@hugeicons/react");
|
|
2566
|
+
var import_core_free_icons13 = require("@hugeicons/core-free-icons");
|
|
2499
2567
|
var UniversalProfileSettings = ({
|
|
2500
2568
|
initialFirstName,
|
|
2501
2569
|
initialLastName,
|
|
@@ -2505,10 +2573,10 @@ var UniversalProfileSettings = ({
|
|
|
2505
2573
|
isReadOnly = false,
|
|
2506
2574
|
onSaveProfile
|
|
2507
2575
|
}) => {
|
|
2508
|
-
const [firstName, setFirstName] = (0,
|
|
2509
|
-
const [lastName, setLastName] = (0,
|
|
2510
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
2511
|
-
(0,
|
|
2576
|
+
const [firstName, setFirstName] = (0, import_react46.useState)(initialFirstName);
|
|
2577
|
+
const [lastName, setLastName] = (0, import_react46.useState)(initialLastName);
|
|
2578
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react46.useState)(false);
|
|
2579
|
+
(0, import_react46.useEffect)(() => {
|
|
2512
2580
|
setFirstName(initialFirstName || "");
|
|
2513
2581
|
setLastName(initialLastName || "");
|
|
2514
2582
|
}, [initialFirstName, initialLastName]);
|
|
@@ -2538,7 +2606,7 @@ var UniversalProfileSettings = ({
|
|
|
2538
2606
|
};
|
|
2539
2607
|
const hasChanges = firstName !== initialFirstName || lastName !== initialLastName;
|
|
2540
2608
|
const isSaveDisabled = isSubmitting || isReadOnly || !hasChanges || firstName.trim().length === 0 || lastName.trim().length === 0;
|
|
2541
|
-
return /* @__PURE__ */
|
|
2609
|
+
return /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react46.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("h1", { className: " gradient-text text-xl mb-1 truncate tracking-tight" }, "Personal Settings"), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your personal account profile.")), isReadOnly && /* @__PURE__ */ import_react46.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ import_react46.default.createElement(import_react47.HugeiconsIcon, { icon: import_core_free_icons13.CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ import_react46.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react46.default.createElement("form", { className: "flex flex-col gap-8", onSubmit: handleSave, autoComplete: "off" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col sm:flex-row gap-6" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement(
|
|
2542
2610
|
TextInput,
|
|
2543
2611
|
{
|
|
2544
2612
|
label: "First Name",
|
|
@@ -2547,7 +2615,7 @@ var UniversalProfileSettings = ({
|
|
|
2547
2615
|
disabled: isReadOnly || isSubmitting,
|
|
2548
2616
|
placeholder: "System"
|
|
2549
2617
|
}
|
|
2550
|
-
)), /* @__PURE__ */
|
|
2618
|
+
)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement(
|
|
2551
2619
|
TextInput,
|
|
2552
2620
|
{
|
|
2553
2621
|
label: "Last Name",
|
|
@@ -2556,7 +2624,7 @@ var UniversalProfileSettings = ({
|
|
|
2556
2624
|
disabled: isReadOnly || isSubmitting,
|
|
2557
2625
|
placeholder: "Admin"
|
|
2558
2626
|
}
|
|
2559
|
-
))), /* @__PURE__ */
|
|
2627
|
+
))), /* @__PURE__ */ import_react46.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement(
|
|
2560
2628
|
TextInput,
|
|
2561
2629
|
{
|
|
2562
2630
|
label: "Email ID",
|
|
@@ -2565,7 +2633,7 @@ var UniversalProfileSettings = ({
|
|
|
2565
2633
|
},
|
|
2566
2634
|
disabled: true
|
|
2567
2635
|
}
|
|
2568
|
-
), /* @__PURE__ */
|
|
2636
|
+
), /* @__PURE__ */ import_react46.default.createElement("p", { className: "text-[11px] text-neutral-400 mt-1 truncate" }, "To change your email address, please contact support.")), /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between pt-8 mt-2 gap-6 sm:gap-4 " }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block truncate " }, "Account Status"), /* @__PURE__ */ import_react46.default.createElement("span", { className: "text-xs text-black block truncate" }, accountStatus)), /* @__PURE__ */ import_react46.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react46.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em] block truncate " }, "Member Since"), /* @__PURE__ */ import_react46.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_react46.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_react46.default.createElement(
|
|
2569
2637
|
"button",
|
|
2570
2638
|
{
|
|
2571
2639
|
type: "button",
|
|
@@ -2576,7 +2644,7 @@ var UniversalProfileSettings = ({
|
|
|
2576
2644
|
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"
|
|
2577
2645
|
},
|
|
2578
2646
|
"Cancel"
|
|
2579
|
-
), /* @__PURE__ */
|
|
2647
|
+
), /* @__PURE__ */ import_react46.default.createElement(
|
|
2580
2648
|
ThreeDActionButton,
|
|
2581
2649
|
{
|
|
2582
2650
|
type: "submit",
|
|
@@ -2589,11 +2657,11 @@ var UniversalProfileSettings = ({
|
|
|
2589
2657
|
};
|
|
2590
2658
|
|
|
2591
2659
|
// src/components/UniversalBillingPage.tsx
|
|
2592
|
-
var
|
|
2593
|
-
var
|
|
2594
|
-
var
|
|
2595
|
-
var PageSpinner3 = () => /* @__PURE__ */
|
|
2596
|
-
var ButtonSpinner4 = () => /* @__PURE__ */
|
|
2660
|
+
var import_react48 = __toESM(require("react"));
|
|
2661
|
+
var import_react49 = require("@hugeicons/react");
|
|
2662
|
+
var import_core_free_icons14 = require("@hugeicons/core-free-icons");
|
|
2663
|
+
var PageSpinner3 = () => /* @__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_icons14.Loading03Icon, size: 32, className: "animate-spin mb-4 text-neutral-400" }));
|
|
2664
|
+
var ButtonSpinner4 = () => /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.Loading03Icon, size: 16, className: "animate-spin text-neutral-500" });
|
|
2597
2665
|
var formatDate = (dateString) => {
|
|
2598
2666
|
if (!dateString) return "N/A";
|
|
2599
2667
|
return new Date(dateString).toLocaleDateString("en-US", {
|
|
@@ -2605,6 +2673,10 @@ var formatDate = (dateString) => {
|
|
|
2605
2673
|
var formatUsd = (amount) => {
|
|
2606
2674
|
return `$${(amount || 0).toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
2607
2675
|
};
|
|
2676
|
+
var capitalizeWords = (input) => {
|
|
2677
|
+
if (!input) return "";
|
|
2678
|
+
return input.toLowerCase().split(" ").map((part) => part.length ? part[0].toUpperCase() + part.slice(1) : part).join(" ");
|
|
2679
|
+
};
|
|
2608
2680
|
var UniversalBillingPage = ({
|
|
2609
2681
|
headerTitle,
|
|
2610
2682
|
headerDescription,
|
|
@@ -2635,13 +2707,13 @@ var UniversalBillingPage = ({
|
|
|
2635
2707
|
onPayInvoice,
|
|
2636
2708
|
onUpdateInvoiceStatus
|
|
2637
2709
|
}) => {
|
|
2638
|
-
const [currentView, setCurrentView] = (0,
|
|
2639
|
-
const [selectedInvoice, setSelectedInvoice] = (0,
|
|
2640
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2641
|
-
const [isPaying, setIsPaying] = (0,
|
|
2642
|
-
const [isActionModalOpen, setIsActionModalOpen] = (0,
|
|
2643
|
-
const [isUpdating, setIsUpdating] = (0,
|
|
2644
|
-
const [twoFactorCode, setTwoFactorCode] = (0,
|
|
2710
|
+
const [currentView, setCurrentView] = (0, import_react48.useState)("list");
|
|
2711
|
+
const [selectedInvoice, setSelectedInvoice] = (0, import_react48.useState)(null);
|
|
2712
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react48.useState)(false);
|
|
2713
|
+
const [isPaying, setIsPaying] = (0, import_react48.useState)(false);
|
|
2714
|
+
const [isActionModalOpen, setIsActionModalOpen] = (0, import_react48.useState)(false);
|
|
2715
|
+
const [isUpdating, setIsUpdating] = (0, import_react48.useState)(false);
|
|
2716
|
+
const [twoFactorCode, setTwoFactorCode] = (0, import_react48.useState)("");
|
|
2645
2717
|
const handlePayment = async () => {
|
|
2646
2718
|
if (!selectedInvoice || isReadOnly || !onPayInvoice || isPaying) return;
|
|
2647
2719
|
setIsPaying(true);
|
|
@@ -2668,14 +2740,14 @@ var UniversalBillingPage = ({
|
|
|
2668
2740
|
setIsUpdating(false);
|
|
2669
2741
|
}
|
|
2670
2742
|
};
|
|
2671
|
-
return /* @__PURE__ */
|
|
2743
|
+
return /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex max-w-5xl rounded-2xl bg-white p-6 flex-col gap-8 animate-in fade-in duration-300 " }, /* @__PURE__ */ import_react48.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0 w-full" }, /* @__PURE__ */ import_react48.default.createElement("h1", { className: "text-lg gradient-text mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 truncate mb-6" }, headerDescription), showSearchAndFilter && onSearchChange && onTimeframeChange && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row gap-4 mb-4" }, /* @__PURE__ */ import_react48.default.createElement(
|
|
2672
2744
|
TextInput,
|
|
2673
2745
|
{
|
|
2674
2746
|
placeholder: "Search by ID or Name...",
|
|
2675
2747
|
value: searchQuery,
|
|
2676
2748
|
onChange: onSearchChange
|
|
2677
2749
|
}
|
|
2678
|
-
), /* @__PURE__ */
|
|
2750
|
+
), /* @__PURE__ */ import_react48.default.createElement(
|
|
2679
2751
|
"button",
|
|
2680
2752
|
{
|
|
2681
2753
|
type: "button",
|
|
@@ -2683,10 +2755,10 @@ var UniversalBillingPage = ({
|
|
|
2683
2755
|
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"
|
|
2684
2756
|
},
|
|
2685
2757
|
timeframe === "ALL" ? "All Time" : timeframe === "24H" ? "Past 24 Hours" : timeframe === "7D" ? "Past 7 Days" : "Past 30 Days"
|
|
2686
|
-
))) : /* @__PURE__ */
|
|
2758
|
+
))) : /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react48.default.createElement("button", { onClick: () => setCurrentView("list"), className: "text-[11px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none" }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.ArrowLeft01Icon, size: 12 }), " Back")), isReadOnly && currentView === "list" && /* @__PURE__ */ import_react48.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full " }, /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.CircleLock02Icon, size: 18, className: "text-current" }))), currentView === "list" && /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-8 w-full" }, (metricPrimaryLabel || metricSecondaryLabel) && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row sm:justify-between sm:items-start pb-8 gap-6 sm:gap-0" }, metricPrimaryLabel && /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-2 truncate block " }, metricPrimaryLabel), /* @__PURE__ */ import_react48.default.createElement("div", { className: "text-2xl text-black tracking-tight truncate" }, formatUsd(metricPrimaryValue)), metricPrimarySubtext && /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[11px] text-neutral-500 mt-1 tracking-widest " }, metricPrimarySubtext)), metricSecondaryLabel && /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0 sm:text-right" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-2 truncate block " }, metricSecondaryLabel), /* @__PURE__ */ import_react48.default.createElement("div", { className: "text-xl text-emerald-600 tracking-tight truncate" }, formatUsd(metricSecondaryValue)), metricSecondarySubtext && /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[11px] text-neutral-500 mt-1 tracking-widest " }, metricSecondarySubtext))), !isReadOnly && showBillingOverview && /* @__PURE__ */ import_react48.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-8 sm:gap-4" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-3 truncate block " }, "Billing Status"), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex items-center gap-2 min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: `w-2 h-2 rounded-full shrink-0 ${billingStatus === "ACTIVE" ? "bg-green-500" : "bg-neutral-300"}` }), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-black tracking-widest truncate" }, billingStatus || "UNKNOWN"))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-3 truncate block " }, "Next Billing Date"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-black truncate" }, formatDate(nextBillingDate))), lastPaidDate && /* @__PURE__ */ import_react48.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-3 truncate block " }, "Last Paid Date"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-neutral-600 truncate" }, formatDate(lastPaidDate)))), !isReadOnly && showUsageMetrics && usageMetrics.length > 0 && /* @__PURE__ */ import_react48.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-6 truncate block " }, "Usage & Limits"), /* @__PURE__ */ import_react48.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_react48.default.createElement("div", { key: idx, className: "flex justify-between pb-2" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-neutral-500 text-xs" }, metric.label), /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-xs text-black" }, metric.value))))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "pt-8 border-t border-neutral-100" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[11px] text-neutral-400 tracking-[0.2em] mb-4 truncate block " }, "Transaction History"), isLoading ? /* @__PURE__ */ import_react48.default.createElement(PageSpinner3, null) : invoices.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(import_react48.default.Fragment, null, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, "No records found.")) : /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "divide-y divide-neutral-100" }, invoices.map((inv) => /* @__PURE__ */ import_react48.default.createElement("div", { key: inv.id, onClick: () => {
|
|
2687
2759
|
setSelectedInvoice(inv);
|
|
2688
2760
|
setCurrentView("details");
|
|
2689
|
-
}, className: "flex items-center justify-between py-4 hover:bg-neutral-50/50 cursor-pointer group min-w-0 px-2 transition-colors" }, /* @__PURE__ */
|
|
2761
|
+
}, 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_react48.default.createElement("div", { className: "flex flex-col gap-1 min-w-0 flex-1" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, capitalizeWords(inv.name)), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, inv.subtext)), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-sm text-black" }, formatUsd(inv.amountDue)), /* @__PURE__ */ import_react48.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_react48.default.createElement("div", { className: "flex items-center justify-between pt-4 mt-2" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[11px] 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 || 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_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react48.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_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.ArrowRight01Icon, size: 14 })))))))), currentView === "details" && selectedInvoice && /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full max-w-5xl animate-in fade-in duration-300" }, /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col gap-6 w-full" }, /* @__PURE__ */ import_react48.default.createElement("div", null, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Breakdown"), /* @__PURE__ */ import_react48.default.createElement("h2", { className: "text-lg text-black mb-1" }, capitalizeWords(selectedInvoice.name)), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500" }, "Generated on ", formatDate(selectedInvoice.createdAt))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6 " }, /* @__PURE__ */ import_react48.default.createElement("div", null, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Amount"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xl text-black" }, formatUsd(selectedInvoice.amountDue))), /* @__PURE__ */ import_react48.default.createElement("div", null, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Status"), isModMode ? /* @__PURE__ */ import_react48.default.createElement(
|
|
2690
2762
|
"button",
|
|
2691
2763
|
{
|
|
2692
2764
|
onClick: () => !isUpdating && setIsActionModalOpen(true),
|
|
@@ -2694,8 +2766,8 @@ var UniversalBillingPage = ({
|
|
|
2694
2766
|
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"}`
|
|
2695
2767
|
},
|
|
2696
2768
|
selectedInvoice.status,
|
|
2697
|
-
isUpdating ? /* @__PURE__ */
|
|
2698
|
-
) : /* @__PURE__ */
|
|
2769
|
+
isUpdating ? /* @__PURE__ */ import_react48.default.createElement(ButtonSpinner4, null) : /* @__PURE__ */ import_react48.default.createElement(import_react49.HugeiconsIcon, { icon: import_core_free_icons14.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2770
|
+
) : /* @__PURE__ */ import_react48.default.createElement("span", { className: `text-[11px] 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_react48.default.createElement("div", { className: "md:col-span-2 pt-4 border-t border-neutral-100/60 mt-2" }, /* @__PURE__ */ import_react48.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Reference ID"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-xs text-neutral-500 inline-block" }, selectedInvoice.id))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-end gap-4 pt-4" }, !isModMode && (selectedInvoice.status === "ISSUED" || selectedInvoice.status === "OVERDUE") && onPayInvoice && /* @__PURE__ */ import_react48.default.createElement("div", { className: "flex flex-col items-end gap-2 w-full sm:w-auto" }, /* @__PURE__ */ import_react48.default.createElement(
|
|
2699
2771
|
ThreeDActionButton,
|
|
2700
2772
|
{
|
|
2701
2773
|
onClick: handlePayment,
|
|
@@ -2704,12 +2776,12 @@ var UniversalBillingPage = ({
|
|
|
2704
2776
|
className: "w-full sm:w-auto"
|
|
2705
2777
|
},
|
|
2706
2778
|
"Pay Invoice"
|
|
2707
|
-
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */
|
|
2779
|
+
)), !isModMode && selectedInvoice.status === "PAID" && /* @__PURE__ */ import_react48.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_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: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react48.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_react48.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[14px] text-black tracking-tight mb-2" }, "Select Timeframe"), /* @__PURE__ */ import_react48.default.createElement("p", { className: "text-[11px] text-neutral-500" }, "Choose the range of transactions to display.")), /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, [
|
|
2708
2780
|
{ value: "ALL", label: "All Time" },
|
|
2709
2781
|
{ value: "24H", label: "Past 24 Hours" },
|
|
2710
2782
|
{ value: "7D", label: "Past 7 Days" },
|
|
2711
2783
|
{ value: "30D", label: "Past 30 Days" }
|
|
2712
|
-
].map((option) => /* @__PURE__ */
|
|
2784
|
+
].map((option) => /* @__PURE__ */ import_react48.default.createElement(
|
|
2713
2785
|
"button",
|
|
2714
2786
|
{
|
|
2715
2787
|
key: option.value,
|
|
@@ -2720,9 +2792,9 @@ var UniversalBillingPage = ({
|
|
|
2720
2792
|
},
|
|
2721
2793
|
className: `text-left px-4 py-3 text-[11px] 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"}`
|
|
2722
2794
|
},
|
|
2723
|
-
/* @__PURE__ */
|
|
2724
|
-
timeframe === option.value && /* @__PURE__ */
|
|
2725
|
-
))), /* @__PURE__ */
|
|
2795
|
+
/* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, option.label),
|
|
2796
|
+
timeframe === option.value && /* @__PURE__ */ import_react48.default.createElement("div", null)
|
|
2797
|
+
))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react48.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_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: () => !isUpdating && setIsActionModalOpen(false) }), /* @__PURE__ */ import_react48.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_react48.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react48.default.createElement("h3", { className: "text-[14px] text-black tracking-tight mb-2" }, "Update Invoice Status"), /* @__PURE__ */ import_react48.default.createElement(
|
|
2726
2798
|
TextInput,
|
|
2727
2799
|
{
|
|
2728
2800
|
placeholder: "Enter 2FA Code...",
|
|
@@ -2730,7 +2802,7 @@ var UniversalBillingPage = ({
|
|
|
2730
2802
|
onChange: setTwoFactorCode,
|
|
2731
2803
|
type: "password"
|
|
2732
2804
|
}
|
|
2733
|
-
)), /* @__PURE__ */
|
|
2805
|
+
)), /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2" }, ["DRAFT", "ISSUED", "PAID", "VOIDED", "OVERDUE"].map((statusOption) => /* @__PURE__ */ import_react48.default.createElement(
|
|
2734
2806
|
"button",
|
|
2735
2807
|
{
|
|
2736
2808
|
key: statusOption,
|
|
@@ -2738,16 +2810,16 @@ var UniversalBillingPage = ({
|
|
|
2738
2810
|
disabled: isUpdating || !twoFactorCode,
|
|
2739
2811
|
className: `text-left px-4 py-3 text-[11px] 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"}`
|
|
2740
2812
|
},
|
|
2741
|
-
/* @__PURE__ */
|
|
2742
|
-
selectedInvoice?.status === statusOption && /* @__PURE__ */
|
|
2743
|
-
))), /* @__PURE__ */
|
|
2813
|
+
/* @__PURE__ */ import_react48.default.createElement("span", { className: "truncate pr-2" }, statusOption),
|
|
2814
|
+
selectedInvoice?.status === statusOption && /* @__PURE__ */ import_react48.default.createElement("div", null)
|
|
2815
|
+
))), /* @__PURE__ */ import_react48.default.createElement("div", { className: "w-full flex mt-2" }, /* @__PURE__ */ import_react48.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")))));
|
|
2744
2816
|
};
|
|
2745
2817
|
|
|
2746
2818
|
// src/components/UniversalCheckoutView.tsx
|
|
2747
|
-
var
|
|
2748
|
-
var
|
|
2749
|
-
var
|
|
2750
|
-
var PageSpinner4 = () => /* @__PURE__ */
|
|
2819
|
+
var import_react50 = __toESM(require("react"));
|
|
2820
|
+
var import_react51 = require("@hugeicons/react");
|
|
2821
|
+
var import_core_free_icons15 = require("@hugeicons/core-free-icons");
|
|
2822
|
+
var PageSpinner4 = () => /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex justify-center items-center py-20" }, /* @__PURE__ */ import_react50.default.createElement(import_react51.HugeiconsIcon, { icon: import_core_free_icons15.Loading03Icon, size: 32, className: "animate-spin text-neutral-400" }));
|
|
2751
2823
|
var formatDate2 = (dateString) => {
|
|
2752
2824
|
if (!dateString) return "N/A";
|
|
2753
2825
|
return new Date(dateString).toLocaleDateString("en-US", {
|
|
@@ -2766,8 +2838,8 @@ var UniversalCheckoutView = ({
|
|
|
2766
2838
|
onPayInvoice,
|
|
2767
2839
|
onBackClick
|
|
2768
2840
|
}) => {
|
|
2769
|
-
const [isPaying, setIsPaying] = (0,
|
|
2770
|
-
const [localStatus, setLocalStatus] = (0,
|
|
2841
|
+
const [isPaying, setIsPaying] = (0, import_react50.useState)(false);
|
|
2842
|
+
const [localStatus, setLocalStatus] = (0, import_react50.useState)(null);
|
|
2771
2843
|
const handlePayment = async () => {
|
|
2772
2844
|
if (!invoice || isReadOnly || isPaying) return;
|
|
2773
2845
|
setIsPaying(true);
|
|
@@ -2781,7 +2853,7 @@ var UniversalCheckoutView = ({
|
|
|
2781
2853
|
}
|
|
2782
2854
|
};
|
|
2783
2855
|
const displayStatus = localStatus || invoice?.status;
|
|
2784
|
-
return /* @__PURE__ */
|
|
2856
|
+
return /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex max-w-5xl rounded-2xl bg-white p-6 sm:p-8 flex-col gap-6 animate-in fade-in duration-300 mx-auto w-full border border-neutral-100" }, /* @__PURE__ */ import_react50.default.createElement(ManagedToaster, null), isLoading ? /* @__PURE__ */ import_react50.default.createElement(PageSpinner4, null) : !invoice ? /* @__PURE__ */ import_react50.default.createElement("div", { className: "py-12 text-center text-sm text-neutral-500" }, "Invoice not found or could not be loaded.") : /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-col gap-8 w-full animate-in fade-in duration-300" }, /* @__PURE__ */ import_react50.default.createElement("div", null, /* @__PURE__ */ import_react50.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Checkout Summary"), /* @__PURE__ */ import_react50.default.createElement("h2", { className: "text-lg text-black mb-1" }, invoice.name), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-xs text-neutral-500" }, "Generated on ", formatDate2(invoice.createdAt))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react50.default.createElement("div", null, /* @__PURE__ */ import_react50.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Amount Due"), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-xl text-black" }, formatUsd2(invoice.amountDue))), /* @__PURE__ */ import_react50.default.createElement("div", null, /* @__PURE__ */ import_react50.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Status"), /* @__PURE__ */ import_react50.default.createElement("span", { className: `text-[11px] tracking-widest px-3 py-1 mt-1 inline-block rounded-full ${displayStatus === "PAID" ? "bg-emerald-100 text-emerald-700" : "bg-neutral-100 text-neutral-700"}` }, displayStatus)), /* @__PURE__ */ import_react50.default.createElement("div", { className: "md:col-span-2 pt-4 border-t border-neutral-200/60 mt-2" }, /* @__PURE__ */ import_react50.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 block mb-1 " }, "Reference ID"), /* @__PURE__ */ import_react50.default.createElement("p", { className: "text-xs text-neutral-500 inline-block" }, invoice.invoiceNumber))), /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-end gap-4 pt-4" }, (displayStatus === "ISSUED" || displayStatus === "OVERDUE") && /* @__PURE__ */ import_react50.default.createElement("div", { className: "flex flex-col items-end gap-2 w-full sm:w-auto" }, /* @__PURE__ */ import_react50.default.createElement(
|
|
2785
2857
|
ThreeDActionButton,
|
|
2786
2858
|
{
|
|
2787
2859
|
onClick: handlePayment,
|
|
@@ -2790,13 +2862,13 @@ var UniversalCheckoutView = ({
|
|
|
2790
2862
|
className: "w-full sm:w-auto"
|
|
2791
2863
|
},
|
|
2792
2864
|
"Pay Invoice"
|
|
2793
|
-
)), displayStatus === "PAID" && /* @__PURE__ */
|
|
2865
|
+
)), displayStatus === "PAID" && /* @__PURE__ */ import_react50.default.createElement("span", { className: "text-[12px] tracking-widest text-emerald-600 px-6 py-3 bg-emerald-50 rounded-full w-full sm:w-auto text-center" }, "Payment Successful"))));
|
|
2794
2866
|
};
|
|
2795
2867
|
|
|
2796
2868
|
// src/components/UniversalDashboardPage.tsx
|
|
2797
|
-
var
|
|
2798
|
-
var
|
|
2799
|
-
var
|
|
2869
|
+
var import_react52 = __toESM(require("react"));
|
|
2870
|
+
var import_react53 = require("@hugeicons/react");
|
|
2871
|
+
var import_core_free_icons16 = require("@hugeicons/core-free-icons");
|
|
2800
2872
|
var UniversalDashboardPage = ({
|
|
2801
2873
|
headerTitle,
|
|
2802
2874
|
headerDescription,
|
|
@@ -2807,20 +2879,20 @@ var UniversalDashboardPage = ({
|
|
|
2807
2879
|
lists,
|
|
2808
2880
|
isLoading = false
|
|
2809
2881
|
}) => {
|
|
2810
|
-
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0,
|
|
2882
|
+
const [isTimeframeModalOpen, setIsTimeframeModalOpen] = (0, import_react52.useState)(false);
|
|
2811
2883
|
const selectedTimeframe = timeframes.find((t) => t.id === activeTimeframe) || timeframes[0];
|
|
2812
2884
|
if (isLoading) {
|
|
2813
|
-
return /* @__PURE__ */
|
|
2885
|
+
return /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react52.default.createElement(import_react53.HugeiconsIcon, { icon: import_core_free_icons16.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
2814
2886
|
}
|
|
2815
|
-
return /* @__PURE__ */
|
|
2887
|
+
return /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react52.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4" }, /* @__PURE__ */ import_react52.default.createElement("div", null, /* @__PURE__ */ import_react52.default.createElement("h1", { className: " gradient-text text-xl mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription)), timeframes.length > 0 && selectedTimeframe && onTimeframeChange && /* @__PURE__ */ import_react52.default.createElement(
|
|
2816
2888
|
"button",
|
|
2817
2889
|
{
|
|
2818
2890
|
onClick: () => setIsTimeframeModalOpen(true),
|
|
2819
2891
|
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"
|
|
2820
2892
|
},
|
|
2821
|
-
/* @__PURE__ */
|
|
2822
|
-
/* @__PURE__ */
|
|
2823
|
-
)), stats.length > 0 && /* @__PURE__ */
|
|
2893
|
+
/* @__PURE__ */ import_react52.default.createElement("span", null, selectedTimeframe.label),
|
|
2894
|
+
/* @__PURE__ */ import_react52.default.createElement(import_react53.HugeiconsIcon, { icon: import_core_free_icons16.ArrowDown01Icon, size: 14, className: "text-neutral-400" })
|
|
2895
|
+
)), stats.length > 0 && /* @__PURE__ */ import_react52.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react52.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_react52.default.createElement("div", { key: idx, className: "p-6 flex flex-col gap-1 min-w-0" }, /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-400 truncate " }, stat.label), /* @__PURE__ */ import_react52.default.createElement("p", { className: `text-xl tracking-tight truncate ${stat.valueClass || "text-black"}` }, stat.value))))), lists.length > 0 && /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex flex-col gap-8 w-full max-w-4xl" }, lists.map((list, idx) => /* @__PURE__ */ import_react52.default.createElement("div", { key: idx, className: "bg-white rounded-2xl p-6 flex flex-col min-w-0" }, /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex items-center gap-3 mb-6" }, /* @__PURE__ */ import_react52.default.createElement("div", { className: "text-neutral-400" }, list.icon), /* @__PURE__ */ import_react52.default.createElement("h2", { className: " text-[11px] text-black tracking-[0.2em] " }, list.title)), /* @__PURE__ */ import_react52.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1 overflow-y-auto" }, list.items.length === 0 ? /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-xs text-neutral-500 py-4" }, list.emptyMessage) : list.items.map((item) => /* @__PURE__ */ import_react52.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_react52.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.primaryText), /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-[11px] text-neutral-500 truncate tracking-widest mt-0.5" }, item.secondaryText)), /* @__PURE__ */ import_react52.default.createElement("div", { className: "flex items-center gap-4 shrink-0 pl-4" }, item.rightText && /* @__PURE__ */ import_react52.default.createElement("p", { className: "text-xs text-black" }, item.rightText), item.rightBadge && /* @__PURE__ */ import_react52.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_react52.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react52.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setIsTimeframeModalOpen(false) }), /* @__PURE__ */ import_react52.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_react52.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react52.default.createElement("h3", { className: " text-[14px] text-black tracking-tight" }, "Select Timeframe")), /* @__PURE__ */ import_react52.default.createElement("div", { className: "w-full flex flex-col pl-2 pr-2 pb-2" }, timeframes.map((tf) => /* @__PURE__ */ import_react52.default.createElement(
|
|
2824
2896
|
"button",
|
|
2825
2897
|
{
|
|
2826
2898
|
key: tf.id,
|
|
@@ -2830,9 +2902,9 @@ var UniversalDashboardPage = ({
|
|
|
2830
2902
|
},
|
|
2831
2903
|
className: `text-left px-4 py-3 text-[11px] 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"}`
|
|
2832
2904
|
},
|
|
2833
|
-
/* @__PURE__ */
|
|
2834
|
-
activeTimeframe === tf.id && /* @__PURE__ */
|
|
2835
|
-
))), /* @__PURE__ */
|
|
2905
|
+
/* @__PURE__ */ import_react52.default.createElement("span", { className: "truncate pr-2" }, tf.label),
|
|
2906
|
+
activeTimeframe === tf.id && /* @__PURE__ */ import_react52.default.createElement("div", null)
|
|
2907
|
+
))), /* @__PURE__ */ import_react52.default.createElement("div", { className: "w-full flex border-t border-neutral-50" }, /* @__PURE__ */ import_react52.default.createElement(
|
|
2836
2908
|
"button",
|
|
2837
2909
|
{
|
|
2838
2910
|
onClick: () => setIsTimeframeModalOpen(false),
|
|
@@ -2843,9 +2915,9 @@ var UniversalDashboardPage = ({
|
|
|
2843
2915
|
};
|
|
2844
2916
|
|
|
2845
2917
|
// src/components/UniversalAgentConsole.tsx
|
|
2846
|
-
var
|
|
2847
|
-
var
|
|
2848
|
-
var
|
|
2918
|
+
var import_react54 = __toESM(require("react"));
|
|
2919
|
+
var import_react55 = require("@hugeicons/react");
|
|
2920
|
+
var import_core_free_icons17 = require("@hugeicons/core-free-icons");
|
|
2849
2921
|
var formatKeyName = (key) => key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase()).trim();
|
|
2850
2922
|
var toTitleCaseSafe = (str) => {
|
|
2851
2923
|
if (!str) return "";
|
|
@@ -2874,13 +2946,13 @@ var UniversalAgentConsole = ({
|
|
|
2874
2946
|
onUploadArchives,
|
|
2875
2947
|
onDeleteArchive
|
|
2876
2948
|
}) => {
|
|
2877
|
-
const archiveRef = (0,
|
|
2878
|
-
const [pendingFiles, setPendingFiles] = (0,
|
|
2879
|
-
const [isUploading, setIsUploading] = (0,
|
|
2880
|
-
const [isActioning, setIsActioning] = (0,
|
|
2881
|
-
const [actionModal, setActionModal] = (0,
|
|
2882
|
-
const [actionMessage, setActionMessage] = (0,
|
|
2883
|
-
const [archiveToDelete, setArchiveToDelete] = (0,
|
|
2949
|
+
const archiveRef = (0, import_react54.useRef)(null);
|
|
2950
|
+
const [pendingFiles, setPendingFiles] = (0, import_react54.useState)([]);
|
|
2951
|
+
const [isUploading, setIsUploading] = (0, import_react54.useState)(false);
|
|
2952
|
+
const [isActioning, setIsActioning] = (0, import_react54.useState)(false);
|
|
2953
|
+
const [actionModal, setActionModal] = (0, import_react54.useState)(null);
|
|
2954
|
+
const [actionMessage, setActionMessage] = (0, import_react54.useState)("");
|
|
2955
|
+
const [archiveToDelete, setArchiveToDelete] = (0, import_react54.useState)(null);
|
|
2884
2956
|
const handleFileSelect = (e) => {
|
|
2885
2957
|
if (e.target.files && e.target.files.length > 0) {
|
|
2886
2958
|
setPendingFiles((prev) => [...prev, ...Array.from(e.target.files)]);
|
|
@@ -2906,36 +2978,36 @@ var UniversalAgentConsole = ({
|
|
|
2906
2978
|
}
|
|
2907
2979
|
};
|
|
2908
2980
|
const DynamicArrayAccordion = ({ items, parentKey }) => {
|
|
2909
|
-
const [activeFAQ, setActiveFAQ] = (0,
|
|
2910
|
-
return /* @__PURE__ */
|
|
2981
|
+
const [activeFAQ, setActiveFAQ] = (0, import_react54.useState)(null);
|
|
2982
|
+
return /* @__PURE__ */ import_react54.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) => {
|
|
2911
2983
|
const isOpen = activeFAQ === index;
|
|
2912
2984
|
let label = `${parentKey ? formatKeyName(parentKey) : "Item"} ${index + 1}`;
|
|
2913
2985
|
if (item.fullName) label = toTitleCaseSafe(item.fullName);
|
|
2914
2986
|
else if (item.role) label = item.role;
|
|
2915
2987
|
else if (item.proposedName) label = toTitleCaseSafe(item.proposedName);
|
|
2916
|
-
return /* @__PURE__ */
|
|
2988
|
+
return /* @__PURE__ */ import_react54.default.createElement("div", { key: index, className: `transition-all duration-300 ${index !== items.length - 1 ? "border-b border-neutral-100" : ""}` }, /* @__PURE__ */ import_react54.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_react54.default.createElement("span", { className: `text-[13px] md:text-[14px] transition-colors ${isOpen ? "text-black" : "text-neutral-700 group-hover:text-black"}` }, label), /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.ArrowDown01Icon, size: 16 }))), /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "overflow-hidden" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "pt-2 flex flex-col gap-3 pr-4 md:pr-12" }, renderDynamicObject(item)))));
|
|
2917
2989
|
}));
|
|
2918
2990
|
};
|
|
2919
2991
|
const renderValue = (key, value) => {
|
|
2920
2992
|
if (value === null || value === void 0 || value === "") return null;
|
|
2921
2993
|
if (typeof value === "string") {
|
|
2922
|
-
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */
|
|
2923
|
-
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */
|
|
2924
|
-
return /* @__PURE__ */
|
|
2994
|
+
if (value.startsWith("http") || value.startsWith("data:image")) return /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Download01Icon, size: 14 }), " Download File");
|
|
2995
|
+
if (key.toLowerCase().includes("name") && !value.includes("@")) return /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-[11px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(value));
|
|
2996
|
+
return /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-[11px] md:text-[13px] leading-[1.8] text-neutral-600" }, value);
|
|
2925
2997
|
}
|
|
2926
2998
|
if (Array.isArray(value)) {
|
|
2927
2999
|
const validItems = value.filter((item) => item !== null && item !== void 0 && item !== "");
|
|
2928
3000
|
if (validItems.length === 0) return null;
|
|
2929
|
-
if (typeof validItems[0] === "string") return /* @__PURE__ */
|
|
2930
|
-
return /* @__PURE__ */
|
|
3001
|
+
if (typeof validItems[0] === "string") return /* @__PURE__ */ import_react54.default.createElement("ul", { className: "list-disc pl-4 mt-1" }, validItems.map((v, i) => /* @__PURE__ */ import_react54.default.createElement("li", { key: i, className: "text-[11px] md:text-[13px] leading-[1.8] text-neutral-600" }, toTitleCaseSafe(v))));
|
|
3002
|
+
return /* @__PURE__ */ import_react54.default.createElement(DynamicArrayAccordion, { items: validItems, parentKey: key });
|
|
2931
3003
|
}
|
|
2932
3004
|
if (typeof value === "object") {
|
|
2933
3005
|
if (Object.keys(value).length === 0) return null;
|
|
2934
3006
|
const renderedObj = renderDynamicObject(value);
|
|
2935
3007
|
if (!renderedObj || Array.isArray(renderedObj) && renderedObj.length === 0) return null;
|
|
2936
|
-
return /* @__PURE__ */
|
|
3008
|
+
return /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-3 mt-1 w-full border-l border-neutral-100 pl-4 py-2" }, renderedObj);
|
|
2937
3009
|
}
|
|
2938
|
-
return /* @__PURE__ */
|
|
3010
|
+
return /* @__PURE__ */ import_react54.default.createElement("span", { className: "text-sm text-black" }, String(value));
|
|
2939
3011
|
};
|
|
2940
3012
|
const renderDynamicObject = (obj) => {
|
|
2941
3013
|
if (!obj) return null;
|
|
@@ -2946,22 +3018,22 @@ var UniversalAgentConsole = ({
|
|
|
2946
3018
|
return true;
|
|
2947
3019
|
});
|
|
2948
3020
|
if (entries.length === 0) return null;
|
|
2949
|
-
return entries.map(([k, v]) => /* @__PURE__ */
|
|
3021
|
+
return entries.map(([k, v]) => /* @__PURE__ */ import_react54.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_react54.default.createElement("span", { className: "text-[11px] tracking-[0.2em] text-neutral-400 mb-1 " }, formatKeyName(k)), renderValue(k, v)));
|
|
2950
3022
|
};
|
|
2951
|
-
return /* @__PURE__ */
|
|
3023
|
+
return /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react54.default.createElement(ManagedToaster, null), currentView === "list" && /* @__PURE__ */ import_react54.default.createElement(import_react54.default.Fragment, null, /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col items-start gap-1" }, /* @__PURE__ */ import_react54.default.createElement("h1", { className: " text-xl text-black tracking-tight" }, headerTitle), /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-sm text-neutral-500" }, headerDescription)), stats.length > 0 && /* @__PURE__ */ import_react54.default.createElement("div", { className: "w-full rounded-2xl max-w-5xl overflow-hidden bg-white" }, /* @__PURE__ */ import_react54.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_react54.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_react54.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_react54.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-400 mb-1 truncate " }, stat.label), /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-xl text-black tracking-tight truncate" }, stat.value)))))), tabs.length > 0 && /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center gap-6" }, tabs.map((tab) => /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "w-full bg-white rounded-2xl max-w-5xl overflow-hidden flex flex-col min-h-100" }, isLoadingList ? /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Loading03Icon, size: 32, className: "animate-spin text-black" })) : listData.length === 0 ? /* @__PURE__ */ import_react54.default.createElement(import_react54.default.Fragment, null, /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex-1 flex justify-center items-center text-neutral-500 text-sm py-20" }, "No matching applications found.")) : /* @__PURE__ */ import_react54.default.createElement(import_react54.default.Fragment, null, /* @__PURE__ */ import_react54.default.createElement("div", { className: "divide-y divide-neutral-100 flex-1" }, listData.map((item) => /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-sm text-black truncate pr-4" }, item.title), /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-xs text-neutral-500 truncate mt-1" }, item.subtitle)), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col items-end gap-1 shrink-0 pl-4" }, /* @__PURE__ */ import_react54.default.createElement("span", { className: `text-[11px] tracking-widest px-3 py-1 rounded-full ${item.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, item.status.replace(/_/g, " ")), /* @__PURE__ */ import_react54.default.createElement("span", { className: "text-[11px] text-neutral-400 mt-1" }, item.date))))), totalPages > 1 && /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center justify-between p-5 bg-neutral-50/50" }, /* @__PURE__ */ import_react54.default.createElement("span", { className: "text-[11px] text-neutral-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.ArrowRight01Icon, size: 14 }))))))), currentView === "details" && selectedApp && /* @__PURE__ */ import_react54.default.createElement("div", { className: "w-full bg-white rounded-2xl p-6 sm:p-10 animate-in fade-in duration-300 max-w-5xl flex flex-col" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center justify-between gap-4 pb-6" }, /* @__PURE__ */ import_react54.default.createElement("button", { onClick: () => {
|
|
2952
3024
|
onBackToList();
|
|
2953
3025
|
setPendingFiles([]);
|
|
2954
|
-
}, className: "flex items-center gap-2 text-[11px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none " }, /* @__PURE__ */
|
|
3026
|
+
}, className: "flex items-center gap-2 text-[11px] text-neutral-400 hover:text-black tracking-widest transition-colors outline-none " }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.ArrowLeft01Icon, size: 14 }), " Back to List"), /* @__PURE__ */ import_react54.default.createElement("span", { className: `text-[11px] tracking-widest px-4 py-1.5 rounded-full ${selectedApp.status === "COMPLETED" ? "bg-emerald-50 text-emerald-600" : "bg-neutral-50 text-neutral-600"}` }, selectedApp.status.replace(/_/g, " "))), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-2 mb-8" }, /* @__PURE__ */ import_react54.default.createElement("h2", { className: " text-xl text-black tracking-tight" }, selectedApp.name || selectedApp.title), /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "flex flex-col gap-5" }, renderDynamicObject(selectedApp.metadata)) : selectedApp.agentId === currentAgentId ? /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-5" }, /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-sm text-neutral-500" }, "No application data extracted.")) : null, selectedApp.agentId && /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-4 pt-8 mt-4 border-t border-neutral-100" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col gap-1 mb-4" }, /* @__PURE__ */ import_react54.default.createElement("h3", { className: " text-sm text-black" }, "Official Archives"), /* @__PURE__ */ import_react54.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_react54.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_react54.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.File02Icon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react54.default.createElement("span", { className: "truncate pr-2" }, arch.name)), /* @__PURE__ */ import_react54.default.createElement("button", { onClick: () => setArchiveToDelete(arch), className: "text-emerald-700 hover:text-red-500 transition-colors p-1 outline-none shrink-0" }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Delete02Icon, size: 16 })))), pendingFiles.map((file, idx) => /* @__PURE__ */ import_react54.default.createElement("div", { key: idx, className: "flex items-center justify-between text-neutral-600 text-sm w-full" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center gap-3 min-w-0" }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.AttachmentIcon, size: 18, className: "shrink-0" }), /* @__PURE__ */ import_react54.default.createElement("span", { className: "truncate pr-2" }, file.name)), /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Cancel01Icon, size: 16 })))), /* @__PURE__ */ import_react54.default.createElement("input", { type: "file", multiple: true, ref: archiveRef, onChange: handleFileSelect, className: "hidden", accept: "application/pdf,image/*" }), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full" }, /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Upload01Icon, size: 18, className: "text-neutral-400" }), " Select Files to Upload"), pendingFiles.length > 0 && /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col sm:flex-row items-center gap-3 w-full sm:w-auto shrink-0" }, /* @__PURE__ */ import_react54.default.createElement("button", { onClick: () => setPendingFiles([]), disabled: isUploading, className: "px-6 py-2 text-neutral-600 text-[11px] tracking-widest rounded-full hover:bg-neutral-100 outline-none w-full sm:w-auto " }, "Clear All"), /* @__PURE__ */ import_react54.default.createElement(ThreeDActionButton, { onClick: executeUpload, disabled: isUploading, isLoading: isUploading, className: "w-full sm:w-auto" }, "Upload ", pendingFiles.length, " File(s)")))), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-between gap-4 mt-8 pt-6" }, !selectedApp.agentId ? /* @__PURE__ */ import_react54.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2955
3027
|
setIsActioning(true);
|
|
2956
3028
|
await onAcceptApplication(selectedApp.id);
|
|
2957
3029
|
setIsActioning(false);
|
|
2958
|
-
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */
|
|
3030
|
+
}, disabled: isActioning, isLoading: isActioning, className: "w-full sm:w-auto" }, "Accept Application") : selectedApp.agentId !== currentAgentId ? /* @__PURE__ */ import_react54.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_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Cancel01Icon, size: 16, className: "text-red-500 shrink-0 mt-0.5" }), /* @__PURE__ */ import_react54.default.createElement("div", null, /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-sm text-red-700" }, "Application Taken"), /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-xs text-red-600 mt-1" }, "Currently handled by ", selectedApp.agentName || "another agent", "."))) : /* @__PURE__ */ import_react54.default.createElement("div", { className: "w-full flex flex-col sm:flex-row items-center gap-4 justify-between" }, /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-xs text-neutral-500" }, "You are the assigned agent."), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex flex-col sm:flex-row items-center justify-end gap-3 w-full sm:w-auto" }, /* @__PURE__ */ import_react54.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 " }, "Query"), /* @__PURE__ */ import_react54.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 " }, "Reject"), /* @__PURE__ */ import_react54.default.createElement(ThreeDActionButton, { onClick: () => setActionModal("success"), disabled: selectedApp.status === "COMPLETED", className: "w-full sm:w-auto" }, "Mark Success"))))), actionModal && /* @__PURE__ */ import_react54.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setActionModal(null) }), /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react54.default.createElement("h3", { className: " text-lg text-black tracking-tight capitalize mb-2" }, actionModal === "success" ? "Complete Application" : `${actionModal} Application`), /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "p-6 pb-2" }, /* @__PURE__ */ import_react54.default.createElement(TextInput, { label: "Reason for Action", value: actionMessage, onChange: setActionMessage, placeholder: "Enter your reason here...", disabled: isActioning })), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center p-6 pt-4 gap-3" }, /* @__PURE__ */ import_react54.default.createElement("button", { onClick: () => setActionModal(null), disabled: isActioning, className: "flex-1 py-3 text-[11px] tracking-widest text-neutral-600 rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react54.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2959
3031
|
setIsActioning(true);
|
|
2960
3032
|
await onUpdateStatus(selectedApp.id, actionModal === "success" ? "COMPLETED" : actionModal === "reject" ? "REJECTED" : "QUEUED", actionMessage);
|
|
2961
3033
|
setIsActioning(false);
|
|
2962
3034
|
setActionModal(null);
|
|
2963
3035
|
setActionMessage("");
|
|
2964
|
-
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */
|
|
3036
|
+
}, disabled: isActioning || (actionModal === "query" || actionModal === "reject") && actionMessage.trim().length < 5, isLoading: isActioning, className: "flex-1" }, "Confirm ", actionModal)))), archiveToDelete && /* @__PURE__ */ import_react54.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react54.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isActioning && setArchiveToDelete(null) }), /* @__PURE__ */ import_react54.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_react54.default.createElement("div", { className: "p-6" }, /* @__PURE__ */ import_react54.default.createElement("h3", { className: " text-lg text-black tracking-tight mb-2" }, "Delete Document?"), /* @__PURE__ */ import_react54.default.createElement("p", { className: "text-xs text-neutral-500" }, 'Are you sure you want to permanently delete "', archiveToDelete.name, '"?')), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex items-center p-6 gap-3" }, /* @__PURE__ */ import_react54.default.createElement("button", { onClick: () => setArchiveToDelete(null), disabled: isActioning, className: "flex-1 py-3 text-[11px] tracking-widest text-neutral-600 rounded-full hover:bg-neutral-50 transition-colors outline-none disabled:opacity-50" }, "Cancel"), /* @__PURE__ */ import_react54.default.createElement(ThreeDActionButton, { onClick: async () => {
|
|
2965
3037
|
setIsActioning(true);
|
|
2966
3038
|
await onDeleteArchive(selectedApp.id, archiveToDelete.id);
|
|
2967
3039
|
setIsActioning(false);
|
|
@@ -2971,66 +3043,6 @@ var UniversalAgentConsole = ({
|
|
|
2971
3043
|
|
|
2972
3044
|
// src/components/UniversalOverviewPage.tsx
|
|
2973
3045
|
var import_react56 = __toESM(require("react"));
|
|
2974
|
-
|
|
2975
|
-
// src/components/Banner.tsx
|
|
2976
|
-
var import_react54 = __toESM(require("react"));
|
|
2977
|
-
var import_react55 = require("@hugeicons/react");
|
|
2978
|
-
var import_core_free_icons17 = require("@hugeicons/core-free-icons");
|
|
2979
|
-
var Banner = ({
|
|
2980
|
-
title,
|
|
2981
|
-
message,
|
|
2982
|
-
type,
|
|
2983
|
-
icon,
|
|
2984
|
-
isDismissible = true,
|
|
2985
|
-
onDismiss,
|
|
2986
|
-
action
|
|
2987
|
-
}) => {
|
|
2988
|
-
const [isVisible, setIsVisible] = (0, import_react54.useState)(true);
|
|
2989
|
-
if (!isVisible) return null;
|
|
2990
|
-
const handleDismiss = () => {
|
|
2991
|
-
setIsVisible(false);
|
|
2992
|
-
if (onDismiss) onDismiss();
|
|
2993
|
-
};
|
|
2994
|
-
const config = {
|
|
2995
|
-
success: {
|
|
2996
|
-
bg: "bg-emerald-50",
|
|
2997
|
-
iconColor: "text-emerald-600",
|
|
2998
|
-
titleColor: "text-emerald-900",
|
|
2999
|
-
msgColor: "text-emerald-700",
|
|
3000
|
-
defaultIcon: import_core_free_icons17.CheckmarkBadge01Icon,
|
|
3001
|
-
closeHover: "hover:bg-emerald-100 text-emerald-500"
|
|
3002
|
-
},
|
|
3003
|
-
warning: {
|
|
3004
|
-
bg: "bg-amber-50",
|
|
3005
|
-
iconColor: "text-amber-600",
|
|
3006
|
-
titleColor: "text-amber-900",
|
|
3007
|
-
msgColor: "text-amber-700",
|
|
3008
|
-
defaultIcon: import_core_free_icons17.InformationCircleIcon,
|
|
3009
|
-
closeHover: "hover:bg-amber-100 text-amber-500"
|
|
3010
|
-
},
|
|
3011
|
-
alert: {
|
|
3012
|
-
bg: "bg-red-50",
|
|
3013
|
-
iconColor: "text-red-600",
|
|
3014
|
-
titleColor: "text-red-900",
|
|
3015
|
-
msgColor: "text-red-700",
|
|
3016
|
-
defaultIcon: import_core_free_icons17.Alert02Icon,
|
|
3017
|
-
closeHover: "hover:bg-red-100 text-red-500"
|
|
3018
|
-
}
|
|
3019
|
-
};
|
|
3020
|
-
const currentConfig = config[type];
|
|
3021
|
-
const IconToUse = icon || currentConfig.defaultIcon;
|
|
3022
|
-
return /* @__PURE__ */ import_react54.default.createElement("div", { className: `relative w-full rounded-2xl p-4 flex items-start gap-4 transition-all duration-300 animate-in fade-in slide-in-from-top-2 ${currentConfig.bg}` }, /* @__PURE__ */ import_react54.default.createElement("div", { className: `shrink-0 mt-0.5 ${currentConfig.iconColor}` }, /* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: IconToUse, size: 20 })), /* @__PURE__ */ import_react54.default.createElement("div", { className: "flex-1 flex flex-col min-w-0 pr-6" }, /* @__PURE__ */ import_react54.default.createElement("h4", { className: `text-sm tracking-tight mb-1 ${currentConfig.titleColor}` }, title), /* @__PURE__ */ import_react54.default.createElement("p", { className: `text-xs leading-relaxed ${currentConfig.msgColor}` }, message), action && /* @__PURE__ */ import_react54.default.createElement("div", { className: "mt-3" }, action)), isDismissible && /* @__PURE__ */ import_react54.default.createElement(
|
|
3023
|
-
"button",
|
|
3024
|
-
{
|
|
3025
|
-
onClick: handleDismiss,
|
|
3026
|
-
className: `absolute top-3 right-3 p-1.5 rounded-full transition-colors outline-none shrink-0 ${currentConfig.closeHover}`,
|
|
3027
|
-
"aria-label": "Dismiss banner"
|
|
3028
|
-
},
|
|
3029
|
-
/* @__PURE__ */ import_react54.default.createElement(import_react55.HugeiconsIcon, { icon: import_core_free_icons17.Cancel01Icon, size: 16 })
|
|
3030
|
-
));
|
|
3031
|
-
};
|
|
3032
|
-
|
|
3033
|
-
// src/components/UniversalOverviewPage.tsx
|
|
3034
3046
|
var UniversalOverviewPage = ({
|
|
3035
3047
|
headerTitle,
|
|
3036
3048
|
headerDescription,
|
|
@@ -3041,7 +3053,7 @@ var UniversalOverviewPage = ({
|
|
|
3041
3053
|
alerts = [],
|
|
3042
3054
|
banner
|
|
3043
3055
|
}) => {
|
|
3044
|
-
return /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react56.default.createElement("div", null, /* @__PURE__ */ import_react56.default.createElement("h1", { className: "
|
|
3056
|
+
return /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in duration-300 pb-10" }, /* @__PURE__ */ import_react56.default.createElement("div", { className: "flex items-center justify-between gap-4" }, /* @__PURE__ */ import_react56.default.createElement("div", null, /* @__PURE__ */ import_react56.default.createElement("h1", { className: " gradient-text text-xl mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-xs text-neutral-500" }, headerDescription))), quickStats.length > 0 && /* @__PURE__ */ import_react56.default.createElement("div", { className: "w-full rounded-2xl overflow-hidden max-w-5xl bg-white" }, /* @__PURE__ */ import_react56.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_react56.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_react56.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_react56.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-[11px] tracking-[0.2em] text-neutral-400 mb-1 truncate " }, stat.label), /* @__PURE__ */ import_react56.default.createElement("p", { className: "text-lg md:text-xl text-black tracking-tight truncate" }, stat.value)))))), banner && banner.isVisible && /* @__PURE__ */ import_react56.default.createElement("div", { className: "w-full max-w-5xl" }, /* @__PURE__ */ import_react56.default.createElement(
|
|
3045
3057
|
Banner,
|
|
3046
3058
|
{
|
|
3047
3059
|
title: banner.title,
|
|
@@ -3162,7 +3174,7 @@ var UniversalLookupPage = ({
|
|
|
3162
3174
|
}) => {
|
|
3163
3175
|
const [isTypeModalOpen, setIsTypeModalOpen] = (0, import_react59.useState)(false);
|
|
3164
3176
|
const currentOptionLabel = searchOptions.find((opt) => opt.value === selectedSearchType)?.label || "Select Type";
|
|
3165
|
-
return /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 pb-20" }, /* @__PURE__ */ import_react59.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react59.default.createElement("h1", { className: " text
|
|
3177
|
+
return /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 pb-20" }, /* @__PURE__ */ import_react59.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react59.default.createElement("h1", { className: " gradient-text text-xl mb-1 truncate tracking-tight" }, headerTitle), /* @__PURE__ */ import_react59.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, headerDescription))), /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-full max-w-5xl pb-8" }, /* @__PURE__ */ import_react59.default.createElement("form", { className: "flex flex-col gap-6", onSubmit: onSearch, autoComplete: "off" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex gap-4" }, /* @__PURE__ */ import_react59.default.createElement(
|
|
3166
3178
|
"button",
|
|
3167
3179
|
{
|
|
3168
3180
|
type: "button",
|
|
@@ -3594,13 +3606,13 @@ var import_core_free_icons25 = require("@hugeicons/core-free-icons");
|
|
|
3594
3606
|
var AiApproveDecline = ({ suggestionTitle, suggestionValue, onApprove, onDecline, onEdit }) => {
|
|
3595
3607
|
const [isEditing, setIsEditing] = (0, import_react72.useState)(false);
|
|
3596
3608
|
const [editVal, setEditVal] = (0, import_react72.useState)(typeof suggestionValue === "string" ? suggestionValue : "");
|
|
3597
|
-
return /* @__PURE__ */ import_react72.default.createElement("div", { className: "border border-
|
|
3609
|
+
return /* @__PURE__ */ import_react72.default.createElement("div", { className: "border border-orange-100 bg-linear-to-bl from-orange-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react72.default.createElement("div", null, /* @__PURE__ */ import_react72.default.createElement("span", { className: "text-[11px] tracking-widest text-orange-600 block mb-1 " }, "AI Suggestion: ", suggestionTitle), !isEditing ? /* @__PURE__ */ import_react72.default.createElement("div", { className: "text-sm text-black" }, suggestionValue) : /* @__PURE__ */ import_react72.default.createElement(
|
|
3598
3610
|
"input",
|
|
3599
3611
|
{
|
|
3600
3612
|
type: "text",
|
|
3601
3613
|
value: editVal,
|
|
3602
3614
|
onChange: (e) => setEditVal(e.target.value),
|
|
3603
|
-
className: "w-full text-sm p-2 border-b border-
|
|
3615
|
+
className: "w-full text-sm p-2 border-b border-orange-200 bg-transparent outline-none focus:border-orange-400 transition-colors",
|
|
3604
3616
|
autoFocus: true
|
|
3605
3617
|
}
|
|
3606
3618
|
)), /* @__PURE__ */ import_react72.default.createElement("div", { className: "flex items-center gap-1 mt-2" }, !isEditing ? /* @__PURE__ */ import_react72.default.createElement(import_react72.default.Fragment, null, /* @__PURE__ */ import_react72.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_react72.default.createElement(import_react73.HugeiconsIcon, { icon: import_core_free_icons25.CheckmarkCircle01Icon, size: 28 })), /* @__PURE__ */ import_react72.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_react72.default.createElement(import_react73.HugeiconsIcon, { icon: import_core_free_icons25.CancelCircleIcon, size: 28 })), onEdit && /* @__PURE__ */ import_react72.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_react72.default.createElement(import_react73.HugeiconsIcon, { icon: import_core_free_icons25.PencilEdit01Icon, size: 18 }))) : /* @__PURE__ */ import_react72.default.createElement(import_react72.default.Fragment, null, /* @__PURE__ */ import_react72.default.createElement("button", { onClick: () => {
|
|
@@ -3614,7 +3626,7 @@ var import_react74 = __toESM(require("react"));
|
|
|
3614
3626
|
var import_react75 = require("@hugeicons/react");
|
|
3615
3627
|
var import_core_free_icons26 = require("@hugeicons/core-free-icons");
|
|
3616
3628
|
var AiStageCheck = ({ tasks }) => {
|
|
3617
|
-
return /* @__PURE__ */ import_react74.default.createElement("div", { className: "flex flex-col gap-3 p-5 rounded-2xl border border-
|
|
3629
|
+
return /* @__PURE__ */ import_react74.default.createElement("div", { className: "flex flex-col gap-3 p-5 rounded-2xl border border-orange-100 bg-linear-to-bl from-orange-50/80 via-white to-white relative overflow-hidden" }, /* @__PURE__ */ import_react74.default.createElement("span", { className: "text-[11px] tracking-widest text-orange-600 mb-1 " }, "AI Processing"), tasks.map((task) => /* @__PURE__ */ import_react74.default.createElement("div", { key: task.id, className: "flex items-center gap-3" }, task.status === "pending" && /* @__PURE__ */ import_react74.default.createElement("div", { className: "w-4 h-4 rounded-full border border-orange-200" }), task.status === "loading" && /* @__PURE__ */ import_react74.default.createElement(import_react75.HugeiconsIcon, { icon: import_core_free_icons26.Loading03Icon, size: 16, className: "animate-spin text-orange-500" }), task.status === "success" && /* @__PURE__ */ import_react74.default.createElement(import_react75.HugeiconsIcon, { icon: import_core_free_icons26.CheckmarkCircle02Icon, size: 16, className: "text-emerald-500" }), task.status === "error" && /* @__PURE__ */ import_react74.default.createElement(import_react75.HugeiconsIcon, { icon: import_core_free_icons26.CancelCircleIcon, size: 16, className: "text-red-500" }), /* @__PURE__ */ import_react74.default.createElement("span", { className: `text-xs transition-colors ${task.status === "success" ? "text-black" : task.status === "loading" ? "text-orange-700" : "text-neutral-500"}` }, task.label))));
|
|
3618
3630
|
};
|
|
3619
3631
|
|
|
3620
3632
|
// src/components/Stagger.tsx
|
|
@@ -4227,7 +4239,7 @@ var UniversalRegistrationFlow = ({
|
|
|
4227
4239
|
const newForm = { ...formData, natureOfBusiness: suggestedNature };
|
|
4228
4240
|
setFormData(newForm);
|
|
4229
4241
|
approveSection("natureApproved", newForm);
|
|
4230
|
-
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "pr-4" }, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), formState.natureApproved && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "What name would you like to register?")), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide two options. We will verify availability against the official registry."), !formState.nameApproved ? /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Proposed Name 1 (Preferred)", value: formData.proposedName, onChange: (v) => setFormData({ ...formData, proposedName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Proposed Name 2 (Alternative)", value: formData.proposedName2, onChange: (v) => setFormData({ ...formData, proposedName2: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "border border-
|
|
4242
|
+
}, onDecline: () => setSuggestedNature(null) }))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "pr-4" }, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.natureOfBusiness?.specificLabel), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 mt-1" }, formData.businessDesc)), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("natureApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), formState.natureApproved && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "What name would you like to register?")), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide two options. We will verify availability against the official registry."), !formState.nameApproved ? /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Proposed Name 1 (Preferred)", value: formData.proposedName, onChange: (v) => setFormData({ ...formData, proposedName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Proposed Name 2 (Alternative)", value: formData.proposedName2, onChange: (v) => setFormData({ ...formData, proposedName2: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "mt-2 animate-in fade-in" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "border border-orange-100 bg-linear-to-bl from-orange-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-orange-600 block mb-1" }, "AI Suggestion: Structural Qualifier Missing"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black mb-3" }, "Nigerian registrations require a structural qualifier to be approved."), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-2" }, (qualifierCheckResult.suggestions || []).map((alt, i) => /* @__PURE__ */ import_react78.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_react78.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_react78.default.createElement("div", { className: " mt-2 animate-in fade-in" }, nameCheckResult.status === "APPROVED" || nameCheckResult.status === "APPROVED_WARNING" || nameCheckResult.status === "SKIPPED" ? /* @__PURE__ */ import_react78.default.createElement(AiApproveDecline, { suggestionTitle: nameCheckResult.status === "APPROVED" ? "Name Available!" : "Fallback Approval", suggestionValue: /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.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_react78.default.createElement("p", { className: "text-xs text-neutral-600" }, nameCheckResult.message), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-600 mt-2 " }, "Proposed Option: ", nameCheckResult.approvedOption)), onApprove: () => {
|
|
4231
4243
|
const newForm = { ...formData, approvedName: nameCheckResult.approvedOption };
|
|
4232
4244
|
setFormData(newForm);
|
|
4233
4245
|
approveSection("nameApproved", newForm);
|
|
@@ -4235,7 +4247,7 @@ var UniversalRegistrationFlow = ({
|
|
|
4235
4247
|
}, disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("addressApproved"), disabled: !formData.address || !formData.city || !formData.state || isReadOnly, className: "w-fit mt-2" }, "Confirm Address")) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-neutral-500" }, formData.address, ", ", formData.city, ", ", formData.state), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("addressApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "company" && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center justify-between gap-2 text-black" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "Directors & Shareholders")), !formState.membersDetailsApproved && /* @__PURE__ */ import_react78.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_react78.default.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide details for all individuals. Ensure total share percentage equals 100%."), !formState.membersDetailsApproved ? /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-6 " }, formData.members.map((member, i) => /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex justify-between items-center mb-1" }, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-neutral-400" }, "Member ", i + 1), formData.members.length > 1 && !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => removeCompanyMember(i), className: "text-red-500 text-xs hover:text-red-600" }, "Remove")), /* @__PURE__ */ import_react78.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Role", value: member.role, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "role", memberIndex: i }), onChange: () => {
|
|
4236
4248
|
}, disabled: isReadOnly || isSubmitting }), member.role !== "Director Only" && /* @__PURE__ */ import_react78.default.createElement(NumberInput, { label: "Share Percentage (%)", value: member.sharePercentage, onChange: (v) => updateCompanyMemberInfo(i, "sharePercentage", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Full Name", value: member.fullName, onChange: (v) => updateCompanyMemberInfo(i, "fullName", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(NumberInput, { label: "Phone Number", value: member.phone, onChange: (v) => updateCompanyMemberInfo(i, "phone", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Email Address", value: member.email, onChange: (v) => updateCompanyMemberInfo(i, "email", v), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Nationality", value: member.nationality, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "nationality", memberIndex: i }), onChange: () => {
|
|
4237
4249
|
}, disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Residential Address", value: member.address, onChange: (v) => updateCompanyMemberInfo(i, "address", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "City", value: member.city, onChange: (v) => updateCompanyMemberInfo(i, "city", v), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "State", value: member.state, readOnly: true, onClick: () => !isReadOnly && setActiveModal({ isOpen: true, type: "state", memberIndex: i }), onChange: () => {
|
|
4238
|
-
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react78.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react78.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_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-purple-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react78.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_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-emerald-800" }, "Documents Uploaded"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react78.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_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-purple-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.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_react78.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_react78.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
4250
|
+
}, disabled: isReadOnly || isSubmitting })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center justify-between mt-2" }, !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDetailsApproved"), disabled: !areCompanyMembersValid() || isReadOnly, className: "w-fit" }, "Confirm Members"))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.members.length, " Member(s) Registered"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, "Total Shares: 100% Verified.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("membersDetailsApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), formState.addressApproved && type === "business" && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "Who owns the business?")), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-400 -mt-2" }, "Provide basic contact info. We will extract your DOB and ID number automatically in the next step."), !formState.ownerApproved ? /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 " }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Full Name", value: formData.ownerName, onChange: (v) => setFormData({ ...formData, ownerName: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(NumberInput, { label: "Phone Number", value: formData.ownerPhone, onChange: (v) => setFormData({ ...formData, ownerPhone: v }), disabled: isReadOnly || isSubmitting }), /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "Email Address", value: formData.ownerEmail, onChange: (v) => setFormData({ ...formData, ownerEmail: v }), disabled: isReadOnly || isSubmitting })), /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("ownerApproved"), disabled: !formData.ownerName || !formData.ownerPhone || !formData.ownerEmail || isReadOnly, className: "w-fit mt-2" }, "Confirm Owner Details")) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-black" }, formData.ownerName), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-neutral-500 mt-1" }, formData.ownerEmail, " \u2022 ", formData.ownerPhone)), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("ownerApproved"), className: "p-2 text-neutral-400 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center justify-between mt-8 pt-6 " }, /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.ArrowLeft01Icon, size: 14 }), " Close"), /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: handleNext, disabled: !isStep0Valid, className: "w-fit shrink-0" }, "Next Step"))), macroStep === 1 && /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-8 animate-in fade-in" }, type === "company" ? /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-2" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm text-black" }, "Member Identity Documents"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-6" }, formData.members.map((member, i) => /* @__PURE__ */ import_react78.default.createElement("div", { key: member.id, className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-black mb-1" }, member.fullName || `Member ${i + 1}`, " ", /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-neutral-400 ml-2" }, "(", member.role, ")")), /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Valid ID (NIN, License, Voter's Card)") : globalExtractingId && !member.idExtractedData ? /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.default.createElement(AiStageCheck, { tasks: aiTasks })) : member.idExtractedData ? /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2 animate-in fade-in border border-orange-100 bg-linear-to-bl from-orange-50/80 via-white to-white p-5 rounded-xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-orange-600 block mb-2" }, "Review Extracted ID"), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.default.createElement(TextInput, { label: "ID Number", value: member.idExtractedData.idNumber, onChange: (v) => updateCompanyMemberInfo(i, "idExtractedData", { ...member.idExtractedData, idNumber: v }), disabled: isReadOnly || isAnyUploading }), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, !isReadOnly && /* @__PURE__ */ import_react78.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_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !member.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : member.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))) : null, !member.signatureFileUrl && !globalUploadingSignature ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !member.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : member.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))) : null)), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("membersDocsApproved"), disabled: !areCompanyMemberDocsValid() || isReadOnly || isAnyUploading, className: "w-fit" }, "Confirm All Documents"))) : /* @__PURE__ */ import_react78.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-emerald-800" }, "Documents Uploaded"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("membersDocsApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))) : /* @__PURE__ */ import_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex items-center gap-2 text-black" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm " }, "Upload Means of Identification")), /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react78.default.Fragment, null, /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 24, className: "text-neutral-400" }), /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-xs" }, "Select ID Image to Upload")), globalExtractingId && /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2" }, /* @__PURE__ */ import_react78.default.createElement(AiStageCheck, { tasks: aiTasks })), formData.idExtractedData && /* @__PURE__ */ import_react78.default.createElement("div", { className: " mt-2 animate-in fade-in border border-orange-100 bg-linear-to-bl from-orange-50/80 via-white to-white p-5 rounded-2xl flex flex-col gap-4 relative overflow-hidden" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("span", { className: "text-[11px] tracking-widest text-orange-600 block mb-2" }, "Review AI Extracted Data"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "grid grid-cols-2 gap-4" }, /* @__PURE__ */ import_react78.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_react78.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_react78.default.createElement("div", { className: "flex items-center gap-2 mt-2" }, /* @__PURE__ */ import_react78.default.createElement(ThreeDActionButton, { onClick: () => approveSection("idApproved"), disabled: isAnyUploading || isReadOnly, className: "w-fit shrink-0" }, "Approve Data"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: " flex items-center justify-between bg-emerald-50 p-6 rounded-full" }, /* @__PURE__ */ import_react78.default.createElement("div", null, /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-sm text-emerald-800" }, "ID Document Verified"), /* @__PURE__ */ import_react78.default.createElement("p", { className: "text-xs text-emerald-600 mt-1" }, "Data safely extracted and stored.")), !isReadOnly && /* @__PURE__ */ import_react78.default.createElement("button", { onClick: () => editSection("idApproved"), className: "p-2 text-emerald-700 hover:text-black transition-colors outline-none shrink-0" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.PencilEdit01Icon, size: 16 })))), /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-4 pt-6 animate-in slide-in-from-top-4 duration-500" }, /* @__PURE__ */ import_react78.default.createElement("div", { className: "flex flex-col gap-3 " }, !formState.passportApproved && !globalUploadingPassport ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Passport Photo") : globalUploadingPassport && !formData.passportFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Passport...") : /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.IdentificationIcon, size: 18 }), " Passport Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 }))), !formState.signatureApproved && !globalUploadingSignature ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Upload01Icon, size: 18, className: "text-neutral-400" }), " Upload Signature") : globalUploadingSignature && !formData.signatureFileUrl ? /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Loading03Icon, size: 18, className: "animate-spin text-black" }), " Uploading Signature...") : /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.SignatureIcon, size: 18 }), " Signature Uploaded"), !isReadOnly && /* @__PURE__ */ import_react78.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_react78.default.createElement(import_react79.HugeiconsIcon, { icon: import_core_free_icons28.Delete02Icon, size: 16 })))))), /* @__PURE__ */ import_react78.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_react78.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_react78.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_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-1 mb-2" }, /* @__PURE__ */ import_react78.default.createElement("h3", { className: "text-sm text-black" }, "Additional Documents (Optional)"), /* @__PURE__ */ import_react78.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_react78.default.createElement("div", { className: "flex flex-col gap-3" }, [1, 2, 3].map((num) => {
|
|
4239
4251
|
const docType = `other${num}`;
|
|
4240
4252
|
const ref = num === 1 ? other1Ref : num === 2 ? other2Ref : other3Ref;
|
|
4241
4253
|
const isUploading = num === 1 ? isUploadingOther1 : num === 2 ? isUploadingOther2 : isUploadingOther3;
|
|
@@ -4339,7 +4351,7 @@ SECRET_KEY="${secKey}"
|
|
|
4339
4351
|
};
|
|
4340
4352
|
const hasWebhookChanges = webhookUrl !== initialWebhookUrl;
|
|
4341
4353
|
const isWebhookSaveDisabled = isSavingWebhook || isReadOnly || !hasWebhookChanges;
|
|
4342
|
-
return /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react80.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react80.default.createElement("h1", { className: " text-xl text-black mb-1 truncate tracking-tight" }, "Developer Settings"), /* @__PURE__ */ import_react80.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations.")), isReadOnly && /* @__PURE__ */ import_react80.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react80.default.createElement(import_react81.HugeiconsIcon, { icon: import_core_free_icons29.CircleLock02Icon, size: 18, className: "text-current" }))), isLoading ? /* @__PURE__ */ import_react80.default.createElement(PageSpinner6, null) : /* @__PURE__ */ import_react80.default.createElement("div", { className: "w-full max-w-5xl flex flex-col gap-12" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react80.default.createElement(
|
|
4354
|
+
return /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col max-w-5xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react80.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react80.default.createElement("h1", { className: " text-xl text-black mb-1 truncate gradient-text tracking-tight" }, "Developer Settings"), /* @__PURE__ */ import_react80.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations.")), isReadOnly && /* @__PURE__ */ import_react80.default.createElement("span", { className: "p-2 w-9 h-9 bg-neutral-50 text-neutral-500 rounded-full flex items-center justify-center shrink-0" }, /* @__PURE__ */ import_react80.default.createElement(import_react81.HugeiconsIcon, { icon: import_core_free_icons29.CircleLock02Icon, size: 18, className: "text-current" }))), isLoading ? /* @__PURE__ */ import_react80.default.createElement(PageSpinner6, null) : /* @__PURE__ */ import_react80.default.createElement("div", { className: "w-full max-w-5xl flex flex-col gap-12" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react80.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react80.default.createElement(
|
|
4343
4355
|
TextInput,
|
|
4344
4356
|
{
|
|
4345
4357
|
label: "Public Key",
|