"use client"; import { useTranslation } from "@/components/i18n/locale-provider"; import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from "recharts"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, type ChartConfig, } from "@/components/ui/chart"; import type { PublicGuide } from "@/lib/guides/queries"; const baseChartConfig = { overall: { label: "Overall · ดาเมจทั้งทีม", color: "var(--chart-1)" }, personal: { label: "Personal · ดาเมจส่วนตัว", color: "var(--chart-2)" }, } satisfies ChartConfig; function percentage(value: string | null) { if (!value?.trim()) return null; const number = Number(value); // Zero is displayed as an unavailable metric in the weapon cards. return Number.isFinite(number) && number !== 0 ? number : null; } export function WeaponChart({ rows }: { rows: PublicGuide["weaponGroups"][number]["rows"] }) { const { t } = useTranslation(); const chartConfig = { overall: { ...baseChartConfig.overall, label: t(baseChartConfig.overall.label) }, personal: { ...baseChartConfig.personal, label: t(baseChartConfig.personal.label) }, }; const data = rows.map((row, index) => ({ name: `${index + 1}. ${row.weapon.name} R${row.refinement}`, imageUrl: row.weapon.imageUrl, overall: percentage(row.overallPercent), personal: percentage(row.personalPercent), })); const hasOverall = data.some((row) => row.overall !== null); const hasPersonal = data.some((row) => row.personal !== null); const singleMetric = !hasOverall || !hasPersonal; if (!hasOverall && !hasPersonal) return null; return ( {t("เปรียบเทียบดาเมจอาวุธ")} {t("เปอร์เซ็นต์ดาเมจของอาวุธทั้งหมดใน Condition นี้")} `${value}%`} /> { const weapon = data.find((row) => row.name === payload.value); if (!weapon) return ; const size = Math.max(8, Math.min(40, Number(width) / data.length - 4 || 32)); return ( {weapon.name} ); }} /> (
{chartConfig[name as keyof typeof chartConfig]?.label ?? name} {value}%
)} /> } /> } /> {hasPersonal ? : null} {hasOverall ? : null}
); }