"use client"; 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): string { if (value === null) return "-%"; const numeric = Number(value); if (numeric === 0) return "-%"; return `${numeric.toLocaleString(undefined, { maximumFractionDigits: 2 })}%`; } function WeaponComparisonImage({ guide, group, metric, conditionLabel, }: { guide: PublicGuide; group: WeaponGroup; metric: DamageMetric; conditionLabel: string; }) { const values = group.rows.map((row) => Number(row[metric]) || 0); const maximum = Math.max(100, ...values); return (

Weapons {guide.character.name}

{metric === "overallPercent" ? "Overall Damage" : "Personal Damage"}

{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])} {row.note ? {row.note} : null}
); })}
{group.note ? (

{group.note}

) : null}
); } export function WeaponImageExport({ guide, group, conditionIndex, }: { guide: PublicGuide; group: WeaponGroup; conditionIndex: number; }) { const conditionLabel = group.name || `Condition ${conditionIndex + 1}`; const baseName = `${guide.name}-Weapon-${conditionLabel}`; const metricOptions = ([ ["overallPercent", "Overall Damage"], ["personalPercent", "Personal Damage"], ] as const).filter(([metric]) => group.rows.some((row) => row[metric] !== null), ); return ( }> ส่งออกภาพ เลือกประเภทดาเมจ เลือกค่าที่ต้องการใช้สร้างภาพเปรียบเทียบอาวุธ
{metricOptions.map(([metric, label]) => ( ))}
); }