feat(frontend): add basic frontend

This commit is contained in:
2025-12-26 20:14:30 +03:00
parent 262c42c1b3
commit 707a474ef3
38 changed files with 5230 additions and 0 deletions

View File

@@ -0,0 +1,71 @@
import {
Line,
LineChart,
ResponsiveContainer,
Tooltip,
XAxis,
YAxis,
} from "recharts";
import {
Card,
CardContent,
CardHeader,
CardTitle,
} from "../../../shared/ui/card";
import type { AudioSample } from "../../../entities/audioSample/model/types";
import { formatTimeHHMMSS } from "../../../shared/lib/time";
type Props = {
history: AudioSample[];
};
type ChartPoint = {
timeMs: number;
freq_hz: number;
};
export function FrequencyHistoryChart({ history }: Props) {
const data: ChartPoint[] = history.map((s) => ({
timeMs: s.timeMs,
freq_hz: s.freq_hz,
}));
return (
<Card>
<CardHeader className="pb-2">
<CardTitle className="text-base">Frequency (last 60s)</CardTitle>
</CardHeader>
<CardContent>
<div className="h-56 w-full">
<ResponsiveContainer width="100%" height="100%">
<LineChart
data={data}
margin={{ top: 10, right: 12, left: 0, bottom: 0 }}
>
<XAxis
dataKey="timeMs"
type="number"
domain={["dataMin", "dataMax"]}
tickFormatter={(v) => formatTimeHHMMSS(Number(v))}
tick={{ fontSize: 12 }}
/>
<YAxis domain={[20, 8000]} tick={{ fontSize: 12 }} width={44} />
<Tooltip
labelFormatter={(v) => formatTimeHHMMSS(Number(v))}
formatter={(v) => [`${Number(v).toFixed(0)} Hz`, "freq"]}
/>
<Line
type="monotone"
dataKey="freq_hz"
stroke="hsl(var(--primary))"
strokeWidth={2}
dot={false}
isAnimationActive={false}
/>
</LineChart>
</ResponsiveContainer>
</div>
</CardContent>
</Card>
);
}