import { useTranslation } from "react-i18next"; import type { components } from "../api/schema"; import { useTerms, useAuthorities } from "../api/queries"; import { labelText } from "../lib/labels"; import { formatDate } from "../lib/format-date"; type FieldDefinitionView = components["schemas"]["FieldDefinitionView"]; /** Renders one flexible field value as human-readable text, resolving term/authority ids * to labels and localized_text to the active language. */ export function FlexibleFieldValue({ def, value, lang, }: { def: FieldDefinitionView; value: unknown; lang: string; }) { switch (def.data_type) { case "term": return ; case "authority": return ; case "localized_text": return <>{pickLocalized(value, lang)}; case "date": return <>{formatDate(value, lang)}; case "boolean": return ; default: return <>{value == null ? "—" : String(value)}; } } function TermValue({ vocabularyId, value, lang, }: { vocabularyId: string | null; value: unknown; lang: string; }) { const { t } = useTranslation(); const { data: terms, isLoading } = useTerms(vocabularyId ?? undefined); if (typeof value !== "string") return <>—; const term = terms?.find((x) => x.id === value); if (term) return <>{labelText(term.labels, lang)}; if (isLoading) return ; return ( {value} {t("objects.unknownRef")} ); } function AuthorityValue({ kind, value, lang, }: { kind: string | null; value: unknown; lang: string; }) { const { t } = useTranslation(); const { data: authorities, isLoading } = useAuthorities(kind ?? undefined); if (typeof value !== "string") return <>—; const authority = authorities?.find((x) => x.id === value); if (authority) return <>{labelText(authority.labels, lang)}; if (isLoading) return ; return ( {value} {t("objects.unknownRef")} ); } function BooleanValue({ value }: { value: unknown }) { const { t } = useTranslation(); return <>{value ? t("common.yes") : t("common.no")}; } function pickLocalized(value: unknown, lang: string): string { if (value && typeof value === "object" && !Array.isArray(value)) { const map = value as Record; return map[lang] ?? map.en ?? Object.values(map)[0] ?? "—"; } return value == null ? "—" : String(value); }