// Arcadia profile API. Backed by /api/v1/profile (current user) — handles // avatar wiring (avatar_digital_object_id + variant URLs) and the basic // profile fields. The "profile" here is the per-tenant profile row, not // the auth account. import type { ArcadiaClient } from "@crema/arcadia-client" export interface Profile { id: string user_id: string tenant_id: string avatar_url: string | null avatar_digital_object_id: string | null /** * Variant URLs keyed by size (e.g. "thumbnail", "medium", "original"). * Shape depends on the storage backend; treat as best-effort. */ avatar_urls?: Record | null bio?: string | null phone?: string | null location?: string | null timezone?: string | null inserted_at?: string updated_at?: string } export interface ProfileUpdateInput { avatar_digital_object_id?: string | null bio?: string | null phone?: string | null location?: string | null timezone?: string | null } export async function getProfile(arcadia: ArcadiaClient): Promise { const res = await arcadia.GET<{ data: Profile } | Profile>("/api/v1/profile") return "data" in (res as object) ? (res as { data: Profile }).data : (res as Profile) } export async function updateProfile( arcadia: ArcadiaClient, input: ProfileUpdateInput, ): Promise { const res = await arcadia.PATCH<{ data: Profile } | Profile>("/api/v1/profile", { body: { profile: input }, }) return "data" in (res as object) ? (res as { data: Profile }).data : (res as Profile) } /** * Pick the most appropriate avatar URL from a profile. Prefers a small * variant (thumbnail / small / medium) if available; falls back to * `avatar_url`, then null. */ export function pickAvatarUrl(profile: Profile | null | undefined): string | null { if (!profile) return null const variants = profile.avatar_urls if (variants && typeof variants === "object") { return ( variants.thumbnail || variants.small || variants.medium || variants.original || profile.avatar_url || null ) } return profile.avatar_url ?? null }