'use client'; import { useTranslations } from 'next-intl'; import { DialogCloseButton } from '@/components/ui/shared/DialogCloseButton'; import { ToastStack, type ToastMessages } from '@/components/ui/shared/Toast'; import type { OrganizationInvitationHistoryItemDto } from '@/lib/api/organization'; import { Badge, organizationConnectionStatusVariant } from '@/components/ui/shared/Badge'; import { Table } from '@/components/ui/shared/Table'; import { CopyInvitationLinkButton } from '@/components/ui/organizations/CopyInvitationLinkButton'; 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) { const t = useTranslations('organizations'); function formatInvitationStatusLabel( status: OrganizationInvitationHistoryItemDto['status'], ): string { if (status === 'PENDING') return t('statusPending'); if (status === 'ACTIVE') return t('statusAccepted'); if (status === 'REJECTED') return t('statusRejected'); if (status === 'EXPIRED') return t('statusExpired'); return status; } if (!open) return null; return (
{t('loadingHistory')}
) : items.length === 0 ? ({t('historyEmpty')}
) : (| {t('tableOrganization')} | {t('tableOwnerEmail')} | {t('tableDate')} | {t('tableStatus')} | {t('tableInvitationLink')} | } body={ <> {items.map((inv) => (
|---|---|---|---|---|
| {inv.organizationName} | {inv.ownerEmail} | {formatTableDate(inv.createdAt)} |
|
|