import React, { useEffect, useState } from 'react';
import api from '../utils/api';
import { Card } from './ui/card';
import { Button } from './ui/button';
import { Badge } from './ui/badge';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from './ui/table';
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from './ui/alert-dialog';
import { toast } from 'sonner';
import { Mail, Trash2, MailCheck, Clock } from 'lucide-react';
const PendingInvitationsTable = () => {
const [invitations, setInvitations] = useState([]);
const [loading, setLoading] = useState(true);
const [revokeDialog, setRevokeDialog] = useState({ open: false, invitation: null });
const [resending, setResending] = useState(null);
useEffect(() => {
fetchInvitations();
}, []);
const fetchInvitations = async () => {
try {
const response = await api.get('/admin/users/invitations?status=pending');
setInvitations(response.data);
} catch (error) {
toast.error('Failed to fetch invitations');
} finally {
setLoading(false);
}
};
const handleResend = async (invitationId) => {
setResending(invitationId);
try {
await api.post(`/admin/users/invitations/${invitationId}/resend`);
toast.success('Invitation resent successfully');
fetchInvitations(); // Refresh list to show new expiry date
} catch (error) {
toast.error(error.response?.data?.detail || 'Failed to resend invitation');
} finally {
setResending(null);
}
};
const handleRevoke = async () => {
if (!revokeDialog.invitation) return;
try {
await api.delete(`/admin/users/invitations/${revokeDialog.invitation.id}`);
toast.success('Invitation revoked');
setRevokeDialog({ open: false, invitation: null });
fetchInvitations(); // Refresh list
} catch (error) {
toast.error(error.response?.data?.detail || 'Failed to revoke invitation');
}
};
const getRoleBadge = (role) => {
const config = {
superadmin: { label: 'Superadmin', className: 'bg-brand-purple text-white' },
admin: { label: 'Admin', className: 'bg-[var(--green-light)] text-white' },
member: { label: 'Member', className: 'bg-[var(--neutral-800)] text-[var(--purple-ink)]' }
};
const roleConfig = config[role] || { label: role, className: 'bg-gray-500 text-white' };
return (
Loading invitations...
All invitations have been accepted or expired