blakeblackshear.frigate/web/src/Debug.jsx

112 lines
3.1 KiB
React
Raw Normal View History

2021-01-09 18:26:46 +01:00
import { h } from 'preact';
import Box from './components/Box';
import Button from './components/Button';
import Heading from './components/Heading';
import Link from './components/Link';
2021-01-26 16:04:03 +01:00
import { useConfig, useStats } from './api';
import { Table, Tbody, Thead, Tr, Th, Td } from './components/Table';
2021-01-26 16:04:03 +01:00
import { useCallback, useEffect, useState } from 'preact/hooks';
2021-01-09 18:26:46 +01:00
export default function Debug() {
2021-01-26 16:04:03 +01:00
const config = useConfig();
const [timeoutId, setTimeoutId] = useState(null);
2021-01-09 18:26:46 +01:00
2021-01-26 16:04:03 +01:00
const forceUpdate = useCallback(async () => {
setTimeoutId(setTimeout(forceUpdate, 1000));
}, []);
useEffect(() => {
2021-01-26 16:04:03 +01:00
forceUpdate();
2021-01-09 18:26:46 +01:00
}, []);
useEffect(() => {
return () => {
clearTimeout(timeoutId);
};
}, [timeoutId]);
2021-01-26 16:04:03 +01:00
const { data: stats, status } = useStats(null, timeoutId);
2021-01-26 16:04:03 +01:00
if (!stats) {
return 'loading…';
}
2021-01-26 16:04:03 +01:00
const { detectors, detection_fps, service, ...cameras } = stats;
const detectorNames = Object.keys(detectors);
const detectorDataKeys = Object.keys(detectors[detectorNames[0]]);
const cameraNames = Object.keys(cameras);
const cameraDataKeys = Object.keys(cameras[cameraNames[0]]);
const handleCopyConfig = useCallback(async () => {
await window.navigator.clipboard.writeText(JSON.stringify(config, null, 2));
}, [config]);
return (
<div class="space-y-4">
<Heading>
Debug <span className="text-sm">{service.version}</span>
</Heading>
<Box>
<Table className="w-full">
<Thead>
<Tr>
<Th>detector</Th>
{detectorDataKeys.map((name) => (
<Th>{name.replace('_', ' ')}</Th>
))}
</Tr>
</Thead>
<Tbody>
{detectorNames.map((detector, i) => (
<Tr index={i}>
<Td>{detector}</Td>
{detectorDataKeys.map((name) => (
<Td key={`${name}-${detector}`}>{detectors[detector][name]}</Td>
))}
</Tr>
))}
</Tbody>
</Table>
</Box>
<Box>
<Table className="w-full">
<Thead>
<Tr>
<Th>camera</Th>
{cameraDataKeys.map((name) => (
<Th>{name.replace('_', ' ')}</Th>
))}
</Tr>
</Thead>
<Tbody>
{cameraNames.map((camera, i) => (
<Tr index={i}>
<Td>
<Link href={`/cameras/${camera}`}>{camera}</Link>
</Td>
{cameraDataKeys.map((name) => (
<Td key={`${name}-${camera}`}>{cameras[camera][name]}</Td>
))}
</Tr>
))}
</Tbody>
</Table>
</Box>
<Box className="relative">
<Heading size="sm">Config</Heading>
<Button className="absolute top-4 right-8" onClick={handleCopyConfig}>
Copy to Clipboard
</Button>
<pre className="overflow-auto font-mono text-gray-900 dark:text-gray-100 rounded bg-gray-100 dark:bg-gray-800 p-2 max-h-96">
{JSON.stringify(config, null, 2)}
</pre>
</Box>
</div>
);
2021-01-09 18:26:46 +01:00
}