import { WEBAPP_URL } from "@/lib/constants"; import { verifyInviteToken } from "@/lib/jwt"; import { createMembership } from "@/lib/membership/service"; import { getUser, updateUser } from "@/lib/user/service"; import { deleteInvite, getInvite } from "@/modules/auth/invite/lib/invite"; import { createTeamMembership } from "@/modules/auth/invite/lib/team"; import { authOptions } from "@/modules/auth/lib/authOptions"; import { sendInviteAcceptedEmail } from "@/modules/email"; import { Button } from "@/modules/ui/components/button"; import { getTranslate } from "@/tolgee/server"; import { getServerSession } from "next-auth"; import Link from "next/link"; import { after } from "next/server"; import { logger } from "@formbricks/logger"; import { ContentLayout } from "./components/content-layout"; interface InvitePageProps { searchParams: Promise<{ token: string }>; } export const InvitePage = async (props: InvitePageProps) => { const searchParams = await props.searchParams; const t = await getTranslate(); const session = await getServerSession(authOptions); const user = session?.user.id ? await getUser(session.user.id) : null; try { const { inviteId, email } = verifyInviteToken(searchParams.token); const invite = await getInvite(inviteId); if (!invite) { return ( ); } const isInviteExpired = new Date(invite.expiresAt) < new Date(); if (isInviteExpired) { return ( ); } if (!session) { const redirectUrl = WEBAPP_URL + "/invite?token=" + searchParams.token; const encodedEmail = encodeURIComponent(email); return ( ); } if (user?.email?.toLowerCase() !== email?.toLowerCase()) { return ( ); } const createMembershipAction = async () => { "use server"; if (!session || !user) return; await createMembership(invite.organizationId, session.user.id, { accepted: true, role: invite.role, }); if (invite.teamIds) { await createTeamMembership( { organizationId: invite.organizationId, role: invite.role, teamIds: invite.teamIds, }, user.id ); } await deleteInvite(inviteId); await sendInviteAcceptedEmail(invite.creator.name ?? "", user?.name ?? "", invite.creator.email); await updateUser(session.user.id, { notificationSettings: { ...user.notificationSettings, alert: user.notificationSettings.alert ?? {}, weeklySummary: user.notificationSettings.weeklySummary ?? {}, unsubscribedOrganizationIds: Array.from( new Set([ ...(user.notificationSettings?.unsubscribedOrganizationIds || []), invite.organizationId, ]) ), }, }); }; after(async () => { await createMembershipAction(); }); return ( ); } catch (e) { logger.error(e, "Error in InvitePage"); return ( ); } };