@burdenoff/microfe-workspaces 2026.830.1 → 2026.915.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/CreateProjectDialog.js +65 -61
- package/dist/components/CreateProjectDialog.js.map +1 -1
- package/dist/components/CreateWorkspaceDialog.js +93 -90
- package/dist/components/CreateWorkspaceDialog.js.map +1 -1
- package/dist/components/InviteMemberDialog.js +122 -111
- package/dist/components/InviteMemberDialog.js.map +1 -1
- package/dist/components/MemberListItem.js +55 -58
- package/dist/components/MemberListItem.js.map +1 -1
- package/dist/components/ProjectCard.js +93 -92
- package/dist/components/ProjectCard.js.map +1 -1
- package/dist/components/ProjectMemberPickerDialog.js +78 -93
- package/dist/components/ProjectMemberPickerDialog.js.map +1 -1
- package/dist/components/RenameProjectDialog.js +47 -44
- package/dist/components/RenameProjectDialog.js.map +1 -1
- package/dist/components/WorkspaceCard.js +42 -43
- package/dist/components/WorkspaceCard.js.map +1 -1
- package/dist/components/WorkspacesErrorBoundary.js +43 -34
- package/dist/components/WorkspacesErrorBoundary.js.map +1 -1
- package/dist/components/tags/ProjectTagsWidget.js +75 -77
- package/dist/components/tags/ProjectTagsWidget.js.map +1 -1
- package/dist/hooks/useTr.js +14 -0
- package/dist/hooks/useTr.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/pages/ActivityListPage.js +3 -3
- package/dist/pages/CreateWorkspacePage.js +10 -10
- package/dist/pages/InviteAcceptancePage.js +49 -49
- package/dist/pages/InviteAcceptancePage.js.map +1 -1
- package/dist/pages/MembersListPage.js +6 -6
- package/dist/pages/PendingInvitesPage.js +3 -3
- package/dist/pages/ProjectDetailPage.js +4 -4
- package/dist/pages/ProjectDetailPage.js.map +1 -1
- package/dist/pages/ProjectMembersPage.js +3 -3
- package/dist/pages/ProjectsListPage.js +5 -5
- package/dist/pages/WorkspaceDetailPage.js +4 -4
- package/dist/pages/WorkspaceInvitePage.js +4 -4
- package/dist/pages/WorkspaceSettingsPage.js +7 -7
- package/dist/pages/WorkspacesListPage.js +9 -9
- package/dist/pages/dashboard/widgets/RecentActivityWidget.js +4 -4
- package/dist/pages/dashboard/widgets/StorageWidget.js +3 -3
- package/dist/pages/dashboard/widgets/WelcomeWidget.js +26 -16
- package/dist/pages/dashboard/widgets/WelcomeWidget.js.map +1 -1
- package/dist/translations/en.js +908 -0
- package/dist/translations/en.js.map +1 -0
- package/package.json +1 -1
|
@@ -7,23 +7,23 @@ import { getProjectDisplayNames as o, getRoleDisplayNames as s, getWorkspaceDisp
|
|
|
7
7
|
import { AlertTriangle as l, Ban as u, CheckCircle as d, Clock as f, Home as p, Mail as m, RefreshCw as h, XCircle as g } from "lucide-react";
|
|
8
8
|
import { Fragment as _, jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
9
9
|
import { Badge as b, Button as x, CardContent as S, CardDescription as C, CardHeader as w, CardTitle as T, GlassCard as E, PagePurpose as D, Skeleton as O } from "@burdenoff/fe-libs/ui";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
10
|
+
import { useI18n as k } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
11
|
+
import { useLocation as A, useNavigate as j, useParams as M } from "react-router";
|
|
12
12
|
//#region src/pages/InviteAcceptancePage.tsx
|
|
13
|
-
function
|
|
13
|
+
function N() {
|
|
14
14
|
n("workspaces.invite");
|
|
15
|
-
let { t: l } =
|
|
16
|
-
|
|
15
|
+
let { t: l } = k(), { invitationId: u } = M(), O = A(), N = j(), { authToken: V } = e(), H = u || O.pathname.split("/").filter(Boolean).at(-1) || "", U = !!V, W = H ? `/auth/login?returnTo=${encodeURIComponent(`/workspaces/invite/${H}`)}` : "/auth/login?returnTo=%2Fworkspaces%2Flist", { data: G, isLoading: K, error: q, refetch: J } = r(H || "", U), { mutate: Y, isPending: X } = i(), { mutate: ee, isPending: Z } = a(), te = G ? c(G) : null, Q = G ? s(G) : [], $ = G ? o(G) : [], ne = () => {
|
|
16
|
+
H && Y(H, {
|
|
17
17
|
onSuccess: (e) => {
|
|
18
|
-
let t = e.workspaceId ||
|
|
19
|
-
|
|
18
|
+
let t = e.workspaceId || G?.workspaceId;
|
|
19
|
+
N(t ? `/workspaces/${t}/members` : "/workspaces/list");
|
|
20
20
|
},
|
|
21
21
|
onError: (e) => {
|
|
22
22
|
console.error("Failed to accept invitation:", e);
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
25
|
};
|
|
26
|
-
if (!
|
|
26
|
+
if (!U) return /* @__PURE__ */ v("div", {
|
|
27
27
|
className: "min-h-screen flex items-center justify-center bg-bg-sunken/30 p-4",
|
|
28
28
|
children: /* @__PURE__ */ y(E, {
|
|
29
29
|
treatment: "glass",
|
|
@@ -47,12 +47,12 @@ function M() {
|
|
|
47
47
|
children: [/* @__PURE__ */ v(x, {
|
|
48
48
|
asChild: !0,
|
|
49
49
|
children: /* @__PURE__ */ v("a", {
|
|
50
|
-
href:
|
|
50
|
+
href: W,
|
|
51
51
|
children: t(l, "inviteAcceptance.signInButton", "Sign In")
|
|
52
52
|
})
|
|
53
53
|
}), /* @__PURE__ */ y(x, {
|
|
54
54
|
variant: "outline",
|
|
55
|
-
onClick: () =>
|
|
55
|
+
onClick: () => N("/workspaces/list"),
|
|
56
56
|
children: [/* @__PURE__ */ v(p, { className: "mr-2 size-4" }), t(l, "inviteAcceptance.backToWorkspaces", "Back to Workspaces")]
|
|
57
57
|
})]
|
|
58
58
|
})]
|
|
@@ -60,27 +60,27 @@ function M() {
|
|
|
60
60
|
})
|
|
61
61
|
});
|
|
62
62
|
let re = () => {
|
|
63
|
-
|
|
63
|
+
H && ee(H, {
|
|
64
64
|
onSuccess: () => {
|
|
65
|
-
|
|
65
|
+
N("/workspaces/list");
|
|
66
66
|
},
|
|
67
67
|
onError: (e) => {
|
|
68
68
|
console.error("Failed to reject invitation:", e);
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
71
|
};
|
|
72
|
-
if (
|
|
73
|
-
if (
|
|
74
|
-
error:
|
|
75
|
-
onRetry: () =>
|
|
72
|
+
if (K) return /* @__PURE__ */ v(P, {});
|
|
73
|
+
if (q) return /* @__PURE__ */ v(F, {
|
|
74
|
+
error: q,
|
|
75
|
+
onRetry: () => J()
|
|
76
76
|
});
|
|
77
|
-
if (!
|
|
78
|
-
switch (
|
|
79
|
-
case "ACCEPTED": return /* @__PURE__ */ v(
|
|
80
|
-
case "REJECTED": return /* @__PURE__ */ v(
|
|
81
|
-
case "EXPIRED": return /* @__PURE__ */ v(
|
|
82
|
-
case "CANCELLED": return /* @__PURE__ */ v(
|
|
83
|
-
case "PENDING": return
|
|
77
|
+
if (!G) return /* @__PURE__ */ v(I, {});
|
|
78
|
+
switch (G.status) {
|
|
79
|
+
case "ACCEPTED": return /* @__PURE__ */ v(L, { invitation: G });
|
|
80
|
+
case "REJECTED": return /* @__PURE__ */ v(R, { invitation: G });
|
|
81
|
+
case "EXPIRED": return /* @__PURE__ */ v(z, { invitation: G });
|
|
82
|
+
case "CANCELLED": return /* @__PURE__ */ v(B, { invitation: G });
|
|
83
|
+
case "PENDING": return G.expiresAt && new Date(G.expiresAt) < /* @__PURE__ */ new Date() ? /* @__PURE__ */ v(z, { invitation: G }) : /* @__PURE__ */ v("div", {
|
|
84
84
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
85
85
|
children: /* @__PURE__ */ y(E, {
|
|
86
86
|
treatment: "glass",
|
|
@@ -110,7 +110,7 @@ function M() {
|
|
|
110
110
|
children: t(l, "inviteAcceptance.emailAddressLabel", "Email Address")
|
|
111
111
|
}), /* @__PURE__ */ v("p", {
|
|
112
112
|
className: "text-lg font-medium mt-1",
|
|
113
|
-
children:
|
|
113
|
+
children: G.email
|
|
114
114
|
})] }),
|
|
115
115
|
/* @__PURE__ */ y("div", { children: [
|
|
116
116
|
/* @__PURE__ */ v("p", {
|
|
@@ -121,12 +121,12 @@ function M() {
|
|
|
121
121
|
className: "text-lg font-medium mt-1 break-words",
|
|
122
122
|
children: te
|
|
123
123
|
}),
|
|
124
|
-
|
|
124
|
+
G.workspaceId ? /* @__PURE__ */ v("p", {
|
|
125
125
|
className: "mt-1 font-mono text-xs text-text-secondary break-all",
|
|
126
|
-
children:
|
|
126
|
+
children: G.workspaceId
|
|
127
127
|
}) : null
|
|
128
128
|
] }),
|
|
129
|
-
|
|
129
|
+
G.expiresAt && /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
130
130
|
className: "text-sm font-medium text-text-secondary",
|
|
131
131
|
children: t(l, "inviteAcceptance.expiresLabel", "Expires")
|
|
132
132
|
}), /* @__PURE__ */ y("p", {
|
|
@@ -134,7 +134,7 @@ function M() {
|
|
|
134
134
|
children: [/* @__PURE__ */ v(f, {
|
|
135
135
|
size: 16,
|
|
136
136
|
className: "text-text-secondary"
|
|
137
|
-
}), new Date(
|
|
137
|
+
}), new Date(G.expiresAt).toLocaleDateString("en-US", {
|
|
138
138
|
year: "numeric",
|
|
139
139
|
month: "long",
|
|
140
140
|
day: "numeric",
|
|
@@ -150,7 +150,7 @@ function M() {
|
|
|
150
150
|
children: Q.map((e, t) => /* @__PURE__ */ v(b, {
|
|
151
151
|
variant: "secondary",
|
|
152
152
|
children: e
|
|
153
|
-
}, `${
|
|
153
|
+
}, `${G.id}-${G.roleIds[t] ?? e}`))
|
|
154
154
|
})] }),
|
|
155
155
|
/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
156
156
|
className: "text-sm font-medium text-text-secondary mb-2",
|
|
@@ -160,7 +160,7 @@ function M() {
|
|
|
160
160
|
children: $.length > 0 ? $.map((e, t) => /* @__PURE__ */ v(b, {
|
|
161
161
|
variant: "outline",
|
|
162
162
|
children: e
|
|
163
|
-
}, `${
|
|
163
|
+
}, `${G.id}-project-${e}-${t}`)) : /* @__PURE__ */ v("p", {
|
|
164
164
|
className: "text-sm text-text-secondary",
|
|
165
165
|
children: t(l, "inviteAcceptance.noProjects", "No project memberships will be granted automatically with this invitation.")
|
|
166
166
|
})
|
|
@@ -170,7 +170,7 @@ function M() {
|
|
|
170
170
|
children: t(l, "inviteAcceptance.invitationIdLabel", "Invitation ID")
|
|
171
171
|
}), /* @__PURE__ */ v("p", {
|
|
172
172
|
className: "text-sm font-mono mt-1 text-text-secondary",
|
|
173
|
-
children:
|
|
173
|
+
children: G.id
|
|
174
174
|
})] })
|
|
175
175
|
]
|
|
176
176
|
}),
|
|
@@ -178,14 +178,14 @@ function M() {
|
|
|
178
178
|
className: "flex flex-col sm:flex-row gap-3 pt-4 border-t",
|
|
179
179
|
children: [/* @__PURE__ */ v(x, {
|
|
180
180
|
onClick: ne,
|
|
181
|
-
disabled:
|
|
181
|
+
disabled: X || Z,
|
|
182
182
|
className: "flex-1",
|
|
183
183
|
size: "lg",
|
|
184
|
-
children:
|
|
184
|
+
children: X ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(h, { className: "mr-2 size-4 animate-spin" }), t(l, "inviteAcceptance.accepting", "Accepting...")] }) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(d, { className: "mr-2 size-4" }), t(l, "inviteAcceptance.acceptButton", "Accept Invitation")] })
|
|
185
185
|
}), /* @__PURE__ */ v(x, {
|
|
186
186
|
variant: "outline",
|
|
187
187
|
onClick: re,
|
|
188
|
-
disabled:
|
|
188
|
+
disabled: X || Z,
|
|
189
189
|
className: "flex-1",
|
|
190
190
|
size: "lg",
|
|
191
191
|
children: Z ? /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(h, { className: "mr-2 size-4 animate-spin" }), t(l, "inviteAcceptance.rejecting", "Rejecting...")] }) : /* @__PURE__ */ y(_, { children: [/* @__PURE__ */ v(g, { className: "mr-2 size-4" }), t(l, "inviteAcceptance.rejectButton", "Reject")] })
|
|
@@ -195,10 +195,10 @@ function M() {
|
|
|
195
195
|
})]
|
|
196
196
|
})
|
|
197
197
|
});
|
|
198
|
-
default: return /* @__PURE__ */ v(
|
|
198
|
+
default: return /* @__PURE__ */ v(I, {});
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
|
-
function
|
|
201
|
+
function P() {
|
|
202
202
|
return /* @__PURE__ */ v("div", {
|
|
203
203
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
204
204
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -229,8 +229,8 @@ function N() {
|
|
|
229
229
|
})
|
|
230
230
|
});
|
|
231
231
|
}
|
|
232
|
-
function
|
|
233
|
-
let { t: r } =
|
|
232
|
+
function F({ error: e, onRetry: n }) {
|
|
233
|
+
let { t: r } = k(), i = j();
|
|
234
234
|
return /* @__PURE__ */ v("div", {
|
|
235
235
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
236
236
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -276,8 +276,8 @@ function P({ error: e, onRetry: n }) {
|
|
|
276
276
|
})
|
|
277
277
|
});
|
|
278
278
|
}
|
|
279
|
-
function
|
|
280
|
-
let { t: e } =
|
|
279
|
+
function I() {
|
|
280
|
+
let { t: e } = k(), n = j();
|
|
281
281
|
return /* @__PURE__ */ v("div", {
|
|
282
282
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
283
283
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -315,8 +315,8 @@ function F() {
|
|
|
315
315
|
})
|
|
316
316
|
});
|
|
317
317
|
}
|
|
318
|
-
function
|
|
319
|
-
let { t: n } =
|
|
318
|
+
function L({ invitation: e }) {
|
|
319
|
+
let { t: n } = k(), r = j();
|
|
320
320
|
return /* @__PURE__ */ v("div", {
|
|
321
321
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
322
322
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -361,8 +361,8 @@ function I({ invitation: e }) {
|
|
|
361
361
|
})
|
|
362
362
|
});
|
|
363
363
|
}
|
|
364
|
-
function
|
|
365
|
-
let { t: n } =
|
|
364
|
+
function R({ invitation: e }) {
|
|
365
|
+
let { t: n } = k(), r = j();
|
|
366
366
|
return /* @__PURE__ */ v("div", {
|
|
367
367
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
368
368
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -407,8 +407,8 @@ function L({ invitation: e }) {
|
|
|
407
407
|
})
|
|
408
408
|
});
|
|
409
409
|
}
|
|
410
|
-
function
|
|
411
|
-
let { t: n } =
|
|
410
|
+
function z({ invitation: e }) {
|
|
411
|
+
let { t: n } = k(), r = j();
|
|
412
412
|
return /* @__PURE__ */ v("div", {
|
|
413
413
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
414
414
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -466,8 +466,8 @@ function R({ invitation: e }) {
|
|
|
466
466
|
})
|
|
467
467
|
});
|
|
468
468
|
}
|
|
469
|
-
function
|
|
470
|
-
let { t: n } =
|
|
469
|
+
function B({ invitation: e }) {
|
|
470
|
+
let { t: n } = k(), r = j();
|
|
471
471
|
return /* @__PURE__ */ v("div", {
|
|
472
472
|
className: "min-h-screen flex items-center justify-center p-4 bg-bg-sunken/30",
|
|
473
473
|
children: /* @__PURE__ */ y(E, {
|
|
@@ -513,6 +513,6 @@ function z({ invitation: e }) {
|
|
|
513
513
|
});
|
|
514
514
|
}
|
|
515
515
|
//#endregion
|
|
516
|
-
export {
|
|
516
|
+
export { N as InviteAcceptancePage };
|
|
517
517
|
|
|
518
518
|
//# 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';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n GlassCard,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Badge,\n Skeleton,\n PagePurpose,\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';\nimport {\n getProjectDisplayNames,\n getRoleDisplayNames,\n getWorkspaceDisplayName,\n} from '../utils/invitationDisplay';\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 const projectDisplayNames = invitation ? getProjectDisplayNames(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-bg-sunken/30 p-4\">\n <GlassCard treatment=\"glass\" className=\"max-w-xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-action-primary-bg/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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" glow className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/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 <PagePurpose>\n {tWithFallback(\n t,\n 'inviteAcceptance.purpose',\n 'Someone has invited you to join their workspace. Review the details below — which workspace it is, the roles and projects you would receive, and when the invite expires — then accept to become a member or reject to decline.'\n )}\n </PagePurpose>\n\n {/* Invitation Details */}\n <div className=\"space-y-4 p-4 rounded-lg bg-bg-sunken/50\">\n <div>\n <p className=\"text-sm font-medium text-text-secondary\">\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-text-secondary\">\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-text-secondary 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-text-secondary\">\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-text-secondary\" />\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-text-secondary 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-text-secondary mb-2\">\n {tWithFallback(t, 'inviteAcceptance.projectsLabel', 'Projects')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {projectDisplayNames.length > 0 ? (\n projectDisplayNames.map((projectName, index) => (\n <Badge\n key={`${invitation.id}-project-${projectName}-${index}`}\n variant=\"outline\"\n >\n {projectName}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'inviteAcceptance.noProjects',\n 'No project memberships will be granted automatically with this invitation.'\n )}\n </p>\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-sm font-medium text-text-secondary\">\n {tWithFallback(t, 'inviteAcceptance.invitationIdLabel', 'Invitation ID')}\n </p>\n <p className=\"text-sm font-mono mt-1 text-text-secondary\">{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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-bg-sunken/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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-error-bg/10\">\n <AlertTriangle className=\"text-status-error-text\" 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-status-error-border/50 bg-status-error-bg/10\">\n <AlertTriangle className=\"size-5 text-status-error-text flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-error-text\">\n {tWithFallback(t, 'inviteAcceptance.errorDetailsLabel', 'Error Details')}\n </p>\n <p className=\"text-sm mt-1 text-status-error-text/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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-bg-sunken\">\n <AlertTriangle className=\"text-text-secondary\" 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-subtle bg-bg-sunken/50\">\n <AlertTriangle className=\"size-5 text-text-secondary 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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-bg-sunken\">\n <XCircle className=\"text-text-secondary\" 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-subtle bg-bg-sunken/50\">\n <XCircle className=\"size-5 text-text-secondary 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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-error-bg/10\">\n <Ban className=\"text-status-error-text\" 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-status-error-border/50 bg-status-error-bg/10\">\n <Ban className=\"size-5 text-status-error-text flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-error-text\">\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledHeading',\n 'Invitation No Longer Available'\n )}\n </p>\n <p className=\"text-sm mt-1 text-status-error-text/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 </GlassCard>\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';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n GlassCard,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Button,\n Badge,\n Skeleton,\n PagePurpose,\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';\nimport {\n getProjectDisplayNames,\n getRoleDisplayNames,\n getWorkspaceDisplayName,\n} from '../utils/invitationDisplay';\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 const projectDisplayNames = invitation ? getProjectDisplayNames(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-bg-sunken/30 p-4\">\n <GlassCard treatment=\"glass\" className=\"max-w-xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-action-primary-bg/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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" glow className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-action-primary-bg/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 <PagePurpose>\n {tWithFallback(\n t,\n 'inviteAcceptance.purpose',\n 'Someone has invited you to join their workspace. Review the details below — which workspace it is, the roles and projects you would receive, and when the invite expires — then accept to become a member or reject to decline.'\n )}\n </PagePurpose>\n\n {/* Invitation Details */}\n <div className=\"space-y-4 p-4 rounded-lg bg-bg-sunken/50\">\n <div>\n <p className=\"text-sm font-medium text-text-secondary\">\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-text-secondary\">\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-text-secondary 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-text-secondary\">\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-text-secondary\" />\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-text-secondary 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-text-secondary mb-2\">\n {tWithFallback(t, 'inviteAcceptance.projectsLabel', 'Projects')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {projectDisplayNames.length > 0 ? (\n projectDisplayNames.map((projectName, index) => (\n <Badge\n key={`${invitation.id}-project-${projectName}-${index}`}\n variant=\"outline\"\n >\n {projectName}\n </Badge>\n ))\n ) : (\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'inviteAcceptance.noProjects',\n 'No project memberships will be granted automatically with this invitation.'\n )}\n </p>\n )}\n </div>\n </div>\n\n <div>\n <p className=\"text-sm font-medium text-text-secondary\">\n {tWithFallback(t, 'inviteAcceptance.invitationIdLabel', 'Invitation ID')}\n </p>\n <p className=\"text-sm font-mono mt-1 text-text-secondary\">{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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-bg-sunken/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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-error-bg/10\">\n <AlertTriangle className=\"text-status-error-text\" 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-status-error-border/50 bg-status-error-bg/10\">\n <AlertTriangle className=\"size-5 text-status-error-text flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-error-text\">\n {tWithFallback(t, 'inviteAcceptance.errorDetailsLabel', 'Error Details')}\n </p>\n <p className=\"text-sm mt-1 text-status-error-text/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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-bg-sunken\">\n <AlertTriangle className=\"text-text-secondary\" 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-subtle bg-bg-sunken/50\">\n <AlertTriangle className=\"size-5 text-text-secondary 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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" className=\"max-w-2xl w-full\">\n <CardHeader>\n <div className=\"flex items-center gap-3\">\n <div className=\"p-3 rounded-lg bg-bg-sunken\">\n <XCircle className=\"text-text-secondary\" 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-subtle bg-bg-sunken/50\">\n <XCircle className=\"size-5 text-text-secondary 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-text-secondary\">\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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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 </GlassCard>\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-bg-sunken/30\">\n <GlassCard treatment=\"glass\" 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-error-bg/10\">\n <Ban className=\"text-status-error-text\" 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-status-error-border/50 bg-status-error-bg/10\">\n <Ban className=\"size-5 text-status-error-text flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium text-status-error-text\">\n {tWithFallback(\n t,\n 'inviteAcceptance.cancelledHeading',\n 'Invitation No Longer Available'\n )}\n </p>\n <p className=\"text-sm mt-1 text-status-error-text/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 </GlassCard>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -13,19 +13,19 @@ import { useEffect as o, useMemo as s, useState as c } from "react";
|
|
|
13
13
|
import { AlertCircle as ce, RefreshCw as le, Search as ue, UserPlus as l, Users as de } from "lucide-react";
|
|
14
14
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
15
15
|
import { Badge as f, Button as p, IllustratedEmptyState as m, Input as fe, PageContainer as pe, PagePurpose as me, Skeleton as h } from "@burdenoff/fe-libs/ui";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
16
|
+
import { useI18n as he } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
17
|
+
import { useNavigate as ge, useParams as _e, useSearchParams as ve } from "react-router";
|
|
18
|
+
import { useDebounce as ye } from "@burdenoff/fe-libs/shared/hooks";
|
|
18
19
|
import { PermissionButton as g } from "@burdenoff/fe-libs/shared/components";
|
|
19
|
-
import { useI18n as ye } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
20
20
|
import { useActorProfiles as be } from "@burdenoff/fe-libs/shared";
|
|
21
21
|
//#region src/pages/MembersListPage.tsx
|
|
22
22
|
function _() {
|
|
23
|
-
let { t: _ } =
|
|
23
|
+
let { t: _ } = he(), { memberFilters: xe, setMemberFilters: v, selectedMemberIds: y, toggleMemberSelection: b, clearMemberSelection: x } = t(), S = ge(), { workspaceId: Se } = e(), { basePath: C = "/workspaces" } = e(), { withCurrentSearch: w } = n(), { workspaceId: Ce } = _e(), T = Ce || Se;
|
|
24
24
|
a("workspaces.members", {
|
|
25
25
|
workspaceId: T,
|
|
26
26
|
requireParams: !0
|
|
27
27
|
});
|
|
28
|
-
let [E, we] = c(xe.search || ""), D =
|
|
28
|
+
let [E, we] = c(xe.search || ""), D = ye(E, 500);
|
|
29
29
|
o(() => {
|
|
30
30
|
v({ search: D });
|
|
31
31
|
}, [D, v]);
|
|
@@ -54,7 +54,7 @@ function _() {
|
|
|
54
54
|
return i.toLowerCase().includes(t) || a.toLowerCase().includes(t) ? !0 : e.userId.toLowerCase().includes(t);
|
|
55
55
|
}), G = s(() => W.filter((e) => y.has(e.id)), [W, y]), K = s(() => B.filter((e) => L.has(e.id)), [B, L]), q = W.length > 0 && W.every((e) => y.has(e.id)), Me = W.some((e) => y.has(e.id)) && !q, J = B.length > 0 && B.every((e) => L.has(e.id)), Ne = B.some((e) => L.has(e.id)) && !J;
|
|
56
56
|
o(() => () => x(), [x]);
|
|
57
|
-
let [Y, X] =
|
|
57
|
+
let [Y, X] = ve();
|
|
58
58
|
o(() => {
|
|
59
59
|
if (Y.get("invite") === "true" && T) {
|
|
60
60
|
let e = new URLSearchParams(Y);
|
|
@@ -8,8 +8,8 @@ import { useMemo as l, useState as u } from "react";
|
|
|
8
8
|
import { AlertTriangle as d, CheckCircle as f, Home as p, Mail as m, RefreshCw as h, XCircle as g } from "lucide-react";
|
|
9
9
|
import { jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
10
10
|
import { Badge as y, Button as b, GlassCard as x, IllustratedEmptyState as S, PageContainer as C, PagePurpose as w, Skeleton as T } from "@burdenoff/fe-libs/ui";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { useI18n as E } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
|
+
import { useNavigate as D } from "react-router";
|
|
13
13
|
import { ActorIdentity as O, useActorProfiles as k } from "@burdenoff/fe-libs/shared";
|
|
14
14
|
//#region src/pages/PendingInvitesPage.tsx
|
|
15
15
|
function A(e) {
|
|
@@ -25,7 +25,7 @@ function A(e) {
|
|
|
25
25
|
}
|
|
26
26
|
function j() {
|
|
27
27
|
r("workspaces.pending-invites");
|
|
28
|
-
let { t: j } =
|
|
28
|
+
let { t: j } = E(), M = D(), { currentUser: N, authToken: P, apiGatewayUrl: F, organizationId: I, basePath: L = "/workspaces" } = e(), [R, z] = u(null), [B, V] = u(null), { data: H = [], isLoading: U, error: W } = t(N?.email), G = l(() => [...H].sort((e, t) => new Date(t.createdAt).getTime() - new Date(e.createdAt).getTime()), [H]), K = k(l(() => G.flatMap((e) => e.invitedById ? [{
|
|
29
29
|
actorId: e.invitedById,
|
|
30
30
|
actorType: "user"
|
|
31
31
|
}] : []), [G]), {
|
|
@@ -17,17 +17,17 @@ import { useMemo as ge, useState as s } from "react";
|
|
|
17
17
|
import { Activity as c, Archive as l, ArrowLeft as u, Clock as d, FolderKanban as f, MoreVertical as _e, Pencil as ve, UserPlus as p, Users as m } from "lucide-react";
|
|
18
18
|
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
19
19
|
import { AlertDialog as ye, AlertDialogAction as be, AlertDialogCancel as xe, AlertDialogContent as Se, AlertDialogDescription as Ce, AlertDialogFooter as we, AlertDialogHeader as Te, AlertDialogTitle as Ee, Badge as _, Button as v, CardContent as y, CardHeader as b, CardTitle as x, DropdownMenu as De, DropdownMenuContent as Oe, DropdownMenuItem as S, DropdownMenuSeparator as C, DropdownMenuTrigger as w, EntityIdModal as T, GlassCard as E, IllustratedEmptyState as ke, NextSteps as Ae, PagePurpose as je, ShowMore as Me, Skeleton as D, useEntityIdModal as Ne } from "@burdenoff/fe-libs/ui";
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
20
|
+
import { useI18n as Pe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
21
|
+
import { useNavigate as O, useParams as Fe } from "react-router";
|
|
22
22
|
//#region src/pages/ProjectDetailPage.tsx
|
|
23
23
|
function k() {
|
|
24
|
-
let { t: k } =
|
|
24
|
+
let { t: k } = Pe(), A = Ne(), { workspaceId: j, projectId: M } = Fe();
|
|
25
25
|
te("workspaces.project-detail", {
|
|
26
26
|
workspaceId: j,
|
|
27
27
|
projectId: M,
|
|
28
28
|
requireParams: !0
|
|
29
29
|
});
|
|
30
|
-
let N =
|
|
30
|
+
let N = O(), { basePath: P = "/workspaces" } = e(), { withCurrentSearch: F } = ee(), { data: I, isLoading: Ie, error: Le } = ie(M || "", j), [Re, L] = s(!1), [R, z] = s(!1), [B, V] = s(!1), { mutate: ze, isPending: H } = oe(j), { mutate: Be, isPending: U } = le(j), { mutate: Ve, isPending: W } = se(j), { mutateAsync: He, isPending: Ue } = ce(j), { mutateAsync: We, isPending: Ge } = ue(j), { mutateAsync: Ke, isPending: qe } = de(j), { canViewProject: Je, canUpdateProject: G, canDeleteProject: K, canArchiveProject: q, canListProjectMembers: J, canAddProjectMember: Y, isLoading: Ye } = re(), { data: Xe } = ae(M || "", j), X = ge(() => fe({
|
|
31
31
|
tags: I?.tags ?? [],
|
|
32
32
|
tagAssignments: I?.tagAssignments
|
|
33
33
|
}), [I?.tags, I?.tagAssignments]), { data: Ze } = me(j), Qe = (Ze ?? []).filter((e) => e.resourceId === M || e.resourceType?.toLowerCase() === "project").length, $e = X;
|