"use client"; import { useState } from "react"; import { zodResolver } from "@hookform/resolvers/zod"; import { isEmpty } from "lodash"; import { useTranslations } from "next-intl"; import Link from "next/link"; import { FormProvider, useForm } from "react-hook-form"; import { z } from "zod"; import { Spinner } from "@/components/Spinner"; import { SelectField } from "@/components/form/SelectField"; import { TextField } from "@/components/form/TextField"; import { fetchTournamentResultsSchema } from "@/schemas"; import { trpc } from "@/utils/trpc"; import { ManualEloForm } from "./ManualEloForm"; import { TournamentResults } from "./TournamentResults"; const formSchema = fetchTournamentResultsSchema.extend({ player: z.string().optional(), kFactor: z.enum(["40", "30", "20", "15", "10"]), }); type FetchResultsFormValues = z.infer; export default function Elo() { const t = useTranslations("Elo"); type TranslationKey = Parameters[0]; const [formInput, setFormInput] = useState({ url: "", kFactor: "20", }); const hasUrl = !isEmpty(formInput?.url.trim()); const { data: allResults, isFetching, error, } = trpc.fetchTournamentResults.useQuery( { url: formInput?.url.trim(), }, { refetchOnWindowFocus: false, staleTime: Infinity, cacheTime: 10 * 60 * 1000, enabled: hasUrl, retry: false, }, ); const playerOptions = (allResults ?? []).map((player) => ({ value: player.id, label: player.name, })); const form = useForm({ resolver: zodResolver(fetchTournamentResultsSchema), defaultValues: { kFactor: "20", }, }); const [player, kFactor] = form.watch(["player", "kFactor"]); const playerResults = allResults?.find((p) => p.id === player); const onSubmit = async (input: FetchResultsFormValues) => { setFormInput(input); }; const clearForm = () => { form.setValue("url", ""); setFormInput({ ...formInput, url: "" }); }; if (error) { console.error(error); } return (

{t("title")}

{t("info")}

{hasUrl && !isFetching && !error && (
)}
{isFetching && (
)} {error && (
{error.message.startsWith("ERR_") ? t(error.message as TranslationKey) : t.rich("unknownError", { contact: (chunks) => ( {chunks} ), })}
)} {!isFetching && playerOptions.length > 0 && (
({ value: k, label: k, }))} isClearable={false} required />
)}
{hasUrl && !isFetching && player && playerResults && !error && ( )} {((!hasUrl && !isFetching) || !!error) && ( <>
{t("useManualLabel")}
)}
); }