account selection with params

This commit is contained in:
peintnermax
2024-05-03 10:09:18 +02:00
parent fd8a1a384b
commit 39d54e20bf
12 changed files with 79 additions and 6 deletions

View File

@@ -97,6 +97,7 @@ export default async function Page({
return retrieveIDPIntent(id, token) return retrieveIDPIntent(id, token)
.then((resp) => { .then((resp) => {
const { idpInformation, userId } = resp; const { idpInformation, userId } = resp;
if (idpInformation) { if (idpInformation) {
// handle login // handle login
if (userId) { if (userId) {
@@ -166,10 +167,14 @@ export default async function Page({
}); });
} else { } else {
return ( return (
<div className="flex flex-col items-center space-y-4"> <DynamicTheme branding={branding}>
<h1>Register</h1> <div className="flex flex-col items-center space-y-4">
<p className="ztdl-p">No id and token received!</p> <div className="flex flex-col items-center space-y-4">
</div> <h1>Register</h1>
<p className="ztdl-p">No id and token received!</p>
</div>
</div>
</DynamicTheme>
); );
} }
} }

View File

@@ -77,6 +77,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}

View File

@@ -80,6 +80,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}

View File

@@ -1,6 +1,14 @@
import { getBrandingSettings, getLoginSettings, server } from "#/lib/zitadel"; import {
getBrandingSettings,
getLoginSettings,
getSession,
server,
} from "#/lib/zitadel";
import Alert from "#/ui/Alert";
import DynamicTheme from "#/ui/DynamicTheme"; import DynamicTheme from "#/ui/DynamicTheme";
import LoginOTP from "#/ui/LoginOTP"; import LoginOTP from "#/ui/LoginOTP";
import UserAvatar from "#/ui/UserAvatar";
import { getMostRecentCookieWithLoginname } from "#/utils/cookies";
export default async function Page({ export default async function Page({
searchParams, searchParams,
@@ -14,8 +22,21 @@ export default async function Page({
const { method } = params; const { method } = params;
const { session, token } = await loadSession(loginName, organization);
const branding = await getBrandingSettings(server, organization); const branding = await getBrandingSettings(server, organization);
async function loadSession(loginName?: string, organization?: string) {
const recent = await getMostRecentCookieWithLoginname(
loginName,
organization
);
return getSession(server, recent.id, recent.token).then((response) => {
return { session: response?.session, token: recent.token };
});
}
return ( return (
<DynamicTheme branding={branding}> <DynamicTheme branding={branding}>
<div className="flex flex-col items-center space-y-4"> <div className="flex flex-col items-center space-y-4">
@@ -30,6 +51,24 @@ export default async function Page({
<p className="ztdl-p">Enter the code you got via your email.</p> <p className="ztdl-p">Enter the code you got via your email.</p>
)} )}
{!session && (
<div className="py-4">
<Alert>
Could not get the context of the user. Make sure to enter the
username first or provide a loginName as searchParam.
</Alert>
</div>
)}
{session && (
<UserAvatar
loginName={loginName ?? session.factors?.user?.loginName}
displayName={session.factors?.user?.displayName}
showDropdown
searchParams={searchParams}
></UserAvatar>
)}
{method && ( {method && (
<LoginOTP <LoginOTP
loginName={loginName} loginName={loginName}

View File

@@ -121,6 +121,7 @@ export default async function Page({
loginName={loginName ?? session.factors?.user?.loginName} loginName={loginName ?? session.factors?.user?.loginName}
displayName={session.factors?.user?.displayName} displayName={session.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}

View File

@@ -45,6 +45,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}
<p className="ztdl-p mb-6 block">{description}</p> <p className="ztdl-p mb-6 block">{description}</p>

View File

@@ -60,6 +60,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}
<p className="ztdl-p mb-6 block">{description}</p> <p className="ztdl-p mb-6 block">{description}</p>

View File

@@ -55,6 +55,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}

View File

@@ -43,6 +43,7 @@ export default async function Page({ searchParams }: { searchParams: any }) {
loginName={loginName ?? sessionFactors?.factors?.user?.loginName} loginName={loginName ?? sessionFactors?.factors?.user?.loginName}
displayName={sessionFactors?.factors?.user?.displayName} displayName={sessionFactors?.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
</div> </div>
</DynamicTheme> </DynamicTheme>

View File

@@ -62,6 +62,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}
<p className="ztdl-p mb-6 block"> <p className="ztdl-p mb-6 block">

View File

@@ -42,6 +42,7 @@ export default async function Page({
loginName={loginName ?? sessionFactors.factors?.user?.loginName} loginName={loginName ?? sessionFactors.factors?.user?.loginName}
displayName={sessionFactors.factors?.user?.displayName} displayName={sessionFactors.factors?.user?.displayName}
showDropdown showDropdown
searchParams={searchParams}
></UserAvatar> ></UserAvatar>
)} )}
<p className="ztdl-p mb-6 block">{description}</p> <p className="ztdl-p mb-6 block">{description}</p>

View File

@@ -6,13 +6,33 @@ type Props = {
loginName?: string; loginName?: string;
displayName?: string; displayName?: string;
showDropdown: boolean; showDropdown: boolean;
searchParams?: Record<string | number | symbol, string | undefined>;
}; };
export default function UserAvatar({ export default function UserAvatar({
loginName, loginName,
displayName, displayName,
showDropdown, showDropdown,
searchParams,
}: Props) { }: Props) {
const params = new URLSearchParams({});
if (searchParams?.sessionId) {
params.set("sessionId", searchParams.sessionId);
}
if (searchParams?.organization) {
params.set("organization", searchParams.organization);
}
if (searchParams?.authRequestId) {
params.set("authRequestId", searchParams.authRequestId);
}
if (searchParams?.loginName) {
params.set("loginName", searchParams.loginName);
}
return ( return (
<div className="flex h-full flex-row items-center rounded-full border p-[1px] dark:border-white/20"> <div className="flex h-full flex-row items-center rounded-full border p-[1px] dark:border-white/20">
<div> <div>
@@ -26,7 +46,7 @@ export default function UserAvatar({
<span className="flex-grow"></span> <span className="flex-grow"></span>
{showDropdown && ( {showDropdown && (
<Link <Link
href="/accounts" href={"/accounts?" + params}
className="ml-4 flex items-center justify-center p-1 hover:bg-black/10 dark:hover:bg-white/10 rounded-full mr-1 transition-all" className="ml-4 flex items-center justify-center p-1 hover:bg-black/10 dark:hover:bg-white/10 rounded-full mr-1 transition-all"
> >
<ChevronDownIcon className="h-4 w-4" /> <ChevronDownIcon className="h-4 w-4" />