import { useMemo, useState, type ReactNode } from 'react' import { Link, useParams } from 'react-router-dom' import { de } from '../strings/de' import { getGerbil } from '../api/gerbils' import { listColorVarieties, listContacts, listEnclosures, listLitters } from '../api/lookups' import { useApi } from '../hooks/useApi' import { formatDate, genderLabel, statusLabel } from '../format/labels' import { fromDisplayString, genotypeToFarbschlag, toDisplayString } from '../genetics' type DetailTab = 'photos' | 'health' | 'weight' /** Parse a stored genotype string and derive its normalized form + Farbschlag. */ function describeGenotype(genotype: string | null): { display: string; farbschlag: string } | null { if (!genotype || !genotype.trim()) return null try { const g = fromDisplayString(genotype) return { display: toDisplayString(g), farbschlag: genotypeToFarbschlag(g) } } catch { // Unparseable: show the raw value, no derived Farbschlag. return { display: genotype, farbschlag: de.genetics.unknownFarbschlag } } } function Row({ label, value }: { label: string; value: ReactNode }) { return (
{label}
{value ?? '—'}
) } export default function GerbilDetailPage() { const t = de.pages.gerbils const { id = '' } = useParams() const [tab, setTab] = useState('photos') const gerbil = useApi(() => getGerbil(id), [id]) const colorVarieties = useApi(() => listColorVarieties(), []) const enclosures = useApi(() => listEnclosures(), []) const contacts = useApi(() => listContacts(), []) const litters = useApi(() => listLitters(), []) const colorName = useMemo( () => new Map((colorVarieties.data ?? []).map((c) => [c.id, c.name])), [colorVarieties.data], ) const enclosureName = useMemo( () => new Map((enclosures.data ?? []).map((e) => [e.id, e.name])), [enclosures.data], ) const contactName = useMemo( () => new Map((contacts.data ?? []).map((c) => [c.id, c.name])), [contacts.data], ) const litterName = useMemo( () => new Map((litters.data ?? []).map((l) => [l.id, l.name])), [litters.data], ) if (gerbil.loading) return

{de.common.loading}

if (gerbil.error || !gerbil.data) { return (

{gerbil.error ?? t.detail.notFound}

{t.detail.back}
) } const g = gerbil.data const geno = describeGenotype(g.genotype) const lookup = (map: Map, key: string | null) => (key ? (map.get(key) ?? '—') : '—') const storedColorName = g.colorVarietyId ? (colorName.get(g.colorVarietyId) ?? null) : null return (

{g.name}

{statusLabel(g.status)}
{t.detail.edit} {t.detail.testMating} {t.detail.back}

{t.detail.masterData}

{g.status === 'Deceased' && ( <> )} {g.status === 'GivenAway' && ( )}

{t.detail.genetics}

{geno ? (
{geno.display}} /> {geno.farbschlag} {storedColorName && geno.farbschlag !== de.genetics.unknownFarbschlag && storedColorName !== geno.farbschlag && ( ⚠ {t.detail.farbschlagMismatch} )} } />
) : (

{t.detail.genotypeNotSet}

)}

Weitere Daten

{(['photos', 'health', 'weight'] as const).map((key) => ( ))}

{t.detail.tabPlaceholder}

) }