/** * FEAT-6: Gewicht-Tab — Schnell-Erfassung (Datum vorbelegt mit heute, * großes touch-freundliches Gramm-Feld), Wachstumskurve (eigenes SVG, * keine Chart-Bibliothek) + Verlaufsliste mit Löschen. */ import { useState, type FormEvent } from 'react' import { de } from '../strings/de' import { createWeightRecord, deleteWeightRecord, listWeightRecords, } from '../api/weightRecords' import { useApi, useMutation } from '../hooks/useApi' import { formatDate } from '../format/labels' import { todayISO } from '../format/dates' import LineChart from './LineChart' export default function GerbilWeightTab({ gerbilId }: { gerbilId: string }) { const t = de.pages.tierTabs.weight const records = useApi(() => listWeightRecords(gerbilId), [gerbilId]) const [date, setDate] = useState(todayISO()) const [grams, setGrams] = useState('') const [errors, setErrors] = useState<{ date?: string; grams?: string }>({}) const add = useMutation((weightGrams: number) => createWeightRecord({ gerbilId, date, weightGrams }), ) const removal = useMutation((recordId: string) => deleteWeightRecord(recordId)) async function onSubmit(e: FormEvent) { e.preventDefault() const value = Number(grams) const next: { date?: string; grams?: string } = {} if (!date) next.date = t.validation.dateRequired if (grams.trim() === '' || Number.isNaN(value)) next.grams = t.validation.weightRequired else if (value < 1 || value > 500 || !Number.isInteger(value)) next.grams = t.validation.weightRange setErrors(next) if (Object.keys(next).length > 0) return await add.run(value) setGrams('') setDate(todayISO()) records.reload() } async function onDelete(recordId: string) { if (!window.confirm(t.deleteConfirm)) return await removal.run(recordId) records.reload() } const items = records.data ?? [] return (
{/* Schnell-Erfassung: ein Daumen, eine Rennmaus in der anderen Hand. */}

{t.addTitle}

{errors.date && {errors.date}} {errors.grams && {errors.grams}} {add.error &&
{add.error}
}
{records.loading &&

{de.common.loading}

} {records.error && (
{records.error}
)} {removal.error &&
{removal.error}
} {!records.loading && !records.error && items.length === 0 && (

{t.empty}

)} {items.length > 0 && ( <>

{t.chartTitle}

{items.length >= 2 ? ( ({ date: r.date, value: r.weightGrams }))} /> ) : (

{t.chartNeedsTwo}

)}

{t.historyTitle}

)}
) }