"use client"; import { useTranslation } from "@/components/i18n/locale-provider"; import Image from "next/image"; import { DownloadIcon } from "lucide-react"; import { GuideExportBranding } from "@/components/public/guide-export-branding"; import { GuideImageExport } from "@/components/public/guide-image-export"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import type { PublicGuide } from "@/lib/guides/queries"; type WeaponGroup = PublicGuide["weaponGroups"][number]; type DamageMetric = "overallPercent" | "personalPercent"; function formattedPercent(value: string | null, locale: string): string { if (value === null) return "-%"; const numeric = Number(value); if (numeric === 0) return "-%"; return `${numeric.toLocaleString(locale, { maximumFractionDigits: 2 })}%`; } function WeaponComparisonImage({ guide, group, metric, conditionIndex, }: { guide: PublicGuide; group: WeaponGroup; metric: DamageMetric; conditionIndex: number; }) { const { e, locale } = useTranslation(); const conditionLabel = group.name || e("condition", { index: conditionIndex + 1 }); const values = group.rows.map((row) => Number(row[metric]) || 0); const maximum = Math.max(100, ...values); return (

{e("weaponTitle", { name: guide.character.name })}

{e(metric === "overallPercent" ? "overallDamage" : "personalDamage")}

{conditionLabel}

{group.rows.map((row) => { const numeric = Number(row[metric]) || 0; const width = row[metric] === null ? 28 : numeric <= 100 ? Math.max(28, Math.max(0, numeric) * 0.5) : Math.min(90, 50 + ((numeric - 100) / Math.max(1, maximum - 100)) * 40); return (
{row.weapon.name} R{row.refinement}
{formattedPercent(row[metric], locale)} {row.note ? {row.note} : null}
); })}
{group.note ? (

{group.note}

) : null}
); } export function WeaponImageExport({ guide, group, conditionIndex, }: { guide: PublicGuide; group: WeaponGroup; conditionIndex: number; }) { const { e } = useTranslation(); const conditionLabel = group.name || e("condition", { index: conditionIndex + 1 }); const baseName = `${guide.name}-Weapon-${conditionLabel}`; const metricOptions = ([ ["overallPercent", e("overallDamage")], ["personalPercent", e("personalDamage")], ] as const).filter(([metric]) => group.rows.some((row) => row[metric] !== null), ); return ( }> {e("exportImage")} {e("damageTitle")} {e("damageDescription")}
{metricOptions.map(([metric, label]) => ( ))}
); }