import Link from 'next/link'; import { notFound, redirect } from 'next/navigation'; import { ArrowLeft } from 'lucide-react'; import { requireUser } from '@kit/supabase/require-user'; import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; import { AcceptInvitationContainer } from '@kit/team-accounts/components'; import { Button } from '@kit/ui/button'; import { Heading } from '@kit/ui/heading'; import { Trans } from '@kit/ui/trans'; import pathsConfig from '~/config/paths.config'; import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; import { withI18n } from '~/lib/i18n/with-i18n'; import { JoinTeamService } from './_lib/server/join-team.service'; interface Context { searchParams: { invite_token: string; }; } export const generateMetadata = async () => { const i18n = await createI18nServerInstance(); return { title: i18n.t('teams:joinTeamAccount'), }; }; async function JoinTeamAccountPage({ searchParams }: Context) { const token = searchParams.invite_token; // no token, redirect to 404 if (!token) { notFound(); } const client = getSupabaseServerComponentClient(); const auth = await requireUser(client); // if the user is not logged in or there is an error // redirect to the sign up page with the invite token // so that they will get back to this page after signing up if (auth.error ?? !auth.data) { redirect(pathsConfig.auth.signUp + '?invite_token=' + token); } const service = new JoinTeamService(); // the user is logged in, we can now check if the token is valid const invitation = await service.getInviteDataFromInviteToken(token); if (!invitation) { return ; } // we need to verify the user isn't already in the account const isInAccount = await service.isCurrentUserAlreadyInAccount( invitation.account.id, ); if (isInAccount) { const { getLogger } = await import('@kit/shared/logger'); const logger = await getLogger(); logger.warn( { name: 'join-team-account', accountId: invitation.account.id, userId: auth.data.id, }, 'User is already in the account. Redirecting to account page.', ); // if the user is already in the account redirect to the home page redirect(pathsConfig.app.home); } // if the user decides to sign in with a different account // we redirect them to the sign in page with the invite token const signOutNext = pathsConfig.auth.signIn + '?invite_token=' + token; // once the user accepts the invitation, we redirect them to the account home page const accountHome = pathsConfig.app.accountHome.replace( '[account]', invitation.account.slug, ); return ( ); } export default withI18n(JoinTeamAccountPage); function InviteNotFoundOrExpired() { return (

); }