import React, { useCallback, useEffect, useMemo, useState } from "react"; import { Alert, Box, Button, Typography } from "@mui/material"; import { api, getApiErrorMessage } from "../api"; import { clearAuthClientState } from "../auth"; import { useToast } from "../toast"; import { useI18n } from "../i18n/I18nProvider"; import { PageSection } from "../layout/PageLayout"; type MeResponse = { provider?: string; id?: string; email?: string; userName?: string; firstName?: string; lastName?: string; displayName?: string; roles?: string[]; googleLink?: { linked: boolean; email?: string | null; } | null; }; export default function AuthStatusCard() { const { toast } = useToast(); const { t } = useI18n(); const [me, setMe] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const refresh = useCallback(() => { setLoading(true); setError(null); api.get("/auth/me") .then((r) => setMe(r.data)) .catch((e) => { setMe(null); if (e?.response?.status !== 401) setError(getApiErrorMessage(e, t("profileLoadFailed"))); }) .finally(() => setLoading(false)); }, [t]); useEffect(() => { refresh(); window.addEventListener("auth-changed", refresh); return () => window.removeEventListener("auth-changed", refresh); }, [refresh]); const label = useMemo(() => me?.userName || me?.displayName || [me?.firstName, me?.lastName].filter(Boolean).join(" ") || me?.email, [me]); return ( {loading ? {t("loading")} : error ? ( {t("retry")}}>{error} ) : !me ? ( {t("authStatusNotSignedIn")} ) : ( {label ? t("signedInAs", { name: label }) : t("signedIn")} {me.provider ? ` (${me.provider === "local" ? t("profileLocalAccount") : me.provider === "google" ? t("profileGoogleSession") : t("profileExternalSession")})` : ""} {me?.roles && me.roles.length > 0 ? ( {t("authStatusRoles", { roles: me.roles.join(", ") })} ) : null} {me?.googleLink?.linked ? ( {t("authStatusGoogleLinked", { suffix: me.googleLink.email ? `: ${me.googleLink.email}` : "." })} ) : null} )} ); }