@burdenoff/microfe-workspaces 2026.530.2 → 2026.531.2
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/WorkspacesRoutes.js +19 -15
- package/dist/WorkspacesRoutes.js.map +1 -1
- package/dist/components/ProjectCard.js +2 -2
- package/dist/components/ProjectCard.js.map +1 -1
- package/dist/components/tags/ProjectTagsWidget.js +53 -57
- package/dist/components/tags/ProjectTagsWidget.js.map +1 -1
- package/dist/generated/wspace-operations.js +24 -9
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useMemberMutations.js +2 -2
- package/dist/hooks/useMemberMutations.js.map +1 -1
- package/dist/hooks/usePendingInvitations.js +29 -0
- package/dist/hooks/usePendingInvitations.js.map +1 -0
- package/dist/hooks/useProjectMutations.js +107 -6
- package/dist/hooks/useProjectMutations.js.map +1 -1
- package/dist/hooks/useProjects.js +1 -1
- package/dist/hooks/useProjects.js.map +1 -1
- package/dist/hooks/useWorkspaceMembers.js +1 -1
- package/dist/hooks/useWorkspaceMembers.js.map +1 -1
- package/dist/index.js +20 -18
- package/dist/pages/InviteAcceptancePage.js +68 -44
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/PendingInvitesPage.js +254 -0
- package/dist/pages/PendingInvitesPage.js.map +1 -0
- package/dist/pages/ProjectDetailPage.js +187 -161
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectsListPage.js +2 -2
- package/dist/pages/ProjectsListPage.js.map +1 -1
- package/dist/pages/WorkspacesListPage.js +118 -102
- package/dist/pages/WorkspacesListPage.js.map +1 -1
- package/dist/utils/projectTags.js +28 -2
- package/dist/utils/projectTags.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,20 +9,30 @@ import { Badge as _, Button as v, Card as y, CardContent as b, CardDescription a
|
|
|
9
9
|
import { useLocation as T, useNavigate as E, useParams as D } from "react-router-dom";
|
|
10
10
|
import { useI18n as O } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
11
|
//#region src/pages/InviteAcceptancePage.tsx
|
|
12
|
-
function k() {
|
|
12
|
+
function k(e) {
|
|
13
|
+
if (e.workspaceName) return e.workspaceName;
|
|
14
|
+
let t = e.context?.metadata?.workspaceName;
|
|
15
|
+
return typeof t == "string" && t.trim().length > 0 ? t : e.workspaceId || "—";
|
|
16
|
+
}
|
|
17
|
+
function A(e) {
|
|
18
|
+
if (Array.isArray(e.roleNames) && e.roleNames.length > 0) return e.roleNames;
|
|
19
|
+
let t = e.context?.metadata?.roleNames;
|
|
20
|
+
return Array.isArray(t) && t.every((e) => typeof e == "string") ? t : e.roleIds;
|
|
21
|
+
}
|
|
22
|
+
function j() {
|
|
13
23
|
n("workspaces.invite");
|
|
14
|
-
let { t: o } = O(), { invitationId: s } = D(), w = T(),
|
|
15
|
-
|
|
24
|
+
let { t: o } = O(), { invitationId: s } = D(), w = T(), j = E(), { authToken: z } = e(), B = s || w.pathname.split("/").filter(Boolean).at(-1) || "", V = !!z, H = B ? `/auth/login?returnTo=${encodeURIComponent(`/workspaces/invite/${B}`)}` : "/auth/login?returnTo=%2Fworkspaces%2Flist", { data: U, isLoading: W, error: G, refetch: K } = r(B || "", V), { mutate: q, isPending: J } = i(), { mutate: Y, isPending: X } = a(), Z = U ? k(U) : null, Q = U ? A(U) : [], $ = () => {
|
|
25
|
+
B && q(B, {
|
|
16
26
|
onSuccess: (e) => {
|
|
17
|
-
let t = e.workspaceId ||
|
|
18
|
-
|
|
27
|
+
let t = e.workspaceId || U?.workspaceId;
|
|
28
|
+
j(t ? `/workspaces/${t}/members` : "/workspaces/list");
|
|
19
29
|
},
|
|
20
30
|
onError: (e) => {
|
|
21
31
|
console.error("Failed to accept invitation:", e);
|
|
22
32
|
}
|
|
23
33
|
});
|
|
24
34
|
};
|
|
25
|
-
if (!
|
|
35
|
+
if (!V) return /* @__PURE__ */ h("div", {
|
|
26
36
|
className: "min-h-screen flex items-center justify-center bg-muted/30 p-4",
|
|
27
37
|
children: /* @__PURE__ */ g(y, {
|
|
28
38
|
className: "max-w-xl w-full",
|
|
@@ -45,40 +55,40 @@ function k() {
|
|
|
45
55
|
children: [/* @__PURE__ */ h(v, {
|
|
46
56
|
asChild: !0,
|
|
47
57
|
children: /* @__PURE__ */ h("a", {
|
|
48
|
-
href:
|
|
58
|
+
href: H,
|
|
49
59
|
children: t(o, "inviteAcceptance.signInButton", "Sign In")
|
|
50
60
|
})
|
|
51
61
|
}), /* @__PURE__ */ g(v, {
|
|
52
62
|
variant: "outline",
|
|
53
|
-
onClick: () =>
|
|
63
|
+
onClick: () => j("/workspaces/list"),
|
|
54
64
|
children: [/* @__PURE__ */ h(u, { className: "mr-2 size-4" }), t(o, "inviteAcceptance.backToWorkspaces", "Back to Workspaces")]
|
|
55
65
|
})]
|
|
56
66
|
})]
|
|
57
67
|
})]
|
|
58
68
|
})
|
|
59
69
|
});
|
|
60
|
-
let
|
|
61
|
-
|
|
70
|
+
let ee = () => {
|
|
71
|
+
B && Y(B, {
|
|
62
72
|
onSuccess: () => {
|
|
63
|
-
|
|
73
|
+
j("/workspaces/list");
|
|
64
74
|
},
|
|
65
75
|
onError: (e) => {
|
|
66
76
|
console.error("Failed to reject invitation:", e);
|
|
67
77
|
}
|
|
68
78
|
});
|
|
69
79
|
};
|
|
70
|
-
if (
|
|
71
|
-
if (
|
|
72
|
-
error:
|
|
73
|
-
onRetry: () =>
|
|
80
|
+
if (W) return /* @__PURE__ */ h(M, {});
|
|
81
|
+
if (G) return /* @__PURE__ */ h(N, {
|
|
82
|
+
error: G,
|
|
83
|
+
onRetry: () => K()
|
|
74
84
|
});
|
|
75
|
-
if (!
|
|
76
|
-
switch (
|
|
77
|
-
case "ACCEPTED": return /* @__PURE__ */ h(
|
|
78
|
-
case "REJECTED": return /* @__PURE__ */ h(
|
|
79
|
-
case "EXPIRED": return /* @__PURE__ */ h(
|
|
80
|
-
case "CANCELLED": return /* @__PURE__ */ h(
|
|
81
|
-
case "PENDING": return
|
|
85
|
+
if (!U) return /* @__PURE__ */ h(P, {});
|
|
86
|
+
switch (U.status) {
|
|
87
|
+
case "ACCEPTED": return /* @__PURE__ */ h(F, { invitation: U });
|
|
88
|
+
case "REJECTED": return /* @__PURE__ */ h(I, { invitation: U });
|
|
89
|
+
case "EXPIRED": return /* @__PURE__ */ h(L, { invitation: U });
|
|
90
|
+
case "CANCELLED": return /* @__PURE__ */ h(R, { invitation: U });
|
|
91
|
+
case "PENDING": return U.expiresAt && new Date(U.expiresAt) < /* @__PURE__ */ new Date() ? /* @__PURE__ */ h(L, { invitation: U }) : /* @__PURE__ */ h("div", {
|
|
82
92
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
83
93
|
children: /* @__PURE__ */ g(y, {
|
|
84
94
|
className: "max-w-2xl w-full",
|
|
@@ -104,9 +114,23 @@ function k() {
|
|
|
104
114
|
children: t(o, "inviteAcceptance.emailAddressLabel", "Email Address")
|
|
105
115
|
}), /* @__PURE__ */ h("p", {
|
|
106
116
|
className: "text-lg font-medium mt-1",
|
|
107
|
-
children:
|
|
117
|
+
children: U.email
|
|
108
118
|
})] }),
|
|
109
|
-
|
|
119
|
+
/* @__PURE__ */ g("div", { children: [
|
|
120
|
+
/* @__PURE__ */ h("p", {
|
|
121
|
+
className: "text-sm font-medium text-muted-foreground",
|
|
122
|
+
children: t(o, "inviteAcceptance.workspaceLabel", "Workspace")
|
|
123
|
+
}),
|
|
124
|
+
/* @__PURE__ */ h("p", {
|
|
125
|
+
className: "text-lg font-medium mt-1 break-words",
|
|
126
|
+
children: Z
|
|
127
|
+
}),
|
|
128
|
+
U.workspaceId ? /* @__PURE__ */ h("p", {
|
|
129
|
+
className: "mt-1 font-mono text-xs text-muted-foreground break-all",
|
|
130
|
+
children: U.workspaceId
|
|
131
|
+
}) : null
|
|
132
|
+
] }),
|
|
133
|
+
U.expiresAt && /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
|
|
110
134
|
className: "text-sm font-medium text-muted-foreground",
|
|
111
135
|
children: t(o, "inviteAcceptance.expiresLabel", "Expires")
|
|
112
136
|
}), /* @__PURE__ */ g("p", {
|
|
@@ -114,7 +138,7 @@ function k() {
|
|
|
114
138
|
children: [/* @__PURE__ */ h(l, {
|
|
115
139
|
size: 16,
|
|
116
140
|
className: "text-muted-foreground"
|
|
117
|
-
}), new Date(
|
|
141
|
+
}), new Date(U.expiresAt).toLocaleDateString("en-US", {
|
|
118
142
|
year: "numeric",
|
|
119
143
|
month: "long",
|
|
120
144
|
day: "numeric",
|
|
@@ -122,48 +146,48 @@ function k() {
|
|
|
122
146
|
minute: "2-digit"
|
|
123
147
|
})]
|
|
124
148
|
})] }),
|
|
125
|
-
|
|
149
|
+
Q.length > 0 && /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
|
|
126
150
|
className: "text-sm font-medium text-muted-foreground mb-2",
|
|
127
151
|
children: t(o, "inviteAcceptance.rolesLabel", "Roles")
|
|
128
152
|
}), /* @__PURE__ */ h("div", {
|
|
129
153
|
className: "flex flex-wrap gap-2",
|
|
130
|
-
children:
|
|
154
|
+
children: Q.map((e, t) => /* @__PURE__ */ h(_, {
|
|
131
155
|
variant: "secondary",
|
|
132
156
|
children: e
|
|
133
|
-
}, e))
|
|
157
|
+
}, `${U.id}-${U.roleIds[t] ?? e}`))
|
|
134
158
|
})] }),
|
|
135
159
|
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
|
|
136
160
|
className: "text-sm font-medium text-muted-foreground",
|
|
137
161
|
children: t(o, "inviteAcceptance.invitationIdLabel", "Invitation ID")
|
|
138
162
|
}), /* @__PURE__ */ h("p", {
|
|
139
163
|
className: "text-sm font-mono mt-1 text-muted-foreground",
|
|
140
|
-
children:
|
|
164
|
+
children: U.id
|
|
141
165
|
})] })
|
|
142
166
|
]
|
|
143
167
|
}), /* @__PURE__ */ g("div", {
|
|
144
168
|
className: "flex flex-col sm:flex-row gap-3 pt-4 border-t",
|
|
145
169
|
children: [/* @__PURE__ */ h(v, {
|
|
146
|
-
onClick:
|
|
147
|
-
disabled:
|
|
170
|
+
onClick: $,
|
|
171
|
+
disabled: J || X,
|
|
148
172
|
className: "flex-1",
|
|
149
173
|
size: "lg",
|
|
150
|
-
children:
|
|
174
|
+
children: J ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(f, { className: "mr-2 size-4 animate-spin" }), t(o, "inviteAcceptance.accepting", "Accepting...")] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(c, { className: "mr-2 size-4" }), t(o, "inviteAcceptance.acceptButton", "Accept Invitation")] })
|
|
151
175
|
}), /* @__PURE__ */ h(v, {
|
|
152
176
|
variant: "outline",
|
|
153
|
-
onClick:
|
|
154
|
-
disabled:
|
|
177
|
+
onClick: ee,
|
|
178
|
+
disabled: J || X,
|
|
155
179
|
className: "flex-1",
|
|
156
180
|
size: "lg",
|
|
157
|
-
children:
|
|
181
|
+
children: X ? /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(f, { className: "mr-2 size-4 animate-spin" }), t(o, "inviteAcceptance.rejecting", "Rejecting...")] }) : /* @__PURE__ */ g(m, { children: [/* @__PURE__ */ h(p, { className: "mr-2 size-4" }), t(o, "inviteAcceptance.rejectButton", "Reject")] })
|
|
158
182
|
})]
|
|
159
183
|
})]
|
|
160
184
|
})]
|
|
161
185
|
})
|
|
162
186
|
});
|
|
163
|
-
default: return /* @__PURE__ */ h(
|
|
187
|
+
default: return /* @__PURE__ */ h(P, {});
|
|
164
188
|
}
|
|
165
189
|
}
|
|
166
|
-
function
|
|
190
|
+
function M() {
|
|
167
191
|
return /* @__PURE__ */ h("div", {
|
|
168
192
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
169
193
|
children: /* @__PURE__ */ g(y, {
|
|
@@ -193,7 +217,7 @@ function A() {
|
|
|
193
217
|
})
|
|
194
218
|
});
|
|
195
219
|
}
|
|
196
|
-
function
|
|
220
|
+
function N({ error: e, onRetry: n }) {
|
|
197
221
|
let { t: r } = O(), i = E();
|
|
198
222
|
return /* @__PURE__ */ h("div", {
|
|
199
223
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -239,7 +263,7 @@ function j({ error: e, onRetry: n }) {
|
|
|
239
263
|
})
|
|
240
264
|
});
|
|
241
265
|
}
|
|
242
|
-
function
|
|
266
|
+
function P() {
|
|
243
267
|
let { t: e } = O(), n = E();
|
|
244
268
|
return /* @__PURE__ */ h("div", {
|
|
245
269
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -277,7 +301,7 @@ function M() {
|
|
|
277
301
|
})
|
|
278
302
|
});
|
|
279
303
|
}
|
|
280
|
-
function
|
|
304
|
+
function F({ invitation: e }) {
|
|
281
305
|
let { t: n } = O(), r = E();
|
|
282
306
|
return /* @__PURE__ */ h("div", {
|
|
283
307
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -322,7 +346,7 @@ function N({ invitation: e }) {
|
|
|
322
346
|
})
|
|
323
347
|
});
|
|
324
348
|
}
|
|
325
|
-
function
|
|
349
|
+
function I({ invitation: e }) {
|
|
326
350
|
let { t: n } = O(), r = E();
|
|
327
351
|
return /* @__PURE__ */ h("div", {
|
|
328
352
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -367,7 +391,7 @@ function P({ invitation: e }) {
|
|
|
367
391
|
})
|
|
368
392
|
});
|
|
369
393
|
}
|
|
370
|
-
function
|
|
394
|
+
function L({ invitation: e }) {
|
|
371
395
|
let { t: n } = O(), r = E();
|
|
372
396
|
return /* @__PURE__ */ h("div", {
|
|
373
397
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -425,7 +449,7 @@ function F({ invitation: e }) {
|
|
|
425
449
|
})
|
|
426
450
|
});
|
|
427
451
|
}
|
|
428
|
-
function
|
|
452
|
+
function R({ invitation: e }) {
|
|
429
453
|
let { t: n } = O(), r = E();
|
|
430
454
|
return /* @__PURE__ */ h("div", {
|
|
431
455
|
className: "min-h-screen flex items-center justify-center p-4 bg-muted/30",
|
|
@@ -471,6 +495,6 @@ function I({ invitation: e }) {
|
|
|
471
495
|
});
|
|
472
496
|
}
|
|
473
497
|
//#endregion
|
|
474
|
-
export {
|
|
498
|
+
export { j as InviteAcceptancePage };
|
|
475
499
|
|
|
476
500
|
//# sourceMappingURL=InviteAcceptancePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InviteAcceptancePage.js","names":[],"sources":["../../src/pages/InviteAcceptancePage.tsx"],"sourcesContent":["import { useParams, useNavigate, useLocation } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Badge,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Mail,\n CheckCircle,\n XCircle,\n Clock,\n AlertTriangle,\n Ban,\n Home,\n RefreshCw,\n} from 'lucide-react';\nimport { useInvitation } from '../hooks/useWorkspaceMembers';\nimport { useAcceptInvitation, useRejectInvitation } from '../hooks/useMemberMutations';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\nimport type { WorkspaceInvitation } from '../types';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\n\n/**\n * Page for accepting or rejecting workspace invitations\n * Accessible via /workspaces/invite/:invitationId\n */\nexport function InviteAcceptancePage() {\n useWorkspacesPageView('workspaces.invite');\n const { t } = useI18n();\n const { invitationId: routeInvitationId } = useParams<{ invitationId: string }>();\n const location = useLocation();\n const navigate = useNavigate();\n const { authToken } = useWorkspacesContext();\n const invitationId =\n routeInvitationId || location.pathname.split('/').filter(Boolean).at(-1) || '';\n const isAuthenticated = Boolean(authToken);\n\n const inviteLoginPath = invitationId\n ? `/auth/login?returnTo=${encodeURIComponent(`/workspaces/invite/${invitationId}`)}`\n : '/auth/login?returnTo=%2Fworkspaces%2Flist';\n\n // Fetch invitation details\n const {\n data: invitation,\n isLoading,\n error,\n refetch,\n } = useInvitation(invitationId || '', isAuthenticated);\n\n // Mutations\n const { mutate: acceptInvitation, isPending: isAccepting } = useAcceptInvitation();\n const { mutate: rejectInvitation, isPending: isRejecting } = useRejectInvitation();\n\n // Handler for accepting invitation\n const handleAccept = () => {\n if (!invitationId) return;\n\n acceptInvitation(invitationId, {\n onSuccess: (acceptedInvitation) => {\n // Redirect to workspace members page\n const workspaceId = acceptedInvitation.workspaceId || invitation?.workspaceId;\n if (workspaceId) {\n navigate(`/workspaces/${workspaceId}/members`);\n } else {\n navigate('/workspaces/list');\n }\n },\n onError: (error) => {\n console.error('Failed to accept invitation:', error);\n },\n });\n };\n\n if (!isAuthenticated) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-muted/30 p-4\">\n <Card className=\"max-w-xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-primary/10 p-3\">\n <Mail className=\"text-primary\" size={24} />\n </div>\n <div>\n <CardTitle>\n {tWithFallback(\n t,\n 'inviteAcceptance.signInRequired',\n 'Sign in to view your invitation'\n )}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.signInDescription',\n 'Workspace invitations require an authenticated Burdenoff account before you can review or accept them.'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n {tWithFallback(\n t,\n 'inviteAcceptance.signInHint',\n 'Use the same email address that received the invitation, then come back here to accept or reject it.'\n )}\n </p>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <Button asChild>\n <a href={inviteLoginPath}>\n {tWithFallback(t, 'inviteAcceptance.signInButton', 'Sign In')}\n </a>\n </Button>\n <Button variant=\"outline\" onClick={() => navigate('/workspaces/list')}>\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Handler for rejecting invitation\n const handleReject = () => {\n if (!invitationId) return;\n\n rejectInvitation(invitationId, {\n onSuccess: () => {\n // Redirect to workspaces list\n navigate('/workspaces/list');\n },\n onError: (error) => {\n console.error('Failed to reject invitation:', error);\n },\n });\n };\n\n // Loading state\n if (isLoading) {\n return <LoadingSkeleton />;\n }\n\n // Error state (network error or other issues)\n if (error) {\n return <ErrorState error={error} onRetry={() => refetch()} />;\n }\n\n // Not found state\n if (!invitation) {\n return <NotFoundState />;\n }\n\n // Check invitation status and show appropriate UI\n switch (invitation.status) {\n case 'ACCEPTED':\n return <AlreadyAcceptedState invitation={invitation} />;\n case 'REJECTED':\n return <AlreadyRejectedState invitation={invitation} />;\n case 'EXPIRED':\n return <ExpiredState invitation={invitation} />;\n case 'CANCELLED':\n return <CancelledState invitation={invitation} />;\n case 'PENDING':\n // Check if invitation has expired based on expiresAt\n if (invitation.expiresAt && new Date(invitation.expiresAt) < new Date()) {\n return <ExpiredState invitation={invitation} />;\n }\n\n // Show main acceptance UI\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-primary/10\">\n <Mail className=\"text-primary\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.pageTitle', 'Workspace Invitation')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.pageSubtitle',\n \"You've been invited to join a workspace\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Invitation Details */}\n <div className=\"space-y-4 p-4 rounded-lg bg-muted/50\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.emailAddressLabel', 'Email Address')}\n </p>\n <p className=\"text-lg font-medium mt-1\">{invitation.email}</p>\n </div>\n\n {invitation.expiresAt && (\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.expiresLabel', 'Expires')}\n </p>\n <p className=\"text-lg font-medium mt-1 flex items-center gap-2\">\n <Clock size={16} className=\"text-muted-foreground\" />\n {new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}\n </p>\n </div>\n )}\n\n {invitation.roleIds && invitation.roleIds.length > 0 && (\n <div>\n <p className=\"text-sm font-medium text-muted-foreground mb-2\">\n {tWithFallback(t, 'inviteAcceptance.rolesLabel', 'Roles')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {invitation.roleIds.map((roleId) => (\n <Badge key={roleId} variant=\"secondary\">\n {roleId}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.invitationIdLabel', 'Invitation ID')}\n </p>\n <p className=\"text-sm font-mono mt-1 text-muted-foreground\">{invitation.id}</p>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col sm:flex-row gap-3 pt-4 border-t\">\n <Button\n onClick={handleAccept}\n disabled={isAccepting || isRejecting}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isAccepting ? (\n <>\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n {tWithFallback(t, 'inviteAcceptance.accepting', 'Accepting...')}\n </>\n ) : (\n <>\n <CheckCircle className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.acceptButton', 'Accept Invitation')}\n </>\n )}\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleReject}\n disabled={isAccepting || isRejecting}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isRejecting ? (\n <>\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n {tWithFallback(t, 'inviteAcceptance.rejecting', 'Rejecting...')}\n </>\n ) : (\n <>\n <XCircle className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.rejectButton', 'Reject')}\n </>\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n\n default:\n return <NotFoundState />;\n }\n}\n\n/**\n * Loading skeleton while fetching invitation\n */\nfunction LoadingSkeleton() {\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"size-12 rounded-lg\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-6 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4 p-4 rounded-lg bg-muted/50\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-6 w-48\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-6 w-64\" />\n </div>\n </div>\n <div className=\"flex gap-3 pt-4\">\n <Skeleton className=\"h-12 flex-1\" />\n <Skeleton className=\"h-12 flex-1\" />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Error state with retry option\n */\nfunction ErrorState({ error, onRetry }: { error: Error; onRetry: () => void }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-destructive/10\">\n <AlertTriangle className=\"text-destructive\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.errorTitle', 'Error Loading Invitation')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.errorDescription',\n \"We couldn't load this invitation. Please try again.\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-destructive/50 bg-destructive/10\">\n <AlertTriangle className=\"size-5 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-destructive\">\n {tWithFallback(t, 'inviteAcceptance.errorDetailsLabel', 'Error Details')}\n </p>\n <p className=\"text-sm mt-1 text-destructive/90\">{error.message}</p>\n </div>\n </div>\n\n <div className=\"flex gap-3\">\n <Button onClick={onRetry} className=\"flex-1\">\n <RefreshCw className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.tryAgain', 'Try Again')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => navigate('/workspaces/list')}\n className=\"flex-1\"\n >\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Not found state (invalid invitation ID)\n */\nfunction NotFoundState() {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-muted\">\n <AlertTriangle className=\"text-muted-foreground\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.notFoundTitle', 'Invitation Not Found')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.notFoundDescription',\n 'This invitation link is invalid or has been removed'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-border bg-muted/50\">\n <AlertTriangle className=\"size-5 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tWithFallback(t, 'inviteAcceptance.invalidLinkHeading', 'Invalid Invitation Link')}\n </p>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n {tWithFallback(\n t,\n 'inviteAcceptance.invalidLinkBody',\n \"The invitation you're trying to access doesn't exist. It may have been deleted or the link is incorrect.\"\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Already accepted state\n */\nfunction AlreadyAcceptedState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-status-success/10 transition-colors\">\n <CheckCircle className=\"text-status-success\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedTitle',\n 'Invitation Already Accepted'\n )}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedDescription',\n 'This invitation has already been accepted'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-status-success/30 bg-status-success/10 transition-colors\">\n <CheckCircle className=\"size-5 text-status-success flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-success\">\n {tWithFallback(t, 'inviteAcceptance.alreadyMember', \"You're already a member\")}\n </p>\n <p className=\"text-sm mt-1 text-status-success/80\">\n {tWithFallback(t, 'inviteAcceptance.alreadyAcceptedPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedSuffix',\n ' has already been accepted.'\n )}\n </p>\n </div>\n </div>\n\n <Button\n onClick={() => navigate(`/workspaces/${invitation.workspaceId}/members`)}\n className=\"w-full\"\n >\n {tWithFallback(t, 'inviteAcceptance.goToWorkspace', 'Go to Workspace')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Already rejected state\n */\nfunction AlreadyRejectedState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-muted\">\n <XCircle className=\"text-muted-foreground\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.rejectedTitle', 'Invitation Rejected')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.rejectedDescription',\n \"You've already declined this invitation\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-border bg-muted/50\">\n <XCircle className=\"size-5 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tWithFallback(t, 'inviteAcceptance.invitationDeclined', 'Invitation Declined')}\n </p>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.rejectedPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(t, 'inviteAcceptance.rejectedSuffix', ' was previously rejected.')}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Expired state\n */\nfunction ExpiredState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-status-warning/10 transition-colors\">\n <Clock className=\"text-status-warning\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.expiredTitle', 'Invitation Expired')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.expiredDescription',\n 'This invitation has expired'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-status-warning/30 bg-status-warning/10 transition-colors\">\n <Clock className=\"size-5 text-status-warning flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-warning\">\n {tWithFallback(t, 'inviteAcceptance.expiredHeading', 'Invitation No Longer Valid')}\n </p>\n <p className=\"text-sm mt-1 text-status-warning/80\">\n {tWithFallback(t, 'inviteAcceptance.expiredPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(t, 'inviteAcceptance.expiredMiddle', ' expired on ')}\n {invitation.expiresAt &&\n new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n .\n </p>\n <p className=\"text-sm mt-2 text-status-warning/80\">\n {tWithFallback(\n t,\n 'inviteAcceptance.expiredContactAdmin',\n 'Please contact the workspace admin to request a new invitation.'\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Cancelled state\n */\nfunction CancelledState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-destructive/10\">\n <Ban className=\"text-destructive\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.cancelledTitle', 'Invitation Cancelled')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledDescription',\n 'This invitation has been cancelled by the sender'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-destructive/50 bg-destructive/10\">\n <Ban className=\"size-5 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-destructive\">\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledHeading',\n 'Invitation No Longer Available'\n )}\n </p>\n <p className=\"text-sm mt-1 text-destructive/90\">\n {tWithFallback(t, 'inviteAcceptance.cancelledPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledSuffix',\n ' was cancelled by the workspace admin and is no longer valid.'\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InviteAcceptancePage.js","names":[],"sources":["../../src/pages/InviteAcceptancePage.tsx"],"sourcesContent":["import { useParams, useNavigate, useLocation } from 'react-router-dom';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Badge,\n Skeleton,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Mail,\n CheckCircle,\n XCircle,\n Clock,\n AlertTriangle,\n Ban,\n Home,\n RefreshCw,\n} from 'lucide-react';\nimport { useInvitation } from '../hooks/useWorkspaceMembers';\nimport { useAcceptInvitation, useRejectInvitation } from '../hooks/useMemberMutations';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\nimport type { WorkspaceInvitation } from '../types';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\n\nfunction getWorkspaceDisplayName(invitation: WorkspaceInvitation) {\n if (invitation.workspaceName) {\n return invitation.workspaceName;\n }\n\n const metadataWorkspaceName = invitation.context?.metadata?.workspaceName;\n if (typeof metadataWorkspaceName === 'string' && metadataWorkspaceName.trim().length > 0) {\n return metadataWorkspaceName;\n }\n\n return invitation.workspaceId || '—';\n}\n\nfunction getRoleDisplayNames(invitation: WorkspaceInvitation) {\n if (Array.isArray(invitation.roleNames) && invitation.roleNames.length > 0) {\n return invitation.roleNames;\n }\n\n const metadataRoleNames = invitation.context?.metadata?.roleNames;\n if (\n Array.isArray(metadataRoleNames) &&\n metadataRoleNames.every((value) => typeof value === 'string')\n ) {\n return metadataRoleNames;\n }\n\n return invitation.roleIds;\n}\n\n/**\n * Page for accepting or rejecting workspace invitations\n * Accessible via /workspaces/invite/:invitationId\n */\nexport function InviteAcceptancePage() {\n useWorkspacesPageView('workspaces.invite');\n const { t } = useI18n();\n const { invitationId: routeInvitationId } = useParams<{ invitationId: string }>();\n const location = useLocation();\n const navigate = useNavigate();\n const { authToken } = useWorkspacesContext();\n const invitationId =\n routeInvitationId || location.pathname.split('/').filter(Boolean).at(-1) || '';\n const isAuthenticated = Boolean(authToken);\n\n const inviteLoginPath = invitationId\n ? `/auth/login?returnTo=${encodeURIComponent(`/workspaces/invite/${invitationId}`)}`\n : '/auth/login?returnTo=%2Fworkspaces%2Flist';\n\n // Fetch invitation details\n const {\n data: invitation,\n isLoading,\n error,\n refetch,\n } = useInvitation(invitationId || '', isAuthenticated);\n\n // Mutations\n const { mutate: acceptInvitation, isPending: isAccepting } = useAcceptInvitation();\n const { mutate: rejectInvitation, isPending: isRejecting } = useRejectInvitation();\n const workspaceDisplayName = invitation ? getWorkspaceDisplayName(invitation) : null;\n const roleDisplayNames = invitation ? getRoleDisplayNames(invitation) : [];\n\n // Handler for accepting invitation\n const handleAccept = () => {\n if (!invitationId) return;\n\n acceptInvitation(invitationId, {\n onSuccess: (acceptedInvitation) => {\n // Redirect to workspace members page\n const workspaceId = acceptedInvitation.workspaceId || invitation?.workspaceId;\n if (workspaceId) {\n navigate(`/workspaces/${workspaceId}/members`);\n } else {\n navigate('/workspaces/list');\n }\n },\n onError: (error) => {\n console.error('Failed to accept invitation:', error);\n },\n });\n };\n\n if (!isAuthenticated) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-muted/30 p-4\">\n <Card className=\"max-w-xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-primary/10 p-3\">\n <Mail className=\"text-primary\" size={24} />\n </div>\n <div>\n <CardTitle>\n {tWithFallback(\n t,\n 'inviteAcceptance.signInRequired',\n 'Sign in to view your invitation'\n )}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.signInDescription',\n 'Workspace invitations require an authenticated Burdenoff account before you can review or accept them.'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <p className=\"text-sm text-muted-foreground\">\n {tWithFallback(\n t,\n 'inviteAcceptance.signInHint',\n 'Use the same email address that received the invitation, then come back here to accept or reject it.'\n )}\n </p>\n <div className=\"flex flex-col gap-3 sm:flex-row\">\n <Button asChild>\n <a href={inviteLoginPath}>\n {tWithFallback(t, 'inviteAcceptance.signInButton', 'Sign In')}\n </a>\n </Button>\n <Button variant=\"outline\" onClick={() => navigate('/workspaces/list')}>\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n // Handler for rejecting invitation\n const handleReject = () => {\n if (!invitationId) return;\n\n rejectInvitation(invitationId, {\n onSuccess: () => {\n // Redirect to workspaces list\n navigate('/workspaces/list');\n },\n onError: (error) => {\n console.error('Failed to reject invitation:', error);\n },\n });\n };\n\n // Loading state\n if (isLoading) {\n return <LoadingSkeleton />;\n }\n\n // Error state (network error or other issues)\n if (error) {\n return <ErrorState error={error} onRetry={() => refetch()} />;\n }\n\n // Not found state\n if (!invitation) {\n return <NotFoundState />;\n }\n\n // Check invitation status and show appropriate UI\n switch (invitation.status) {\n case 'ACCEPTED':\n return <AlreadyAcceptedState invitation={invitation} />;\n case 'REJECTED':\n return <AlreadyRejectedState invitation={invitation} />;\n case 'EXPIRED':\n return <ExpiredState invitation={invitation} />;\n case 'CANCELLED':\n return <CancelledState invitation={invitation} />;\n case 'PENDING':\n // Check if invitation has expired based on expiresAt\n if (invitation.expiresAt && new Date(invitation.expiresAt) < new Date()) {\n return <ExpiredState invitation={invitation} />;\n }\n\n // Show main acceptance UI\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-primary/10\">\n <Mail className=\"text-primary\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.pageTitle', 'Workspace Invitation')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.pageSubtitle',\n \"You've been invited to join a workspace\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n {/* Invitation Details */}\n <div className=\"space-y-4 p-4 rounded-lg bg-muted/50\">\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.emailAddressLabel', 'Email Address')}\n </p>\n <p className=\"text-lg font-medium mt-1\">{invitation.email}</p>\n </div>\n\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.workspaceLabel', 'Workspace')}\n </p>\n <p className=\"text-lg font-medium mt-1 break-words\">{workspaceDisplayName}</p>\n {invitation.workspaceId ? (\n <p className=\"mt-1 font-mono text-xs text-muted-foreground break-all\">\n {invitation.workspaceId}\n </p>\n ) : null}\n </div>\n\n {invitation.expiresAt && (\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.expiresLabel', 'Expires')}\n </p>\n <p className=\"text-lg font-medium mt-1 flex items-center gap-2\">\n <Clock size={16} className=\"text-muted-foreground\" />\n {new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })}\n </p>\n </div>\n )}\n\n {roleDisplayNames.length > 0 && (\n <div>\n <p className=\"text-sm font-medium text-muted-foreground mb-2\">\n {tWithFallback(t, 'inviteAcceptance.rolesLabel', 'Roles')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {roleDisplayNames.map((roleName, index) => (\n <Badge\n key={`${invitation.id}-${invitation.roleIds[index] ?? roleName}`}\n variant=\"secondary\"\n >\n {roleName}\n </Badge>\n ))}\n </div>\n </div>\n )}\n\n <div>\n <p className=\"text-sm font-medium text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.invitationIdLabel', 'Invitation ID')}\n </p>\n <p className=\"text-sm font-mono mt-1 text-muted-foreground\">{invitation.id}</p>\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-col sm:flex-row gap-3 pt-4 border-t\">\n <Button\n onClick={handleAccept}\n disabled={isAccepting || isRejecting}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isAccepting ? (\n <>\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n {tWithFallback(t, 'inviteAcceptance.accepting', 'Accepting...')}\n </>\n ) : (\n <>\n <CheckCircle className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.acceptButton', 'Accept Invitation')}\n </>\n )}\n </Button>\n <Button\n variant=\"outline\"\n onClick={handleReject}\n disabled={isAccepting || isRejecting}\n className=\"flex-1\"\n size=\"lg\"\n >\n {isRejecting ? (\n <>\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n {tWithFallback(t, 'inviteAcceptance.rejecting', 'Rejecting...')}\n </>\n ) : (\n <>\n <XCircle className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.rejectButton', 'Reject')}\n </>\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n\n default:\n return <NotFoundState />;\n }\n}\n\n/**\n * Loading skeleton while fetching invitation\n */\nfunction LoadingSkeleton() {\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"size-12 rounded-lg\" />\n <div className=\"flex-1 space-y-2\">\n <Skeleton className=\"h-6 w-48\" />\n <Skeleton className=\"h-4 w-64\" />\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-6\">\n <div className=\"space-y-4 p-4 rounded-lg bg-muted/50\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-6 w-48\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-6 w-64\" />\n </div>\n </div>\n <div className=\"flex gap-3 pt-4\">\n <Skeleton className=\"h-12 flex-1\" />\n <Skeleton className=\"h-12 flex-1\" />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Error state with retry option\n */\nfunction ErrorState({ error, onRetry }: { error: Error; onRetry: () => void }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-destructive/10\">\n <AlertTriangle className=\"text-destructive\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.errorTitle', 'Error Loading Invitation')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.errorDescription',\n \"We couldn't load this invitation. Please try again.\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-destructive/50 bg-destructive/10\">\n <AlertTriangle className=\"size-5 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-destructive\">\n {tWithFallback(t, 'inviteAcceptance.errorDetailsLabel', 'Error Details')}\n </p>\n <p className=\"text-sm mt-1 text-destructive/90\">{error.message}</p>\n </div>\n </div>\n\n <div className=\"flex gap-3\">\n <Button onClick={onRetry} className=\"flex-1\">\n <RefreshCw className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.tryAgain', 'Try Again')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => navigate('/workspaces/list')}\n className=\"flex-1\"\n >\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Not found state (invalid invitation ID)\n */\nfunction NotFoundState() {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-muted\">\n <AlertTriangle className=\"text-muted-foreground\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.notFoundTitle', 'Invitation Not Found')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.notFoundDescription',\n 'This invitation link is invalid or has been removed'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-border bg-muted/50\">\n <AlertTriangle className=\"size-5 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tWithFallback(t, 'inviteAcceptance.invalidLinkHeading', 'Invalid Invitation Link')}\n </p>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n {tWithFallback(\n t,\n 'inviteAcceptance.invalidLinkBody',\n \"The invitation you're trying to access doesn't exist. It may have been deleted or the link is incorrect.\"\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Already accepted state\n */\nfunction AlreadyAcceptedState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-status-success/10 transition-colors\">\n <CheckCircle className=\"text-status-success\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedTitle',\n 'Invitation Already Accepted'\n )}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedDescription',\n 'This invitation has already been accepted'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-status-success/30 bg-status-success/10 transition-colors\">\n <CheckCircle className=\"size-5 text-status-success flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-success\">\n {tWithFallback(t, 'inviteAcceptance.alreadyMember', \"You're already a member\")}\n </p>\n <p className=\"text-sm mt-1 text-status-success/80\">\n {tWithFallback(t, 'inviteAcceptance.alreadyAcceptedPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(\n t,\n 'inviteAcceptance.alreadyAcceptedSuffix',\n ' has already been accepted.'\n )}\n </p>\n </div>\n </div>\n\n <Button\n onClick={() => navigate(`/workspaces/${invitation.workspaceId}/members`)}\n className=\"w-full\"\n >\n {tWithFallback(t, 'inviteAcceptance.goToWorkspace', 'Go to Workspace')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Already rejected state\n */\nfunction AlreadyRejectedState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-muted\">\n <XCircle className=\"text-muted-foreground\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.rejectedTitle', 'Invitation Rejected')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.rejectedDescription',\n \"You've already declined this invitation\"\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-border bg-muted/50\">\n <XCircle className=\"size-5 text-muted-foreground flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tWithFallback(t, 'inviteAcceptance.invitationDeclined', 'Invitation Declined')}\n </p>\n <p className=\"text-sm mt-1 text-muted-foreground\">\n {tWithFallback(t, 'inviteAcceptance.rejectedPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(t, 'inviteAcceptance.rejectedSuffix', ' was previously rejected.')}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Expired state\n */\nfunction ExpiredState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-status-warning/10 transition-colors\">\n <Clock className=\"text-status-warning\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.expiredTitle', 'Invitation Expired')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.expiredDescription',\n 'This invitation has expired'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-status-warning/30 bg-status-warning/10 transition-colors\">\n <Clock className=\"size-5 text-status-warning flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-warning\">\n {tWithFallback(t, 'inviteAcceptance.expiredHeading', 'Invitation No Longer Valid')}\n </p>\n <p className=\"text-sm mt-1 text-status-warning/80\">\n {tWithFallback(t, 'inviteAcceptance.expiredPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(t, 'inviteAcceptance.expiredMiddle', ' expired on ')}\n {invitation.expiresAt &&\n new Date(invitation.expiresAt).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n })}\n .\n </p>\n <p className=\"text-sm mt-2 text-status-warning/80\">\n {tWithFallback(\n t,\n 'inviteAcceptance.expiredContactAdmin',\n 'Please contact the workspace admin to request a new invitation.'\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n\n/**\n * Cancelled state\n */\nfunction CancelledState({ invitation }: { invitation: WorkspaceInvitation }) {\n const { t } = useI18n();\n const navigate = useNavigate();\n return (\n <div className=\"min-h-screen flex items-center justify-center p-4 bg-muted/30\">\n <Card className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-destructive/10\">\n <Ban className=\"text-destructive\" size={24} />\n </div>\n <div className=\"flex-1\">\n <CardTitle>\n {tWithFallback(t, 'inviteAcceptance.cancelledTitle', 'Invitation Cancelled')}\n </CardTitle>\n <CardDescription>\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledDescription',\n 'This invitation has been cancelled by the sender'\n )}\n </CardDescription>\n </div>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex gap-3 p-4 rounded-lg border border-destructive/50 bg-destructive/10\">\n <Ban className=\"size-5 text-destructive flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-destructive\">\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledHeading',\n 'Invitation No Longer Available'\n )}\n </p>\n <p className=\"text-sm mt-1 text-destructive/90\">\n {tWithFallback(t, 'inviteAcceptance.cancelledPrefix', 'This invitation to ')}\n <span className=\"font-medium\">{invitation.email}</span>\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledSuffix',\n ' was cancelled by the workspace admin and is no longer valid.'\n )}\n </p>\n </div>\n </div>\n\n <Button onClick={() => navigate('/workspaces/list')} className=\"w-full\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'inviteAcceptance.goToWorkspaces', 'Go to Workspaces')}\n </Button>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|