diff --git a/devfront/src/features/clients/ClientsPage.tsx b/devfront/src/features/clients/ClientsPage.tsx index 2d1fd352..bb0ebbe6 100644 --- a/devfront/src/features/clients/ClientsPage.tsx +++ b/devfront/src/features/clients/ClientsPage.tsx @@ -5,8 +5,6 @@ import { Filter, Plus, Search, - ServerCog, - ShieldHalf, X, } from "lucide-react"; import { useEffect, useState } from "react"; @@ -50,6 +48,7 @@ import { t } from "../../lib/i18n"; import { resolveProfileRole } from "../../lib/role"; import { cn } from "../../lib/utils"; import { fetchMe } from "../auth/authApi"; +import { ClientLogo } from "./components/ClientLogo"; function ClientsPage() { const navigate = useNavigate(); @@ -498,13 +497,7 @@ function ClientsPage() { to={`/clients/${client.id}`} className="flex items-center gap-3 transition-colors hover:text-primary" > -
- {client.type === "private" ? ( - - ) : ( - - )} -
+

{client.name || diff --git a/devfront/src/features/clients/components/ClientLogo.tsx b/devfront/src/features/clients/components/ClientLogo.tsx new file mode 100644 index 00000000..0c7b0a56 --- /dev/null +++ b/devfront/src/features/clients/components/ClientLogo.tsx @@ -0,0 +1,52 @@ +import { ServerCog, ShieldHalf } from "lucide-react"; +import { useMemo, useState } from "react"; +import { Avatar, AvatarFallback, AvatarImage } from "../../../components/ui/avatar"; +import type { ClientSummary, ClientType } from "../../../lib/devApi"; +import { t } from "../../../lib/i18n"; + +type ClientLogoProps = { + client: Pick; +}; + +function readLogoUrl(metadata?: Record): string | undefined { + const logoUrl = metadata?.logo_url; + if (typeof logoUrl !== "string") { + return undefined; + } + + const trimmedLogoUrl = logoUrl.trim(); + return trimmedLogoUrl.length > 0 ? trimmedLogoUrl : undefined; +} + +function TypeFallbackIcon({ type }: { type: ClientType }) { + if (type === "private") { + return