Prepare endpoint

This commit is contained in:
Timothy Armes
2023-09-15 10:43:51 +02:00
parent 2d7e9744e7
commit cf010855b7
6 changed files with 90 additions and 3 deletions
+54
View File
@@ -0,0 +1,54 @@
"use client";
import { useState } from "react";
import { zodResolver } from "@hookform/resolvers/zod";
import { useTranslations } from "next-intl";
import { FormProvider, useForm } from "react-hook-form";
import { z } from "zod";
import { TextField } from "@/components/form/TextField";
import { fetchTournamentResultsSchema } from "@/schemas";
import { trpc } from "@/utils/trpc";
type FetchResultsFormValues = z.infer<typeof fetchTournamentResultsSchema>;
export const FetchResultsForm = () => {
const t = useTranslations("Elo");
const fetchResults = trpc.fetchTournamentResults.useMutation();
const form = useForm<FetchResultsFormValues>({
resolver: zodResolver(fetchTournamentResultsSchema),
});
const onSubmit = async (input: FetchResultsFormValues) => {
try {
const result = await fetchResults.mutateAsync(input);
console.log(result);
} catch (err: unknown) {
console.log(err);
}
};
return (
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8">
<div className="flex items-end gap-4">
<TextField
name="url"
label={t("resultsUrlLabel")}
placeholder={t("resultsUrlLabel")}
required
/>
<button
disabled={form.formState.isSubmitting}
type="submit"
className="rounded-lg border border-transparent bg-primary-600 px-5 py-3 text-center text-sm font-medium text-white hover:bg-primary-800 focus:outline-none focus:ring-4 focus:ring-primary-300 disabled:opacity-25 dark:text-white dark:hover:bg-primary-700 dark:focus:ring-primary-800 sm:w-fit"
>
{t("fetchResultsButton")}
</button>
</div>
</form>
</FormProvider>
);
};
+6 -2
View File
@@ -1,8 +1,6 @@
"use client";
import { zodResolver } from "@hookform/resolvers/zod";
import { de } from "date-fns/locale";
import { isEmpty, isNil, isNumber } from "lodash";
import { useTranslations } from "next-intl";
import { FormProvider, useFieldArray, useForm } from "react-hook-form";
import { IoAdd, IoCloseOutline } from "react-icons/io5";
@@ -12,6 +10,8 @@ import { z } from "zod";
import { SelectField } from "@/components/form/SelectField";
import { TextField } from "@/components/form/TextField";
import { FetchResultsForm } from "./FetchResultsForm";
const getNewRating = (
rating: number,
opponentRating: number,
@@ -125,6 +125,10 @@ export default function Elo() {
{t("info")}
</p>
<div className="mb-10">
<FetchResultsForm />
</div>
<FormProvider {...form}>
<form onSubmit={form.handleSubmit(onSubmit)}>
<div className="grid w-full grid-cols-1 gap-2 sm:grid-cols-2">
+2
View File
@@ -1,8 +1,10 @@
import { addTournament } from "./procedures/addTournament";
import { fetchTournamentResults } from "./procedures/fetchTournamentResults";
import { router } from "./trpc";
export const appRouter = router({
addTournament,
fetchTournamentResults,
});
export type AppRouter = typeof appRouter;
@@ -0,0 +1,19 @@
import { fetchTournamentResultsSchema } from "@/schemas";
import { errorLog } from "@/utils/logger";
import { publicProcedure } from "../trpc";
export const fetchTournamentResults = publicProcedure
.input(fetchTournamentResultsSchema)
.mutation(async ({ input }) => {
try {
console.log(input.url);
// Fetch the tournament results using Python
return true;
} catch (error) {
errorLog(error);
throw error;
}
});
+5 -1
View File
@@ -133,6 +133,10 @@
"opponentEloPlaceholder": "Classement de l'adversaire",
"gameResultPlaceholder": "Résultat...",
"gameResult": "{result, select, win {Victoire} draw {Match nul} loss {Défaite} other {{result}}}",
"addGameButton": "Ajouter un autre résultat de partie"
"addGameButton": "Ajouter un autre résultat de partie",
"resultsUrlLabel": "Paste a link to the FFE results page",
"resultsUrlPlaceholder": "https://echecs.asso.fr/Resultats.aspx?URL=Tournois/Id/12345/12345&Action=Ga",
"fetchResultsButton": "Fetch"
}
}
+4
View File
@@ -20,3 +20,7 @@ export const addTournamentSchema = z.object({
country: z.string().min(1, { message: "FormValidation.required" }),
}),
});
export const fetchTournamentResultsSchema = z.object({
url: z.string().url({ message: "FormValidation.url" }),
});