"use client"; import { Button } from "@unsend/ui/src/button"; import { Spinner } from "@unsend/ui/src/spinner"; import { api } from "~/trpc/react"; import { useRouter, useSearchParams } from "next/navigation"; import { toast } from "@unsend/ui/src/toaster"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@unsend/ui/src/dialog"; import { useState } from "react"; import type { AppRouter } from "~/server/api/root"; import type { inferRouterOutputs } from "@trpc/server"; type RouterOutputs = inferRouterOutputs; type Invite = NonNullable< RouterOutputs["invitation"]["getUserInvites"] >[number]; export default function JoinTeam({ showCreateTeam = false, }: { showCreateTeam?: boolean; }) { const searchParams = useSearchParams(); const inviteId = searchParams.get("inviteId"); const { data: invites, status: invitesStatus } = api.invitation.getUserInvites.useQuery({ inviteId, }); const joinTeamMutation = api.invitation.acceptTeamInvite.useMutation(); const [selectedInvite, setSelectedInvite] = useState(null); const [dialogOpen, setDialogOpen] = useState(false); const utils = api.useUtils(); const router = useRouter(); const handleAcceptInvite = (invite: Invite) => { setSelectedInvite(invite); setDialogOpen(true); }; const confirmAcceptInvite = () => { if (!selectedInvite) return; joinTeamMutation.mutate( { inviteId: selectedInvite.id, }, { onSuccess: async () => { toast.success(`Successfully joined ${selectedInvite.team.name}`); await Promise.all([ utils.invitation.getUserInvites.invalidate(), utils.team.getTeams.invalidate(), ]); setDialogOpen(false); router.replace("/dashboard"); }, onError: (error) => { toast.error(`Failed to join team: ${error.message}`); setDialogOpen(false); }, } ); }; if (!invites?.length) { return !showCreateTeam ? (
No invites found
) : null; } return (
You have been invited to join team
{invites.map((invite) => (
{invite.team.name}
{invite.role.toLowerCase()}
{invite.createdAt.toLocaleDateString()}
))}
{showCreateTeam ? (
OR
) : null} Accept Team Invitation Are you sure you want to join{" "} {selectedInvite?.team.name} ? You will be added as a{" "} {selectedInvite?.role.toLowerCase()} .
); }