@burdenoff/microfe-workspaces 2026.531.1 → 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.
@@ -154,7 +154,7 @@ function j() {
154
154
  children: Q.map((e, t) => /* @__PURE__ */ h(_, {
155
155
  variant: "secondary",
156
156
  children: e
157
- }, `${U.id}-role-${e}-${t}`))
157
+ }, `${U.id}-${U.roleIds[t] ?? e}`))
158
158
  })] }),
159
159
  /* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("p", {
160
160
  className: "text-sm font-medium text-muted-foreground",
@@ -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\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}-role-${roleName}-${index}`}\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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"}
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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"}
@@ -219,7 +219,7 @@ function O() {
219
219
  children: s.length > 0 ? s.map((t, n) => /* @__PURE__ */ h(_, {
220
220
  variant: "outline",
221
221
  children: t
222
- }, `${e.id}-role-${t}-${n}`)) : /* @__PURE__ */ h("span", {
222
+ }, `${e.id}-${e.roleIds[n] ?? t}`)) : /* @__PURE__ */ h("span", {
223
223
  className: "text-sm text-muted-foreground",
224
224
  children: n(O, "pendingInvites.noRoles", "No explicit roles assigned")
225
225
  })
@@ -1 +1 @@
1
- {"version":3,"file":"PendingInvitesPage.js","names":[],"sources":["../../src/pages/PendingInvitesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Mail, RefreshCw, CheckCircle, XCircle, Inbox, AlertTriangle, Home } from 'lucide-react';\nimport {\n ActorIdentity,\n useActorProfiles,\n type ActorInput,\n type ActorProfileMap,\n} from '@burdenoff/fe-libs/shared';\nimport { Badge, Button, PageContainer, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useAcceptInvitation, useRejectInvitation } from '../hooks/useMemberMutations';\nimport { useMyPendingInvitations } from '../hooks/usePendingInvitations';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nfunction formatDate(value?: string) {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction getWorkspaceDisplayName(invitation: {\n workspaceName?: string;\n workspaceId?: string;\n context?: { metadata?: Record<string, unknown> | null } | null;\n}) {\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: {\n roleNames?: string[];\n roleIds: string[];\n context?: { metadata?: Record<string, unknown> | null } | null;\n}) {\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\nexport function PendingInvitesPage() {\n useWorkspacesPageView('workspaces.pending-invites');\n\n const { t } = useI18n();\n const navigate = useNavigate();\n const {\n currentUser,\n authToken,\n apiGatewayUrl,\n organizationId,\n basePath = '/workspaces',\n } = useWorkspacesContext();\n const [processingInviteId, setProcessingInviteId] = useState<string | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const {\n data: pendingInvitations = [],\n isLoading,\n error,\n } = useMyPendingInvitations(currentUser?.email);\n\n const sortedInvitations = useMemo(\n () =>\n [...pendingInvitations].sort(\n (left, right) => new Date(right.createdAt).getTime() - new Date(left.createdAt).getTime()\n ),\n [pendingInvitations]\n );\n\n const inviterActors = useMemo<ActorInput[]>(\n () =>\n sortedInvitations.flatMap((invitation) =>\n invitation.invitedById\n ? [{ actorId: invitation.invitedById, actorType: 'user' as const }]\n : []\n ),\n [sortedInvitations]\n );\n\n const inviterProfiles: ActorProfileMap = useActorProfiles(inviterActors, {\n apiGatewayUrl,\n authToken,\n orgId: organizationId,\n });\n\n const { mutate: acceptInvitation, isPending: isAccepting } = useAcceptInvitation();\n const { mutate: rejectInvitation, isPending: isRejecting } = useRejectInvitation();\n\n const isMutating = isAccepting || isRejecting;\n\n const handleBackToWorkspaces = () => {\n navigate(`${basePath}/list`);\n };\n\n const handleAccept = (invitationId: string) => {\n setProcessingInviteId(invitationId);\n setActionError(null);\n\n acceptInvitation(invitationId, {\n onSuccess: () => {\n setProcessingInviteId(null);\n },\n onError: (mutationError) => {\n setProcessingInviteId(null);\n setActionError(\n mutationError instanceof Error\n ? mutationError.message\n : tWithFallback(t, 'pendingInvites.acceptError', 'Failed to accept invitation')\n );\n },\n });\n };\n\n const handleReject = (invitationId: string) => {\n setProcessingInviteId(invitationId);\n setActionError(null);\n\n rejectInvitation(invitationId, {\n onSuccess: () => {\n setProcessingInviteId(null);\n },\n onError: (mutationError) => {\n setProcessingInviteId(null);\n setActionError(\n mutationError instanceof Error\n ? mutationError.message\n : tWithFallback(t, 'pendingInvites.rejectError', 'Failed to reject invitation')\n );\n },\n });\n };\n\n if (!authToken || !currentUser?.email) {\n return (\n <PageContainer padded={false}>\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div className=\"rounded-lg border bg-card p-6 text-center\">\n <AlertTriangle className=\"mx-auto mb-3 size-10 text-muted-foreground\" />\n <h1 className=\"text-2xl font-bold\">\n {tWithFallback(\n t,\n 'pendingInvites.signInTitle',\n 'Sign in to view your pending invites'\n )}\n </h1>\n <p className=\"mt-2 text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.signInDescription',\n 'You need an authenticated account before you can review or respond to workspace invitations.'\n )}\n </p>\n <div className=\"mt-4 flex justify-center\">\n <Button onClick={handleBackToWorkspaces} variant=\"outline\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'pendingInvites.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n </div>\n </div>\n </div>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer padded={false}>\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tWithFallback(t, 'pendingInvites.pageTitle', 'Pending Invites')}\n </h1>\n <p className=\"text-sm sm:text-base text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.pageSubtitle',\n 'Review and respond to workspace invitations sent to your account.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\">{sortedInvitations.length}</Badge>\n <Button variant=\"outline\" onClick={handleBackToWorkspaces}>\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'pendingInvites.viewWorkspaces', 'View Workspaces')}\n </Button>\n </div>\n </div>\n\n {actionError ? (\n <div className=\"flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive\">\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0\" />\n <span>{actionError}</span>\n </div>\n ) : null}\n\n {error ? (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive\">\n {error instanceof Error\n ? error.message\n : tWithFallback(t, 'pendingInvites.loadError', 'Failed to load pending invitations')}\n </div>\n ) : null}\n\n {isLoading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-5 space-y-3\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-64\" />\n <Skeleton className=\"h-4 w-52\" />\n <div className=\"flex gap-2 pt-2\">\n <Skeleton className=\"h-10 w-36\" />\n <Skeleton className=\"h-10 w-28\" />\n </div>\n </div>\n ))}\n </div>\n ) : sortedInvitations.length === 0 ? (\n <div className=\"rounded-lg border bg-card p-10 text-center\">\n <Inbox className=\"mx-auto mb-4 size-12 text-muted-foreground\" />\n <h2 className=\"text-xl font-semibold\">\n {tWithFallback(t, 'pendingInvites.emptyTitle', 'No pending invites')}\n </h2>\n <p className=\"mt-2 text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.emptyDescription',\n 'When someone invites you to a workspace, it will appear here.'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {sortedInvitations.map((invitation) => {\n const inviterProfile = invitation.invitedById\n ? inviterProfiles[invitation.invitedById]\n : undefined;\n const inviterLabel =\n inviterProfile?.displayName ||\n inviterProfile?.email ||\n invitation.invitedById ||\n '—';\n const expiresAt = formatDate(invitation.expiresAt);\n const createdAt = formatDate(invitation.createdAt);\n const workspaceDisplayName = getWorkspaceDisplayName(invitation);\n const roleDisplayNames = getRoleDisplayNames(invitation);\n const isProcessingThisInvite = processingInviteId === invitation.id && isMutating;\n\n return (\n <div key={invitation.id} className=\"rounded-lg border bg-card p-5\">\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"space-y-3 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 font-semibold text-lg\">\n <Mail className=\"size-4 text-primary\" />\n <span>{invitation.email}</span>\n </div>\n <Badge variant=\"secondary\">{invitation.status}</Badge>\n </div>\n\n <dl className=\"grid gap-2 text-sm text-muted-foreground sm:grid-cols-2\">\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.workspaceLabel', 'Workspace')}\n </dt>\n <dd className=\"break-words font-medium text-foreground\">\n {workspaceDisplayName}\n </dd>\n {invitation.workspaceId ? (\n <dd className=\"mt-1 break-all font-mono text-xs text-muted-foreground\">\n {invitation.workspaceId}\n </dd>\n ) : null}\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.invitedByLabel', 'Invited by')}\n </dt>\n <dd className=\"break-all\">\n {inviterProfile ? (\n <ActorIdentity\n profile={inviterProfile}\n variant=\"inline\"\n hideIdDrilldown\n />\n ) : (\n <span className=\"font-medium text-foreground\">{inviterLabel}</span>\n )}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.receivedLabel', 'Received')}\n </dt>\n <dd>{createdAt ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.expiresLabel', 'Expires')}\n </dt>\n <dd>{expiresAt ?? '—'}</dd>\n </div>\n </dl>\n\n <div>\n <p className=\"text-sm font-medium text-foreground mb-2\">\n {tWithFallback(t, 'pendingInvites.rolesLabel', 'Roles')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {roleDisplayNames.length > 0 ? (\n roleDisplayNames.map((roleName, index) => (\n <Badge\n key={`${invitation.id}-role-${roleName}-${index}`}\n variant=\"outline\"\n >\n {roleName}\n </Badge>\n ))\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.noRoles',\n 'No explicit roles assigned'\n )}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2 sm:flex-row lg:flex-col lg:min-w-44\">\n <Button\n onClick={() => handleAccept(invitation.id)}\n disabled={isMutating}\n className=\"w-full\"\n >\n {isProcessingThisInvite && isAccepting ? (\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n ) : (\n <CheckCircle className=\"mr-2 size-4\" />\n )}\n {tWithFallback(t, 'pendingInvites.acceptButton', 'Accept')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => handleReject(invitation.id)}\n disabled={isMutating}\n className=\"w-full\"\n >\n {isProcessingThisInvite && isRejecting ? (\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n ) : (\n <XCircle className=\"mr-2 size-4\" />\n )}\n {tWithFallback(t, 'pendingInvites.rejectButton', 'Reject')}\n </Button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </PageContainer>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PendingInvitesPage.js","names":[],"sources":["../../src/pages/PendingInvitesPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Mail, RefreshCw, CheckCircle, XCircle, Inbox, AlertTriangle, Home } from 'lucide-react';\nimport {\n ActorIdentity,\n useActorProfiles,\n type ActorInput,\n type ActorProfileMap,\n} from '@burdenoff/fe-libs/shared';\nimport { Badge, Button, PageContainer, Skeleton } from '@burdenoff/fe-libs/ui';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { tWithFallback } from '../utils/i18n';\nimport { useWorkspacesContext } from '../providers/WorkspacesProvider';\nimport { useAcceptInvitation, useRejectInvitation } from '../hooks/useMemberMutations';\nimport { useMyPendingInvitations } from '../hooks/usePendingInvitations';\nimport { useWorkspacesPageView } from '../hooks/useWorkspacesPageView';\n\nfunction formatDate(value?: string) {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n\n return date.toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction getWorkspaceDisplayName(invitation: {\n workspaceName?: string;\n workspaceId?: string;\n context?: { metadata?: Record<string, unknown> | null } | null;\n}) {\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: {\n roleNames?: string[];\n roleIds: string[];\n context?: { metadata?: Record<string, unknown> | null } | null;\n}) {\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\nexport function PendingInvitesPage() {\n useWorkspacesPageView('workspaces.pending-invites');\n\n const { t } = useI18n();\n const navigate = useNavigate();\n const {\n currentUser,\n authToken,\n apiGatewayUrl,\n organizationId,\n basePath = '/workspaces',\n } = useWorkspacesContext();\n const [processingInviteId, setProcessingInviteId] = useState<string | null>(null);\n const [actionError, setActionError] = useState<string | null>(null);\n\n const {\n data: pendingInvitations = [],\n isLoading,\n error,\n } = useMyPendingInvitations(currentUser?.email);\n\n const sortedInvitations = useMemo(\n () =>\n [...pendingInvitations].sort(\n (left, right) => new Date(right.createdAt).getTime() - new Date(left.createdAt).getTime()\n ),\n [pendingInvitations]\n );\n\n const inviterActors = useMemo<ActorInput[]>(\n () =>\n sortedInvitations.flatMap((invitation) =>\n invitation.invitedById\n ? [{ actorId: invitation.invitedById, actorType: 'user' as const }]\n : []\n ),\n [sortedInvitations]\n );\n\n const inviterProfiles: ActorProfileMap = useActorProfiles(inviterActors, {\n apiGatewayUrl,\n authToken,\n orgId: organizationId,\n });\n\n const { mutate: acceptInvitation, isPending: isAccepting } = useAcceptInvitation();\n const { mutate: rejectInvitation, isPending: isRejecting } = useRejectInvitation();\n\n const isMutating = isAccepting || isRejecting;\n\n const handleBackToWorkspaces = () => {\n navigate(`${basePath}/list`);\n };\n\n const handleAccept = (invitationId: string) => {\n setProcessingInviteId(invitationId);\n setActionError(null);\n\n acceptInvitation(invitationId, {\n onSuccess: () => {\n setProcessingInviteId(null);\n },\n onError: (mutationError) => {\n setProcessingInviteId(null);\n setActionError(\n mutationError instanceof Error\n ? mutationError.message\n : tWithFallback(t, 'pendingInvites.acceptError', 'Failed to accept invitation')\n );\n },\n });\n };\n\n const handleReject = (invitationId: string) => {\n setProcessingInviteId(invitationId);\n setActionError(null);\n\n rejectInvitation(invitationId, {\n onSuccess: () => {\n setProcessingInviteId(null);\n },\n onError: (mutationError) => {\n setProcessingInviteId(null);\n setActionError(\n mutationError instanceof Error\n ? mutationError.message\n : tWithFallback(t, 'pendingInvites.rejectError', 'Failed to reject invitation')\n );\n },\n });\n };\n\n if (!authToken || !currentUser?.email) {\n return (\n <PageContainer padded={false}>\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div className=\"rounded-lg border bg-card p-6 text-center\">\n <AlertTriangle className=\"mx-auto mb-3 size-10 text-muted-foreground\" />\n <h1 className=\"text-2xl font-bold\">\n {tWithFallback(\n t,\n 'pendingInvites.signInTitle',\n 'Sign in to view your pending invites'\n )}\n </h1>\n <p className=\"mt-2 text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.signInDescription',\n 'You need an authenticated account before you can review or respond to workspace invitations.'\n )}\n </p>\n <div className=\"mt-4 flex justify-center\">\n <Button onClick={handleBackToWorkspaces} variant=\"outline\">\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'pendingInvites.backToWorkspaces', 'Back to Workspaces')}\n </Button>\n </div>\n </div>\n </div>\n </PageContainer>\n );\n }\n\n return (\n <PageContainer padded={false}>\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl sm:text-3xl font-bold\">\n {tWithFallback(t, 'pendingInvites.pageTitle', 'Pending Invites')}\n </h1>\n <p className=\"text-sm sm:text-base text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.pageSubtitle',\n 'Review and respond to workspace invitations sent to your account.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\">{sortedInvitations.length}</Badge>\n <Button variant=\"outline\" onClick={handleBackToWorkspaces}>\n <Home className=\"mr-2 size-4\" />\n {tWithFallback(t, 'pendingInvites.viewWorkspaces', 'View Workspaces')}\n </Button>\n </div>\n </div>\n\n {actionError ? (\n <div className=\"flex items-start gap-2 rounded-lg border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive\">\n <AlertTriangle className=\"mt-0.5 size-4 shrink-0\" />\n <span>{actionError}</span>\n </div>\n ) : null}\n\n {error ? (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/10 p-4 text-sm text-destructive\">\n {error instanceof Error\n ? error.message\n : tWithFallback(t, 'pendingInvites.loadError', 'Failed to load pending invitations')}\n </div>\n ) : null}\n\n {isLoading ? (\n <div className=\"space-y-4\">\n {Array.from({ length: 3 }).map((_, index) => (\n <div key={index} className=\"rounded-lg border bg-card p-5 space-y-3\">\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"h-4 w-64\" />\n <Skeleton className=\"h-4 w-52\" />\n <div className=\"flex gap-2 pt-2\">\n <Skeleton className=\"h-10 w-36\" />\n <Skeleton className=\"h-10 w-28\" />\n </div>\n </div>\n ))}\n </div>\n ) : sortedInvitations.length === 0 ? (\n <div className=\"rounded-lg border bg-card p-10 text-center\">\n <Inbox className=\"mx-auto mb-4 size-12 text-muted-foreground\" />\n <h2 className=\"text-xl font-semibold\">\n {tWithFallback(t, 'pendingInvites.emptyTitle', 'No pending invites')}\n </h2>\n <p className=\"mt-2 text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.emptyDescription',\n 'When someone invites you to a workspace, it will appear here.'\n )}\n </p>\n </div>\n ) : (\n <div className=\"space-y-4\">\n {sortedInvitations.map((invitation) => {\n const inviterProfile = invitation.invitedById\n ? inviterProfiles[invitation.invitedById]\n : undefined;\n const inviterLabel =\n inviterProfile?.displayName ||\n inviterProfile?.email ||\n invitation.invitedById ||\n '—';\n const expiresAt = formatDate(invitation.expiresAt);\n const createdAt = formatDate(invitation.createdAt);\n const workspaceDisplayName = getWorkspaceDisplayName(invitation);\n const roleDisplayNames = getRoleDisplayNames(invitation);\n const isProcessingThisInvite = processingInviteId === invitation.id && isMutating;\n\n return (\n <div key={invitation.id} className=\"rounded-lg border bg-card p-5\">\n <div className=\"flex flex-col gap-4 lg:flex-row lg:items-start lg:justify-between\">\n <div className=\"space-y-3 min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <div className=\"flex items-center gap-2 font-semibold text-lg\">\n <Mail className=\"size-4 text-primary\" />\n <span>{invitation.email}</span>\n </div>\n <Badge variant=\"secondary\">{invitation.status}</Badge>\n </div>\n\n <dl className=\"grid gap-2 text-sm text-muted-foreground sm:grid-cols-2\">\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.workspaceLabel', 'Workspace')}\n </dt>\n <dd className=\"break-words font-medium text-foreground\">\n {workspaceDisplayName}\n </dd>\n {invitation.workspaceId ? (\n <dd className=\"mt-1 break-all font-mono text-xs text-muted-foreground\">\n {invitation.workspaceId}\n </dd>\n ) : null}\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.invitedByLabel', 'Invited by')}\n </dt>\n <dd className=\"break-all\">\n {inviterProfile ? (\n <ActorIdentity\n profile={inviterProfile}\n variant=\"inline\"\n hideIdDrilldown\n />\n ) : (\n <span className=\"font-medium text-foreground\">{inviterLabel}</span>\n )}\n </dd>\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.receivedLabel', 'Received')}\n </dt>\n <dd>{createdAt ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"font-medium text-foreground\">\n {tWithFallback(t, 'pendingInvites.expiresLabel', 'Expires')}\n </dt>\n <dd>{expiresAt ?? '—'}</dd>\n </div>\n </dl>\n\n <div>\n <p className=\"text-sm font-medium text-foreground mb-2\">\n {tWithFallback(t, 'pendingInvites.rolesLabel', 'Roles')}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {roleDisplayNames.length > 0 ? (\n roleDisplayNames.map((roleName, index) => (\n <Badge\n key={`${invitation.id}-${invitation.roleIds[index] ?? roleName}`}\n variant=\"outline\"\n >\n {roleName}\n </Badge>\n ))\n ) : (\n <span className=\"text-sm text-muted-foreground\">\n {tWithFallback(\n t,\n 'pendingInvites.noRoles',\n 'No explicit roles assigned'\n )}\n </span>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex flex-col gap-2 sm:flex-row lg:flex-col lg:min-w-44\">\n <Button\n onClick={() => handleAccept(invitation.id)}\n disabled={isMutating}\n className=\"w-full\"\n >\n {isProcessingThisInvite && isAccepting ? (\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n ) : (\n <CheckCircle className=\"mr-2 size-4\" />\n )}\n {tWithFallback(t, 'pendingInvites.acceptButton', 'Accept')}\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => handleReject(invitation.id)}\n disabled={isMutating}\n className=\"w-full\"\n >\n {isProcessingThisInvite && isRejecting ? (\n <RefreshCw className=\"mr-2 size-4 animate-spin\" />\n ) : (\n <XCircle className=\"mr-2 size-4\" />\n )}\n {tWithFallback(t, 'pendingInvites.rejectButton', 'Reject')}\n </Button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n </PageContainer>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-workspaces",
3
- "version": "2026.531.1",
3
+ "version": "2026.531.2",
4
4
  "description": "Workspaces microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [