mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-12 22:44:30 +00:00
90 lines
2.9 KiB
TypeScript
90 lines
2.9 KiB
TypeScript
import { DynamicTheme } from "@/components/dynamic-theme";
|
|
import { SignInWithIdp } from "@/components/sign-in-with-idp";
|
|
import { UsernameForm } from "@/components/username-form";
|
|
import { getApiUrlOfHeaders } from "@/lib/service";
|
|
import {
|
|
getActiveIdentityProviders,
|
|
getBrandingSettings,
|
|
getDefaultOrg,
|
|
getLoginSettings,
|
|
} from "@/lib/zitadel";
|
|
import { Organization } from "@zitadel/proto/zitadel/org/v2/org_pb";
|
|
import { getLocale, getTranslations } from "next-intl/server";
|
|
import { headers } from "next/headers";
|
|
|
|
export default async function Page(props: {
|
|
searchParams: Promise<Record<string | number | symbol, string | undefined>>;
|
|
}) {
|
|
const searchParams = await props.searchParams;
|
|
const locale = getLocale();
|
|
const t = await getTranslations({ locale, namespace: "loginname" });
|
|
|
|
const loginName = searchParams?.loginName;
|
|
const authRequestId = searchParams?.authRequestId;
|
|
const organization = searchParams?.organization;
|
|
const suffix = searchParams?.suffix;
|
|
const submit: boolean = searchParams?.submit === "true";
|
|
|
|
const _headers = await headers();
|
|
const instanceUrl = getApiUrlOfHeaders(_headers);
|
|
const host = instanceUrl;
|
|
|
|
if (!host || typeof host !== "string") {
|
|
throw new Error("No host found");
|
|
}
|
|
|
|
let defaultOrganization;
|
|
if (!organization) {
|
|
const org: Organization | null = await getDefaultOrg({ host });
|
|
if (org) {
|
|
defaultOrganization = org.id;
|
|
}
|
|
}
|
|
|
|
const loginSettings = await getLoginSettings({
|
|
host,
|
|
organization: organization ?? defaultOrganization,
|
|
});
|
|
|
|
const contextLoginSettings = await getLoginSettings({ host, organization });
|
|
|
|
const identityProviders = await getActiveIdentityProviders({
|
|
host,
|
|
orgId: organization ?? defaultOrganization,
|
|
}).then((resp) => {
|
|
return resp.identityProviders;
|
|
});
|
|
|
|
const branding = await getBrandingSettings({
|
|
host,
|
|
organization: organization ?? defaultOrganization,
|
|
});
|
|
|
|
return (
|
|
<DynamicTheme branding={branding}>
|
|
<div className="flex flex-col items-center space-y-4">
|
|
<h1>{t("title")}</h1>
|
|
<p className="ztdl-p">{t("description")}</p>
|
|
|
|
<UsernameForm
|
|
loginName={loginName}
|
|
authRequestId={authRequestId}
|
|
organization={organization} // stick to "organization" as we still want to do user discovery based on the searchParams not the default organization, later the organization is determined by the found user
|
|
loginSettings={contextLoginSettings}
|
|
suffix={suffix}
|
|
submit={submit}
|
|
allowRegister={!!loginSettings?.allowRegister}
|
|
>
|
|
{identityProviders && (
|
|
<SignInWithIdp
|
|
identityProviders={identityProviders}
|
|
authRequestId={authRequestId}
|
|
organization={organization}
|
|
></SignInWithIdp>
|
|
)}
|
|
</UsernameForm>
|
|
</div>
|
|
</DynamicTheme>
|
|
);
|
|
}
|