@datatechsolutions/ui 2.11.86 → 2.11.88

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.
Files changed (75) hide show
  1. package/dist/billing-panel-DsHhhJqG.d.mts +18 -0
  2. package/dist/billing-panel-DsHhhJqG.d.ts +18 -0
  3. package/dist/chunk-4667D2ZT.mjs +61 -0
  4. package/dist/chunk-4667D2ZT.mjs.map +1 -0
  5. package/dist/chunk-5HXDJBVX.mjs +1330 -0
  6. package/dist/chunk-5HXDJBVX.mjs.map +1 -0
  7. package/dist/chunk-DJ33CSGJ.mjs +126 -0
  8. package/dist/chunk-DJ33CSGJ.mjs.map +1 -0
  9. package/dist/chunk-F4TOOARV.mjs +503 -0
  10. package/dist/chunk-F4TOOARV.mjs.map +1 -0
  11. package/dist/chunk-GEUGFYLO.mjs +237 -0
  12. package/dist/chunk-GEUGFYLO.mjs.map +1 -0
  13. package/dist/chunk-LBALE4JX.js +1342 -0
  14. package/dist/chunk-LBALE4JX.js.map +1 -0
  15. package/dist/chunk-MXFEU7A6.js +148 -0
  16. package/dist/chunk-MXFEU7A6.js.map +1 -0
  17. package/dist/chunk-NBCOVUQP.mjs +142 -0
  18. package/dist/chunk-NBCOVUQP.mjs.map +1 -0
  19. package/dist/chunk-P4RVGMZL.js +128 -0
  20. package/dist/chunk-P4RVGMZL.js.map +1 -0
  21. package/dist/chunk-Q2MG7S2E.js +239 -0
  22. package/dist/chunk-Q2MG7S2E.js.map +1 -0
  23. package/dist/chunk-RV555OEO.mjs +1009 -0
  24. package/dist/chunk-RV555OEO.mjs.map +1 -0
  25. package/dist/chunk-SAYVWIMJ.js +63 -0
  26. package/dist/chunk-SAYVWIMJ.js.map +1 -0
  27. package/dist/chunk-SUHNSUMH.mjs +1021 -0
  28. package/dist/chunk-SUHNSUMH.mjs.map +1 -0
  29. package/dist/chunk-TOEMSC4P.mjs +99 -0
  30. package/dist/chunk-TOEMSC4P.mjs.map +1 -0
  31. package/dist/chunk-UUHV5KHF.js +505 -0
  32. package/dist/chunk-UUHV5KHF.js.map +1 -0
  33. package/dist/chunk-UVEPTYZC.js +101 -0
  34. package/dist/chunk-UVEPTYZC.js.map +1 -0
  35. package/dist/chunk-X2KCCQPL.js +1049 -0
  36. package/dist/chunk-X2KCCQPL.js.map +1 -0
  37. package/dist/chunk-ZARCUQA6.js +1015 -0
  38. package/dist/chunk-ZARCUQA6.js.map +1 -0
  39. package/dist/platform/admin/index.d.mts +17 -0
  40. package/dist/platform/admin/index.d.ts +17 -0
  41. package/dist/platform/admin/index.js +39 -0
  42. package/dist/platform/admin/index.js.map +1 -0
  43. package/dist/platform/admin/index.mjs +10 -0
  44. package/dist/platform/admin/index.mjs.map +1 -0
  45. package/dist/platform/auth/index.d.mts +73 -0
  46. package/dist/platform/auth/index.d.ts +73 -0
  47. package/dist/platform/auth/index.js +107 -0
  48. package/dist/platform/auth/index.js.map +1 -0
  49. package/dist/platform/auth/index.mjs +10 -0
  50. package/dist/platform/auth/index.mjs.map +1 -0
  51. package/dist/platform/billing/index.d.mts +29 -0
  52. package/dist/platform/billing/index.d.ts +29 -0
  53. package/dist/platform/billing/index.js +22 -0
  54. package/dist/platform/billing/index.js.map +1 -0
  55. package/dist/platform/billing/index.mjs +9 -0
  56. package/dist/platform/billing/index.mjs.map +1 -0
  57. package/dist/platform/impersonation/index.d.mts +19 -0
  58. package/dist/platform/impersonation/index.d.ts +19 -0
  59. package/dist/platform/impersonation/index.js +17 -0
  60. package/dist/platform/impersonation/index.js.map +1 -0
  61. package/dist/platform/impersonation/index.mjs +8 -0
  62. package/dist/platform/impersonation/index.mjs.map +1 -0
  63. package/dist/platform/index.d.mts +45 -2
  64. package/dist/platform/index.d.ts +45 -2
  65. package/dist/platform/index.js +4850 -0
  66. package/dist/platform/index.js.map +1 -1
  67. package/dist/platform/index.mjs +4716 -3
  68. package/dist/platform/index.mjs.map +1 -1
  69. package/dist/platform/settings/index.d.mts +31 -0
  70. package/dist/platform/settings/index.d.ts +31 -0
  71. package/dist/platform/settings/index.js +21 -0
  72. package/dist/platform/settings/index.js.map +1 -0
  73. package/dist/platform/settings/index.mjs +12 -0
  74. package/dist/platform/settings/index.mjs.map +1 -0
  75. package/package.json +26 -1
@@ -0,0 +1,505 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkKNXAOJAK_js = require('./chunk-KNXAOJAK.js');
5
+ var chunkUZ3CMNUJ_js = require('./chunk-UZ3CMNUJ.js');
6
+ var chunkYXN2K77G_js = require('./chunk-YXN2K77G.js');
7
+ var react = require('react');
8
+ var outline = require('@heroicons/react/24/outline');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ var ALL_TABS = ["members", "invitations", "domains"];
12
+ function MembersTabContent({
13
+ organizationId,
14
+ client
15
+ }) {
16
+ const t = chunkYXN2K77G_js.useTranslations("windsock");
17
+ const [members, setMembers] = react.useState([]);
18
+ const [isLoading, setIsLoading] = react.useState(true);
19
+ const [removingId, setRemovingId] = react.useState(null);
20
+ const [removeTarget, setRemoveTarget] = react.useState(null);
21
+ const fetchMembers = react.useCallback(async () => {
22
+ setIsLoading(true);
23
+ try {
24
+ const result = await client.listOrganizationMembers(organizationId);
25
+ setMembers(result);
26
+ } catch {
27
+ } finally {
28
+ setIsLoading(false);
29
+ }
30
+ }, [client, organizationId]);
31
+ react.useEffect(() => {
32
+ fetchMembers();
33
+ }, [fetchMembers]);
34
+ const handleRemoveRequest = react.useCallback((member) => {
35
+ chunkUZ3CMNUJ_js.triggerHaptic("warning");
36
+ setRemoveTarget(member);
37
+ }, []);
38
+ const handleRemoveConfirm = react.useCallback(async () => {
39
+ if (!removeTarget) return;
40
+ setRemovingId(removeTarget.id);
41
+ chunkUZ3CMNUJ_js.triggerHaptic("medium");
42
+ try {
43
+ await client.removeOrganizationMember(organizationId, removeTarget.id);
44
+ setRemoveTarget(null);
45
+ chunkUZ3CMNUJ_js.triggerHaptic("success");
46
+ fetchMembers();
47
+ } catch {
48
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
49
+ } finally {
50
+ setRemovingId(null);
51
+ }
52
+ }, [removeTarget, client, organizationId, fetchMembers]);
53
+ const handleRemoveCancel = react.useCallback(() => {
54
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
55
+ setRemoveTarget(null);
56
+ }, []);
57
+ const roleBadgeColor = (role) => {
58
+ if (role === "owner") return "purple";
59
+ if (role === "admin") return "blue";
60
+ return "zinc";
61
+ };
62
+ if (isLoading) {
63
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.InlineSpinner, {}),
65
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.members.loading") })
66
+ ] });
67
+ }
68
+ if (members.length === 0) {
69
+ return /* @__PURE__ */ jsxRuntime.jsx(
70
+ chunkKNXAOJAK_js.EmptyState,
71
+ {
72
+ message: t("admin.organizationDetail.members.emptyMessage"),
73
+ description: t("admin.organizationDetail.members.emptyDescription"),
74
+ icon: outline.UsersIcon,
75
+ variant: "card"
76
+ }
77
+ );
78
+ }
79
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
80
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.ListCard, { children: members.map((member) => /* @__PURE__ */ jsxRuntime.jsx(
81
+ chunkKNXAOJAK_js.ListCardItem,
82
+ {
83
+ leading: /* @__PURE__ */ jsxRuntime.jsx(
84
+ chunkKNXAOJAK_js.Avatar,
85
+ {
86
+ src: member.image,
87
+ initials: (member.name ?? member.email).slice(0, 2).toUpperCase(),
88
+ alt: member.name ?? member.email
89
+ }
90
+ ),
91
+ trailing: member.role !== "owner" ? /* @__PURE__ */ jsxRuntime.jsx(
92
+ chunkKNXAOJAK_js.Button,
93
+ {
94
+ size: "sm",
95
+ color: "ios-glass-red",
96
+ onClick: () => handleRemoveRequest(member),
97
+ loading: removingId === member.id,
98
+ disabled: removingId !== null,
99
+ children: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-3.5 w-3.5" })
100
+ }
101
+ ) : void 0,
102
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
103
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
104
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-sm font-medium text-gray-900 dark:text-white", children: member.name ?? member.email }),
105
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "truncate text-xs text-gray-500 dark:text-gray-400", children: member.email })
106
+ ] }),
107
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.Badge, { color: roleBadgeColor(member.role), children: member.role })
108
+ ] })
109
+ },
110
+ member.id
111
+ )) }),
112
+ /* @__PURE__ */ jsxRuntime.jsx(
113
+ chunkKNXAOJAK_js.DynamicIslandConfirm,
114
+ {
115
+ open: removeTarget !== null,
116
+ onClose: handleRemoveCancel,
117
+ onConfirm: handleRemoveConfirm,
118
+ title: t("admin.organizationDetail.members.removeConfirmTitle", { name: removeTarget?.name ?? removeTarget?.email ?? "" }),
119
+ icon: /* @__PURE__ */ jsxRuntime.jsx(outline.TrashIcon, { className: "h-5 w-5 text-white" }),
120
+ iconBackground: "bg-ios-red",
121
+ confirmLabel: t("admin.organizationDetail.members.removeConfirmButton"),
122
+ cancelLabel: t("admin.organizationDetail.members.removeCancelButton")
123
+ }
124
+ )
125
+ ] });
126
+ }
127
+ function InvitationsTabContent({
128
+ organizationId,
129
+ client
130
+ }) {
131
+ const t = chunkYXN2K77G_js.useTranslations("windsock");
132
+ const format = chunkYXN2K77G_js.useFormatter();
133
+ const [invitations, setInvitations] = react.useState([]);
134
+ const [isLoading, setIsLoading] = react.useState(true);
135
+ const [isInviteSheetOpen, setIsInviteSheetOpen] = react.useState(false);
136
+ const [inviteEmail, setInviteEmail] = react.useState("");
137
+ const [inviteRole, setInviteRole] = react.useState("member");
138
+ const [isInviting, setIsInviting] = react.useState(false);
139
+ const [inviteError, setInviteError] = react.useState(null);
140
+ const fetchInvitations = react.useCallback(async () => {
141
+ setIsLoading(true);
142
+ try {
143
+ const result = await client.listOrganizationInvitations(organizationId);
144
+ setInvitations(result);
145
+ } catch {
146
+ } finally {
147
+ setIsLoading(false);
148
+ }
149
+ }, [client, organizationId]);
150
+ react.useEffect(() => {
151
+ fetchInvitations();
152
+ }, [fetchInvitations]);
153
+ const handleOpenInviteSheet = react.useCallback(() => {
154
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
155
+ setInviteEmail("");
156
+ setInviteRole("member");
157
+ setInviteError(null);
158
+ setIsInviteSheetOpen(true);
159
+ }, []);
160
+ const handleCloseInviteSheet = react.useCallback(() => {
161
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
162
+ setIsInviteSheetOpen(false);
163
+ }, []);
164
+ const handleSendInvitation = react.useCallback(async () => {
165
+ if (!inviteEmail.trim()) {
166
+ setInviteError(t("admin.organizationDetail.invitations.errorEmailRequired"));
167
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
168
+ return;
169
+ }
170
+ setInviteError(null);
171
+ setIsInviting(true);
172
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
173
+ try {
174
+ const data = {
175
+ email: inviteEmail.trim().toLowerCase(),
176
+ role: inviteRole
177
+ };
178
+ await client.createOrganizationInvitation(organizationId, data);
179
+ chunkUZ3CMNUJ_js.triggerHaptic("success");
180
+ setIsInviteSheetOpen(false);
181
+ fetchInvitations();
182
+ } catch {
183
+ setInviteError(t("admin.organizationDetail.invitations.errorSendFailed"));
184
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
185
+ } finally {
186
+ setIsInviting(false);
187
+ }
188
+ }, [inviteEmail, inviteRole, client, organizationId, fetchInvitations, t]);
189
+ const statusBadgeColor = (status) => {
190
+ if (status === "accepted") return "green";
191
+ if (status === "pending") return "amber";
192
+ if (status === "revoked" || status === "expired") return "red";
193
+ return "zinc";
194
+ };
195
+ const roleOptions = ["viewer", "member", "admin", "owner"];
196
+ if (isLoading) {
197
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.InlineSpinner, {}),
199
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.invitations.loading") })
200
+ ] });
201
+ }
202
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
203
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
204
+ /* @__PURE__ */ jsxRuntime.jsxs(
205
+ chunkKNXAOJAK_js.Button,
206
+ {
207
+ color: "ios-glass-blue",
208
+ onClick: handleOpenInviteSheet,
209
+ fullWidth: true,
210
+ children: [
211
+ /* @__PURE__ */ jsxRuntime.jsx(outline.PlusIcon, { className: "mr-1.5 h-4 w-4" }),
212
+ t("admin.organizationDetail.invitations.inviteButton")
213
+ ]
214
+ }
215
+ ),
216
+ invitations.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
217
+ chunkKNXAOJAK_js.EmptyState,
218
+ {
219
+ message: t("admin.organizationDetail.invitations.emptyMessage"),
220
+ description: t("admin.organizationDetail.invitations.emptyDescription"),
221
+ icon: outline.EnvelopeIcon,
222
+ variant: "card"
223
+ }
224
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.ListCard, { children: invitations.map((invitation) => /* @__PURE__ */ jsxRuntime.jsx(
225
+ chunkKNXAOJAK_js.ListCardItem,
226
+ {
227
+ leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsx(outline.EnvelopeIcon, { className: "h-5 w-5 text-white" }) }),
228
+ trailing: /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.Badge, { color: statusBadgeColor(invitation.status), children: invitation.status }),
229
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
230
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900 dark:text-white", children: invitation.email }),
231
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400", children: [
232
+ t("admin.organizationDetail.invitations.roleLabel", { role: invitation.role }),
233
+ " \xB7 ",
234
+ format.dateTime(new Date(invitation.createdAt), {
235
+ month: "short",
236
+ day: "numeric"
237
+ })
238
+ ] })
239
+ ] })
240
+ },
241
+ invitation.id
242
+ )) })
243
+ ] }),
244
+ /* @__PURE__ */ jsxRuntime.jsx(
245
+ chunkKNXAOJAK_js.Sheet,
246
+ {
247
+ open: isInviteSheetOpen,
248
+ onClose: handleCloseInviteSheet,
249
+ title: t("admin.organizationDetail.invitations.sheetTitle"),
250
+ side: "bottom",
251
+ size: "md",
252
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
253
+ /* @__PURE__ */ jsxRuntime.jsx(
254
+ chunkKNXAOJAK_js.Input,
255
+ {
256
+ label: t("admin.organizationDetail.invitations.emailLabel"),
257
+ type: "email",
258
+ value: inviteEmail,
259
+ onChange: (event) => setInviteEmail(event.target.value),
260
+ placeholder: t("admin.organizationDetail.invitations.emailPlaceholder"),
261
+ disabled: isInviting,
262
+ autoFocus: true
263
+ }
264
+ ),
265
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
266
+ /* @__PURE__ */ jsxRuntime.jsx("label", { className: "mb-1.5 block text-sm font-medium text-gray-900 dark:text-white", children: t("admin.organizationDetail.invitations.roleSelectLabel") }),
267
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-4 gap-2", children: roleOptions.map((role) => /* @__PURE__ */ jsxRuntime.jsx(
268
+ "button",
269
+ {
270
+ type: "button",
271
+ onClick: () => {
272
+ setInviteRole(role);
273
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
274
+ },
275
+ className: `rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${inviteRole === role ? "border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100" : "border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]"}`,
276
+ children: role
277
+ },
278
+ role
279
+ )) })
280
+ ] }),
281
+ inviteError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: inviteError }),
282
+ /* @__PURE__ */ jsxRuntime.jsx(
283
+ chunkKNXAOJAK_js.Button,
284
+ {
285
+ color: "ios-glass-blue",
286
+ fullWidth: true,
287
+ onClick: handleSendInvitation,
288
+ loading: isInviting,
289
+ disabled: isInviting || !inviteEmail.trim(),
290
+ children: t("admin.organizationDetail.invitations.sendButton")
291
+ }
292
+ )
293
+ ] })
294
+ }
295
+ )
296
+ ] });
297
+ }
298
+ function DomainsTabContent({
299
+ organizationId,
300
+ client
301
+ }) {
302
+ const t = chunkYXN2K77G_js.useTranslations("windsock");
303
+ const [domains, setDomains] = react.useState([]);
304
+ const [isLoading, setIsLoading] = react.useState(true);
305
+ const [isAddSheetOpen, setIsAddSheetOpen] = react.useState(false);
306
+ const [newDomain, setNewDomain] = react.useState("");
307
+ const [isAdding, setIsAdding] = react.useState(false);
308
+ const [addError, setAddError] = react.useState(null);
309
+ const [verifyingDomain, setVerifyingDomain] = react.useState(null);
310
+ const fetchDomains = react.useCallback(async () => {
311
+ setIsLoading(true);
312
+ try {
313
+ const result = await client.listOrganizationDomains(organizationId);
314
+ setDomains(result);
315
+ } catch {
316
+ } finally {
317
+ setIsLoading(false);
318
+ }
319
+ }, [client, organizationId]);
320
+ react.useEffect(() => {
321
+ fetchDomains();
322
+ }, [fetchDomains]);
323
+ const handleOpenAddSheet = react.useCallback(() => {
324
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
325
+ setNewDomain("");
326
+ setAddError(null);
327
+ setIsAddSheetOpen(true);
328
+ }, []);
329
+ const handleCloseAddSheet = react.useCallback(() => {
330
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
331
+ setIsAddSheetOpen(false);
332
+ }, []);
333
+ const handleAddDomain = react.useCallback(async () => {
334
+ if (!newDomain.trim()) {
335
+ setAddError(t("admin.organizationDetail.domains.errorDomainRequired"));
336
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
337
+ return;
338
+ }
339
+ setAddError(null);
340
+ setIsAdding(true);
341
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
342
+ try {
343
+ await client.addOrganizationDomain(organizationId, newDomain.trim().toLowerCase());
344
+ chunkUZ3CMNUJ_js.triggerHaptic("success");
345
+ setIsAddSheetOpen(false);
346
+ fetchDomains();
347
+ } catch {
348
+ setAddError(t("admin.organizationDetail.domains.errorAddFailed"));
349
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
350
+ } finally {
351
+ setIsAdding(false);
352
+ }
353
+ }, [newDomain, client, organizationId, fetchDomains, t]);
354
+ const handleVerifyDomain = react.useCallback(async (domain) => {
355
+ setVerifyingDomain(domain);
356
+ chunkUZ3CMNUJ_js.triggerHaptic("light");
357
+ try {
358
+ await client.verifyOrganizationDomain(organizationId, domain);
359
+ chunkUZ3CMNUJ_js.triggerHaptic("success");
360
+ fetchDomains();
361
+ } catch {
362
+ chunkUZ3CMNUJ_js.triggerHaptic("error");
363
+ } finally {
364
+ setVerifyingDomain(null);
365
+ }
366
+ }, [client, organizationId, fetchDomains]);
367
+ if (isLoading) {
368
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400", children: [
369
+ /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.InlineSpinner, {}),
370
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("admin.organizationDetail.domains.loading") })
371
+ ] });
372
+ }
373
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
374
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
375
+ /* @__PURE__ */ jsxRuntime.jsxs(
376
+ chunkKNXAOJAK_js.Button,
377
+ {
378
+ color: "ios-glass-blue",
379
+ onClick: handleOpenAddSheet,
380
+ fullWidth: true,
381
+ children: [
382
+ /* @__PURE__ */ jsxRuntime.jsx(outline.PlusIcon, { className: "mr-1.5 h-4 w-4" }),
383
+ t("admin.organizationDetail.domains.addButton")
384
+ ]
385
+ }
386
+ ),
387
+ domains.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
388
+ chunkKNXAOJAK_js.EmptyState,
389
+ {
390
+ message: t("admin.organizationDetail.domains.emptyMessage"),
391
+ description: t("admin.organizationDetail.domains.emptyDescription"),
392
+ icon: outline.GlobeAltIcon,
393
+ variant: "card"
394
+ }
395
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.ListCard, { children: domains.map((domain) => /* @__PURE__ */ jsxRuntime.jsx(
396
+ chunkKNXAOJAK_js.ListCardItem,
397
+ {
398
+ leading: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${domain.verified ? "bg-gradient-to-br from-emerald-500 to-green-600" : "bg-gradient-to-br from-amber-500 to-orange-600"}`, children: domain.verified ? /* @__PURE__ */ jsxRuntime.jsx(outline.CheckCircleIcon, { className: "h-5 w-5 text-white" }) : /* @__PURE__ */ jsxRuntime.jsx(outline.GlobeAltIcon, { className: "h-5 w-5 text-white" }) }),
399
+ trailing: !domain.verified ? /* @__PURE__ */ jsxRuntime.jsxs(
400
+ chunkKNXAOJAK_js.Button,
401
+ {
402
+ size: "sm",
403
+ color: "ios-glass-blue",
404
+ onClick: () => handleVerifyDomain(domain.domain),
405
+ loading: verifyingDomain === domain.domain,
406
+ disabled: verifyingDomain !== null,
407
+ children: [
408
+ /* @__PURE__ */ jsxRuntime.jsx(outline.ArrowPathIcon, { className: "mr-1 h-3.5 w-3.5" }),
409
+ t("admin.organizationDetail.domains.verifyButton")
410
+ ]
411
+ }
412
+ ) : /* @__PURE__ */ jsxRuntime.jsx(chunkKNXAOJAK_js.StatusBadge, { status: "active", label: t("admin.organizationDetail.domains.verifiedLabel"), size: "sm" }),
413
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
414
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900 dark:text-white", children: domain.domain }),
415
+ domain.autoJoinEnabled && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-xs text-gray-500 dark:text-gray-400", children: t("admin.organizationDetail.domains.autoJoinEnabled") })
416
+ ] })
417
+ },
418
+ domain.id
419
+ )) })
420
+ ] }),
421
+ /* @__PURE__ */ jsxRuntime.jsx(
422
+ chunkKNXAOJAK_js.Sheet,
423
+ {
424
+ open: isAddSheetOpen,
425
+ onClose: handleCloseAddSheet,
426
+ title: t("admin.organizationDetail.domains.sheetTitle"),
427
+ side: "bottom",
428
+ size: "md",
429
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 p-4 sm:p-6", children: [
430
+ /* @__PURE__ */ jsxRuntime.jsx(
431
+ chunkKNXAOJAK_js.Input,
432
+ {
433
+ label: t("admin.organizationDetail.domains.domainLabel"),
434
+ value: newDomain,
435
+ onChange: (event) => setNewDomain(event.target.value),
436
+ placeholder: t("admin.organizationDetail.domains.domainPlaceholder"),
437
+ disabled: isAdding,
438
+ autoFocus: true
439
+ }
440
+ ),
441
+ addError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-red-600 dark:text-red-400", role: "alert", children: addError }),
442
+ /* @__PURE__ */ jsxRuntime.jsx(
443
+ chunkKNXAOJAK_js.Button,
444
+ {
445
+ color: "ios-glass-blue",
446
+ fullWidth: true,
447
+ onClick: handleAddDomain,
448
+ loading: isAdding,
449
+ disabled: isAdding || !newDomain.trim(),
450
+ children: t("admin.organizationDetail.domains.addDomainButton")
451
+ }
452
+ )
453
+ ] })
454
+ }
455
+ )
456
+ ] });
457
+ }
458
+ function AdminOrganizationDetail({
459
+ organization,
460
+ client
461
+ }) {
462
+ const t = chunkYXN2K77G_js.useTranslations("windsock");
463
+ const [activeTab, setActiveTab] = react.useState("members");
464
+ const segments = ALL_TABS.map((tab) => ({
465
+ value: tab,
466
+ label: t(`admin.organizationDetail.tabs.${tab}`)
467
+ }));
468
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-6", children: /* @__PURE__ */ jsxRuntime.jsx(
469
+ chunkKNXAOJAK_js.SectionCard,
470
+ {
471
+ header: {
472
+ icon: /* @__PURE__ */ jsxRuntime.jsx(outline.UsersIcon, { className: "h-5 w-5 text-white" }),
473
+ title: organization.displayName ?? organization.name,
474
+ subtitle: organization.description ?? t("admin.organizationDetail.defaultSubtitle"),
475
+ gradient: "from-emerald-500 via-teal-500 to-cyan-500",
476
+ rightContent: /* @__PURE__ */ jsxRuntime.jsx(
477
+ chunkKNXAOJAK_js.StatusBadge,
478
+ {
479
+ status: organization.enabled ? "active" : "inactive",
480
+ label: organization.enabled ? t("admin.organizationDetail.statusEnabled") : t("admin.organizationDetail.statusDisabled"),
481
+ size: "sm"
482
+ }
483
+ )
484
+ },
485
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
486
+ /* @__PURE__ */ jsxRuntime.jsx(
487
+ chunkKNXAOJAK_js.SegmentedControl,
488
+ {
489
+ segments,
490
+ value: activeTab,
491
+ onChange: (value) => setActiveTab(value),
492
+ fullWidth: true
493
+ }
494
+ ),
495
+ activeTab === "members" && /* @__PURE__ */ jsxRuntime.jsx(MembersTabContent, { organizationId: organization.id, client }),
496
+ activeTab === "invitations" && /* @__PURE__ */ jsxRuntime.jsx(InvitationsTabContent, { organizationId: organization.id, client }),
497
+ activeTab === "domains" && /* @__PURE__ */ jsxRuntime.jsx(DomainsTabContent, { organizationId: organization.id, client })
498
+ ] })
499
+ }
500
+ ) });
501
+ }
502
+
503
+ exports.AdminOrganizationDetail = AdminOrganizationDetail;
504
+ //# sourceMappingURL=chunk-UUHV5KHF.js.map
505
+ //# sourceMappingURL=chunk-UUHV5KHF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/platform/admin/admin-organization-detail.tsx"],"names":["useTranslations","useState","useCallback","useEffect","triggerHaptic","jsxs","jsx","InlineSpinner","EmptyState","UsersIcon","Fragment","ListCard","ListCardItem","Avatar","Button","TrashIcon","Badge","DynamicIslandConfirm","useFormatter","PlusIcon","EnvelopeIcon","Sheet","Input","GlobeAltIcon","CheckCircleIcon","ArrowPathIcon","StatusBadge","SectionCard","SegmentedControl"],"mappings":"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","file":"chunk-UUHV5KHF.js","sourcesContent":["import { useState, useEffect, useCallback } from 'react'\nimport { useTranslations, useFormatter } from '@ui/lib/i18n-context'\nimport {\n SectionCard,\n SegmentedControl,\n ListCard,\n ListCardItem,\n Button,\n Input,\n Badge,\n StatusBadge,\n EmptyState,\n InlineSpinner,\n Sheet,\n DynamicIslandConfirm,\n Avatar,\n triggerHaptic,\n} from '@ui/index'\nimport {\n UsersIcon,\n EnvelopeIcon,\n GlobeAltIcon,\n PlusIcon,\n TrashIcon,\n CheckCircleIcon,\n ArrowPathIcon,\n} from '@heroicons/react/24/outline'\nimport type {\n AuthOrganizationDomain,\n AuthOrganizationInvitation,\n} from '@datatechsolutions/shared-domain'\n\nexport type { AdminOrganizationDetailProps } from '@datatechsolutions/shared-domain'\nimport type {\n AdminOrganizationDetailProps,\n AdminOrganizationDetailTab,\n AdminOrganizationMember,\n AdminCreateInvitationInput,\n} from '@datatechsolutions/shared-domain'\nimport type { AuthOrganizationRole } from '@datatechsolutions/shared-domain'\n\nconst ALL_TABS: AdminOrganizationDetailTab[] = ['members', 'invitations', 'domains']\n\n// ── Members Tab ─────────────────────────────────────────────────────────────\n\nfunction MembersTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [members, setMembers] = useState<AdminOrganizationMember[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [removingId, setRemovingId] = useState<string | null>(null)\n const [removeTarget, setRemoveTarget] = useState<AdminOrganizationMember | null>(null)\n\n const fetchMembers = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationMembers(organizationId)\n setMembers(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchMembers()\n }, [fetchMembers])\n\n const handleRemoveRequest = useCallback((member: AdminOrganizationMember) => {\n triggerHaptic('warning')\n setRemoveTarget(member)\n }, [])\n\n const handleRemoveConfirm = useCallback(async () => {\n if (!removeTarget) return\n setRemovingId(removeTarget.id)\n triggerHaptic('medium')\n try {\n await client.removeOrganizationMember(organizationId, removeTarget.id)\n setRemoveTarget(null)\n triggerHaptic('success')\n fetchMembers()\n } catch {\n triggerHaptic('error')\n } finally {\n setRemovingId(null)\n }\n }, [removeTarget, client, organizationId, fetchMembers])\n\n const handleRemoveCancel = useCallback(() => {\n triggerHaptic('light')\n setRemoveTarget(null)\n }, [])\n\n const roleBadgeColor = (role: string) => {\n if (role === 'owner') return 'purple' as const\n if (role === 'admin') return 'blue' as const\n return 'zinc' as const\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.members.loading')}</span>\n </div>\n )\n }\n\n if (members.length === 0) {\n return (\n <EmptyState\n message={t('admin.organizationDetail.members.emptyMessage')}\n description={t('admin.organizationDetail.members.emptyDescription')}\n icon={UsersIcon}\n variant=\"card\"\n />\n )\n }\n\n return (\n <>\n <ListCard>\n {members.map((member) => (\n <ListCardItem\n key={member.id}\n leading={\n <Avatar\n src={(member as unknown as { image?: string }).image}\n initials={(member.name ?? member.email).slice(0, 2).toUpperCase()}\n alt={member.name ?? member.email}\n />\n }\n trailing={\n member.role !== 'owner' ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={() => handleRemoveRequest(member)}\n loading={removingId === member.id}\n disabled={removingId !== null}\n >\n <TrashIcon className=\"h-3.5 w-3.5\" />\n </Button>\n ) : undefined\n }\n >\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-sm font-medium text-gray-900 dark:text-white\">\n {member.name ?? member.email}\n </p>\n <p className=\"truncate text-xs text-gray-500 dark:text-gray-400\">\n {member.email}\n </p>\n </div>\n <Badge color={roleBadgeColor(member.role)}>{member.role}</Badge>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n\n <DynamicIslandConfirm\n open={removeTarget !== null}\n onClose={handleRemoveCancel}\n onConfirm={handleRemoveConfirm}\n title={t('admin.organizationDetail.members.removeConfirmTitle', { name: removeTarget?.name ?? removeTarget?.email ?? '' })}\n icon={<TrashIcon className=\"h-5 w-5 text-white\" />}\n iconBackground=\"bg-ios-red\"\n confirmLabel={t('admin.organizationDetail.members.removeConfirmButton')}\n cancelLabel={t('admin.organizationDetail.members.removeCancelButton')}\n />\n </>\n )\n}\n\n// ── Invitations Tab ─────────────────────────────────────────────────────────\n\nfunction InvitationsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n const format = useFormatter()\n\n const [invitations, setInvitations] = useState<AuthOrganizationInvitation[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isInviteSheetOpen, setIsInviteSheetOpen] = useState(false)\n const [inviteEmail, setInviteEmail] = useState('')\n const [inviteRole, setInviteRole] = useState<AuthOrganizationRole>('member')\n const [isInviting, setIsInviting] = useState(false)\n const [inviteError, setInviteError] = useState<string | null>(null)\n\n const fetchInvitations = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationInvitations(organizationId)\n setInvitations(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchInvitations()\n }, [fetchInvitations])\n\n const handleOpenInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setInviteEmail('')\n setInviteRole('member')\n setInviteError(null)\n setIsInviteSheetOpen(true)\n }, [])\n\n const handleCloseInviteSheet = useCallback(() => {\n triggerHaptic('light')\n setIsInviteSheetOpen(false)\n }, [])\n\n const handleSendInvitation = useCallback(async () => {\n if (!inviteEmail.trim()) {\n setInviteError(t('admin.organizationDetail.invitations.errorEmailRequired'))\n triggerHaptic('error')\n return\n }\n\n setInviteError(null)\n setIsInviting(true)\n triggerHaptic('light')\n\n try {\n const data: AdminCreateInvitationInput = {\n email: inviteEmail.trim().toLowerCase(),\n role: inviteRole,\n }\n await client.createOrganizationInvitation(organizationId, data)\n triggerHaptic('success')\n setIsInviteSheetOpen(false)\n fetchInvitations()\n } catch {\n setInviteError(t('admin.organizationDetail.invitations.errorSendFailed'))\n triggerHaptic('error')\n } finally {\n setIsInviting(false)\n }\n }, [inviteEmail, inviteRole, client, organizationId, fetchInvitations, t])\n\n const statusBadgeColor = (status: string) => {\n if (status === 'accepted') return 'green' as const\n if (status === 'pending') return 'amber' as const\n if (status === 'revoked' || status === 'expired') return 'red' as const\n return 'zinc' as const\n }\n\n const roleOptions: AuthOrganizationRole[] = ['viewer', 'member', 'admin', 'owner']\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.invitations.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenInviteSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.invitations.inviteButton')}\n </Button>\n\n {invitations.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.invitations.emptyMessage')}\n description={t('admin.organizationDetail.invitations.emptyDescription')}\n icon={EnvelopeIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {invitations.map((invitation) => (\n <ListCardItem\n key={invitation.id}\n leading={\n <div className=\"flex h-9 w-9 items-center justify-center rounded-xl bg-gradient-to-br from-amber-500 to-orange-600 shadow-sm\">\n <EnvelopeIcon className=\"h-5 w-5 text-white\" />\n </div>\n }\n trailing={\n <Badge color={statusBadgeColor(invitation.status)}>{invitation.status}</Badge>\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {invitation.email}\n </p>\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.invitations.roleLabel', { role: invitation.role })}\n {' · '}\n {format.dateTime(new Date(invitation.createdAt), {\n month: 'short',\n day: 'numeric',\n })}\n </p>\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Invite sheet */}\n <Sheet\n open={isInviteSheetOpen}\n onClose={handleCloseInviteSheet}\n title={t('admin.organizationDetail.invitations.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.invitations.emailLabel')}\n type=\"email\"\n value={inviteEmail}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setInviteEmail(event.target.value)}\n placeholder={t('admin.organizationDetail.invitations.emailPlaceholder')}\n disabled={isInviting}\n autoFocus\n />\n\n <div>\n <label className=\"mb-1.5 block text-sm font-medium text-gray-900 dark:text-white\">\n {t('admin.organizationDetail.invitations.roleSelectLabel')}\n </label>\n <div className=\"grid grid-cols-4 gap-2\">\n {roleOptions.map((role) => (\n <button\n key={role}\n type=\"button\"\n onClick={() => {\n setInviteRole(role)\n triggerHaptic('light')\n }}\n className={`rounded-xl border px-2 py-2 text-xs font-semibold backdrop-blur-xl transition ${\n inviteRole === role\n ? 'border-indigo-400/80 bg-gradient-to-br from-indigo-100/85 via-white/80 to-sky-100/75 text-slate-900 dark:border-indigo-300/70 dark:bg-[linear-gradient(140deg,rgba(99,102,241,0.32)_0%,rgba(30,41,59,0.72)_100%)] dark:text-indigo-100'\n : 'border-white/55 bg-gradient-to-br from-white/82 via-white/66 to-slate-100/62 text-slate-700 hover:from-white/92 hover:to-sky-100/72 dark:border-white/15 dark:bg-[linear-gradient(140deg,rgba(30,41,59,0.72)_0%,rgba(15,23,42,0.62)_100%)] dark:text-slate-100 dark:hover:bg-[linear-gradient(140deg,rgba(51,65,85,0.76)_0%,rgba(30,41,59,0.68)_100%)]'\n }`}\n >\n {role}\n </button>\n ))}\n </div>\n </div>\n\n {inviteError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{inviteError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleSendInvitation}\n loading={isInviting}\n disabled={isInviting || !inviteEmail.trim()}\n >\n {t('admin.organizationDetail.invitations.sendButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── Domains Tab ─────────────────────────────────────────────────────────────\n\nfunction DomainsTabContent({\n organizationId,\n client,\n}: {\n organizationId: string\n client: AdminOrganizationDetailProps['client']\n}) {\n const t = useTranslations('windsock')\n\n const [domains, setDomains] = useState<AuthOrganizationDomain[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [isAddSheetOpen, setIsAddSheetOpen] = useState(false)\n const [newDomain, setNewDomain] = useState('')\n const [isAdding, setIsAdding] = useState(false)\n const [addError, setAddError] = useState<string | null>(null)\n const [verifyingDomain, setVerifyingDomain] = useState<string | null>(null)\n\n const fetchDomains = useCallback(async () => {\n setIsLoading(true)\n try {\n const result = await client.listOrganizationDomains(organizationId)\n setDomains(result)\n } catch {\n // Fail gracefully\n } finally {\n setIsLoading(false)\n }\n }, [client, organizationId])\n\n useEffect(() => {\n fetchDomains()\n }, [fetchDomains])\n\n const handleOpenAddSheet = useCallback(() => {\n triggerHaptic('light')\n setNewDomain('')\n setAddError(null)\n setIsAddSheetOpen(true)\n }, [])\n\n const handleCloseAddSheet = useCallback(() => {\n triggerHaptic('light')\n setIsAddSheetOpen(false)\n }, [])\n\n const handleAddDomain = useCallback(async () => {\n if (!newDomain.trim()) {\n setAddError(t('admin.organizationDetail.domains.errorDomainRequired'))\n triggerHaptic('error')\n return\n }\n\n setAddError(null)\n setIsAdding(true)\n triggerHaptic('light')\n\n try {\n await client.addOrganizationDomain(organizationId, newDomain.trim().toLowerCase())\n triggerHaptic('success')\n setIsAddSheetOpen(false)\n fetchDomains()\n } catch {\n setAddError(t('admin.organizationDetail.domains.errorAddFailed'))\n triggerHaptic('error')\n } finally {\n setIsAdding(false)\n }\n }, [newDomain, client, organizationId, fetchDomains, t])\n\n const handleVerifyDomain = useCallback(async (domain: string) => {\n setVerifyingDomain(domain)\n triggerHaptic('light')\n try {\n await client.verifyOrganizationDomain(organizationId, domain)\n triggerHaptic('success')\n fetchDomains()\n } catch {\n triggerHaptic('error')\n } finally {\n setVerifyingDomain(null)\n }\n }, [client, organizationId, fetchDomains])\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center gap-2 p-8 text-sm text-gray-500 dark:text-gray-400\">\n <InlineSpinner />\n <span>{t('admin.organizationDetail.domains.loading')}</span>\n </div>\n )\n }\n\n return (\n <>\n <div className=\"space-y-4\">\n <Button\n color=\"ios-glass-blue\"\n onClick={handleOpenAddSheet}\n fullWidth\n >\n <PlusIcon className=\"mr-1.5 h-4 w-4\" />\n {t('admin.organizationDetail.domains.addButton')}\n </Button>\n\n {domains.length === 0 ? (\n <EmptyState\n message={t('admin.organizationDetail.domains.emptyMessage')}\n description={t('admin.organizationDetail.domains.emptyDescription')}\n icon={GlobeAltIcon}\n variant=\"card\"\n />\n ) : (\n <ListCard>\n {domains.map((domain) => (\n <ListCardItem\n key={domain.id}\n leading={\n <div className={`flex h-9 w-9 items-center justify-center rounded-xl shadow-sm ${\n domain.verified\n ? 'bg-gradient-to-br from-emerald-500 to-green-600'\n : 'bg-gradient-to-br from-amber-500 to-orange-600'\n }`}>\n {domain.verified\n ? <CheckCircleIcon className=\"h-5 w-5 text-white\" />\n : <GlobeAltIcon className=\"h-5 w-5 text-white\" />\n }\n </div>\n }\n trailing={\n !domain.verified ? (\n <Button\n size=\"sm\"\n color=\"ios-glass-blue\"\n onClick={() => handleVerifyDomain(domain.domain)}\n loading={verifyingDomain === domain.domain}\n disabled={verifyingDomain !== null}\n >\n <ArrowPathIcon className=\"mr-1 h-3.5 w-3.5\" />\n {t('admin.organizationDetail.domains.verifyButton')}\n </Button>\n ) : (\n <StatusBadge status=\"active\" label={t('admin.organizationDetail.domains.verifiedLabel')} size=\"sm\" />\n )\n }\n >\n <div>\n <p className=\"text-sm font-medium text-gray-900 dark:text-white\">\n {domain.domain}\n </p>\n {domain.autoJoinEnabled && (\n <p className=\"mt-0.5 text-xs text-gray-500 dark:text-gray-400\">\n {t('admin.organizationDetail.domains.autoJoinEnabled')}\n </p>\n )}\n </div>\n </ListCardItem>\n ))}\n </ListCard>\n )}\n </div>\n\n {/* Add domain sheet */}\n <Sheet\n open={isAddSheetOpen}\n onClose={handleCloseAddSheet}\n title={t('admin.organizationDetail.domains.sheetTitle')}\n side=\"bottom\"\n size=\"md\"\n >\n <div className=\"space-y-4 p-4 sm:p-6\">\n <Input\n label={t('admin.organizationDetail.domains.domainLabel')}\n value={newDomain}\n onChange={(event: React.ChangeEvent<HTMLInputElement>) => setNewDomain(event.target.value)}\n placeholder={t('admin.organizationDetail.domains.domainPlaceholder')}\n disabled={isAdding}\n autoFocus\n />\n\n {addError && (\n <p className=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">{addError}</p>\n )}\n\n <Button\n color=\"ios-glass-blue\"\n fullWidth\n onClick={handleAddDomain}\n loading={isAdding}\n disabled={isAdding || !newDomain.trim()}\n >\n {t('admin.organizationDetail.domains.addDomainButton')}\n </Button>\n </div>\n </Sheet>\n </>\n )\n}\n\n// ── AdminOrganizationDetail ─────────────────────────────────────────────────\n\nexport function AdminOrganizationDetail({\n organization,\n client,\n}: AdminOrganizationDetailProps) {\n const t = useTranslations('windsock')\n\n const [activeTab, setActiveTab] = useState<AdminOrganizationDetailTab>('members')\n\n const segments = ALL_TABS.map((tab) => ({\n value: tab,\n label: t(`admin.organizationDetail.tabs.${tab}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {/* Organization header */}\n <SectionCard\n header={{\n icon: <UsersIcon className=\"h-5 w-5 text-white\" />,\n title: organization.displayName ?? organization.name,\n subtitle: organization.description ?? t('admin.organizationDetail.defaultSubtitle'),\n gradient: 'from-emerald-500 via-teal-500 to-cyan-500',\n rightContent: (\n <StatusBadge\n status={organization.enabled ? 'active' : 'inactive'}\n label={organization.enabled\n ? t('admin.organizationDetail.statusEnabled')\n : t('admin.organizationDetail.statusDisabled')}\n size=\"sm\"\n />\n ),\n }}\n >\n <div className=\"space-y-4\">\n <SegmentedControl\n segments={segments}\n value={activeTab}\n onChange={(value: string) => setActiveTab(value as AdminOrganizationDetailTab)}\n fullWidth\n />\n\n {activeTab === 'members' && (\n <MembersTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'invitations' && (\n <InvitationsTabContent organizationId={organization.id} client={client} />\n )}\n\n {activeTab === 'domains' && (\n <DomainsTabContent organizationId={organization.id} client={client} />\n )}\n </div>\n </SectionCard>\n </div>\n )\n}\n"]}