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 { acceptTeamInvitation } from '@documenso/lib/server-only/team/accept-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.invite.$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', }, }, }); // Directly convert the team member invite to a team member if they already have an account. if (user) { await acceptTeamInvitation({ userId: user.id, teamId: team.id }); } // For users who do not exist yet, set the team invite status to accepted, which is checked during // user creation to determine if we should add the user to the team at that time. if (!user && teamMemberInvite.status !== TeamMemberInviteStatus.ACCEPTED) { await prisma.teamMemberInvite.update({ where: { id: teamMemberInvite.id, }, data: { status: TeamMemberInviteStatus.ACCEPTED, }, }); } 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 AcceptInvitationPage({ loaderData }: Route.ComponentProps) { const data = loaderData; if (data.state === 'InvalidLink') { return (