import { useEffect, useState } from 'react' import { inventory } from '@/api/client' import type { Location, StockMovement } from '@/types/api' import { PageHeader } from '@/components/PageHeader' import { Loading } from '@/components/Loading' import { ErrorBox } from '@/components/ErrorBox' import { DataTable, type Column } from '@/components/DataTable' interface Row extends Record { id: string occurredAt: string itemCode: string locationCode: string delta: string | number reason: string reference: string | null } export function MovementsPage() { const [rows, setRows] = useState([]) const [error, setError] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { Promise.all([inventory.listMovements(), inventory.listLocations()]) .then(([moves, locs]: [StockMovement[], Location[]]) => { const byId = new Map(locs.map((l) => [l.id, l.code])) const sorted = [...moves].sort((a, b) => (b.occurredAt ?? '').localeCompare(a.occurredAt ?? ''), ) setRows( sorted.map((m) => ({ id: m.id, occurredAt: m.occurredAt, itemCode: m.itemCode, locationCode: byId.get(m.locationId) ?? m.locationId, delta: m.delta, reason: m.reason, reference: m.reference, })), ) }) .catch((e: unknown) => setError(e instanceof Error ? e : new Error(String(e)))) .finally(() => setLoading(false)) }, []) const columns: Column[] = [ { header: 'Occurred', key: 'occurredAt', render: (r) => r.occurredAt ? new Date(r.occurredAt).toLocaleString() : '—', }, { header: 'Item', key: 'itemCode', render: (r) => {r.itemCode} }, { header: 'Location', key: 'locationCode', render: (r) => {r.locationCode} }, { header: 'Δ', key: 'delta', render: (r) => { const n = Number(r.delta) const cls = n >= 0 ? 'text-emerald-600' : 'text-rose-600' return {String(r.delta)} }, }, { header: 'Reason', key: 'reason' }, { header: 'Reference', key: 'reference', render: (r) => r.reference ?? '—' }, ] return (
{loading && } {error && } {!loading && !error && }
) }