From 7ba6e0f09948c3ea1ab46a2e413564894565d3ff Mon Sep 17 00:00:00 2001 From: Max Peintner Date: Fri, 19 May 2023 13:02:09 +0200 Subject: [PATCH] signedin page, client avatar --- apps/login/app/(login)/accounts/page.tsx | 25 +++++--- apps/login/app/(login)/password/page.tsx | 3 - apps/login/app/(login)/signedin/page.tsx | 34 +++++++++++ apps/login/ui/Avatar.tsx | 75 ++++++++++++------------ apps/login/ui/UserAvatar.tsx | 4 +- apps/login/utils/cookies.ts | 2 +- 6 files changed, 92 insertions(+), 51 deletions(-) create mode 100644 apps/login/app/(login)/signedin/page.tsx diff --git a/apps/login/app/(login)/accounts/page.tsx b/apps/login/app/(login)/accounts/page.tsx index 8bc121198ce..79e47be1f93 100644 --- a/apps/login/app/(login)/accounts/page.tsx +++ b/apps/login/app/(login)/accounts/page.tsx @@ -1,5 +1,5 @@ import { listSessions, server } from "#/lib/zitadel"; -import { Avatar, AvatarSize } from "#/ui/Avatar"; +import { Avatar } from "#/ui/Avatar"; import { getAllSessionIds } from "#/utils/cookies"; import { ExclamationTriangleIcon, @@ -18,7 +18,6 @@ async function loadSessions() { server, ids.filter((id: string | undefined) => !!id) ).then((sessions) => { - console.log("ss", sessions.sessions); return sessions; }); } else { @@ -37,16 +36,26 @@ export default async function Page() {
{sessions ? ( sessions.map((session: any) => { + const validPassword = session.factors.password?.verifiedAt; + console.log(session); return (
@@ -57,18 +66,16 @@ export default async function Page() { {session.factors.user.loginName} - {session.factors.password?.verifiedAt && ( + {validPassword && ( - {moment( - new Date(session.factors.password.verifiedAt) - ).fromNow()} + {moment(new Date(validPassword)).fromNow()} )}
- {session.factors.password?.verifiedAt ? ( + {validPassword ? (
) : (
diff --git a/apps/login/app/(login)/password/page.tsx b/apps/login/app/(login)/password/page.tsx index c365c2dd0ff..dff1b7eca0e 100644 --- a/apps/login/app/(login)/password/page.tsx +++ b/apps/login/app/(login)/password/page.tsx @@ -8,7 +8,6 @@ async function loadSession(loginName: string) { const recent = await getMostRecentCookieWithLoginname(`${loginName}`); return getSession(server, recent.id, recent.token).then(({ session }) => { - console.log("ss", session); return session; }); } catch (error) { @@ -18,8 +17,6 @@ async function loadSession(loginName: string) { export default async function Page({ searchParams }: { searchParams: any }) { const { loginName } = searchParams; - - console.log(loginName); const sessionFactors = await loadSession(loginName); return ( diff --git a/apps/login/app/(login)/signedin/page.tsx b/apps/login/app/(login)/signedin/page.tsx new file mode 100644 index 00000000000..3a6a76171b0 --- /dev/null +++ b/apps/login/app/(login)/signedin/page.tsx @@ -0,0 +1,34 @@ +import { getSession, server } from "#/lib/zitadel"; +import PasswordForm from "#/ui/PasswordForm"; +import UserAvatar from "#/ui/UserAvatar"; +import { getMostRecentCookieWithLoginname } from "#/utils/cookies"; + +async function loadSession(loginName: string) { + try { + const recent = await getMostRecentCookieWithLoginname(`${loginName}`); + + return getSession(server, recent.id, recent.token).then(({ session }) => { + return session; + }); + } catch (error) { + throw new Error("Session could not be loaded!"); + } +} + +export default async function Page({ searchParams }: { searchParams: any }) { + const { loginName } = searchParams; + const sessionFactors = await loadSession(loginName); + + return ( +
+

{`Welcome ${sessionFactors.factors?.user?.displayName}`}

+

You are signed in.

+ + +
+ ); +} diff --git a/apps/login/ui/Avatar.tsx b/apps/login/ui/Avatar.tsx index 8f69f31e0b8..294033f4d9f 100644 --- a/apps/login/ui/Avatar.tsx +++ b/apps/login/ui/Avatar.tsx @@ -1,32 +1,18 @@ +"use client"; + import { ColorShade, getColorHash } from "#/utils/colors"; import { useTheme } from "next-themes"; -import { FC } from "react"; - -export enum AvatarSize { - SMALL = "small", - BASE = "base", - LARGE = "large", -} interface AvatarProps { name: string | null | undefined; loginName: string; imageUrl?: string; - size?: AvatarSize; + size?: "small" | "base" | "large"; shadow?: boolean; } -export const Avatar: FC = ({ - size = AvatarSize.BASE, - name, - loginName, - imageUrl, - shadow, -}) => { - // const { resolvedTheme } = useTheme(); +function getCredentials(name: string, loginName: string) { let credentials = ""; - - console.log(name, loginName); if (name) { const split = name.split(" "); if (split) { @@ -34,7 +20,7 @@ export const Avatar: FC = ({ split[0].charAt(0) + (split[1] ? split[1].charAt(0) : ""); credentials = initials; } else { - return name.charAt(0); + credentials = name.charAt(0); } } else { const username = loginName.split("@")[0]; @@ -50,32 +36,51 @@ export const Avatar: FC = ({ credentials = initials; } + return credentials; +} + +export function Avatar({ + size = "base", + name, + loginName, + imageUrl, + shadow, +}: AvatarProps) { + const { resolvedTheme } = useTheme(); + const credentials = getCredentials(name ?? loginName, loginName); + const color: ColorShade = getColorHash(loginName); - // const avatarStyleDark = { - // backgroundColor: color[900], - // color: color[200], - // }; + const avatarStyleDark = { + backgroundColor: color[900], + color: color[200], + }; - // const avatarStyleLight = { - // backgroundColor: color[200], - // color: color[900], - // }; + const avatarStyleLight = { + backgroundColor: color[200], + color: color[900], + }; + + // const [mounted, setMounted] = useState(false); + // // useEffect only runs on the client, so now we can safely show the UI + // useEffect(() => { + // setMounted(true); + // }, []); return (
{imageUrl ? ( = ({ /> ) : ( {credentials} )}
); -}; +} diff --git a/apps/login/ui/UserAvatar.tsx b/apps/login/ui/UserAvatar.tsx index 332de5feadd..33205b899bd 100644 --- a/apps/login/ui/UserAvatar.tsx +++ b/apps/login/ui/UserAvatar.tsx @@ -1,4 +1,4 @@ -import { Avatar, AvatarSize } from "#/ui/Avatar"; +import { Avatar } from "#/ui/Avatar"; import { ChevronDownIcon } from "@heroicons/react/24/outline"; import Link from "next/link"; @@ -17,7 +17,7 @@ export default function UserAvatar({
diff --git a/apps/login/utils/cookies.ts b/apps/login/utils/cookies.ts index 22f15b87746..6b7504f1eaa 100644 --- a/apps/login/utils/cookies.ts +++ b/apps/login/utils/cookies.ts @@ -88,7 +88,7 @@ export async function removeSessionFromCookie( // @ts-ignore return cookiesList.set({ - name: "sessions", + name: "__Secure-sessions", value: JSON.stringify(filteredSessions), httpOnly: true, path: "/",