mirror of
https://github.com/hanzo-apps/dataroom.git
synced 2026-10-30 14:47:36 +00:00
101 lines
3.0 KiB
TypeScript
101 lines
3.0 KiB
TypeScript
import {
|
|
Area,
|
|
AreaChart,
|
|
ResponsiveContainer,
|
|
Tooltip,
|
|
XAxis,
|
|
YAxis,
|
|
} from "recharts";
|
|
|
|
export default function VideoChartPlaceholder({
|
|
length,
|
|
}: {
|
|
length: number | null;
|
|
}) {
|
|
const videoLength = length || 51;
|
|
// Generate placeholder data with a nice curve
|
|
const data = Array.from({ length: videoLength }, (_, i) => ({
|
|
start_time: i,
|
|
unique_views:
|
|
i < videoLength / 3 ? 10 : i > videoLength - videoLength / 3 ? 3 : 6,
|
|
}));
|
|
|
|
const formatTime = (seconds: number) => {
|
|
const minutes = Math.floor(seconds / 60);
|
|
const remainingSeconds = Math.floor(seconds % 60);
|
|
return `${minutes}:${remainingSeconds.toString().padStart(2, "0")}`;
|
|
};
|
|
|
|
const CustomTooltip = ({ active, payload, label }: any) => {
|
|
if (active && payload && payload.length) {
|
|
return (
|
|
<div className="space-y-1 rounded-md border bg-background p-2 text-sm">
|
|
<p className="text-xs text-muted-foreground">Example Data</p>
|
|
<p className="font-medium">{formatTime(label)}</p>
|
|
<div className="space-y-0.5 text-muted-foreground">
|
|
<p className="flex items-center gap-2">
|
|
<span className="h-2 w-2 rounded-full bg-gray-400" />
|
|
{payload[0].value} unique viewers
|
|
</p>
|
|
<p className="flex items-center gap-2">
|
|
<span className="h-2 w-2 rounded-full bg-gray-600" />
|
|
{payload[0].value} playbacks
|
|
</p>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
return null;
|
|
};
|
|
|
|
return (
|
|
<div className="space-y-4">
|
|
<div className="-ml-9 h-[300px]">
|
|
<ResponsiveContainer width="100%" height="100%">
|
|
<AreaChart
|
|
data={data}
|
|
margin={{ top: 10, right: 10, left: 0, bottom: 0 }}
|
|
>
|
|
<XAxis
|
|
dataKey="start_time"
|
|
tickFormatter={formatTime}
|
|
stroke="#888888"
|
|
fontSize={12}
|
|
/>
|
|
<YAxis
|
|
stroke="#888888"
|
|
fontSize={12}
|
|
tickFormatter={(value) => Math.floor(value).toString()}
|
|
domain={[0, 1]}
|
|
padding={{ top: 20 }}
|
|
allowDecimals={false}
|
|
/>
|
|
<Tooltip content={<CustomTooltip />} />
|
|
<defs>
|
|
<linearGradient
|
|
id="uniqueViewsGradient"
|
|
x1="0"
|
|
y1="0"
|
|
x2="0"
|
|
y2="1"
|
|
>
|
|
<stop offset="5%" stopColor="#9CA3AF" stopOpacity={0.3} />
|
|
<stop offset="95%" stopColor="#9CA3AF" stopOpacity={0} />
|
|
</linearGradient>
|
|
</defs>
|
|
<Area
|
|
type="monotone"
|
|
dataKey="unique_views"
|
|
stroke="#9CA3AF"
|
|
strokeWidth={2}
|
|
fill="url(#uniqueViewsGradient)"
|
|
dot={false}
|
|
name="Unique Viewers"
|
|
/>
|
|
</AreaChart>
|
|
</ResponsiveContainer>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|