"use client"; import { ActionButton } from "@/components/ui/action-button"; import { ButtonWithTooltip } from "@/components/ui/button"; import { toast } from "@/components/ui/sonner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { useMutation, useQueryClient, useSuspenseQuery, } from "@tanstack/react-query"; import { formatDistanceToNow } from "date-fns"; import { Mail, MailX, UserPlus } from "lucide-react"; import { useTRPC } from "@karakeep/shared-react/trpc"; import ActionConfirmingDialog from "../ui/action-confirming-dialog"; import { AdminCard } from "./AdminCard"; import CreateInviteDialog from "./CreateInviteDialog"; export default function InvitesList() { const api = useTRPC(); const queryClient = useQueryClient(); const { data: invites } = useSuspenseQuery(api.invites.list.queryOptions()); const { mutateAsync: revokeInvite, isPending: isRevokePending } = useMutation( api.invites.revoke.mutationOptions({ onSuccess: () => { toast({ description: "Invite revoked successfully", }); queryClient.invalidateQueries(api.invites.list.pathFilter()); }, onError: (e) => { toast({ variant: "destructive", description: `Failed to revoke invite: ${e.message}`, }); }, }), ); const { mutateAsync: resendInvite, isPending: isResendPending } = useMutation( api.invites.resend.mutationOptions({ onSuccess: () => { toast({ description: "Invite resent successfully", }); queryClient.invalidateQueries(api.invites.list.pathFilter()); }, onError: (e) => { toast({ variant: "destructive", description: `Failed to resend invite: ${e.message}`, }); }, }), ); const activeInvites = invites?.invites || []; const InviteTable = ({ invites: inviteList, title, }: { invites: NonNullable["invites"]; title: string; }) => (
{inviteList.length === 0 ? (

No {title.toLowerCase()} invites

) : ( Email Invited By Created Actions {inviteList.map((invite) => ( {invite.email} {invite.invitedBy.name} {formatDistanceToNow(new Date(invite.createdAt), { addSuffix: true, })} { <> resendInvite({ inviteId: invite.id })} disabled={isResendPending} > ( { await revokeInvite({ inviteId: invite.id }); setDialogOpen(false); }} > Revoke )} > } ))}
)}
); return (
User Invitations ({activeInvites.length})
); }