'use client'; import { DialogCloseButton } from '@/components/ui/common/DialogCloseButton'; import { ToastStack, type ToastMessages } from '@/components/ui/common/Toast'; import type { OrganizationInvitationHistoryItemDto } from '@/lib/api/organization'; import { Badge, organizationConnectionStatusVariant } from '@/components/ui/common/Badge'; import { Table } from '@/components/ui/common/Table'; import { CopyInvitationLinkButton } from '@/components/ui/organizations/CopyInvitationLinkButton'; function formatInvitationStatusLabel(status: OrganizationInvitationHistoryItemDto['status']): string { if (status === 'PENDING') return 'Invitation pending'; if (status === 'ACTIVE') return 'Invitation accepted'; if (status === 'REJECTED') return 'Invitation rejected'; if (status === 'EXPIRED') return 'Invitation expired'; return status; } function formatTableDate(value: string): string { const d = new Date(value); if (Number.isNaN(d.getTime())) return '—'; return d.toLocaleDateString(); } type InvitationHistoryDialogProps = { open: boolean; onClose: () => void; loading: boolean; items: OrganizationInvitationHistoryItemDto[]; copiedId: string | null; copyingInvitationId: string | null; onCopy: (invitation: OrganizationInvitationHistoryItemDto) => void; /** Same page-level toasts, rendered at top of dialog while it is open. */ toastMessages?: ToastMessages; }; export function InvitationHistoryDialog({ open, onClose, loading, items, copiedId, copyingInvitationId, onCopy, toastMessages, }: InvitationHistoryDialogProps) { if (!open) return null; return (

Invitation History

{toastMessages && } {loading ? (

Loading invitation history...

) : items.length === 0 ? (

No invitations yet.

) : ( } body={ <> {items.map((inv) => ( ))} } /> )} ); }
Organization Owner email Date Status Invitation link
{inv.organizationName} {inv.ownerEmail} {formatTableDate(inv.createdAt)} {formatInvitationStatusLabel(inv.status)} onCopy(inv)} />