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);
}