import { useEffect, useRef, useState } from "react";
import {
CartesianGrid,
Legend,
Line,
LineChart,
Tooltip,
XAxis,
YAxis,
} from "recharts";
import type { BacklinksOverviewData } from "./backlinksPageTypes";
import {
formatFullDate,
formatMonthLabel,
formatTooltipValue,
} from "./backlinksPageUtils";
export function BacklinksTrendChart({
data,
}: {
data: BacklinksOverviewData["trends"];
}) {
const { containerRef, chartWidth } = useChartWidth();
if (data.length === 0) {
return ;
}
return (
{chartWidth > 0 ? (
) : null}
);
}
export function BacklinksNewLostChart({
data,
}: {
data: BacklinksOverviewData["newLostTrends"];
}) {
const { containerRef, chartWidth } = useChartWidth();
if (data.length === 0) {
return ;
}
return (
{chartWidth > 0 ? (
) : null}
);
}
function useChartWidth() {
const containerRef = useRef(null);
const [chartWidth, setChartWidth] = useState(0);
useEffect(() => {
const container = containerRef.current;
if (!container) {
return;
}
const updateWidth = () => {
setChartWidth(container.clientWidth);
};
updateWidth();
const observer = new ResizeObserver(updateWidth);
observer.observe(container);
return () => {
observer.disconnect();
};
}, []);
return { containerRef, chartWidth };
}
function EmptyChartState() {
return (
Not enough historical data yet.
);
}
function formatChartTick(value: unknown) {
return typeof value === "string" ? formatMonthLabel(value) : "";
}
function formatChartLabel(value: unknown) {
return typeof value === "string" ? formatFullDate(value) : "";
}