mirror of
https://github.com/yusufipk/OpenFrame.git
synced 2026-09-11 09:36:08 +00:00
Clicking an invitation link while signed out dropped the visitor on a bare login form, even though most invitees have no account yet and nothing on screen told them to create one. Signed-out visitors now get the invitation itself: who invited them, which workspace/project, which role, and which address it was sent to. The primary call to action follows whether an account already exists for that address — "Create your account" when it does not, "Sign in to accept" when it does. The sign-up path carries the invitation forward, so a new account lands back on the invitation and from there on the shared workspace/project instead of the onboarding wizard: - the register link passes invitationToken, the invited email and a callbackUrl - the register form locks the email to the invited address and shows what is being joined - the verification email round-trips the destination through a sanitized `next` parameter - login and verify-email keep the pending destination in their sign-in links Signing in with a different address than the one invited now explains the mismatch instead of silently redirecting to the dashboard. Callback sanitization moves to lib/safe-redirect.ts so login, register, verify-email and the verification route share one open-redirect guard.
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import { isInviteCodeRequired } from '@/lib/feature-flags';
|
|
import { getInvitationPreviewByToken } from '@/lib/invitations';
|
|
import RegisterPageClient from './register-page-client';
|
|
|
|
interface RegisterPageProps {
|
|
searchParams: Promise<{ invitationToken?: string }>;
|
|
}
|
|
|
|
export default async function RegisterPage({ searchParams }: RegisterPageProps) {
|
|
const googleEnabled = Boolean(process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET);
|
|
const githubEnabled = Boolean(process.env.GITHUB_CLIENT_ID && process.env.GITHUB_CLIENT_SECRET);
|
|
|
|
const token = (await searchParams)?.invitationToken?.trim();
|
|
const preview = token ? await getInvitationPreviewByToken(token) : null;
|
|
const invitation =
|
|
preview && preview.status === 'PENDING' && !preview.isExpired
|
|
? {
|
|
email: preview.email,
|
|
inviterName: preview.inviterName,
|
|
roleLabel: preview.roleLabel,
|
|
scopeLabel: preview.scopeLabel,
|
|
targetName: preview.targetName,
|
|
}
|
|
: null;
|
|
|
|
return (
|
|
<RegisterPageClient
|
|
requireInviteCode={isInviteCodeRequired()}
|
|
googleEnabled={googleEnabled}
|
|
githubEnabled={githubEnabled}
|
|
invitation={invitation}
|
|
/>
|
|
);
|
|
}
|