diff --git a/client/src/api/sport.ts b/client/src/api/sport.ts new file mode 100644 index 0000000000000000000000000000000000000000..59013652fff7f9e81c151712e174273e8372ffe5 --- /dev/null +++ b/client/src/api/sport.ts @@ -0,0 +1,23 @@ +export async function getSportsFromApi() { + try { + const response = await fetch("/api/sport", { + method: "GET", + }); + const sports = await response.json(); + return sports.result; + } catch (error) { + console.log(error); + } +} + +export async function addSport() { + try { + const response = await fetch("/api/sport", { + method: "POST", + }); + const sports = await response.json(); + return sports; + } catch (error) { + console.log(error); + } +} diff --git a/client/src/components/UserLayout.tsx b/client/src/components/UserLayout.tsx index 6c2a8d3312ff4941c21b3390ee566baf0d7a37c9..bc5af86b150b65793595351e7e3a3f2eb5c28f5f 100644 --- a/client/src/components/UserLayout.tsx +++ b/client/src/components/UserLayout.tsx @@ -1,32 +1,32 @@ -import {useTranslation} from "react-i18next"; -import {Outlet} from "react-router"; -import {useLocation} from "react-router-dom"; +import { useTranslation } from "react-i18next"; +import { Outlet } from "react-router"; +import { useLocation } from "react-router-dom"; import bg from "../assets/bg_mobile.png"; -import {Helmet} from "react-helmet-async"; +import { Helmet } from "react-helmet-async"; function UserLayout() { - const {t} = useTranslation(); - const {pathname} = useLocation(); + const { t } = useTranslation(); + const { pathname } = useLocation(); - return ( - <div> - <Helmet> - <title>{t(`routes.${pathname}`)}</title> - </Helmet> - <div - style={{ - position: "fixed", - height: "100vh", - width: "100vw", - backgroundImage: `url(${bg})`, - backgroundSize: "cover", - backgroundPosition: "center center", - zIndex: -1, - }} - /> - <Outlet/> - </div> - ); + return ( + <div> + <Helmet> + <title>{t(`routes.${pathname}`)}</title> + </Helmet> + <div + style={{ + position: "fixed", + height: "100vh", + width: "100vw", + backgroundImage: `url(${bg})`, + backgroundSize: "cover", + backgroundPosition: "center center", + zIndex: -1, + }} + /> + <Outlet /> + </div> + ); } export default UserLayout; diff --git a/client/src/components/forms/EditSports.tsx b/client/src/components/forms/EditSports.tsx index 7feb406b7ed376c51651d14e11fefc1418057bbe..e41ecc23bcfd5c191cb7bb7ac6edf84112acbb97 100644 --- a/client/src/components/forms/EditSports.tsx +++ b/client/src/components/forms/EditSports.tsx @@ -9,13 +9,12 @@ type FormData = { }; function EditSports(props: any) { - const { control, handleSubmit, formState: { errors }, } = useForm<FormData>({ - mode: "onBlur" + mode: "onBlur", }); const { t } = useTranslation(); @@ -35,14 +34,14 @@ function EditSports(props: any) { return ( <Form onSubmit={handleSubmit(onSubmit)}> - {props.id && + {props.id && ( <Controller name="id" control={control} - defaultValue= {props.id} + defaultValue={props.id} render={({ field }) => ( <div className="mb-2"> - <Form.Label >{t("sports.Id")}</Form.Label> + <Form.Label>{t("sports.Id")}</Form.Label> <Form.Control disabled type="text" {...field} /> </div> )} @@ -52,10 +51,10 @@ function EditSports(props: any) { message: t("boatTypeOverview.messages.required", { val: t("boatTypeOverview.Id"), }), - } + }, }} /> - } + )} <Controller name="name" control={control} @@ -63,7 +62,7 @@ function EditSports(props: any) { render={({ field }) => ( <div className="mb-2"> <Form.Label>{t("sports.Name")}</Form.Label> - <Form.Control type="text" {...field} isInvalid={!!errors.name}/> + <Form.Control type="text" {...field} isInvalid={!!errors.name} /> <Form.Control.Feedback type="invalid"> {errors.name?.message} </Form.Control.Feedback> @@ -77,8 +76,8 @@ function EditSports(props: any) { }), }, validate: (value: string) => - validator.isAlphanumeric(value) || - t("Sports.messages.required").toString(), + validator.isAlphanumeric(value) || + t("Sports.messages.required").toString(), }} /> </Form> diff --git a/client/src/pages/staff/Sports.tsx b/client/src/pages/staff/Sports.tsx index 478ea140c6f7db9d61d770e964f40ecf182b9e30..088dbfe0e19e915b480ed7fdd5ac389040eb36ec 100644 --- a/client/src/pages/staff/Sports.tsx +++ b/client/src/pages/staff/Sports.tsx @@ -6,26 +6,26 @@ import { faPlus } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import StaffModal from "../../components/StaffModal"; import EditSports from "../../components/forms/EditSports"; +import { getSportsFromApi } from "../../api/sport"; function Sports() { const { t } = useTranslation(); - const [editElement, setEditElement] = useState< - { id: number; name: string } | undefined - >(undefined); + const [editElement, setEditElement] = useState<Sport | undefined>(undefined); const [deleteElement, setDeleteElement] = useState<any>(undefined); const [addElement, setAddElement] = useState<any>(false); - const [sports, setSports] = useState<{ id: number; name: string }[]>([]); + const [sports, setSports] = useState<Sport[]>([]); + + async function getSports() { + const sports = await getSportsFromApi(); + setSports(sports); + } + + function onSubmitAddSport() { + setAddElement(undefined); + } useEffect(() => { - fetch("/api/sport") - .then((response) => response.json()) - .then((data) => { - console.log(data); - setSports(data); - }) - .catch((e) => { - console.log(e); - }); + getSports(); }); return ( diff --git a/client/src/react-app-env.d.ts b/client/src/react-app-env.d.ts index 6431bc5fc6b2c932dfe5d0418fc667b86c18b9fc..2c432be84db1231ff0d034f88c27f4845327bd56 100644 --- a/client/src/react-app-env.d.ts +++ b/client/src/react-app-env.d.ts @@ -1 +1,6 @@ /// <reference types="react-scripts" /> + +declare interface Sport { + id: number; + name: string; +} diff --git a/client/src/types.ts b/client/src/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef2a01cf597ae66d13b33ba5948702d92a5d7f91 --- /dev/null +++ b/client/src/types.ts @@ -0,0 +1,4 @@ +export interface Sport { + id: number; + name: string; +}