import { Trans } from '@lingui/react/macro'; import { Link } from 'react-router'; import { isTokenExpired } from '@documenso/lib/utils/token-verification'; import { prisma } from '@documenso/prisma'; import { Button } from '@documenso/ui/primitives/button'; import type { Route } from './+types/team.verify.email.$token'; export async function loader({ params }: Route.LoaderArgs) { const { token } = params; if (!token) { return { state: 'InvalidLink', } as const; } const teamEmailVerification = await prisma.teamEmailVerification.findUnique({ where: { token, }, include: { team: true, }, }); if (!teamEmailVerification || isTokenExpired(teamEmailVerification.expiresAt)) { return { state: 'InvalidLink', } as const; } if (teamEmailVerification.completed) { return { state: 'AlreadyCompleted', teamName: teamEmailVerification.team.name, } as const; } const { team } = teamEmailVerification; let isTeamEmailVerificationError = false; try { await prisma.$transaction([ prisma.teamEmailVerification.updateMany({ where: { teamId: team.id, email: teamEmailVerification.email, }, data: { completed: true, }, }), prisma.teamEmailVerification.deleteMany({ where: { teamId: team.id, expiresAt: { lt: new Date(), }, }, }), prisma.teamEmail.create({ data: { teamId: team.id, email: teamEmailVerification.email, name: teamEmailVerification.name, }, }), ]); } catch (e) { console.error(e); isTeamEmailVerificationError = true; } if (isTeamEmailVerificationError) { return { state: 'VerificationError', teamName: team.name, } as const; } return { state: 'Success', teamName: team.name, } as const; } export default function VerifyTeamEmailPage({ loaderData }: Route.ComponentProps) { const data = loaderData; if (data.state === 'InvalidLink') { return (