"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.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()}
);
})}
{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) => (
C{member.constellation}
{member.weapon ? (
R{member.refinement}
) : (
)}
{member.artifact ? (
) : (
)}
{member.secondArtifact ? (
) : 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) => (
}
/>
))}
) : (
ไม่พบทีมที่ตรงกับคำค้นหา
)}
);
}