"use client"; import Image from "next/image"; import Link from "next/link"; import { ArrowUpRightIcon, SearchIcon } from "lucide-react"; import { useMemo, useState, type ReactNode } from "react"; import { GuideImageExport } from "@/components/public/guide-image-export"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Kbd } from "@/components/ui/kbd"; import { Separator } from "@/components/ui/separator"; import { elementBackgroundColor } from "@/lib/catalog/element"; import { rarityGradientClass } from "@/lib/catalog/rarity"; import { isCustomTravelerKey } from "@/lib/catalog/travelers"; import type { PublicGuide } from "@/lib/guides/queries"; import { cn } from "@/lib/utils"; type Team = PublicGuide["teams"][number]; function TeamExportImage({ team }: { team: Team }) { const total = team.members.reduce((sum, member) => sum + Number(member.damage), 0); const seconds = Number(team.rotationSeconds); return (

{team.title}

ระยะเวลาโรเทชั่น {seconds.toLocaleString(undefined, { maximumFractionDigits: 2 })} วิ

{team.members.map((member) => { const damage = Number(member.damage); const percent = total > 0 ? damage / total * 100 : 0; return (
C{member.constellation}
{member.weapon ?
R{member.refinement}
: null} {[member.artifact, member.secondArtifact].map((item, index) => item ?
: null)}
{member.character.name}{damage.toLocaleString()}
{percent.toFixed(1)}%
); })}
{team.combo}
DPS: {seconds > 0 ? (total / seconds).toLocaleString(undefined, { maximumFractionDigits: 0 }) : "0"}
By YT เกนชินไม่ใช่เกมมือถือ
); } function TeamCard({ team, action, exporting = false, }: { team: Team; action?: ReactNode; exporting?: boolean; }) { const total = team.members.reduce( (sum, member) => sum + Number(member.damage), 0, ); const seconds = Number(team.rotationSeconds); return ( {team.title} โรเทชั่น {seconds} วิ {action ? {action} : null}
{team.members.map((member) => (
{member.character.name} C{member.constellation}
{member.weapon ? ( {member.weapon.name} R{member.refinement} ) : (
)} {member.artifact ? ( {member.artifact.name} ) : (
)} {member.secondArtifact ? ( {member.secondArtifact.name} ) : null}

{member.character.name}

{Number(member.damage).toLocaleString(undefined, { maximumFractionDigits: 2, })}

{total ? ((Number(member.damage) / total) * 100).toFixed(2) : "0.00"} %

))}

ดาเมจรวม

{total.toLocaleString()}

DPS

{seconds > 0 ? (total / seconds).toLocaleString(undefined, { maximumFractionDigits: 0, }) : "0"}

{team.combo}

); } export function TeamSearch({ teams }: { teams: PublicGuide["teams"] }) { const [query, setQuery] = useState(""); const normalizedQuery = query.trim().toLocaleLowerCase(); const filteredTeams = useMemo( () => teams.filter((team) => { if (!normalizedQuery) return true; const searchableNames = [ team.title, ...team.members.flatMap((member) => [ member.character.name, member.weapon?.name, member.artifact?.name, member.secondArtifact?.name, ]), ].filter((name): name is string => Boolean(name)); return searchableNames.some((name) => name.toLocaleLowerCase().includes(normalizedQuery)); }), [normalizedQuery, teams], ); return (
{filteredTeams.length ? (
{filteredTeams.map((team) => ( } /> ))}
) : ( ไม่พบทีมที่ตรงกับคำค้นหา )}
); }