import { Trans } from '@lingui/react/macro'; import { TeamMemberInviteStatus } from '@prisma/client'; import { DateTime } from 'luxon'; import { Link } from 'react-router'; import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session'; import { encryptSecondaryData } from '@documenso/lib/server-only/crypto/encrypt'; import { declineTeamInvitation } from '@documenso/lib/server-only/team/decline-team-invitation'; import { getTeamById } from '@documenso/lib/server-only/team/get-team'; import { prisma } from '@documenso/prisma'; import { Button } from '@documenso/ui/primitives/button'; import type { Route } from './+types/team.decline.$token'; export async function loader({ params, request }: Route.LoaderArgs) { const session = await getOptionalSession(request); const { token } = params; if (!token) { return { state: 'InvalidLink', } as const; } const teamMemberInvite = await prisma.teamMemberInvite.findUnique({ where: { token, }, }); if (!teamMemberInvite) { return { state: 'InvalidLink', } as const; } const team = await getTeamById({ teamId: teamMemberInvite.teamId }); const user = await prisma.user.findFirst({ where: { email: { equals: teamMemberInvite.email, mode: 'insensitive', }, }, }); if (user) { await declineTeamInvitation({ userId: user.id, teamId: team.id }); } if (!user && teamMemberInvite.status !== TeamMemberInviteStatus.DECLINED) { await prisma.teamMemberInvite.update({ where: { id: teamMemberInvite.id, }, data: { status: TeamMemberInviteStatus.DECLINED, }, }); } const email = encryptSecondaryData({ data: teamMemberInvite.email, expiresAt: DateTime.now().plus({ days: 1 }).toMillis(), }); if (!user) { return { state: 'LoginRequired', email, teamName: team.name, } as const; } const isSessionUserTheInvitedUser = user.id === session?.user?.id; return { state: 'Success', email, teamName: team.name, isSessionUserTheInvitedUser, } as const; } export default function DeclineInvitationPage({ loaderData }: Route.ComponentProps) { const data = loaderData; if (data.state === 'InvalidLink') { return (

Invalid token

This token is invalid or has expired. No action is needed.

); } if (data.state === 'LoginRequired') { return (

Team invitation

You have been invited by {data.teamName} to join their team.

To decline this invitation you must create an account.

); } return (

Invitation declined

You have declined the invitation from {data.teamName} to join their team.

{data.isSessionUserTheInvitedUser ? ( ) : ( )}
); }