import { LockKeyhole, Mail, UserRound } from "lucide-react"; import Link from "next/link"; import { notFound } from "next/navigation"; import { acceptInvitation } from "./actions"; import { AuthPageShell } from "@/components/auth/auth-page-shell"; import { SubmitButton } from "@/components/auth/submit-button"; import { ErrorToaster } from "@/components/error-toaster"; import { Input, Label } from "poyraz-ui/atoms"; import { Alert, AlertDescription } from "poyraz-ui/molecules"; import { getPortalInvitationPreview } from "@/server/auth/invitations"; import { getPublicBranding } from "@/server/branding/runtime"; import { resolveInvitationLocale } from "@/server/i18n/resolver"; import { createTranslator } from "@/server/i18n/translator"; export const dynamic = "force-dynamic"; export default async function InvitationPage({ params, searchParams, }: { params: Promise<{ token: string }>; searchParams: Promise<{ error?: string; code?: string; message?: string }>; }) { const { token } = await params; const invitation = getPortalInvitationPreview(token); const branding = getPublicBranding(); if (!invitation) { notFound(); } const resolvedLocale = await resolveInvitationLocale(invitation.locale); const t = createTranslator(resolvedLocale.locale, ["auth"]).t; const query = await searchParams; const queryCode = query.code ?? null; const queryMessage = queryCode ? t(queryCode) : query.message; const resolvedQueryMessage = queryMessage === queryCode ? query.message : queryMessage; const marketing = { headline: t("auth.marketing.headline"), description: t("auth.marketing.description", { app: branding.organizationName ?? branding.applicationName }), openSource: t("auth.marketing.openSource"), github: t("auth.marketing.github"), via: t("auth.marketing.via"), builtBy: t("auth.marketing.builtBy"), highlights: [ t("auth.highlights.clients"), t("auth.highlights.calendar"), t("auth.highlights.finance"), t("auth.highlights.reports"), ] as [string, string, string, string], }; const isUsable = invitation.status === "pending"; const unavailableMessage = invitation.status === "expired" ? t("auth.invite.expired") : invitation.status === "accepted" ? t("auth.invite.accepted") : invitation.status === "revoked" ? t("auth.invite.revoked") : null; return ( <> {query.error && resolvedQueryMessage ? : null}

{t("auth.invite.passwordHelp")}

{t("auth.invite.submit")} ) : ( {unavailableMessage} ) } secondaryAction={null} footer={ {t("auth.invite.backToLogin")} } /> ); }