import { Trans } from '@lingui/react/macro'; import { Link } from 'react-router'; import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session'; import { acceptOrganisationInvitation } from '@documenso/lib/server-only/organisation/accept-organisation-invitation'; import { prisma } from '@documenso/prisma'; import { Button } from '@documenso/ui/primitives/button'; import type { Route } from './+types/organisation.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 organisationMemberInvite = await prisma.organisationMemberInvite.findUnique({ where: { token, }, include: { organisation: { select: { name: true, }, }, }, }); if (!organisationMemberInvite) { return { state: 'InvalidLink', } as const; } const user = await prisma.user.findFirst({ where: { email: { equals: organisationMemberInvite.email, mode: 'insensitive', }, }, }); // Directly convert the team member invite to a team member if they already have an account. if (user) { await acceptOrganisationInvitation({ token: organisationMemberInvite.token }); } if (!user) { return { state: 'LoginRequired', email: organisationMemberInvite.email, organisationName: organisationMemberInvite.organisation.name, } as const; } const isSessionUserTheInvitedUser = user.id === session.user?.id; return { state: 'Success', email: organisationMemberInvite.email, organisationName: organisationMemberInvite.organisation.name, isSessionUserTheInvitedUser, } as const; } export default function AcceptInvitationPage({ loaderData }: Route.ComponentProps) { const data = loaderData; if (data.state === 'InvalidLink') { return (

Invalid token

This token is invalid or has expired. Please contact your team for a new invitation.

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

Organisation invitation

You have been invited by {data.organisationName} to join their organisation.

To accept this invitation you must create an account.

); } return (

Invitation accepted!

You have accepted an invitation from {data.organisationName} to join their organisation.

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