fix : use original sort
This commit is contained in:
@@ -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>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
<ToggleGroup
|
<ToggleGroup
|
||||||
aria-label="เรียงทีมตาม DPS"
|
aria-label="เรียงทีมตาม DPS"
|
||||||
variant="outline"
|
variant="outline"
|
||||||
size="sm"
|
size="sm"
|
||||||
value={[dpsOrder]}
|
value={dpsOrder ? [dpsOrder] : []}
|
||||||
onValueChange={(value) => {
|
onValueChange={(value) => {
|
||||||
const order = value[0] as "best" | "worst" | undefined;
|
const order = value[0] as Exclude<DpsOrder, null> | undefined;
|
||||||
if (order) setDpsOrder(order);
|
if (order) setDpsOrder(order);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<ToggleGroupItem value="best">Best DPS</ToggleGroupItem>
|
<ToggleGroupItem value="best">Best DPS</ToggleGroupItem>
|
||||||
<ToggleGroupItem value="worst">Worst DPS</ToggleGroupItem>
|
<ToggleGroupItem value="worst">Worst DPS</ToggleGroupItem>
|
||||||
</ToggleGroup>
|
</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) => (
|
||||||
|
|||||||
@@ -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"]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user