@retinalabsllc/zairusjs 21.1.3 → 21.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +183 -1
- package/dist/index.d.ts +183 -1
- package/dist/index.js +1052 -43
- package/dist/index.mjs +1080 -43
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -59,15 +59,20 @@ __export(index_exports, {
|
|
|
59
59
|
PipleAuth: () => PipleAuth,
|
|
60
60
|
PlatformFeatures: () => PlatformFeatures,
|
|
61
61
|
PortfolioHero: () => PortfolioHero,
|
|
62
|
+
RootSidebar: () => RootSidebar,
|
|
62
63
|
TextInput: () => TextInput,
|
|
63
64
|
ThreeDActionButton: () => ThreeDActionButton,
|
|
64
65
|
ThreeDButton: () => ThreeDButton,
|
|
66
|
+
UniversalApplicationPage2: () => UniversalApplicationPage2,
|
|
67
|
+
UniversalApplicationsPage: () => UniversalApplicationsPage,
|
|
65
68
|
UniversalBuyCryptoPage: () => UniversalBuyCryptoPage,
|
|
66
69
|
UniversalCardActionPage: () => UniversalCardActionPage,
|
|
67
70
|
UniversalCardPage: () => UniversalCardPage,
|
|
68
71
|
UniversalCreateHuddle: () => UniversalCreateHuddle,
|
|
72
|
+
UniversalDeveloperSettings: () => UniversalDeveloperSettings,
|
|
69
73
|
UniversalErrorView: () => UniversalErrorView,
|
|
70
74
|
UniversalHome2: () => UniversalHome2,
|
|
75
|
+
UniversalHome3: () => UniversalHome3,
|
|
71
76
|
UniversalHomeView: () => UniversalHomeView,
|
|
72
77
|
UniversalHuddleDetails: () => UniversalHuddleDetails,
|
|
73
78
|
UniversalHuddlesPage: () => UniversalHuddlesPage,
|
|
@@ -79,6 +84,7 @@ __export(index_exports, {
|
|
|
79
84
|
UniversalRewardPage: () => UniversalRewardPage,
|
|
80
85
|
UniversalSecurityPage: () => UniversalSecurityPage,
|
|
81
86
|
UniversalSettings: () => UniversalSettings,
|
|
87
|
+
UniversalSettings2: () => UniversalSettings2,
|
|
82
88
|
UniversalSidebar: () => UniversalSidebar,
|
|
83
89
|
UniversalTransactionPage: () => UniversalTransactionPage,
|
|
84
90
|
UniversalVerificationPage: () => UniversalVerificationPage,
|
|
@@ -3388,6 +3394,7 @@ var ManagedDocument = ({
|
|
|
3388
3394
|
var import_react55 = __toESM(require("react"));
|
|
3389
3395
|
var import_react56 = require("@hugeicons/react");
|
|
3390
3396
|
var import_core_free_icons20 = require("@hugeicons/core-free-icons");
|
|
3397
|
+
var import_react_hot_toast10 = __toESM(require("react-hot-toast"));
|
|
3391
3398
|
var TextInput2 = ({
|
|
3392
3399
|
label,
|
|
3393
3400
|
value,
|
|
@@ -3464,11 +3471,9 @@ var ManagedContactBlock = ({
|
|
|
3464
3471
|
}) => {
|
|
3465
3472
|
const [formData, setFormData] = (0, import_react55.useState)({ name: "", email: "", title: "", phone: "", message: "" });
|
|
3466
3473
|
const [status, setStatus] = (0, import_react55.useState)("idle");
|
|
3467
|
-
const [responseMessage, setResponseMessage] = (0, import_react55.useState)("");
|
|
3468
3474
|
const handleSubmit = async (e) => {
|
|
3469
3475
|
e.preventDefault();
|
|
3470
3476
|
setStatus("loading");
|
|
3471
|
-
setResponseMessage("");
|
|
3472
3477
|
try {
|
|
3473
3478
|
const res = await fetch("/api/contact", {
|
|
3474
3479
|
method: "POST",
|
|
@@ -3478,15 +3483,15 @@ var ManagedContactBlock = ({
|
|
|
3478
3483
|
const data = await res.json();
|
|
3479
3484
|
if (res.ok) {
|
|
3480
3485
|
setStatus("success");
|
|
3481
|
-
|
|
3486
|
+
import_react_hot_toast10.default.success(data.message || "Message sent successfully!");
|
|
3482
3487
|
setFormData({ name: "", email: "", title: "", phone: "", message: "" });
|
|
3483
3488
|
} else {
|
|
3484
3489
|
setStatus("error");
|
|
3485
|
-
|
|
3490
|
+
import_react_hot_toast10.default.error(data.error || "Failed to send message.");
|
|
3486
3491
|
}
|
|
3487
3492
|
} catch (error) {
|
|
3488
3493
|
setStatus("error");
|
|
3489
|
-
|
|
3494
|
+
import_react_hot_toast10.default.error("An unexpected error occurred. Please try again.");
|
|
3490
3495
|
}
|
|
3491
3496
|
};
|
|
3492
3497
|
return /* @__PURE__ */ import_react55.default.createElement("div", { className: "grow pt-4 pb-20 px-4 md:px-8 w-full flex justify-center z-10 relative" }, /* @__PURE__ */ import_react55.default.createElement("div", { className: "relative bg-white rounded-2xl w-full max-w-7xl mx-auto overflow-hidden" }, /* @__PURE__ */ import_react55.default.createElement(
|
|
@@ -3570,7 +3575,7 @@ var ManagedContactBlock = ({
|
|
|
3570
3575
|
onChange: (val) => setFormData({ ...formData, message: val }),
|
|
3571
3576
|
disabled: status === "loading"
|
|
3572
3577
|
}
|
|
3573
|
-
),
|
|
3578
|
+
), /* @__PURE__ */ import_react55.default.createElement("div", { className: "pt-4" }, /* @__PURE__ */ import_react55.default.createElement(
|
|
3574
3579
|
ThreeDActionButton2,
|
|
3575
3580
|
{
|
|
3576
3581
|
type: "submit",
|
|
@@ -4273,7 +4278,7 @@ var UniversalVerificationPage = ({
|
|
|
4273
4278
|
// src/components/UniversalRewardPage.tsx
|
|
4274
4279
|
var import_react73 = __toESM(require("react"));
|
|
4275
4280
|
var import_axios = __toESM(require("axios"));
|
|
4276
|
-
var
|
|
4281
|
+
var import_react_hot_toast11 = __toESM(require("react-hot-toast"));
|
|
4277
4282
|
var import_react_confetti = __toESM(require("react-confetti"));
|
|
4278
4283
|
var import_react_use = require("react-use");
|
|
4279
4284
|
var import_react74 = require("@hugeicons/react");
|
|
@@ -4324,7 +4329,7 @@ var UniversalRewardPage = ({
|
|
|
4324
4329
|
const res = await import_axios.default.post(selectedReward.endpoint, selectedReward.config);
|
|
4325
4330
|
if (res.data.success) {
|
|
4326
4331
|
setShowConfetti(true);
|
|
4327
|
-
|
|
4332
|
+
import_react_hot_toast11.default.success(res.data.message || "Reward claimed successfully!");
|
|
4328
4333
|
setSelectedReward(null);
|
|
4329
4334
|
onRefresh();
|
|
4330
4335
|
setTimeout(() => {
|
|
@@ -4332,7 +4337,7 @@ var UniversalRewardPage = ({
|
|
|
4332
4337
|
}, 6e3);
|
|
4333
4338
|
}
|
|
4334
4339
|
} catch (error) {
|
|
4335
|
-
|
|
4340
|
+
import_react_hot_toast11.default.error(error.response?.data?.error || "Failed to claim reward. Please try again.");
|
|
4336
4341
|
} finally {
|
|
4337
4342
|
setIsClaiming(false);
|
|
4338
4343
|
}
|
|
@@ -4382,7 +4387,7 @@ var UniversalRewardPage = ({
|
|
|
4382
4387
|
|
|
4383
4388
|
// src/components/UniversalReferralPage.tsx
|
|
4384
4389
|
var import_react75 = __toESM(require("react"));
|
|
4385
|
-
var
|
|
4390
|
+
var import_react_hot_toast12 = __toESM(require("react-hot-toast"));
|
|
4386
4391
|
var import_react76 = require("@hugeicons/react");
|
|
4387
4392
|
var import_core_free_icons27 = require("@hugeicons/core-free-icons");
|
|
4388
4393
|
var PageSpinner5 = () => /* @__PURE__ */ import_react75.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react75.default.createElement(import_react76.HugeiconsIcon, { icon: import_core_free_icons27.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
@@ -4411,9 +4416,9 @@ var UniversalReferralPage = ({
|
|
|
4411
4416
|
if (!referralCode) return;
|
|
4412
4417
|
try {
|
|
4413
4418
|
await navigator.clipboard.writeText(referralCode);
|
|
4414
|
-
|
|
4419
|
+
import_react_hot_toast12.default.success("Referral code copied!");
|
|
4415
4420
|
} catch {
|
|
4416
|
-
|
|
4421
|
+
import_react_hot_toast12.default.error("Failed to copy code.");
|
|
4417
4422
|
}
|
|
4418
4423
|
};
|
|
4419
4424
|
const AvatarLogo2 = ({ src, alt, name, sizeClass = "w-10 h-10" }) => {
|
|
@@ -4718,7 +4723,7 @@ var PinDialerBottomSheet = ({
|
|
|
4718
4723
|
|
|
4719
4724
|
// src/components/UniversalBuyCryptoPage.tsx
|
|
4720
4725
|
var import_react81 = __toESM(require("react"));
|
|
4721
|
-
var
|
|
4726
|
+
var import_react_hot_toast13 = __toESM(require("react-hot-toast"));
|
|
4722
4727
|
var import_react82 = require("@hugeicons/react");
|
|
4723
4728
|
var import_core_free_icons30 = require("@hugeicons/core-free-icons");
|
|
4724
4729
|
var CircularLogo = ({ src, alt, fallbackText }) => {
|
|
@@ -4841,7 +4846,7 @@ var UniversalBuyCryptoPage = ({
|
|
|
4841
4846
|
if (result.ratePerToken) setRateDisplay(result.ratePerToken);
|
|
4842
4847
|
if (result.rateKey) setCurrentRateKey(result.rateKey);
|
|
4843
4848
|
} catch {
|
|
4844
|
-
|
|
4849
|
+
import_react_hot_toast13.default.error("Failed to calculate live rate.");
|
|
4845
4850
|
} finally {
|
|
4846
4851
|
setIsCalculating(false);
|
|
4847
4852
|
}
|
|
@@ -4872,11 +4877,11 @@ var UniversalBuyCryptoPage = ({
|
|
|
4872
4877
|
const handleCheckout = async () => {
|
|
4873
4878
|
const numFiat = parseFloat(fiatAmount) || 0;
|
|
4874
4879
|
const numCrypto = parseFloat(cryptoAmount) || 0;
|
|
4875
|
-
if (numFiat <= 0 || numCrypto <= 0) return
|
|
4880
|
+
if (numFiat <= 0 || numCrypto <= 0) return import_react_hot_toast13.default.error("Please enter a valid amount.");
|
|
4876
4881
|
if (selectedNetwork.minimumWithdrawal && numCrypto < selectedNetwork.minimumWithdrawal) {
|
|
4877
|
-
return
|
|
4882
|
+
return import_react_hot_toast13.default.error(`Minimum purchase for ${selectedNetwork.name} is ${selectedNetwork.minimumWithdrawal} ${selectedCrypto.code}`);
|
|
4878
4883
|
}
|
|
4879
|
-
if (!recipientAddress.trim() || !isAddressValid) return
|
|
4884
|
+
if (!recipientAddress.trim() || !isAddressValid) return import_react_hot_toast13.default.error("Please enter a valid wallet address.");
|
|
4880
4885
|
if (onSubmitCheckout) {
|
|
4881
4886
|
setIsSubmitting(true);
|
|
4882
4887
|
try {
|
|
@@ -5075,7 +5080,7 @@ var UniversalHuddlesPage = ({
|
|
|
5075
5080
|
// src/components/UniversalMembersPage.tsx
|
|
5076
5081
|
var import_react85 = __toESM(require("react"));
|
|
5077
5082
|
var import_react86 = require("@hugeicons/react");
|
|
5078
|
-
var
|
|
5083
|
+
var import_react_hot_toast14 = __toESM(require("react-hot-toast"));
|
|
5079
5084
|
var import_core_free_icons32 = require("@hugeicons/core-free-icons");
|
|
5080
5085
|
var MemberAvatar2 = ({ src, status }) => {
|
|
5081
5086
|
const [loaded, setLoaded] = (0, import_react85.useState)(false);
|
|
@@ -5170,11 +5175,11 @@ var UniversalMembersPage = ({
|
|
|
5170
5175
|
setIsRemoving(true);
|
|
5171
5176
|
try {
|
|
5172
5177
|
await onRemoveMember(memberToRemove.id);
|
|
5173
|
-
|
|
5178
|
+
import_react_hot_toast14.default.success("Member removed successfully.");
|
|
5174
5179
|
setExpandedId(null);
|
|
5175
5180
|
setMemberToRemove(null);
|
|
5176
5181
|
} catch (error) {
|
|
5177
|
-
|
|
5182
|
+
import_react_hot_toast14.default.error("Failed to remove member.");
|
|
5178
5183
|
} finally {
|
|
5179
5184
|
setIsRemoving(false);
|
|
5180
5185
|
}
|
|
@@ -5188,7 +5193,7 @@ var UniversalMembersPage = ({
|
|
|
5188
5193
|
setInviteEmail("");
|
|
5189
5194
|
setIsInviteMode(false);
|
|
5190
5195
|
} catch (error) {
|
|
5191
|
-
|
|
5196
|
+
import_react_hot_toast14.default.error(error.message || "Failed to send invitation.");
|
|
5192
5197
|
} finally {
|
|
5193
5198
|
setIsInviting(false);
|
|
5194
5199
|
}
|
|
@@ -5335,7 +5340,7 @@ var UniversalMembersPage = ({
|
|
|
5335
5340
|
var import_react87 = __toESM(require("react"));
|
|
5336
5341
|
var import_navigation6 = require("next/navigation");
|
|
5337
5342
|
var import_react88 = require("@hugeicons/react");
|
|
5338
|
-
var
|
|
5343
|
+
var import_react_hot_toast15 = __toESM(require("react-hot-toast"));
|
|
5339
5344
|
var import_core_free_icons33 = require("@hugeicons/core-free-icons");
|
|
5340
5345
|
var OrgAvatar = ({ src, sizeClass = "w-10 h-10" }) => {
|
|
5341
5346
|
const [loaded, setLoaded] = (0, import_react87.useState)(false);
|
|
@@ -5390,7 +5395,7 @@ var UniversalHome2 = ({
|
|
|
5390
5395
|
await onResolveInvite(selectedNotif, resolution);
|
|
5391
5396
|
window.location.reload();
|
|
5392
5397
|
} catch (error) {
|
|
5393
|
-
|
|
5398
|
+
import_react_hot_toast15.default.error("Failed to process invitation");
|
|
5394
5399
|
setIsResolving(false);
|
|
5395
5400
|
}
|
|
5396
5401
|
};
|
|
@@ -5399,7 +5404,7 @@ var UniversalHome2 = ({
|
|
|
5399
5404
|
try {
|
|
5400
5405
|
if (onLogout) await onLogout();
|
|
5401
5406
|
} catch (e) {
|
|
5402
|
-
|
|
5407
|
+
import_react_hot_toast15.default.error("Failed to log out cleanly.");
|
|
5403
5408
|
} finally {
|
|
5404
5409
|
setIsLoggingOut(false);
|
|
5405
5410
|
setShowLogoutConfirm(false);
|
|
@@ -5552,7 +5557,7 @@ var UniversalHome2 = ({
|
|
|
5552
5557
|
|
|
5553
5558
|
// src/components/UniversalSettings.tsx
|
|
5554
5559
|
var import_react89 = __toESM(require("react"));
|
|
5555
|
-
var
|
|
5560
|
+
var import_react_hot_toast16 = __toESM(require("react-hot-toast"));
|
|
5556
5561
|
var import_react90 = require("@hugeicons/react");
|
|
5557
5562
|
var import_core_free_icons34 = require("@hugeicons/core-free-icons");
|
|
5558
5563
|
var MemberAvatar3 = ({ src, status, sizeClass = "w-10 h-10" }) => {
|
|
@@ -5685,13 +5690,13 @@ var UniversalSettings = ({
|
|
|
5685
5690
|
const file = e.target.files?.[0];
|
|
5686
5691
|
if (!file) return;
|
|
5687
5692
|
if (file.size > 1024 * 1024) {
|
|
5688
|
-
|
|
5693
|
+
import_react_hot_toast16.default.error("Image size must be less than 1MB.");
|
|
5689
5694
|
e.target.value = "";
|
|
5690
5695
|
return;
|
|
5691
5696
|
}
|
|
5692
5697
|
const validTypes = ["image/jpeg", "image/jpg", "image/png"];
|
|
5693
5698
|
if (!validTypes.includes(file.type)) {
|
|
5694
|
-
|
|
5699
|
+
import_react_hot_toast16.default.error("Only PNG and JPEG images are allowed.");
|
|
5695
5700
|
e.target.value = "";
|
|
5696
5701
|
return;
|
|
5697
5702
|
}
|
|
@@ -5726,11 +5731,11 @@ var UniversalSettings = ({
|
|
|
5726
5731
|
setIsRemoving(true);
|
|
5727
5732
|
try {
|
|
5728
5733
|
await onRemoveMember(memberToRemove.userId);
|
|
5729
|
-
|
|
5734
|
+
import_react_hot_toast16.default.success("Member removed successfully.");
|
|
5730
5735
|
setExpandedId(null);
|
|
5731
5736
|
setMemberToRemove(null);
|
|
5732
5737
|
} catch (error) {
|
|
5733
|
-
|
|
5738
|
+
import_react_hot_toast16.default.error(error.message || "Failed to remove member.");
|
|
5734
5739
|
} finally {
|
|
5735
5740
|
setIsRemoving(false);
|
|
5736
5741
|
}
|
|
@@ -5744,7 +5749,7 @@ var UniversalSettings = ({
|
|
|
5744
5749
|
setInviteEmail("");
|
|
5745
5750
|
setIsInviteMode(false);
|
|
5746
5751
|
} catch (error) {
|
|
5747
|
-
|
|
5752
|
+
import_react_hot_toast16.default.error(error.message || "Failed to send invitation.");
|
|
5748
5753
|
} finally {
|
|
5749
5754
|
setIsInviting(false);
|
|
5750
5755
|
}
|
|
@@ -5792,7 +5797,7 @@ var UniversalSettings = ({
|
|
|
5792
5797
|
const handleSaveOrganization = async (e) => {
|
|
5793
5798
|
e.preventDefault();
|
|
5794
5799
|
if (isSavingOrg || isCheckingSlug || !canManage || !onSaveOrganization) return;
|
|
5795
|
-
if (orgSlug !== initialOrgSlug && slugAvailable === false) return
|
|
5800
|
+
if (orgSlug !== initialOrgSlug && slugAvailable === false) return import_react_hot_toast16.default.error("Address handle unavailable.");
|
|
5796
5801
|
setIsSavingOrg(true);
|
|
5797
5802
|
try {
|
|
5798
5803
|
let finalAvatarUrl = orgAvatarUrl;
|
|
@@ -5805,7 +5810,7 @@ var UniversalSettings = ({
|
|
|
5805
5810
|
setOrgAvatarUrl(finalAvatarUrl);
|
|
5806
5811
|
}
|
|
5807
5812
|
} catch (err) {
|
|
5808
|
-
|
|
5813
|
+
import_react_hot_toast16.default.error("Failed to securely upload workspace avatar.");
|
|
5809
5814
|
setIsSavingOrg(false);
|
|
5810
5815
|
setIsUploadingOrgAvatar(false);
|
|
5811
5816
|
return;
|
|
@@ -5814,10 +5819,10 @@ var UniversalSettings = ({
|
|
|
5814
5819
|
setIsUploadingOrgAvatar(false);
|
|
5815
5820
|
}
|
|
5816
5821
|
const res = await onSaveOrganization({ name: orgName, slug: orgSlug, avatarUrl: finalAvatarUrl });
|
|
5817
|
-
if (res.success)
|
|
5818
|
-
else
|
|
5822
|
+
if (res.success) import_react_hot_toast16.default.success("Workspace updated successfully.");
|
|
5823
|
+
else import_react_hot_toast16.default.error(res.error || "Failed to update workspace.");
|
|
5819
5824
|
} catch (error) {
|
|
5820
|
-
|
|
5825
|
+
import_react_hot_toast16.default.error("Service unavailable.");
|
|
5821
5826
|
} finally {
|
|
5822
5827
|
setIsSavingOrg(false);
|
|
5823
5828
|
setIsUploadingOrgAvatar(false);
|
|
@@ -5838,7 +5843,7 @@ var UniversalSettings = ({
|
|
|
5838
5843
|
setAvatarUrl(finalAvatarUrl);
|
|
5839
5844
|
}
|
|
5840
5845
|
} catch (err) {
|
|
5841
|
-
|
|
5846
|
+
import_react_hot_toast16.default.error("Failed to securely upload profile avatar.");
|
|
5842
5847
|
setIsSavingProfile(false);
|
|
5843
5848
|
setIsUploadingUserAvatar(false);
|
|
5844
5849
|
return;
|
|
@@ -5847,10 +5852,10 @@ var UniversalSettings = ({
|
|
|
5847
5852
|
setIsUploadingUserAvatar(false);
|
|
5848
5853
|
}
|
|
5849
5854
|
const res = await onSaveProfile({ firstName, lastName, jobTitle, description, avatarUrl: finalAvatarUrl });
|
|
5850
|
-
if (res.success)
|
|
5851
|
-
else
|
|
5855
|
+
if (res.success) import_react_hot_toast16.default.success("Identity updated successfully.");
|
|
5856
|
+
else import_react_hot_toast16.default.error(res.error || "Failed to update identity.");
|
|
5852
5857
|
} catch (error) {
|
|
5853
|
-
|
|
5858
|
+
import_react_hot_toast16.default.error("Service unavailable.");
|
|
5854
5859
|
} finally {
|
|
5855
5860
|
setIsSavingProfile(false);
|
|
5856
5861
|
setIsUploadingUserAvatar(false);
|
|
@@ -5917,7 +5922,7 @@ var UniversalSettings = ({
|
|
|
5917
5922
|
|
|
5918
5923
|
// src/components/UniversalCreateHuddle.tsx
|
|
5919
5924
|
var import_react91 = __toESM(require("react"));
|
|
5920
|
-
var
|
|
5925
|
+
var import_react_hot_toast17 = __toESM(require("react-hot-toast"));
|
|
5921
5926
|
var import_react92 = require("@hugeicons/react");
|
|
5922
5927
|
var import_core_free_icons35 = require("@hugeicons/core-free-icons");
|
|
5923
5928
|
var MemberAvatar4 = ({ src, sizeClass = "w-10 h-10" }) => {
|
|
@@ -6008,8 +6013,8 @@ var UniversalCreateHuddle = ({
|
|
|
6008
6013
|
e.preventDefault();
|
|
6009
6014
|
if (!canManage) return;
|
|
6010
6015
|
const cleanTitle = title.trim();
|
|
6011
|
-
if (cleanTitle.length < 2) return
|
|
6012
|
-
if (isPrivate && selectedParticipants.size === 0) return
|
|
6016
|
+
if (cleanTitle.length < 2) return import_react_hot_toast17.default.error("Please enter a valid huddle name.");
|
|
6017
|
+
if (isPrivate && selectedParticipants.size === 0) return import_react_hot_toast17.default.error("Private huddles require at least one participant.");
|
|
6013
6018
|
setIsSubmitting(true);
|
|
6014
6019
|
try {
|
|
6015
6020
|
await onCreateSubmit({
|
|
@@ -6020,7 +6025,7 @@ var UniversalCreateHuddle = ({
|
|
|
6020
6025
|
participantIds: isPrivate ? Array.from(selectedParticipants) : []
|
|
6021
6026
|
});
|
|
6022
6027
|
} catch (error) {
|
|
6023
|
-
|
|
6028
|
+
import_react_hot_toast17.default.error(error.message || "Failed to schedule huddle.");
|
|
6024
6029
|
setIsSubmitting(false);
|
|
6025
6030
|
}
|
|
6026
6031
|
};
|
|
@@ -6327,6 +6332,1004 @@ var HomeHuddleCalendar = ({
|
|
|
6327
6332
|
}
|
|
6328
6333
|
));
|
|
6329
6334
|
};
|
|
6335
|
+
|
|
6336
|
+
// src/components/UniversalApplicationsPage.tsx
|
|
6337
|
+
var import_react95 = __toESM(require("react"));
|
|
6338
|
+
var import_react96 = require("@hugeicons/react");
|
|
6339
|
+
var import_core_free_icons37 = require("@hugeicons/core-free-icons");
|
|
6340
|
+
var formatType = (type) => {
|
|
6341
|
+
if (!type) return "";
|
|
6342
|
+
return type.split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
|
|
6343
|
+
};
|
|
6344
|
+
var ApplicationIcon = ({ icon, sizeClass = "w-10 h-10" }) => {
|
|
6345
|
+
return /* @__PURE__ */ import_react95.default.createElement("div", { className: `relative shrink-0 aspect-square ${sizeClass}` }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full h-full aspect-square rounded-lg bg-neutral-50 flex items-center justify-center overflow-hidden" }, icon ? /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon, size: 20, className: "text-stone-500" }) : /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-4 h-4 rounded-sm bg-stone-300" })));
|
|
6346
|
+
};
|
|
6347
|
+
var PageSpinner9 = () => /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
6348
|
+
var UniversalApplicationsPage = ({
|
|
6349
|
+
headerTitle,
|
|
6350
|
+
headerDescription,
|
|
6351
|
+
applications,
|
|
6352
|
+
isLoading,
|
|
6353
|
+
currentPage,
|
|
6354
|
+
totalPages,
|
|
6355
|
+
onPageChange,
|
|
6356
|
+
onApplicationClick,
|
|
6357
|
+
onCreateApplication
|
|
6358
|
+
}) => {
|
|
6359
|
+
return /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-row items-center justify-between gap-4" }, /* @__PURE__ */ import_react95.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, headerTitle), /* @__PURE__ */ import_react95.default.createElement(
|
|
6360
|
+
"button",
|
|
6361
|
+
{
|
|
6362
|
+
onClick: () => onCreateApplication?.(),
|
|
6363
|
+
className: "shrink-0 px-4 py-1.5 border border-stone-200 text-black text-xs tracking-wide rounded-full hover:bg-stone-50 transition-colors outline-none"
|
|
6364
|
+
},
|
|
6365
|
+
"Create new"
|
|
6366
|
+
)), headerDescription && /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-xs text-stone-500" }, headerDescription)), /* @__PURE__ */ import_react95.default.createElement("div", { className: "w-full overflow-hidden" }, isLoading ? /* @__PURE__ */ import_react95.default.createElement(PageSpinner9, null) : /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react95.default.createElement("div", null, applications.length === 0 ? /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-xs text-stone-400 py-6 text-center" }, "No applications available") : applications.map((app) => /* @__PURE__ */ import_react95.default.createElement(
|
|
6367
|
+
"div",
|
|
6368
|
+
{
|
|
6369
|
+
key: app.id,
|
|
6370
|
+
onClick: () => onApplicationClick(app.id),
|
|
6371
|
+
className: "flex flex-row items-center gap-4 py-2 hover:bg-stone-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl"
|
|
6372
|
+
},
|
|
6373
|
+
/* @__PURE__ */ import_react95.default.createElement(ApplicationIcon, { icon: app.icon }),
|
|
6374
|
+
/* @__PURE__ */ import_react95.default.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ import_react95.default.createElement("p", { className: "text-sm text-black tracking-tight truncate" }, formatType(app.type)), /* @__PURE__ */ import_react95.default.createElement("span", { className: "text-xs text-stone-500 truncate block mt-0.5" }, app.timeString)),
|
|
6375
|
+
/* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowRight01Icon, size: 14, className: "shrink-0 text-stone-400" })
|
|
6376
|
+
))), /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex items-center justify-between pt-6 mt-2 " }, /* @__PURE__ */ import_react95.default.createElement("span", { className: "text-xs text-stone-400 tracking-[0.2em]" }, "Page ", currentPage, " of ", totalPages === 0 ? 1 : totalPages), /* @__PURE__ */ import_react95.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react95.default.createElement(
|
|
6377
|
+
"button",
|
|
6378
|
+
{
|
|
6379
|
+
onClick: () => onPageChange(currentPage - 1),
|
|
6380
|
+
disabled: currentPage <= 1 || isLoading,
|
|
6381
|
+
className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
6382
|
+
},
|
|
6383
|
+
/* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowLeft01Icon, size: 14 })
|
|
6384
|
+
), /* @__PURE__ */ import_react95.default.createElement(
|
|
6385
|
+
"button",
|
|
6386
|
+
{
|
|
6387
|
+
onClick: () => onPageChange(currentPage + 1),
|
|
6388
|
+
disabled: currentPage >= totalPages || isLoading || totalPages === 0,
|
|
6389
|
+
className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none"
|
|
6390
|
+
},
|
|
6391
|
+
/* @__PURE__ */ import_react95.default.createElement(import_react96.HugeiconsIcon, { icon: import_core_free_icons37.ArrowRight01Icon, size: 14 })
|
|
6392
|
+
)))))));
|
|
6393
|
+
};
|
|
6394
|
+
|
|
6395
|
+
// src/components/UniversalHome3.tsx
|
|
6396
|
+
var import_react97 = __toESM(require("react"));
|
|
6397
|
+
var import_navigation8 = require("next/navigation");
|
|
6398
|
+
var import_react98 = require("@hugeicons/react");
|
|
6399
|
+
var import_react_hot_toast18 = __toESM(require("react-hot-toast"));
|
|
6400
|
+
var import_core_free_icons38 = require("@hugeicons/core-free-icons");
|
|
6401
|
+
var UniversalHome3 = ({
|
|
6402
|
+
createApplicationAction,
|
|
6403
|
+
checkApplicationAction,
|
|
6404
|
+
notifications = [],
|
|
6405
|
+
notificationPage = 1,
|
|
6406
|
+
notificationTotalPages = 1,
|
|
6407
|
+
isNotifsLoading = false,
|
|
6408
|
+
onNotificationPageChange,
|
|
6409
|
+
onNotificationClick,
|
|
6410
|
+
onResolveInvite,
|
|
6411
|
+
formatNotifDate,
|
|
6412
|
+
customContent,
|
|
6413
|
+
applicationsProps
|
|
6414
|
+
}) => {
|
|
6415
|
+
const [showNotifDialog, setShowNotifDialog] = (0, import_react97.useState)(false);
|
|
6416
|
+
const [selectedNotif, setSelectedNotif] = (0, import_react97.useState)(null);
|
|
6417
|
+
const [isResolving, setIsResolving] = (0, import_react97.useState)(false);
|
|
6418
|
+
const router = (0, import_navigation8.useRouter)();
|
|
6419
|
+
const hasUnreadNotifs = notifications.some((n) => !n.isRead);
|
|
6420
|
+
const handleResolve = async (resolution) => {
|
|
6421
|
+
if (!onResolveInvite || !selectedNotif) return;
|
|
6422
|
+
setIsResolving(true);
|
|
6423
|
+
try {
|
|
6424
|
+
await onResolveInvite(selectedNotif, resolution);
|
|
6425
|
+
window.location.reload();
|
|
6426
|
+
} catch (error) {
|
|
6427
|
+
import_react_hot_toast18.default.error("Failed to process invitation");
|
|
6428
|
+
setIsResolving(false);
|
|
6429
|
+
}
|
|
6430
|
+
};
|
|
6431
|
+
return /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center justify-between w-full pb-4" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center gap-3" }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6432
|
+
"button",
|
|
6433
|
+
{
|
|
6434
|
+
onClick: () => window.dispatchEvent(new Event("open-sidebar")),
|
|
6435
|
+
className: "md:hidden flex items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
|
|
6436
|
+
"aria-label": "Open Menu"
|
|
6437
|
+
},
|
|
6438
|
+
/* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.SidebarLeft01Icon, size: 18 })
|
|
6439
|
+
)), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center gap-2 shrink-0" }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6440
|
+
"button",
|
|
6441
|
+
{
|
|
6442
|
+
onClick: () => router.push("/app/ai"),
|
|
6443
|
+
className: "relative w-10 h-10 flex items-center justify-center rounded-full bg-white outline-none hover:bg-stone-50 transition-colors"
|
|
6444
|
+
},
|
|
6445
|
+
/* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Robot01Icon, size: 20, className: "text-black" })
|
|
6446
|
+
), /* @__PURE__ */ import_react97.default.createElement(
|
|
6447
|
+
"button",
|
|
6448
|
+
{
|
|
6449
|
+
onClick: () => {
|
|
6450
|
+
setShowNotifDialog(true);
|
|
6451
|
+
setSelectedNotif(null);
|
|
6452
|
+
},
|
|
6453
|
+
className: "relative w-10 h-10 flex items-center justify-center rounded-full bg-white outline-none hover:bg-stone-50 transition-colors"
|
|
6454
|
+
},
|
|
6455
|
+
/* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Notification01Icon, size: 20, className: "text-black" }),
|
|
6456
|
+
hasUnreadNotifs && /* @__PURE__ */ import_react97.default.createElement("span", { className: "absolute top-2.5 right-2.5 w-2 h-2 bg-[#d97757] rounded-full border border-white" })
|
|
6457
|
+
))), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full pb-6 flex flex-col gap-4" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "grid grid-cols-2 gap-2" }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6458
|
+
"div",
|
|
6459
|
+
{
|
|
6460
|
+
onClick: createApplicationAction?.onClick,
|
|
6461
|
+
className: "bg-[#d97757] rounded-2xl p-5 relative overflow-hidden flex flex-col h-32 sm:h-36 cursor-pointer hover:opacity-90 transition-opacity"
|
|
6462
|
+
},
|
|
6463
|
+
/* @__PURE__ */ import_react97.default.createElement("div", { className: "relative z-10 flex flex-col h-full justify-between" }, /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-sm sm:text-sm text-white leading-tight" }, "New", /* @__PURE__ */ import_react97.default.createElement("br", null), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-white/70" }, "Application")), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-8 h-8 rounded-full bg-white/10 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowUpRight01Icon, size: 16, className: "text-white" }))),
|
|
6464
|
+
/* @__PURE__ */ import_react97.default.createElement(
|
|
6465
|
+
"img",
|
|
6466
|
+
{
|
|
6467
|
+
src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cal_b.avif",
|
|
6468
|
+
alt: "New Application",
|
|
6469
|
+
className: "absolute bottom-4 right-2 translate-x-1/4 translate-y-1/2 w-32 h-auto object-contain z-0 pointer-events-none opacity-30"
|
|
6470
|
+
}
|
|
6471
|
+
)
|
|
6472
|
+
), /* @__PURE__ */ import_react97.default.createElement(
|
|
6473
|
+
"div",
|
|
6474
|
+
{
|
|
6475
|
+
onClick: checkApplicationAction?.onClick,
|
|
6476
|
+
className: "bg-[#ffffff] rounded-2xl p-5 relative overflow-hidden flex flex-col h-32 sm:h-36 cursor-pointer hover:opacity-90 transition-opacity"
|
|
6477
|
+
},
|
|
6478
|
+
/* @__PURE__ */ import_react97.default.createElement("div", { className: "relative z-10 flex flex-col h-full justify-between" }, /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-sm sm:text-sm text-black leading-tight" }, "Check", /* @__PURE__ */ import_react97.default.createElement("br", null), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-black/60" }, "Application")), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-8 h-8 rounded-full bg-black/5 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowRight01Icon, size: 16, className: "text-black" }))),
|
|
6479
|
+
/* @__PURE__ */ import_react97.default.createElement(
|
|
6480
|
+
"img",
|
|
6481
|
+
{
|
|
6482
|
+
src: "https://storage.googleapis.com/retina-cloud-v2/assets/images/cam_c.avif",
|
|
6483
|
+
alt: "Check Application",
|
|
6484
|
+
className: "absolute bottom-4 right-2 translate-x-1/4 translate-y-1/2 w-32 h-auto object-contain z-0 pointer-events-none opacity-30"
|
|
6485
|
+
}
|
|
6486
|
+
)
|
|
6487
|
+
))), customContent && /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full" }, customContent), /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6488
|
+
UniversalApplicationsPage,
|
|
6489
|
+
{
|
|
6490
|
+
...applicationsProps
|
|
6491
|
+
}
|
|
6492
|
+
)), showNotifDialog && /* @__PURE__ */ import_react97.default.createElement("div", { className: "fixed inset-0 z-120 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => setShowNotifDialog(false) }), /* @__PURE__ */ import_react97.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200 max-h-[80vh] h-auto" }, /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex items-center justify-between p-5 shrink-0" }, selectedNotif ? /* @__PURE__ */ import_react97.default.createElement("button", { onClick: () => setSelectedNotif(null), disabled: isResolving, className: "text-[#d97757] hover:text-[#d97757] transition-colors outline-none flex items-center gap-2 text-xs tracking-widest disabled:opacity-50" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowLeft01Icon, size: 14 }), " Back") : /* @__PURE__ */ import_react97.default.createElement("h3", { className: "text-sm text-black tracking-tight flex items-center gap-2" }, "Notifications"), /* @__PURE__ */ import_react97.default.createElement("button", { onClick: () => setShowNotifDialog(false), disabled: isResolving, className: "text-stone-400 hover:text-black transition-colors outline-none disabled:opacity-50" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.CancelCircleIcon, size: 18 }))), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex-1 overflow-y-auto custom-scrollbar p-2 relative" }, isNotifsLoading && !selectedNotif && /* @__PURE__ */ import_react97.default.createElement("div", { className: "absolute inset-0 z-10 flex items-center justify-center" }, /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Loading03Icon, size: 28, className: "animate-spin text-black" })), selectedNotif ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-4 text-left" }, selectedNotif.type === "HUDDLE_INVITE" && selectedNotif.meta_json?.action === "RESOLVE_INVITE" && selectedNotif.meta_json?.completed ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "" }) : /* @__PURE__ */ import_react97.default.createElement("h4", { className: "text-sm text-black mb-1" }, selectedNotif.title), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest mb-4 block" }, formatNotifDate(selectedNotif.createdAt)), /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-xs text-stone-600 leading-relaxed whitespace-pre-wrap" }, selectedNotif.message), selectedNotif.type === "HUDDLE_INVITE" && selectedNotif.meta_json?.action === "RESOLVE_INVITE" && /* @__PURE__ */ import_react97.default.createElement("div", { className: `mt-8 flex gap-3 pt-6 ${selectedNotif.meta_json?.completed ? "opacity-40 pointer-events-none cursor-not-allowed" : ""}` }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6493
|
+
"button",
|
|
6494
|
+
{
|
|
6495
|
+
onClick: () => handleResolve("ACCEPTED"),
|
|
6496
|
+
disabled: isResolving || selectedNotif.meta_json?.completed,
|
|
6497
|
+
className: "flex-1 py-2.5 rounded-full bg-black text-white text-xs tracking-wide transition-all outline-none hover:bg-stone-800 flex justify-center items-center disabled:opacity-50"
|
|
6498
|
+
},
|
|
6499
|
+
isResolving ? /* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.Loading03Icon, className: "animate-spin", size: 16 }) : "Accept"
|
|
6500
|
+
), /* @__PURE__ */ import_react97.default.createElement(
|
|
6501
|
+
"button",
|
|
6502
|
+
{
|
|
6503
|
+
onClick: () => handleResolve("REJECTED"),
|
|
6504
|
+
disabled: isResolving || selectedNotif.meta_json?.completed,
|
|
6505
|
+
className: "flex-1 py-2.5 rounded-full bg-white border border-stone-200 text-black text-xs tracking-wide transition-all outline-none hover:bg-stone-50 flex justify-center items-center disabled:opacity-50"
|
|
6506
|
+
},
|
|
6507
|
+
"Reject"
|
|
6508
|
+
))) : /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex flex-col divide-y divide-stone-50/50" }, notifications?.length === 0 && !isNotifsLoading ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-8 text-center text-xs text-stone-400" }, "You have no notifications.") : notifications?.map((notif) => /* @__PURE__ */ import_react97.default.createElement(
|
|
6509
|
+
"div",
|
|
6510
|
+
{
|
|
6511
|
+
key: notif.id,
|
|
6512
|
+
onClick: () => {
|
|
6513
|
+
setSelectedNotif(notif);
|
|
6514
|
+
onNotificationClick?.(notif);
|
|
6515
|
+
},
|
|
6516
|
+
className: `p-3 flex items-start gap-3 rounded-xl cursor-pointer transition-colors ${isNotifsLoading ? "opacity-50 pointer-events-none" : "hover:bg-stone-50"}`
|
|
6517
|
+
},
|
|
6518
|
+
/* @__PURE__ */ import_react97.default.createElement("div", { className: "mt-1.5 shrink-0" }, !notif.isRead ? /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-1.5 h-1.5 bg-[#d97757] rounded-full" }) : /* @__PURE__ */ import_react97.default.createElement("div", { className: "w-1.5 h-1.5 bg-transparent" })),
|
|
6519
|
+
/* @__PURE__ */ import_react97.default.createElement("div", { className: "flex-1 min-w-0 text-left" }, /* @__PURE__ */ import_react97.default.createElement("h5", { className: `text-xs truncate ${notif.isRead ? "text-stone-500" : "text-black"}` }, notif.title), /* @__PURE__ */ import_react97.default.createElement("p", { className: "text-xs text-stone-400 truncate mt-0.5" }, notif.message), /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest mt-2 block" }, formatNotifDate(notif.createdAt)))
|
|
6520
|
+
)))), !selectedNotif && /* @__PURE__ */ import_react97.default.createElement("div", { className: "p-4 flex items-center justify-between shrink-0" }, /* @__PURE__ */ import_react97.default.createElement("span", { className: "text-xs text-stone-400 tracking-widest" }, "Page ", notificationPage, " of ", notificationTotalPages === 0 ? 1 : notificationTotalPages), /* @__PURE__ */ import_react97.default.createElement("div", { className: "flex gap-1" }, /* @__PURE__ */ import_react97.default.createElement(
|
|
6521
|
+
"button",
|
|
6522
|
+
{
|
|
6523
|
+
disabled: notificationPage <= 1 || isNotifsLoading,
|
|
6524
|
+
onClick: () => onNotificationPageChange?.(notificationPage - 1),
|
|
6525
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-stone-200 text-stone-600 disabled:opacity-30 outline-none hover:bg-stone-50 transition-colors"
|
|
6526
|
+
},
|
|
6527
|
+
/* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowLeft01Icon, size: 12 })
|
|
6528
|
+
), /* @__PURE__ */ import_react97.default.createElement(
|
|
6529
|
+
"button",
|
|
6530
|
+
{
|
|
6531
|
+
disabled: notificationPage >= notificationTotalPages || notificationTotalPages === 0 || isNotifsLoading,
|
|
6532
|
+
onClick: () => onNotificationPageChange?.(notificationPage + 1),
|
|
6533
|
+
className: "w-7 h-7 flex items-center justify-center rounded-full bg-white border border-stone-200 text-stone-600 disabled:opacity-30 outline-none hover:bg-stone-50 transition-colors"
|
|
6534
|
+
},
|
|
6535
|
+
/* @__PURE__ */ import_react97.default.createElement(import_react98.HugeiconsIcon, { icon: import_core_free_icons38.ArrowRight01Icon, size: 12 })
|
|
6536
|
+
))))));
|
|
6537
|
+
};
|
|
6538
|
+
|
|
6539
|
+
// src/components/RootSidebar.tsx
|
|
6540
|
+
var import_react99 = __toESM(require("react"));
|
|
6541
|
+
var import_link10 = __toESM(require("next/link"));
|
|
6542
|
+
var import_react100 = require("@hugeicons/react");
|
|
6543
|
+
var import_core_free_icons39 = require("@hugeicons/core-free-icons");
|
|
6544
|
+
function RootSidebar({
|
|
6545
|
+
NavItem2s,
|
|
6546
|
+
currentPath,
|
|
6547
|
+
isMobileOpen,
|
|
6548
|
+
closeMobile,
|
|
6549
|
+
onNavClick,
|
|
6550
|
+
avatarSrc,
|
|
6551
|
+
title = "App",
|
|
6552
|
+
subtitle,
|
|
6553
|
+
homeUrl = "/app",
|
|
6554
|
+
showWorkspaceSwitcher = false,
|
|
6555
|
+
workspaces = [],
|
|
6556
|
+
activeWorkspaceId,
|
|
6557
|
+
onSwitchWorkspace,
|
|
6558
|
+
showLogoutAction = false,
|
|
6559
|
+
onLogout
|
|
6560
|
+
}) {
|
|
6561
|
+
const [isCollapsed, setIsCollapsed] = (0, import_react99.useState)(false);
|
|
6562
|
+
const [isAvatarLoaded, setIsAvatarLoaded] = (0, import_react99.useState)(false);
|
|
6563
|
+
const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react99.useState)(false);
|
|
6564
|
+
const [showLogoutDialog, setShowLogoutDialog] = (0, import_react99.useState)(false);
|
|
6565
|
+
const [isLoggingOut, setIsLoggingOut] = (0, import_react99.useState)(false);
|
|
6566
|
+
(0, import_react99.useEffect)(() => {
|
|
6567
|
+
if (isMobileOpen) {
|
|
6568
|
+
closeMobile();
|
|
6569
|
+
}
|
|
6570
|
+
}, [currentPath]);
|
|
6571
|
+
const hasActiveMatch = NavItem2s.some(
|
|
6572
|
+
(item) => item.path === "/applications" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`)
|
|
6573
|
+
);
|
|
6574
|
+
const handleLogoutInitiation = async () => {
|
|
6575
|
+
if (isLoggingOut || !onLogout) return;
|
|
6576
|
+
setIsLoggingOut(true);
|
|
6577
|
+
try {
|
|
6578
|
+
await onLogout();
|
|
6579
|
+
} catch (error) {
|
|
6580
|
+
setIsLoggingOut(false);
|
|
6581
|
+
setShowLogoutDialog(false);
|
|
6582
|
+
}
|
|
6583
|
+
};
|
|
6584
|
+
const finalAvatarSrc = avatarSrc || "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
|
|
6585
|
+
return /* @__PURE__ */ import_react99.default.createElement(import_react99.default.Fragment, null, /* @__PURE__ */ import_react99.default.createElement(
|
|
6586
|
+
"div",
|
|
6587
|
+
{
|
|
6588
|
+
className: `fixed inset-0 bg-black/30 shadow-2xl transition-opacity duration-300 md:hidden z-90 ${isMobileOpen ? "opacity-100 pointer-events-auto" : "opacity-0 pointer-events-none"}`,
|
|
6589
|
+
onClick: closeMobile
|
|
6590
|
+
}
|
|
6591
|
+
), /* @__PURE__ */ import_react99.default.createElement(
|
|
6592
|
+
"aside",
|
|
6593
|
+
{
|
|
6594
|
+
className: `
|
|
6595
|
+
fixed md:sticky rounded-2xl top-4 md:top-4 md:my-4 left-4 md:left-0 md:ml-4 h-[calc(100dvh-2rem)] bg-white
|
|
6596
|
+
transition-all duration-300 ease-in-out shrink-0 flex flex-col z-100 md:z-10
|
|
6597
|
+
${isMobileOpen ? "translate-x-0" : "translate-x-[-120%] md:translate-x-0"}
|
|
6598
|
+
${isCollapsed ? "md:w-16 w-64" : "w-64"}
|
|
6599
|
+
`
|
|
6600
|
+
},
|
|
6601
|
+
/* @__PURE__ */ import_react99.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center" : "justify-between"}` }, /* @__PURE__ */ import_react99.default.createElement(import_link10.default, { href: homeUrl, className: `flex items-center outline-none group min-w-0 ${isCollapsed && !isMobileOpen ? "" : "gap-3 pr-2"}` }, /* @__PURE__ */ import_react99.default.createElement("div", { className: "w-8 h-8 shrink-0 relative rounded-lg overflow-hidden bg-stone-50 flex items-center justify-center" }, !isAvatarLoaded && /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.Loading03Icon, size: 14, className: "animate-spin text-stone-300 absolute" }), /* @__PURE__ */ import_react99.default.createElement(
|
|
6602
|
+
"img",
|
|
6603
|
+
{
|
|
6604
|
+
src: finalAvatarSrc,
|
|
6605
|
+
alt: "User Avatar",
|
|
6606
|
+
onLoad: () => setIsAvatarLoaded(true),
|
|
6607
|
+
className: `w-full h-full object-cover transition-opacity duration-300 ${isAvatarLoaded ? "opacity-100" : "opacity-0"}`
|
|
6608
|
+
}
|
|
6609
|
+
)), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("div", { className: "flex flex-col justify-center min-w-0" }, /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[13px] font-serif text-black leading-none truncate max-w-32.5 tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate max-w-32.5 tracking-[0.2em] leading-none uppercase" }, subtitle))), (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react99.default.createElement(
|
|
6610
|
+
"button",
|
|
6611
|
+
{
|
|
6612
|
+
onClick: closeMobile,
|
|
6613
|
+
className: "text-neutral-400 hover:text-black transition-colors outline-none",
|
|
6614
|
+
"aria-label": "Close Menu"
|
|
6615
|
+
},
|
|
6616
|
+
/* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.CancelCircleIcon, size: 24 })
|
|
6617
|
+
))),
|
|
6618
|
+
/* @__PURE__ */ import_react99.default.createElement("nav", { className: "flex-1 py-2 flex flex-col gap-1.5 px-3 overflow-y-auto custom-scrollbar" }, NavItem2s.map((item, index) => {
|
|
6619
|
+
const isExactOrSubMatch = item.path === "/applications" || item.path === "/app" ? currentPath === item.path : currentPath === item.path || currentPath?.startsWith(`${item.path}/`);
|
|
6620
|
+
const isCurrentRoute = isExactOrSubMatch || !hasActiveMatch && index === 0;
|
|
6621
|
+
return /* @__PURE__ */ import_react99.default.createElement(
|
|
6622
|
+
import_link10.default,
|
|
6623
|
+
{
|
|
6624
|
+
key: item.name,
|
|
6625
|
+
href: item.path,
|
|
6626
|
+
onClick: (e) => onNavClick ? onNavClick(e, item.path) : void 0,
|
|
6627
|
+
className: `flex items-center gap-3 px-3 py-2 rounded-full transition-all outline-none group shrink-0 ${isCurrentRoute ? "bg-neutral-100 text-black " : "text-neutral-500 hover:text-black hover:bg-neutral-50"}`,
|
|
6628
|
+
title: isCollapsed && !isMobileOpen ? item.name : void 0
|
|
6629
|
+
},
|
|
6630
|
+
/* @__PURE__ */ import_react99.default.createElement(
|
|
6631
|
+
import_react100.HugeiconsIcon,
|
|
6632
|
+
{
|
|
6633
|
+
icon: item.icon,
|
|
6634
|
+
size: 18,
|
|
6635
|
+
className: `shrink-0 transition-colors ${isCurrentRoute ? "text-black" : "text-neutral-400 group-hover:text-black"}`
|
|
6636
|
+
}
|
|
6637
|
+
),
|
|
6638
|
+
(!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-xs tracking-wide truncate" }, item.name)
|
|
6639
|
+
);
|
|
6640
|
+
})),
|
|
6641
|
+
/* @__PURE__ */ import_react99.default.createElement("div", { className: "p-4 shrink-0 flex flex-col gap-2 " }, (showWorkspaceSwitcher || showLogoutAction) && /* @__PURE__ */ import_react99.default.createElement("div", { className: `flex gap-2 px-1 pb-2 ${isCollapsed && !isMobileOpen ? "flex-col items-center" : "flex-col items-start md:flex-row md:items-center"}` }, showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react99.default.createElement(
|
|
6642
|
+
"button",
|
|
6643
|
+
{
|
|
6644
|
+
onClick: () => setShowSwitcherDialog(true),
|
|
6645
|
+
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
6646
|
+
title: "Switch Workspace"
|
|
6647
|
+
},
|
|
6648
|
+
/* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.UserIcon, size: 16 })
|
|
6649
|
+
), showLogoutAction && /* @__PURE__ */ import_react99.default.createElement(
|
|
6650
|
+
"button",
|
|
6651
|
+
{
|
|
6652
|
+
onClick: () => setShowLogoutDialog(true),
|
|
6653
|
+
className: "w-8 h-8 shrink-0 rounded-full bg-neutral-50 flex items-center justify-center text-neutral-500 hover:text-black hover:bg-neutral-100 transition-all outline-none",
|
|
6654
|
+
title: "Secure Logout"
|
|
6655
|
+
},
|
|
6656
|
+
/* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.LogoutCircle02Icon, size: 16 })
|
|
6657
|
+
)), /* @__PURE__ */ import_react99.default.createElement("div", { className: "hidden md:block" }, /* @__PURE__ */ import_react99.default.createElement(
|
|
6658
|
+
"button",
|
|
6659
|
+
{
|
|
6660
|
+
onClick: () => setIsCollapsed(!isCollapsed),
|
|
6661
|
+
className: "flex items-center justify-center md:justify-start gap-3 w-full p-2.5 rounded-full text-neutral-500 hover:text-black hover:bg-neutral-50 transition-colors outline-none"
|
|
6662
|
+
},
|
|
6663
|
+
/* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
|
|
6664
|
+
!isCollapsed && /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-xs" }, "Collapse")
|
|
6665
|
+
)))
|
|
6666
|
+
), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react99.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react99.default.createElement(
|
|
6667
|
+
"div",
|
|
6668
|
+
{
|
|
6669
|
+
className: "absolute inset-0 bg-black/30",
|
|
6670
|
+
onClick: () => setShowSwitcherDialog(false)
|
|
6671
|
+
}
|
|
6672
|
+
), /* @__PURE__ */ import_react99.default.createElement("div", { className: "relative w-full max-w-sm bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react99.default.createElement("div", { className: "p-5 text-center w-full" }, /* @__PURE__ */ import_react99.default.createElement("h3", { className: " font-serif text-[17px] text-black tracking-tight mb-1" }, "Switch Workspace"), /* @__PURE__ */ import_react99.default.createElement("p", { className: "text-[11px] text-neutral-500 leading-snug" }, "Select an organization to switch your current context.")), /* @__PURE__ */ import_react99.default.createElement("div", { className: "max-h-75 overflow-y-auto w-full custom-scrollbar" }, workspaces.map((org) => /* @__PURE__ */ import_react99.default.createElement(
|
|
6673
|
+
"button",
|
|
6674
|
+
{
|
|
6675
|
+
key: org.id,
|
|
6676
|
+
onClick: () => {
|
|
6677
|
+
if (onSwitchWorkspace) onSwitchWorkspace(org.id);
|
|
6678
|
+
setShowSwitcherDialog(false);
|
|
6679
|
+
},
|
|
6680
|
+
className: "w-full text-left px-5 py-4 flex items-center justify-between hover:bg-neutral-50 transition-colors group outline-none last:border-0"
|
|
6681
|
+
},
|
|
6682
|
+
/* @__PURE__ */ import_react99.default.createElement("div", { className: "flex flex-col truncate pr-4" }, /* @__PURE__ */ import_react99.default.createElement("span", { className: `text-[13px] truncate ${activeWorkspaceId === org.id ? "text-black" : "text-neutral-600 group-hover:text-black"}` }, org.name), /* @__PURE__ */ import_react99.default.createElement("span", { className: "text-[9px] text-neutral-400 tracking-[0.2em] mt-1 uppercase" }, "Role: ", org.role)),
|
|
6683
|
+
activeWorkspaceId === org.id && /* @__PURE__ */ import_react99.default.createElement(import_react100.HugeiconsIcon, { icon: import_core_free_icons39.CheckmarkCircle01Icon, size: 16, className: "text-black shrink-0" })
|
|
6684
|
+
))), /* @__PURE__ */ import_react99.default.createElement("div", { className: "w-full flex mt-auto" }, /* @__PURE__ */ import_react99.default.createElement(
|
|
6685
|
+
"button",
|
|
6686
|
+
{
|
|
6687
|
+
onClick: () => setShowSwitcherDialog(false),
|
|
6688
|
+
className: "w-full py-3.5 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors outline-none"
|
|
6689
|
+
},
|
|
6690
|
+
"Cancel"
|
|
6691
|
+
)))), /* @__PURE__ */ import_react99.default.createElement(
|
|
6692
|
+
ConfirmationDialog,
|
|
6693
|
+
{
|
|
6694
|
+
isOpen: showLogoutDialog && showLogoutAction,
|
|
6695
|
+
title: "Secure Logout",
|
|
6696
|
+
message: "Are you sure you want to log out? You will need to authenticate to return.",
|
|
6697
|
+
confirmText: "Log Out",
|
|
6698
|
+
cancelText: "Cancel",
|
|
6699
|
+
isProcessing: isLoggingOut,
|
|
6700
|
+
isDestructive: true,
|
|
6701
|
+
onClose: () => !isLoggingOut && setShowLogoutDialog(false),
|
|
6702
|
+
onConfirm: handleLogoutInitiation
|
|
6703
|
+
}
|
|
6704
|
+
));
|
|
6705
|
+
}
|
|
6706
|
+
|
|
6707
|
+
// src/components/UniversalSettings2.tsx
|
|
6708
|
+
var import_react101 = __toESM(require("react"));
|
|
6709
|
+
var import_react_hot_toast19 = __toESM(require("react-hot-toast"));
|
|
6710
|
+
var import_react102 = require("@hugeicons/react");
|
|
6711
|
+
var import_core_free_icons40 = require("@hugeicons/core-free-icons");
|
|
6712
|
+
var MemberAvatar5 = ({ src, status, sizeClass = "w-10 h-10" }) => {
|
|
6713
|
+
const [loaded, setLoaded] = (0, import_react101.useState)(false);
|
|
6714
|
+
const [error, setError] = (0, import_react101.useState)(false);
|
|
6715
|
+
const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/avatar.avif";
|
|
6716
|
+
const finalSrc = error || !src ? defaultAvatar : src;
|
|
6717
|
+
const getStatusColor = () => {
|
|
6718
|
+
switch (status?.toUpperCase()) {
|
|
6719
|
+
case "ACTIVE":
|
|
6720
|
+
return "bg-emerald-500";
|
|
6721
|
+
case "BUSY":
|
|
6722
|
+
return "bg-amber-500";
|
|
6723
|
+
case "OFFLINE":
|
|
6724
|
+
return "bg-[#d97757]";
|
|
6725
|
+
case "AWAY":
|
|
6726
|
+
return "bg-stone-400";
|
|
6727
|
+
default:
|
|
6728
|
+
return "bg-stone-200";
|
|
6729
|
+
}
|
|
6730
|
+
};
|
|
6731
|
+
return /* @__PURE__ */ import_react101.default.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full h-full rounded-lg bg-stone-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, className: "animate-spin text-stone-400 absolute", size: 14 }), /* @__PURE__ */ import_react101.default.createElement("img", { src: finalSrc, alt: "Member", className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`, onLoad: () => setLoaded(true), onError: () => setError(true) })), /* @__PURE__ */ import_react101.default.createElement("div", { className: `absolute -bottom-1 -right-1 w-3.5 h-3.5 rounded-full border-2 border-white z-10 ${getStatusColor()}` }));
|
|
6732
|
+
};
|
|
6733
|
+
var OrgAvatar3 = ({ src, sizeClass = "w-10 h-10" }) => {
|
|
6734
|
+
const [loaded, setLoaded] = (0, import_react101.useState)(false);
|
|
6735
|
+
const [error, setError] = (0, import_react101.useState)(false);
|
|
6736
|
+
const defaultAvatar = "https://storage.googleapis.com/retina-cloud-v2/assets/images/office_a.avif";
|
|
6737
|
+
const finalSrc = error || !src ? defaultAvatar : src;
|
|
6738
|
+
return /* @__PURE__ */ import_react101.default.createElement("div", { className: `relative shrink-0 ${sizeClass}` }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full h-full rounded-lg bg-stone-100 flex items-center justify-center overflow-hidden" }, !loaded && !error && /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, className: "animate-spin text-stone-400 absolute", size: 14 }), /* @__PURE__ */ import_react101.default.createElement(
|
|
6739
|
+
"img",
|
|
6740
|
+
{
|
|
6741
|
+
src: finalSrc,
|
|
6742
|
+
alt: "Workspace Avatar",
|
|
6743
|
+
className: `w-full h-full object-cover transition-opacity duration-300 ${loaded || error ? "opacity-100" : "opacity-0"}`,
|
|
6744
|
+
onLoad: () => setLoaded(true),
|
|
6745
|
+
onError: () => setError(true)
|
|
6746
|
+
}
|
|
6747
|
+
)));
|
|
6748
|
+
};
|
|
6749
|
+
var PageSpinner10 = () => /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex justify-center items-center py-12" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 32, className: "animate-spin mb-4 text-black" }));
|
|
6750
|
+
var InputSpinner4 = () => /* @__PURE__ */ import_react101.default.createElement("svg", { className: "animate-spin h-4 w-4 text-stone-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react101.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react101.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" }));
|
|
6751
|
+
var UniversalSettings2 = ({
|
|
6752
|
+
accountType,
|
|
6753
|
+
userRole,
|
|
6754
|
+
members = [],
|
|
6755
|
+
isMembersLoading = false,
|
|
6756
|
+
membersCurrentPage = 1,
|
|
6757
|
+
membersTotalPages = 1,
|
|
6758
|
+
onMembersPageChange = () => {
|
|
6759
|
+
},
|
|
6760
|
+
membersSearchQuery = "",
|
|
6761
|
+
onMembersSearchChange = () => {
|
|
6762
|
+
},
|
|
6763
|
+
activeStatusFilter = "ALL",
|
|
6764
|
+
onStatusFilterChange = () => {
|
|
6765
|
+
},
|
|
6766
|
+
activeRoleFilter = "ALL",
|
|
6767
|
+
onRoleFilterChange = () => {
|
|
6768
|
+
},
|
|
6769
|
+
onRemoveMember,
|
|
6770
|
+
onInviteMember,
|
|
6771
|
+
onUpdateRole,
|
|
6772
|
+
initialOrgName = "",
|
|
6773
|
+
initialOrgSlug = "",
|
|
6774
|
+
initialOrgAvatarUrl = "",
|
|
6775
|
+
initialFullName = "",
|
|
6776
|
+
initialEmail = "",
|
|
6777
|
+
initialJobTitle = "",
|
|
6778
|
+
initialDescription = "",
|
|
6779
|
+
initialAvatarUrl = "",
|
|
6780
|
+
onSaveProfile,
|
|
6781
|
+
onSaveOrganization,
|
|
6782
|
+
onCheckSlugAvailability,
|
|
6783
|
+
onUploadAvatar
|
|
6784
|
+
}) => {
|
|
6785
|
+
const isOrg = accountType === "ORGANIZATION";
|
|
6786
|
+
const safeRole = String(userRole || "").toUpperCase().trim();
|
|
6787
|
+
const canManage = ["ADMIN", "MANAGER", "OWNER"].includes(safeRole);
|
|
6788
|
+
const [activeTab, setActiveTab] = (0, import_react101.useState)(isOrg ? "MEMBERS" : "ACCOUNT");
|
|
6789
|
+
const [expandedId, setExpandedId] = (0, import_react101.useState)(null);
|
|
6790
|
+
const [memberToRemove, setMemberToRemove] = (0, import_react101.useState)(null);
|
|
6791
|
+
const [isRemoving, setIsRemoving] = (0, import_react101.useState)(false);
|
|
6792
|
+
const [isInviteMode, setIsInviteMode] = (0, import_react101.useState)(false);
|
|
6793
|
+
const [inviteEmail, setInviteEmail] = (0, import_react101.useState)("");
|
|
6794
|
+
const [isInviting, setIsInviting] = (0, import_react101.useState)(false);
|
|
6795
|
+
const [localSearchQuery, setLocalSearchQuery] = (0, import_react101.useState)(membersSearchQuery);
|
|
6796
|
+
const [isTyping, setIsTyping] = (0, import_react101.useState)(false);
|
|
6797
|
+
const isFirstSearchMount = (0, import_react101.useRef)(true);
|
|
6798
|
+
const [isStatusModalOpen, setIsStatusModalOpen] = (0, import_react101.useState)(false);
|
|
6799
|
+
const [isRoleModalOpen, setIsRoleModalOpen] = (0, import_react101.useState)(false);
|
|
6800
|
+
const [roleEditTarget, setRoleEditTarget] = (0, import_react101.useState)(null);
|
|
6801
|
+
const [isUpdatingRole, setIsUpdatingRole] = (0, import_react101.useState)(false);
|
|
6802
|
+
const [orgName, setOrgName] = (0, import_react101.useState)(initialOrgName);
|
|
6803
|
+
const [orgSlug, setOrgSlug] = (0, import_react101.useState)(initialOrgSlug);
|
|
6804
|
+
const [orgAvatarUrl, setOrgAvatarUrl] = (0, import_react101.useState)(initialOrgAvatarUrl);
|
|
6805
|
+
const [firstName, setFirstName] = (0, import_react101.useState)("");
|
|
6806
|
+
const [lastName, setLastName] = (0, import_react101.useState)("");
|
|
6807
|
+
const [jobTitle, setJobTitle] = (0, import_react101.useState)(initialJobTitle);
|
|
6808
|
+
const [description, setDescription] = (0, import_react101.useState)(initialDescription);
|
|
6809
|
+
const [avatarUrl, setAvatarUrl] = (0, import_react101.useState)(initialAvatarUrl);
|
|
6810
|
+
const [isCheckingSlug, setIsCheckingSlug] = (0, import_react101.useState)(false);
|
|
6811
|
+
const [slugAvailable, setSlugAvailable] = (0, import_react101.useState)(null);
|
|
6812
|
+
const [isSavingOrg, setIsSavingOrg] = (0, import_react101.useState)(false);
|
|
6813
|
+
const [isSavingProfile, setIsSavingProfile] = (0, import_react101.useState)(false);
|
|
6814
|
+
const orgFileInputRef = (0, import_react101.useRef)(null);
|
|
6815
|
+
const userFileInputRef = (0, import_react101.useRef)(null);
|
|
6816
|
+
const [pendingOrgAvatar, setPendingOrgAvatar] = (0, import_react101.useState)(null);
|
|
6817
|
+
const [pendingUserAvatar, setPendingUserAvatar] = (0, import_react101.useState)(null);
|
|
6818
|
+
const [isUploadingOrgAvatar, setIsUploadingOrgAvatar] = (0, import_react101.useState)(false);
|
|
6819
|
+
const [isUploadingUserAvatar, setIsUploadingUserAvatar] = (0, import_react101.useState)(false);
|
|
6820
|
+
(0, import_react101.useEffect)(() => {
|
|
6821
|
+
setOrgName(initialOrgName || "");
|
|
6822
|
+
setOrgSlug(initialOrgSlug || "");
|
|
6823
|
+
setOrgAvatarUrl(initialOrgAvatarUrl || "");
|
|
6824
|
+
const parts = (initialFullName || "").split(" ");
|
|
6825
|
+
setFirstName(parts[0] || "");
|
|
6826
|
+
setLastName(parts.slice(1).join(" ") || "");
|
|
6827
|
+
setJobTitle(initialJobTitle || "");
|
|
6828
|
+
setDescription(initialDescription || "");
|
|
6829
|
+
setAvatarUrl(initialAvatarUrl || "");
|
|
6830
|
+
}, [initialOrgName, initialOrgSlug, initialOrgAvatarUrl, initialFullName, initialJobTitle, initialDescription, initialAvatarUrl]);
|
|
6831
|
+
const handleFileSelect = (e, type) => {
|
|
6832
|
+
const file = e.target.files?.[0];
|
|
6833
|
+
if (!file) return;
|
|
6834
|
+
if (file.size > 1024 * 1024) {
|
|
6835
|
+
import_react_hot_toast19.default.error("Image size must be less than 1MB.");
|
|
6836
|
+
e.target.value = "";
|
|
6837
|
+
return;
|
|
6838
|
+
}
|
|
6839
|
+
const validTypes = ["image/jpeg", "image/jpg", "image/png"];
|
|
6840
|
+
if (!validTypes.includes(file.type)) {
|
|
6841
|
+
import_react_hot_toast19.default.error("Only PNG and JPEG images are allowed.");
|
|
6842
|
+
e.target.value = "";
|
|
6843
|
+
return;
|
|
6844
|
+
}
|
|
6845
|
+
const previewUrl = URL.createObjectURL(file);
|
|
6846
|
+
if (type === "USER") {
|
|
6847
|
+
setPendingUserAvatar(file);
|
|
6848
|
+
setAvatarUrl(previewUrl);
|
|
6849
|
+
} else if (type === "ORGANIZATION") {
|
|
6850
|
+
setPendingOrgAvatar(file);
|
|
6851
|
+
setOrgAvatarUrl(previewUrl);
|
|
6852
|
+
}
|
|
6853
|
+
e.target.value = "";
|
|
6854
|
+
};
|
|
6855
|
+
(0, import_react101.useEffect)(() => {
|
|
6856
|
+
if (activeTab !== "MEMBERS") return;
|
|
6857
|
+
if (isFirstSearchMount.current) {
|
|
6858
|
+
isFirstSearchMount.current = false;
|
|
6859
|
+
return;
|
|
6860
|
+
}
|
|
6861
|
+
setIsTyping(true);
|
|
6862
|
+
const handler = setTimeout(() => {
|
|
6863
|
+
onMembersSearchChange(localSearchQuery);
|
|
6864
|
+
setIsTyping(false);
|
|
6865
|
+
}, 600);
|
|
6866
|
+
return () => clearTimeout(handler);
|
|
6867
|
+
}, [localSearchQuery, activeTab]);
|
|
6868
|
+
const cleanEmailId = (val) => val.toLowerCase().replace(/[^a-z0-9@._-]/g, "");
|
|
6869
|
+
const handleOrgSlugChange = (val) => setOrgSlug(val.toLowerCase().replace(/[^a-z0-9-]/g, "").replace(/-+/g, "-").substring(0, 50));
|
|
6870
|
+
const handleOrgNameChange = (val) => setOrgName(val.replace(/[^a-zA-Z0-9\s-]/g, "").substring(0, 50));
|
|
6871
|
+
const handleConfirmRemove = async () => {
|
|
6872
|
+
if (!memberToRemove || !onRemoveMember) return;
|
|
6873
|
+
setIsRemoving(true);
|
|
6874
|
+
try {
|
|
6875
|
+
await onRemoveMember(memberToRemove.userId);
|
|
6876
|
+
import_react_hot_toast19.default.success("Member removed successfully.");
|
|
6877
|
+
setExpandedId(null);
|
|
6878
|
+
setMemberToRemove(null);
|
|
6879
|
+
} catch (error) {
|
|
6880
|
+
import_react_hot_toast19.default.error(error.message || "Failed to remove member.");
|
|
6881
|
+
} finally {
|
|
6882
|
+
setIsRemoving(false);
|
|
6883
|
+
}
|
|
6884
|
+
};
|
|
6885
|
+
const handleInviteSubmit = async (e) => {
|
|
6886
|
+
e.preventDefault();
|
|
6887
|
+
if (inviteEmail.length < 5 || isInviting || !onInviteMember) return;
|
|
6888
|
+
setIsInviting(true);
|
|
6889
|
+
try {
|
|
6890
|
+
await onInviteMember(inviteEmail);
|
|
6891
|
+
setInviteEmail("");
|
|
6892
|
+
setIsInviteMode(false);
|
|
6893
|
+
} catch (error) {
|
|
6894
|
+
import_react_hot_toast19.default.error(error.message || "Failed to send invitation.");
|
|
6895
|
+
} finally {
|
|
6896
|
+
setIsInviting(false);
|
|
6897
|
+
}
|
|
6898
|
+
};
|
|
6899
|
+
const handleRoleUpdate = async (newRole) => {
|
|
6900
|
+
if (!roleEditTarget || !onUpdateRole) return;
|
|
6901
|
+
setIsUpdatingRole(true);
|
|
6902
|
+
const targetId = roleEditTarget.userId;
|
|
6903
|
+
setRoleEditTarget(null);
|
|
6904
|
+
try {
|
|
6905
|
+
await onUpdateRole(targetId, newRole);
|
|
6906
|
+
} catch (error) {
|
|
6907
|
+
} finally {
|
|
6908
|
+
setIsUpdatingRole(false);
|
|
6909
|
+
}
|
|
6910
|
+
};
|
|
6911
|
+
const activeExpandedMember = expandedId ? members.find((m) => m.id === expandedId) : null;
|
|
6912
|
+
(0, import_react101.useEffect)(() => {
|
|
6913
|
+
if (!isOrg || !orgSlug || orgSlug === initialOrgSlug) {
|
|
6914
|
+
setSlugAvailable(null);
|
|
6915
|
+
setIsCheckingSlug(false);
|
|
6916
|
+
return;
|
|
6917
|
+
}
|
|
6918
|
+
if (orgSlug.length < 3) {
|
|
6919
|
+
setSlugAvailable(false);
|
|
6920
|
+
setIsCheckingSlug(false);
|
|
6921
|
+
return;
|
|
6922
|
+
}
|
|
6923
|
+
setIsCheckingSlug(true);
|
|
6924
|
+
setSlugAvailable(null);
|
|
6925
|
+
const checkTimer = setTimeout(async () => {
|
|
6926
|
+
try {
|
|
6927
|
+
if (onCheckSlugAvailability) {
|
|
6928
|
+
const res = await onCheckSlugAvailability(orgSlug);
|
|
6929
|
+
setSlugAvailable(res.available);
|
|
6930
|
+
}
|
|
6931
|
+
} catch (error) {
|
|
6932
|
+
setSlugAvailable(null);
|
|
6933
|
+
} finally {
|
|
6934
|
+
setIsCheckingSlug(false);
|
|
6935
|
+
}
|
|
6936
|
+
}, 1500);
|
|
6937
|
+
return () => clearTimeout(checkTimer);
|
|
6938
|
+
}, [orgSlug, initialOrgSlug, onCheckSlugAvailability, isOrg]);
|
|
6939
|
+
const handleSaveOrganization = async (e) => {
|
|
6940
|
+
e.preventDefault();
|
|
6941
|
+
if (isSavingOrg || isCheckingSlug || !canManage || !onSaveOrganization) return;
|
|
6942
|
+
if (orgSlug !== initialOrgSlug && slugAvailable === false) return import_react_hot_toast19.default.error("Address handle unavailable.");
|
|
6943
|
+
setIsSavingOrg(true);
|
|
6944
|
+
try {
|
|
6945
|
+
let finalAvatarUrl = orgAvatarUrl;
|
|
6946
|
+
if (pendingOrgAvatar && onUploadAvatar) {
|
|
6947
|
+
setIsUploadingOrgAvatar(true);
|
|
6948
|
+
try {
|
|
6949
|
+
const res2 = await onUploadAvatar(pendingOrgAvatar, "ORGANIZATION");
|
|
6950
|
+
if (res2?.url) {
|
|
6951
|
+
finalAvatarUrl = res2.url;
|
|
6952
|
+
setOrgAvatarUrl(finalAvatarUrl);
|
|
6953
|
+
}
|
|
6954
|
+
} catch (err) {
|
|
6955
|
+
import_react_hot_toast19.default.error("Failed to securely upload workspace avatar.");
|
|
6956
|
+
setIsSavingOrg(false);
|
|
6957
|
+
setIsUploadingOrgAvatar(false);
|
|
6958
|
+
return;
|
|
6959
|
+
}
|
|
6960
|
+
setPendingOrgAvatar(null);
|
|
6961
|
+
setIsUploadingOrgAvatar(false);
|
|
6962
|
+
}
|
|
6963
|
+
const res = await onSaveOrganization({ name: orgName, slug: orgSlug, avatarUrl: finalAvatarUrl });
|
|
6964
|
+
if (res.success) import_react_hot_toast19.default.success("Workspace updated successfully.");
|
|
6965
|
+
else import_react_hot_toast19.default.error(res.error || "Failed to update workspace.");
|
|
6966
|
+
} catch (error) {
|
|
6967
|
+
import_react_hot_toast19.default.error("Service unavailable.");
|
|
6968
|
+
} finally {
|
|
6969
|
+
setIsSavingOrg(false);
|
|
6970
|
+
setIsUploadingOrgAvatar(false);
|
|
6971
|
+
}
|
|
6972
|
+
};
|
|
6973
|
+
const handleSaveProfile = async (e) => {
|
|
6974
|
+
e.preventDefault();
|
|
6975
|
+
if (isSavingProfile || !onSaveProfile) return;
|
|
6976
|
+
setIsSavingProfile(true);
|
|
6977
|
+
try {
|
|
6978
|
+
let finalAvatarUrl = avatarUrl;
|
|
6979
|
+
if (pendingUserAvatar && onUploadAvatar) {
|
|
6980
|
+
setIsUploadingUserAvatar(true);
|
|
6981
|
+
try {
|
|
6982
|
+
const res2 = await onUploadAvatar(pendingUserAvatar, "USER");
|
|
6983
|
+
if (res2?.url) {
|
|
6984
|
+
finalAvatarUrl = res2.url;
|
|
6985
|
+
setAvatarUrl(finalAvatarUrl);
|
|
6986
|
+
}
|
|
6987
|
+
} catch (err) {
|
|
6988
|
+
import_react_hot_toast19.default.error("Failed to securely upload profile avatar.");
|
|
6989
|
+
setIsSavingProfile(false);
|
|
6990
|
+
setIsUploadingUserAvatar(false);
|
|
6991
|
+
return;
|
|
6992
|
+
}
|
|
6993
|
+
setPendingUserAvatar(null);
|
|
6994
|
+
setIsUploadingUserAvatar(false);
|
|
6995
|
+
}
|
|
6996
|
+
const res = await onSaveProfile({ firstName, lastName, jobTitle, description, avatarUrl: finalAvatarUrl });
|
|
6997
|
+
if (res.success) import_react_hot_toast19.default.success("Identity updated successfully.");
|
|
6998
|
+
else import_react_hot_toast19.default.error(res.error || "Failed to update identity.");
|
|
6999
|
+
} catch (error) {
|
|
7000
|
+
import_react_hot_toast19.default.error("Service unavailable.");
|
|
7001
|
+
} finally {
|
|
7002
|
+
setIsSavingProfile(false);
|
|
7003
|
+
setIsUploadingUserAvatar(false);
|
|
7004
|
+
}
|
|
7005
|
+
};
|
|
7006
|
+
const hasOrgChanges = orgName !== initialOrgName || orgSlug !== initialOrgSlug || orgAvatarUrl !== initialOrgAvatarUrl;
|
|
7007
|
+
const isOrgSaveDisabled = isSavingOrg || !canManage || isCheckingSlug || !hasOrgChanges || orgName.length < 3 || orgSlug.length < 3 || orgSlug !== initialOrgSlug && slugAvailable === false;
|
|
7008
|
+
const hasProfileChanges = `${firstName} ${lastName}`.trim() !== initialFullName || jobTitle !== initialJobTitle || description !== initialDescription || avatarUrl !== initialAvatarUrl;
|
|
7009
|
+
const isProfileSaveDisabled = isSavingProfile || !hasProfileChanges || firstName.length < 2 || lastName.length < 2;
|
|
7010
|
+
const tabs = [];
|
|
7011
|
+
if (isOrg) {
|
|
7012
|
+
tabs.push({ id: "MEMBERS", label: "Members" });
|
|
7013
|
+
tabs.push({ id: "ORGANIZATION", label: "Organization" });
|
|
7014
|
+
}
|
|
7015
|
+
tabs.push({ id: "ACCOUNT", label: "Profile" });
|
|
7016
|
+
return /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 mb-8 px-1" }, /* @__PURE__ */ import_react101.default.createElement(
|
|
7017
|
+
"button",
|
|
7018
|
+
{
|
|
7019
|
+
onClick: () => window.dispatchEvent(new Event("open-sidebar")),
|
|
7020
|
+
className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
|
|
7021
|
+
"aria-label": "Open Menu"
|
|
7022
|
+
},
|
|
7023
|
+
/* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.SidebarLeft01Icon, size: 18 })
|
|
7024
|
+
), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react101.default.createElement("h1", { className: "text-black text-xl tracking-tight" }, "System Settings"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage your workspace identity, team configurations, and AI billing parameters."))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center justify-center mb-8 sm:mb-10 w-full animate-in fade-in duration-300 px-2" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center bg-white rounded-full p-1 sm:p-1.5 max-w-full overflow-x-auto custom-scrollbar" }, tabs.map((tab, idx) => {
|
|
7025
|
+
const isActive = activeTab === tab.id;
|
|
7026
|
+
return /* @__PURE__ */ import_react101.default.createElement(
|
|
7027
|
+
"button",
|
|
7028
|
+
{
|
|
7029
|
+
key: idx,
|
|
7030
|
+
onClick: () => {
|
|
7031
|
+
setActiveTab(tab.id);
|
|
7032
|
+
if (tab.id === "MEMBERS") {
|
|
7033
|
+
setExpandedId(null);
|
|
7034
|
+
setIsInviteMode(false);
|
|
7035
|
+
}
|
|
7036
|
+
},
|
|
7037
|
+
className: `px-4 py-1.5 rounded-full text-xs transition-all duration-200 outline-none whitespace-nowrap shrink-0 ${isActive ? "bg-stone-50 text-black" : "text-stone-500 hover:text-black hover:bg-stone-50/50"}`
|
|
7038
|
+
},
|
|
7039
|
+
tab.label
|
|
7040
|
+
);
|
|
7041
|
+
}))), activeTab === "MEMBERS" && isOrg && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement(
|
|
7042
|
+
ConfirmationDialog,
|
|
7043
|
+
{
|
|
7044
|
+
isOpen: !!memberToRemove,
|
|
7045
|
+
title: "Remove Member",
|
|
7046
|
+
message: `Are you sure you want to remove ${memberToRemove?.fullName}? This action cannot be undone.`,
|
|
7047
|
+
confirmText: "Remove",
|
|
7048
|
+
cancelText: "Cancel",
|
|
7049
|
+
isProcessing: isRemoving,
|
|
7050
|
+
isDestructive: true,
|
|
7051
|
+
onClose: () => setMemberToRemove(null),
|
|
7052
|
+
onConfirm: handleConfirmRemove
|
|
7053
|
+
}
|
|
7054
|
+
), !isInviteMode && !activeExpandedMember && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-row flex-nowrap mb-4 items-center justify-between gap-4 w-full px-1" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Search01Icon, size: 16, className: "text-stone-400" })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "text", placeholder: "Search members...", value: localSearchQuery, onChange: (e) => setLocalSearchQuery(e.target.value), className: "w-full pl-10 pr-4 py-2 bg-white rounded-full text-sm text-black placeholder-stone-400 outline-none transition-colors focus:border-[#d97757] border border-transparent " })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-3 w-auto pb-0 shrink-0" }, /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsStatusModalOpen(true), className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-stone-500 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.SearchList02Icon, size: 16 })), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsRoleModalOpen(true), className: "flex items-center justify-center bg-white w-9 h-9 rounded-full text-stone-500 hover:text-black transition-colors outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ListSettingIcon, size: 16 })))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 p-6 rounded-2xl bg-white w-full" }, activeExpandedMember ? /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col animate-in fade-in zoom-in-95 duration-300 w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "mb-6 flex w-full items-center" }, /* @__PURE__ */ import_react101.default.createElement(
|
|
7055
|
+
"button",
|
|
7056
|
+
{
|
|
7057
|
+
onClick: () => setExpandedId(null),
|
|
7058
|
+
disabled: isUpdatingRole,
|
|
7059
|
+
className: "flex items-center gap-2 text-[#d97757] hover:text-[#d97757] transition-colors text-sm outline-none disabled:opacity-50"
|
|
7060
|
+
},
|
|
7061
|
+
/* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowLeft01Icon, size: 16 }),
|
|
7062
|
+
" Back"
|
|
7063
|
+
)), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1 mb-8" }, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, "Member Profile"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "View and manage this member's access privileges.")), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 mb-4" }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: activeExpandedMember.avatarUrl, status: activeExpandedMember.status, sizeClass: "w-14 h-14" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-sm text-black tracking-tight truncate" }, activeExpandedMember.fullName), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-2 mt-0.5" }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-xs text-stone-500 capitalize" }, activeExpandedMember.role.toLowerCase()), canManage && (isUpdatingRole ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin text-stone-400 ml-1" }) : /* @__PURE__ */ import_react101.default.createElement(import_react101.default.Fragment, null, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-stone-300 text-xs px-0.5" }, "\u2022"), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setRoleEditTarget(activeExpandedMember), className: "text-xs text-[#d97757] hover:underline outline-none" }, "Edit"), /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-stone-300 text-xs px-0.5" }, "\u2022"), /* @__PURE__ */ import_react101.default.createElement(
|
|
7064
|
+
"button",
|
|
7065
|
+
{
|
|
7066
|
+
onClick: () => setMemberToRemove(activeExpandedMember),
|
|
7067
|
+
disabled: isUpdatingRole,
|
|
7068
|
+
className: "text-xs text-[#d97757] hover:underline outline-none disabled:opacity-50"
|
|
7069
|
+
},
|
|
7070
|
+
"Remove"
|
|
7071
|
+
))))))) : /* @__PURE__ */ import_react101.default.createElement(import_react101.default.Fragment, null, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-row items-center justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl tracking-tight" }, isInviteMode ? "Add Member" : "Team Directory"), !isInviteMode && canManage && /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => setIsInviteMode(true), className: "shrink-0 px-4 py-1.5 border border-stone-200 text-black text-xs tracking-wide rounded-full hover:bg-stone-50 transition-colors outline-none" }, "Invite Team")), !isInviteMode && /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage members and access controls across your organization.")), /* @__PURE__ */ import_react101.default.createElement("div", { className: "w-full overflow-hidden" }, isInviteMode ? /* @__PURE__ */ import_react101.default.createElement("form", { onSubmit: handleInviteSubmit, className: "flex flex-col gap-8 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 mt-2" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ import_react101.default.createElement("input", { type: "email", value: inviteEmail, onChange: (e) => setInviteEmail(cleanEmailId(e.target.value)), required: true, autoFocus: true, className: "w-full px-2 py-3 bg-transparent text-sm border-b border-stone-200 text-black outline-none focus:border-black transition-all duration-300", placeholder: "name@company.com" })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: inviteEmail.length < 5 || isInviting, isLoading: isInviting, className: "w-full" }, "Send Invitation"), /* @__PURE__ */ import_react101.default.createElement("button", { type: "button", onClick: () => {
|
|
7072
|
+
setIsInviteMode(false);
|
|
7073
|
+
setInviteEmail("");
|
|
7074
|
+
}, disabled: isInviting, className: "w-full flex items-center justify-center py-2.5 rounded-full border border-stone-200 text-black hover:bg-stone-50 transition-colors outline-none text-xs tracking-wide" }, "Cancel"))) : isMembersLoading || isTyping ? /* @__PURE__ */ import_react101.default.createElement(PageSpinner10, null) : /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col min-w-0 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", null, members.length === 0 ? /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-400 py-6 text-center" }, "No members found") : members.map((member) => /* @__PURE__ */ import_react101.default.createElement("div", { key: member.id, onClick: () => setExpandedId(member.id), className: "flex items-center justify-between py-3 hover:bg-stone-50 transition-colors cursor-pointer group min-w-0 px-3 -mx-3 rounded-xl" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: member.avatarUrl, status: member.status }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "min-w-0 flex-1 flex flex-col gap-0.5" }, /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-sm text-black truncate" }, member.fullName), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500 capitalize truncate" }, member.role.toLowerCase())))))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center justify-between pt-6 mt-2 " }, /* @__PURE__ */ import_react101.default.createElement("span", { className: "text-xs text-stone-400 tracking-[0.2em]" }, "Page ", membersCurrentPage, " of ", membersTotalPages === 0 ? 1 : membersTotalPages), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => onMembersPageChange(membersCurrentPage - 1), disabled: membersCurrentPage <= 1 || isMembersLoading, className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("button", { onClick: () => onMembersPageChange(membersCurrentPage + 1), disabled: membersCurrentPage >= membersTotalPages || isMembersLoading || membersTotalPages === 0, className: "p-2 bg-white border border-stone-200 rounded-full text-black hover:bg-stone-50 disabled:opacity-30 disabled:cursor-not-allowed transition-all outline-none" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.ArrowRight01Icon, size: 14 })))))))), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: isStatusModalOpen, onClose: () => setIsStatusModalOpen(false), title: "Status Filter", options: ["ALL", "ACTIVE", "BUSY", "OFFLINE", "AWAY"], selectedOption: activeStatusFilter, onSelect: (status) => onStatusFilterChange(status) }), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: isRoleModalOpen, onClose: () => setIsRoleModalOpen(false), title: "Role Filter", options: ["ALL", "OWNER", "ADMIN", "MANAGER", "MEMBER", "GUEST"], selectedOption: activeRoleFilter, onSelect: (role) => onRoleFilterChange(role) }), /* @__PURE__ */ import_react101.default.createElement(ReusableOptions, { isOpen: !!roleEditTarget, onClose: () => setRoleEditTarget(null), title: "Modify Access Role", options: ["ADMIN", "MANAGER", "MEMBER"], selectedOption: roleEditTarget?.role || "", onSelect: handleRoleUpdate })), activeTab === "ORGANIZATION" && isOrg && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 animate-in rounded-2xl p-6 bg-white fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative group cursor-pointer shrink-0", onClick: () => canManage && !isSavingOrg ? orgFileInputRef.current?.click() : void 0 }, /* @__PURE__ */ import_react101.default.createElement(OrgAvatar3, { src: orgAvatarUrl, sizeClass: "w-14 h-14" }), canManage && /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute -bottom-1 -right-1 w-6 h-6 bg-white border border-stone-200 rounded-full flex items-center justify-center text-stone-500 group-hover:text-black transition-colors z-10" }, isUploadingOrgAvatar ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin" }) : /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CloudUploadIcon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "file", ref: orgFileInputRef, className: "hidden", accept: ".png, .jpg, .jpeg", onChange: (e) => handleFileSelect(e, "ORGANIZATION") })), /* @__PURE__ */ import_react101.default.createElement("div", null, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl mb-1 tracking-tight" }, "Workspace Details"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Manage your organizational identity and handles."))), !canManage && /* @__PURE__ */ import_react101.default.createElement("span", { className: "p-2 w-9 h-9 bg-stone-100 text-stone-400 rounded-full shrink-0" }, /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CircleLock02Icon, size: 18, className: "text-current" }))), /* @__PURE__ */ import_react101.default.createElement("form", { className: "flex flex-col gap-8 w-full max-w-5xl", onSubmit: handleSaveOrganization, autoComplete: "off" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Workspace Name", value: orgName, onChange: handleOrgNameChange, disabled: !canManage || isSavingOrg, placeholder: "Acme Corporation", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 relative w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Workspace Handle"), /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center relative w-full border-b border-stone-200 focus-within:border-black transition-all duration-300 overflow-hidden" }, /* @__PURE__ */ import_react101.default.createElement("input", { type: "text", value: orgSlug, disabled: !canManage || isSavingOrg, onChange: (e) => handleOrgSlugChange(e.target.value), spellCheck: "false", autoComplete: "off", className: "w-full pr-10 pl-0 py-3 text-sm bg-transparent text-black outline-none disabled:opacity-50 disabled:cursor-not-allowed", placeholder: "workspace-handle" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute right-2 top-1/2 -translate-y-1/2" }, isCheckingSlug && /* @__PURE__ */ import_react101.default.createElement(InputSpinner4, null), !isCheckingSlug && canManage && orgSlug !== initialOrgSlug && orgSlug.length >= 3 && slugAvailable === false && /* @__PURE__ */ import_react101.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-[#d97757]/10" }, /* @__PURE__ */ import_react101.default.createElement("svg", { className: "w-2 h-2 text-[#d97757]", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react101.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" }))), !isCheckingSlug && canManage && orgSlug !== initialOrgSlug && orgSlug.length >= 3 && slugAvailable === true && /* @__PURE__ */ import_react101.default.createElement("span", { className: "inline-flex items-center justify-center w-4 h-4 rounded-full bg-green-100" }, /* @__PURE__ */ import_react101.default.createElement("svg", { className: "w-2 h-2 text-green-600", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ import_react101.default.createElement("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M16.707 5.293a1 1 0 00-1.414 0L8 12.586 4.707 9.293a1 1 0 10-1.414 1.414l4 4a1 1 0 001.414 0l8-8a1 1 0 000-1.414z" })))))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "pt-8 mt-2 flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: isOrgSaveDisabled, isLoading: isSavingOrg, className: "min-w-32" }, "Save Changes"), hasOrgChanges && !isSavingOrg && canManage && /* @__PURE__ */ import_react101.default.createElement("button", { type: "button", onClick: () => {
|
|
7075
|
+
setOrgName(initialOrgName || "");
|
|
7076
|
+
setOrgSlug(initialOrgSlug || "");
|
|
7077
|
+
setOrgAvatarUrl(initialOrgAvatarUrl || "");
|
|
7078
|
+
setPendingOrgAvatar(null);
|
|
7079
|
+
}, className: "text-xs tracking-widest text-stone-400 hover:text-black transition-colors outline-none" }, "Cancel")))), activeTab === "ACCOUNT" && /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-6 animate-in fade-in duration-300" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex flex-col gap-8 rounded-2xl p-6 bg-white w-full" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "relative group cursor-pointer shrink-0", onClick: () => !isSavingProfile ? userFileInputRef.current?.click() : void 0 }, /* @__PURE__ */ import_react101.default.createElement(MemberAvatar5, { src: avatarUrl, status: "ACTIVE", sizeClass: "w-14 h-14" }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "absolute -bottom-1 -right-1 w-6 h-6 bg-white border border-stone-200 rounded-full flex items-center justify-center text-stone-500 group-hover:text-black transition-colors z-20" }, isUploadingUserAvatar ? /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.Loading03Icon, size: 12, className: "animate-spin" }) : /* @__PURE__ */ import_react101.default.createElement(import_react102.HugeiconsIcon, { icon: import_core_free_icons40.CloudUploadIcon, size: 14 })), /* @__PURE__ */ import_react101.default.createElement("input", { type: "file", ref: userFileInputRef, className: "hidden", accept: ".png, .jpg, .jpeg", onChange: (e) => handleFileSelect(e, "USER") })), /* @__PURE__ */ import_react101.default.createElement("div", null, /* @__PURE__ */ import_react101.default.createElement("h2", { className: "text-black text-xl mb-1 tracking-tight" }, "Personal Identity"), /* @__PURE__ */ import_react101.default.createElement("p", { className: "text-xs text-stone-500" }, "Update your system display name and contact email.")))), /* @__PURE__ */ import_react101.default.createElement("form", { className: "flex flex-col gap-6 w-full max-w-5xl", onSubmit: handleSaveProfile, autoComplete: "off" }, /* @__PURE__ */ import_react101.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "First Name", value: firstName, onChange: (v) => setFirstName(v.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50)), disabled: isSavingProfile, placeholder: "First name", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Last Name", value: lastName, onChange: (v) => setLastName(v.replace(/[^a-zA-Z\s-]/g, "").substring(0, 50)), disabled: isSavingProfile, placeholder: "Last name", maxLength: 50 })), /* @__PURE__ */ import_react101.default.createElement("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-6" }, /* @__PURE__ */ import_react101.default.createElement(TextInput, { label: "Job Title", value: jobTitle, onChange: (v) => setJobTitle(v.substring(0, 50)), disabled: isSavingProfile, placeholder: "e.g. HR Manager, CEO", maxLength: 50 }), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "Email Address"), /* @__PURE__ */ import_react101.default.createElement("input", { type: "email", value: initialEmail, disabled: true, className: "w-full pb-3 pt-3 text-sm bg-transparent text-stone-400 border-b border-stone-200 outline-none cursor-not-allowed" }))), /* @__PURE__ */ import_react101.default.createElement("div", { className: "space-y-1.5 w-full" }, /* @__PURE__ */ import_react101.default.createElement("label", { className: "text-xs text-stone-400 tracking-[0.2em] block" }, "About Me"), /* @__PURE__ */ import_react101.default.createElement(
|
|
7080
|
+
"textarea",
|
|
7081
|
+
{
|
|
7082
|
+
value: description,
|
|
7083
|
+
onChange: (e) => setDescription(e.target.value.substring(0, 300)),
|
|
7084
|
+
disabled: isSavingProfile,
|
|
7085
|
+
placeholder: "A short shout about yourself...",
|
|
7086
|
+
className: "w-full pb-3 pt-3 text-sm bg-transparent text-black border-b border-stone-200 outline-none focus:border-[#d97757] transition-all duration-300 resize-none h-20 custom-scrollbar",
|
|
7087
|
+
maxLength: 300
|
|
7088
|
+
}
|
|
7089
|
+
)), /* @__PURE__ */ import_react101.default.createElement("div", { className: "pt-4 flex items-center gap-4" }, /* @__PURE__ */ import_react101.default.createElement(ThreeDActionButton, { type: "submit", disabled: isProfileSaveDisabled, isLoading: isSavingProfile, className: "min-w-32" }, "Update Identity"))))));
|
|
7090
|
+
};
|
|
7091
|
+
|
|
7092
|
+
// src/components/UniversalDeveloperSettings.tsx
|
|
7093
|
+
var import_react103 = __toESM(require("react"));
|
|
7094
|
+
var import_react_hot_toast20 = require("react-hot-toast");
|
|
7095
|
+
var import_react104 = require("@hugeicons/react");
|
|
7096
|
+
var import_core_free_icons41 = require("@hugeicons/core-free-icons");
|
|
7097
|
+
var UniversalDeveloperSettings = ({
|
|
7098
|
+
initialPublicKey,
|
|
7099
|
+
initialWebhookUrl,
|
|
7100
|
+
isReadOnly = false,
|
|
7101
|
+
onGenerateKeys,
|
|
7102
|
+
onSaveWebhook
|
|
7103
|
+
}) => {
|
|
7104
|
+
const [publicKey, setPublicKey] = (0, import_react103.useState)(initialPublicKey);
|
|
7105
|
+
const [webhookUrl, setWebhookUrl] = (0, import_react103.useState)(initialWebhookUrl);
|
|
7106
|
+
const [isGenerating, setIsGenerating] = (0, import_react103.useState)(false);
|
|
7107
|
+
const [isSavingWebhook, setIsSavingWebhook] = (0, import_react103.useState)(false);
|
|
7108
|
+
const [isRollModalOpen, setIsRollModalOpen] = (0, import_react103.useState)(false);
|
|
7109
|
+
(0, import_react103.useEffect)(() => {
|
|
7110
|
+
setPublicKey(initialPublicKey || "");
|
|
7111
|
+
setWebhookUrl(initialWebhookUrl || "");
|
|
7112
|
+
}, [initialPublicKey, initialWebhookUrl]);
|
|
7113
|
+
const handleWebhookChange = (val) => {
|
|
7114
|
+
setWebhookUrl(val.trim());
|
|
7115
|
+
};
|
|
7116
|
+
const downloadEnvironmentFile = (pubKey, secKey) => {
|
|
7117
|
+
const envContent = `AUDDITUR_PUBLIC_KEY="${pubKey}"
|
|
7118
|
+
AUDDITUR_SECRET_KEY="${secKey}"
|
|
7119
|
+
`;
|
|
7120
|
+
const blob = new Blob([envContent], { type: "text/plain" });
|
|
7121
|
+
const url = URL.createObjectURL(blob);
|
|
7122
|
+
const link = document.createElement("a");
|
|
7123
|
+
link.href = url;
|
|
7124
|
+
link.download = "audditur_credentials.txt";
|
|
7125
|
+
document.body.appendChild(link);
|
|
7126
|
+
link.click();
|
|
7127
|
+
document.body.removeChild(link);
|
|
7128
|
+
URL.revokeObjectURL(url);
|
|
7129
|
+
};
|
|
7130
|
+
const handleGenerateKeys = async () => {
|
|
7131
|
+
if (isGenerating || isReadOnly) return;
|
|
7132
|
+
setIsGenerating(true);
|
|
7133
|
+
try {
|
|
7134
|
+
const res = await onGenerateKeys();
|
|
7135
|
+
if (res.success && res.data) {
|
|
7136
|
+
setPublicKey(res.data.publicKey);
|
|
7137
|
+
downloadEnvironmentFile(res.data.publicKey, res.data.secretKey);
|
|
7138
|
+
import_react_hot_toast20.toast.success("Keys generated. Check your downloads folder.");
|
|
7139
|
+
setIsRollModalOpen(false);
|
|
7140
|
+
} else {
|
|
7141
|
+
import_react_hot_toast20.toast.error(res.error || "Uh oh! Something went wrong.");
|
|
7142
|
+
}
|
|
7143
|
+
} catch (error) {
|
|
7144
|
+
import_react_hot_toast20.toast.error("Uh oh! Something went wrong.");
|
|
7145
|
+
} finally {
|
|
7146
|
+
setIsGenerating(false);
|
|
7147
|
+
}
|
|
7148
|
+
};
|
|
7149
|
+
const handleSaveWebhook = async (e) => {
|
|
7150
|
+
e.preventDefault();
|
|
7151
|
+
if (isSavingWebhook || isReadOnly) return;
|
|
7152
|
+
setIsSavingWebhook(true);
|
|
7153
|
+
try {
|
|
7154
|
+
const res = await onSaveWebhook(webhookUrl);
|
|
7155
|
+
if (res.success && res.data) {
|
|
7156
|
+
setWebhookUrl(res.data.webhookUrl || "");
|
|
7157
|
+
import_react_hot_toast20.toast.success("Webhook URL updated.");
|
|
7158
|
+
} else {
|
|
7159
|
+
import_react_hot_toast20.toast.error(res.error || "Uh oh! Something went wrong.");
|
|
7160
|
+
}
|
|
7161
|
+
} catch (error) {
|
|
7162
|
+
import_react_hot_toast20.toast.error("Uh oh! Something went wrong.");
|
|
7163
|
+
} finally {
|
|
7164
|
+
setIsSavingWebhook(false);
|
|
7165
|
+
}
|
|
7166
|
+
};
|
|
7167
|
+
const hasWebhookChanges = webhookUrl !== initialWebhookUrl;
|
|
7168
|
+
const isWebhookSaveDisabled = isSavingWebhook || isReadOnly || !hasWebhookChanges;
|
|
7169
|
+
return /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col max-w-3xl rounded-2xl p-6 bg-white gap-8 animate-in fade-in duration-300 min-h-full" }, /* @__PURE__ */ import_react103.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-3 sm:gap-4" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-4 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
|
|
7170
|
+
"button",
|
|
7171
|
+
{
|
|
7172
|
+
onClick: () => window.dispatchEvent(new Event("open-sidebar")),
|
|
7173
|
+
className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
|
|
7174
|
+
"aria-label": "Open Menu"
|
|
7175
|
+
},
|
|
7176
|
+
/* @__PURE__ */ import_react103.default.createElement(import_react104.HugeiconsIcon, { icon: import_core_free_icons41.SidebarLeft01Icon, size: 18 })
|
|
7177
|
+
), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("h1", { className: "font-serif text-xl text-black mb-1 truncate tracking-tight" }, "Developer Settings"), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-xs text-neutral-500 truncate" }, "Manage your API credentials and webhook integrations."))), isReadOnly && /* @__PURE__ */ import_react103.default.createElement("span", { className: "px-3 py-1 bg-neutral-50 text-neutral-500 rounded-full text-[10px] tracking-[0.2em] shrink-0 w-fit sm:mt-1" }, "Read Only Access")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "w-full max-w-2xl flex flex-col gap-12" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col gap-6" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
|
|
7178
|
+
TextInput,
|
|
7179
|
+
{
|
|
7180
|
+
label: "Public Key",
|
|
7181
|
+
value: publicKey || "No key generated yet",
|
|
7182
|
+
onChange: () => {
|
|
7183
|
+
},
|
|
7184
|
+
disabled: true
|
|
7185
|
+
}
|
|
7186
|
+
), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 leading-snug" }, "Your public key is used to identify your application. Your secret key will only be shown once upon generation.")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-4" }, /* @__PURE__ */ import_react103.default.createElement(
|
|
7187
|
+
ThreeDActionButton,
|
|
7188
|
+
{
|
|
7189
|
+
onClick: () => {
|
|
7190
|
+
if (publicKey) setIsRollModalOpen(true);
|
|
7191
|
+
else handleGenerateKeys();
|
|
7192
|
+
},
|
|
7193
|
+
disabled: isGenerating || isReadOnly,
|
|
7194
|
+
isLoading: isGenerating,
|
|
7195
|
+
className: "w-fit"
|
|
7196
|
+
},
|
|
7197
|
+
publicKey ? "Roll API Keys" : "Generate Keys"
|
|
7198
|
+
))), /* @__PURE__ */ import_react103.default.createElement("form", { className: "flex flex-col gap-6 border-t border-neutral-100 pt-8", onSubmit: handleSaveWebhook, autoComplete: "off" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "space-y-2 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement(
|
|
7199
|
+
TextInput,
|
|
7200
|
+
{
|
|
7201
|
+
label: "Webhook URL",
|
|
7202
|
+
value: webhookUrl,
|
|
7203
|
+
onChange: handleWebhookChange,
|
|
7204
|
+
disabled: isReadOnly || isSavingWebhook,
|
|
7205
|
+
placeholder: "https://your-domain.com/webhook",
|
|
7206
|
+
type: "url"
|
|
7207
|
+
}
|
|
7208
|
+
), /* @__PURE__ */ import_react103.default.createElement("p", { className: "text-[10px] text-neutral-400 mt-1 leading-snug" }, "We will send secure POST requests to this endpoint when significant events occur. Must use HTTPS.")), /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between mt-2 gap-6 sm:gap-4" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "flex items-center gap-6 min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react103.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] block truncate uppercase" }, "Webhook Status"), /* @__PURE__ */ import_react103.default.createElement("span", { className: `text-xs block truncate ${webhookUrl ? "text-emerald-600" : "text-neutral-400"}` }, webhookUrl ? "Active" : "Inactive"))), /* @__PURE__ */ import_react103.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" }, hasWebhookChanges && !isSavingWebhook && !isReadOnly && /* @__PURE__ */ import_react103.default.createElement(
|
|
7209
|
+
"button",
|
|
7210
|
+
{
|
|
7211
|
+
type: "button",
|
|
7212
|
+
onClick: () => setWebhookUrl(initialWebhookUrl),
|
|
7213
|
+
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"
|
|
7214
|
+
},
|
|
7215
|
+
"Cancel"
|
|
7216
|
+
), /* @__PURE__ */ import_react103.default.createElement(
|
|
7217
|
+
ThreeDActionButton,
|
|
7218
|
+
{
|
|
7219
|
+
type: "submit",
|
|
7220
|
+
disabled: isWebhookSaveDisabled,
|
|
7221
|
+
isLoading: isSavingWebhook,
|
|
7222
|
+
className: "min-w-32 w-full sm:w-auto"
|
|
7223
|
+
},
|
|
7224
|
+
"Save Webhook"
|
|
7225
|
+
))))), /* @__PURE__ */ import_react103.default.createElement(
|
|
7226
|
+
ConfirmationDialog,
|
|
7227
|
+
{
|
|
7228
|
+
isOpen: isRollModalOpen && !isReadOnly,
|
|
7229
|
+
title: "Roll API Keys",
|
|
7230
|
+
message: "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.",
|
|
7231
|
+
confirmText: "Roll Keys",
|
|
7232
|
+
cancelText: "Cancel",
|
|
7233
|
+
isProcessing: isGenerating,
|
|
7234
|
+
isDestructive: true,
|
|
7235
|
+
onClose: () => !isGenerating && setIsRollModalOpen(false),
|
|
7236
|
+
onConfirm: handleGenerateKeys
|
|
7237
|
+
}
|
|
7238
|
+
));
|
|
7239
|
+
};
|
|
7240
|
+
|
|
7241
|
+
// src/components/UniversalApplicationPage2.tsx
|
|
7242
|
+
var import_react105 = __toESM(require("react"));
|
|
7243
|
+
var import_react106 = require("@hugeicons/react");
|
|
7244
|
+
var import_core_free_icons42 = require("@hugeicons/core-free-icons");
|
|
7245
|
+
var UniversalApplicationPage2 = ({
|
|
7246
|
+
userRole = "MEMBER",
|
|
7247
|
+
applications,
|
|
7248
|
+
isLoading,
|
|
7249
|
+
currentPage,
|
|
7250
|
+
totalPages,
|
|
7251
|
+
onPageChange,
|
|
7252
|
+
searchQuery,
|
|
7253
|
+
onSearchChange,
|
|
7254
|
+
activeStatusFilter,
|
|
7255
|
+
onStatusFilterChange,
|
|
7256
|
+
onApplicationClick,
|
|
7257
|
+
onCreateApplication
|
|
7258
|
+
}) => {
|
|
7259
|
+
const canManage = userRole === "ADMIN" || userRole === "MANAGER" || userRole === "OWNER";
|
|
7260
|
+
const [showStatusModal, setShowStatusModal] = (0, import_react105.useState)(false);
|
|
7261
|
+
const [localSearchQuery, setLocalSearchQuery] = (0, import_react105.useState)(searchQuery);
|
|
7262
|
+
const typingTimer = (0, import_react105.useRef)(null);
|
|
7263
|
+
const handleSearchInput = (e) => {
|
|
7264
|
+
const val = e.target.value;
|
|
7265
|
+
setLocalSearchQuery(val);
|
|
7266
|
+
if (typingTimer.current) clearTimeout(typingTimer.current);
|
|
7267
|
+
typingTimer.current = setTimeout(() => {
|
|
7268
|
+
onSearchChange(val);
|
|
7269
|
+
}, 600);
|
|
7270
|
+
};
|
|
7271
|
+
const APPLICATION_STATUSES = [
|
|
7272
|
+
"ALL",
|
|
7273
|
+
"DRAFT",
|
|
7274
|
+
"COMPLETED",
|
|
7275
|
+
"PENDING",
|
|
7276
|
+
"REJECTED",
|
|
7277
|
+
"QUERIED",
|
|
7278
|
+
"AWAITING_PAYMENT"
|
|
7279
|
+
];
|
|
7280
|
+
return /* @__PURE__ */ import_react105.default.createElement("div", { className: "w-full max-w-3xl mx-auto flex flex-col animate-in fade-in duration-300 relative" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex items-center gap-4 mb-8 px-1" }, /* @__PURE__ */ import_react105.default.createElement(
|
|
7281
|
+
"button",
|
|
7282
|
+
{
|
|
7283
|
+
onClick: () => window.dispatchEvent(new Event("open-sidebar")),
|
|
7284
|
+
className: "md:hidden flex shrink-0 items-center justify-center w-10 h-10 bg-white rounded-full text-black transition-all duration-300 outline-none hover:bg-stone-50",
|
|
7285
|
+
"aria-label": "Open Menu"
|
|
7286
|
+
},
|
|
7287
|
+
/* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.SidebarLeft01Icon, size: 18 })
|
|
7288
|
+
), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex flex-col gap-1" }, /* @__PURE__ */ import_react105.default.createElement("h1", { className: "text-black text-xl tracking-tight" }, "Applications Directory"), /* @__PURE__ */ import_react105.default.createElement("p", { className: "text-xs text-stone-500" }, "Search, filter, and track all your organizational applications."))), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex flex-row flex-nowrap mb-2 items-center justify-between gap-4 w-full px-1" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "relative flex-1 min-w-0 max-w-full" }, /* @__PURE__ */ import_react105.default.createElement("div", { className: "absolute inset-y-0 left-0 pl-4 flex items-center pointer-events-none" }, /* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.Search01Icon, size: 16, className: "text-stone-400" })), /* @__PURE__ */ import_react105.default.createElement(
|
|
7289
|
+
"input",
|
|
7290
|
+
{
|
|
7291
|
+
type: "text",
|
|
7292
|
+
placeholder: "Search applications...",
|
|
7293
|
+
value: localSearchQuery,
|
|
7294
|
+
onChange: handleSearchInput,
|
|
7295
|
+
className: "w-full pl-10 pr-4 py-2.5 bg-white rounded-full text-sm text-black placeholder-stone-400 outline-none transition-colors focus:border-[#d97757] border border-transparent shadow-[0_2px_10px_rgba(0,0,0,0.02)]"
|
|
7296
|
+
}
|
|
7297
|
+
)), /* @__PURE__ */ import_react105.default.createElement("div", { className: "flex items-center gap-3 w-auto pb-0 shrink-0" }, /* @__PURE__ */ import_react105.default.createElement(
|
|
7298
|
+
"button",
|
|
7299
|
+
{
|
|
7300
|
+
onClick: () => setShowStatusModal(true),
|
|
7301
|
+
className: "flex items-center justify-center bg-white shadow-[0_2px_10px_rgba(0,0,0,0.02)] w-10 h-10 rounded-full text-stone-500 hover:text-black transition-colors outline-none relative"
|
|
7302
|
+
},
|
|
7303
|
+
/* @__PURE__ */ import_react105.default.createElement(import_react106.HugeiconsIcon, { icon: import_core_free_icons42.SearchList02Icon, size: 18 }),
|
|
7304
|
+
activeStatusFilter !== "ALL" && /* @__PURE__ */ import_react105.default.createElement("span", { className: "absolute top-2 right-2 w-2 h-2 bg-[#d97757] rounded-full border border-white" })
|
|
7305
|
+
))), /* @__PURE__ */ import_react105.default.createElement("div", { className: "w-full mt-2" }, /* @__PURE__ */ import_react105.default.createElement(
|
|
7306
|
+
UniversalApplicationsPage,
|
|
7307
|
+
{
|
|
7308
|
+
headerTitle: "Recent Filings",
|
|
7309
|
+
headerDescription: "",
|
|
7310
|
+
applications,
|
|
7311
|
+
isLoading,
|
|
7312
|
+
currentPage,
|
|
7313
|
+
totalPages,
|
|
7314
|
+
onPageChange,
|
|
7315
|
+
onApplicationClick,
|
|
7316
|
+
onCreateApplication: canManage ? onCreateApplication : void 0
|
|
7317
|
+
}
|
|
7318
|
+
)), /* @__PURE__ */ import_react105.default.createElement(
|
|
7319
|
+
ReusableOptions,
|
|
7320
|
+
{
|
|
7321
|
+
isOpen: showStatusModal,
|
|
7322
|
+
onClose: () => setShowStatusModal(false),
|
|
7323
|
+
title: "Filter by Status",
|
|
7324
|
+
options: APPLICATION_STATUSES,
|
|
7325
|
+
selectedOption: activeStatusFilter,
|
|
7326
|
+
onSelect: (status) => {
|
|
7327
|
+
onStatusFilterChange(status);
|
|
7328
|
+
setShowStatusModal(false);
|
|
7329
|
+
}
|
|
7330
|
+
}
|
|
7331
|
+
));
|
|
7332
|
+
};
|
|
6330
7333
|
// Annotate the CommonJS export names for ESM import in node:
|
|
6331
7334
|
0 && (module.exports = {
|
|
6332
7335
|
AppBento2,
|
|
@@ -6357,15 +7360,20 @@ var HomeHuddleCalendar = ({
|
|
|
6357
7360
|
PipleAuth,
|
|
6358
7361
|
PlatformFeatures,
|
|
6359
7362
|
PortfolioHero,
|
|
7363
|
+
RootSidebar,
|
|
6360
7364
|
TextInput,
|
|
6361
7365
|
ThreeDActionButton,
|
|
6362
7366
|
ThreeDButton,
|
|
7367
|
+
UniversalApplicationPage2,
|
|
7368
|
+
UniversalApplicationsPage,
|
|
6363
7369
|
UniversalBuyCryptoPage,
|
|
6364
7370
|
UniversalCardActionPage,
|
|
6365
7371
|
UniversalCardPage,
|
|
6366
7372
|
UniversalCreateHuddle,
|
|
7373
|
+
UniversalDeveloperSettings,
|
|
6367
7374
|
UniversalErrorView,
|
|
6368
7375
|
UniversalHome2,
|
|
7376
|
+
UniversalHome3,
|
|
6369
7377
|
UniversalHomeView,
|
|
6370
7378
|
UniversalHuddleDetails,
|
|
6371
7379
|
UniversalHuddlesPage,
|
|
@@ -6377,6 +7385,7 @@ var HomeHuddleCalendar = ({
|
|
|
6377
7385
|
UniversalRewardPage,
|
|
6378
7386
|
UniversalSecurityPage,
|
|
6379
7387
|
UniversalSettings,
|
|
7388
|
+
UniversalSettings2,
|
|
6380
7389
|
UniversalSidebar,
|
|
6381
7390
|
UniversalTransactionPage,
|
|
6382
7391
|
UniversalVerificationPage,
|