13 lines
1.4 KiB
TypeScript
13 lines
1.4 KiB
TypeScript
import { Alert, Badge, Center, Loader, Stack, Table, Text } from '@mantine/core'
|
|
import { useChannelReadings, type MeterSourceChannelResponse } from './hooks'
|
|
import { formatLocalDateTime } from '../utils/datetime'
|
|
|
|
export function SourceReadings({ sourceUuid, channel }: { sourceUuid: string; channel: MeterSourceChannelResponse }) {
|
|
const query = useChannelReadings(sourceUuid, channel.uuid)
|
|
return <Stack gap="xs"><Text fw={500}>{channel.label} — latest {channel.latest_value ?? '—'} {channel.unit}</Text>
|
|
<Text size="sm">Quality: {channel.latest_quality ?? 'unknown'}</Text>
|
|
{channel.latest_quality === 'unverifiable' && <Alert color="yellow">This reading is unverifiable: it is shown for review, not marked verified.</Alert>}
|
|
{query.isLoading ? <Center><Loader /></Center> : query.isError || !query.data ? <Alert color="red">Failed to load channel history.</Alert> : query.data.items.length === 0 ? <Text c="dimmed">No channel history yet.</Text> : <Table><Table.Thead><Table.Tr><Table.Th>Recorded</Table.Th><Table.Th>Value</Table.Th><Table.Th>Quality</Table.Th></Table.Tr></Table.Thead><Table.Tbody>{query.data.items.map((row) => <Table.Tr key={row.recorded_at}><Table.Td>{formatLocalDateTime(row.recorded_at)}</Table.Td><Table.Td>{row.value ?? '—'}</Table.Td><Table.Td><Badge color={row.quality === 'unverifiable' ? 'yellow' : 'gray'}>{row.quality ?? 'unknown'}</Badge></Table.Td></Table.Tr>)}</Table.Tbody></Table>}
|
|
</Stack>
|
|
}
|