Event.jsx 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { h, Fragment } from 'preact';
  2. import ActivityIndicator from './components/ActivityIndicator';
  3. import Box from './components/Box';
  4. import Heading from './components/Heading';
  5. import Link from './components/Link';
  6. import { FetchStatus, useApiHost, useEvent } from './api';
  7. import { Table, Thead, Tbody, Tfoot, Th, Tr, Td } from './components/Table';
  8. export default function Event({ eventId }) {
  9. const apiHost = useApiHost();
  10. const { data, status } = useEvent(eventId);
  11. if (status !== FetchStatus.LOADED) {
  12. return <ActivityIndicator />;
  13. }
  14. const startime = new Date(data.start_time * 1000);
  15. const endtime = new Date(data.end_time * 1000);
  16. return (
  17. <div className="space-y-4">
  18. <Heading>
  19. {data.camera} {data.label} <span className="text-sm">{startime.toLocaleString()}</span>
  20. </Heading>
  21. <Box>
  22. {data.has_clip ? (
  23. <Fragment>
  24. <Heading size="sm">Clip</Heading>
  25. <video className="w-100" src={`${apiHost}/clips/${data.camera}-${eventId}.mp4`} controls />
  26. </Fragment>
  27. ) : (
  28. <p>No clip available</p>
  29. )}
  30. </Box>
  31. <Box>
  32. <Heading size="sm">{data.has_snapshot ? 'Best image' : 'Thumbnail'}</Heading>
  33. <img
  34. src={
  35. data.has_snapshot
  36. ? `${apiHost}/clips/${data.camera}-${eventId}.jpg`
  37. : `data:image/jpeg;base64,${data.thumbnail}`
  38. }
  39. alt={`${data.label} at ${(data.top_score * 100).toFixed(1)}% confidence`}
  40. />
  41. </Box>
  42. <Box>
  43. <Table>
  44. <Thead>
  45. <Th>Key</Th>
  46. <Th>Value</Th>
  47. </Thead>
  48. <Tbody>
  49. <Tr>
  50. <Td>Camera</Td>
  51. <Td>
  52. <Link href={`/cameras/${data.camera}`}>{data.camera}</Link>
  53. </Td>
  54. </Tr>
  55. <Tr index={1}>
  56. <Td>Timeframe</Td>
  57. <Td>
  58. {startime.toLocaleString()} – {endtime.toLocaleString()}
  59. </Td>
  60. </Tr>
  61. <Tr>
  62. <Td>Score</Td>
  63. <Td>{(data.top_score * 100).toFixed(2)}%</Td>
  64. </Tr>
  65. <Tr index={1}>
  66. <Td>Zones</Td>
  67. <Td>{data.zones.join(', ')}</Td>
  68. </Tr>
  69. </Tbody>
  70. </Table>
  71. </Box>
  72. </div>
  73. );
  74. }