"use client"; import Image from "next/image"; import { DownloadIcon, SearchIcon } from "lucide-react"; import { useMemo, useState } from "react"; import { buttonVariants } from "@/components/ui/button"; 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"; 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, ]), ].filter((name): name is string => Boolean(name)); return searchableNames.some((name) => name.toLocaleLowerCase().includes(normalizedQuery)); }), [normalizedQuery, teams], ); return (
{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}