"use client"; import { sendLoginname } from "@/lib/server/loginname"; import { cleanupSession, continueWithSession } from "@/lib/server/session"; import { XCircleIcon } from "@heroicons/react/24/outline"; import { Timestamp, timestampDate } from "@zitadel/client"; import { Session } from "@zitadel/proto/zitadel/session/v2/session_pb"; import moment from "moment"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { Avatar } from "./avatar"; export function isSessionValid(session: Partial): { valid: boolean; verifiedAt?: Timestamp; } { const validPassword = session?.factors?.password?.verifiedAt; const validPasskey = session?.factors?.webAuthN?.verifiedAt; const validIDP = session?.factors?.intent?.verifiedAt; const stillValid = session.expirationDate ? timestampDate(session.expirationDate) > new Date() : true; const verifiedAt = validPassword || validPasskey || validIDP; const valid = !!((validPassword || validPasskey || validIDP) && stillValid); return { valid, verifiedAt }; } export function SessionItem({ session, reload, authRequestId, }: { session: Session; reload: () => void; authRequestId?: string; }) { const [loading, setLoading] = useState(false); async function clearSession(id: string) { setLoading(true); const response = await cleanupSession({ sessionId: id, }) .catch((error) => { setError(error.message); return; }) .finally(() => { setLoading(false); }); return response; } const { valid, verifiedAt } = isSessionValid(session); const [error, setError] = useState(null); const router = useRouter(); return ( ); }