fix : use original sort

This commit is contained in:
2026-09-05 19:12:38 +07:00 Unverified
parent 29e62dc98a
commit 2d651fbe56
3 changed files with 34 additions and 16 deletions
+28 -15
View File
@@ -2,10 +2,11 @@
import Image from "next/image"; import Image from "next/image";
import Link from "next/link"; import Link from "next/link";
import { ArrowUpRightIcon, SearchIcon } from "lucide-react"; import { ArrowUpRightIcon, SearchIcon, XIcon } from "lucide-react";
import { useMemo, useState, type ReactNode } from "react"; import { useMemo, useState, type ReactNode } from "react";
import { GuideImageExport } from "@/components/public/guide-image-export"; import { GuideImageExport } from "@/components/public/guide-image-export";
import { Button } from "@/components/ui/button";
import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Card, CardAction, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { Input } from "@/components/ui/input"; import { Input } from "@/components/ui/input";
import { Kbd } from "@/components/ui/kbd"; import { Kbd } from "@/components/ui/kbd";
@@ -18,6 +19,7 @@ import type { PublicGuide } from "@/lib/guides/queries";
import { import {
matchesTeamSearch, matchesTeamSearch,
sortTeamsByDps, sortTeamsByDps,
type DpsOrder,
type TeamSearchTarget, type TeamSearchTarget,
} from "@/lib/guides/team-search"; } from "@/lib/guides/team-search";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
@@ -361,7 +363,7 @@ function TeamCard({
export function TeamSearch({ teams }: { teams: PublicGuide["teams"] }) { export function TeamSearch({ teams }: { teams: PublicGuide["teams"] }) {
const [query, setQuery] = useState(""); const [query, setQuery] = useState("");
const [searchTarget, setSearchTarget] = useState<TeamSearchTarget>("all"); const [searchTarget, setSearchTarget] = useState<TeamSearchTarget>("all");
const [dpsOrder, setDpsOrder] = useState<"best" | "worst">("best"); const [dpsOrder, setDpsOrder] = useState<DpsOrder>(null);
const filteredTeams = useMemo( const filteredTeams = useMemo(
() => sortTeamsByDps(teams.filter((team) => matchesTeamSearch({ () => sortTeamsByDps(teams.filter((team) => matchesTeamSearch({
team: [team.title], team: [team.title],
@@ -401,19 +403,30 @@ export function TeamSearch({ teams }: { teams: PublicGuide["teams"] }) {
<ToggleGroupItem value="weapon">อาวุธ</ToggleGroupItem> <ToggleGroupItem value="weapon">อาวุธ</ToggleGroupItem>
<ToggleGroupItem value="artifact">อาร์ติแฟกต์</ToggleGroupItem> <ToggleGroupItem value="artifact">อาร์ติแฟกต์</ToggleGroupItem>
</ToggleGroup> </ToggleGroup>
<ToggleGroup <div className="flex items-center gap-2">
aria-label="เรียงทีมตาม DPS" <ToggleGroup
variant="outline" aria-label="เรียงทีมตาม DPS"
size="sm" variant="outline"
value={[dpsOrder]} size="sm"
onValueChange={(value) => { value={dpsOrder ? [dpsOrder] : []}
const order = value[0] as "best" | "worst" | undefined; onValueChange={(value) => {
if (order) setDpsOrder(order); const order = value[0] as Exclude<DpsOrder, null> | undefined;
}} if (order) setDpsOrder(order);
> }}
<ToggleGroupItem value="best">Best DPS</ToggleGroupItem> >
<ToggleGroupItem value="worst">Worst DPS</ToggleGroupItem> <ToggleGroupItem value="best">Best DPS</ToggleGroupItem>
</ToggleGroup> <ToggleGroupItem value="worst">Worst DPS</ToggleGroupItem>
</ToggleGroup>
<Button
variant="ghost"
size="sm"
disabled={!dpsOrder}
onClick={() => setDpsOrder(null)}
>
<XIcon data-icon="inline-start" />
Clear
</Button>
</div>
{filteredTeams.length ? ( {filteredTeams.length ? (
<div className="grid gap-5 xl:grid-cols-2"> <div className="grid gap-5 xl:grid-cols-2">
{filteredTeams.map((team) => ( {filteredTeams.map((team) => (
+1
View File
@@ -37,5 +37,6 @@ describe("team search", () => {
]; ];
expect(sortTeamsByDps(teams, "best").map((item) => item.name)).toEqual(["best", "middle", "tie"]); expect(sortTeamsByDps(teams, "best").map((item) => item.name)).toEqual(["best", "middle", "tie"]);
expect(sortTeamsByDps(teams, "worst").map((item) => item.name)).toEqual(["middle", "tie", "best"]); expect(sortTeamsByDps(teams, "worst").map((item) => item.name)).toEqual(["middle", "tie", "best"]);
expect(sortTeamsByDps(teams, null).map((item) => item.name)).toEqual(["middle", "best", "tie"]);
}); });
}); });
+5 -1
View File
@@ -17,6 +17,8 @@ export interface DpsTeam {
members: Array<{ damage: string | number }>; members: Array<{ damage: string | number }>;
} }
export type DpsOrder = "best" | "worst" | null;
export function teamDps(team: DpsTeam): number { export function teamDps(team: DpsTeam): number {
const seconds = Number(team.rotationSeconds); const seconds = Number(team.rotationSeconds);
if (!(seconds > 0)) return 0; if (!(seconds > 0)) return 0;
@@ -25,8 +27,10 @@ export function teamDps(team: DpsTeam): number {
export function sortTeamsByDps<Team extends DpsTeam>( export function sortTeamsByDps<Team extends DpsTeam>(
teams: readonly Team[], teams: readonly Team[],
order: "best" | "worst", order: DpsOrder,
): Team[] { ): Team[] {
if (!order) return [...teams];
return teams return teams
.map((team, index) => ({ team, index })) .map((team, index) => ({ team, index }))
.sort((left, right) => { .sort((left, right) => {