import { useSession } from "next-auth/react"; import { useRouter } from "next/router"; import type { Session } from "@/models/auth/Session"; import Carousel from "@/components/Carousel"; import { Gender } from "@prisma/client"; import { Box, Button, Center, Container, Divider, Flex, FormLabel, Text, useToast, VStack, } from "@chakra-ui/react"; import { formateDate } from "@/lib/formateDate"; import ModalModifyImages from "@/components/layout/profile/ModalModifyImages"; import ModalChoosePassion from "@/components/layout/profile/ModalChoosePassion"; import ProfileTagList from "@/components/layout/profile/ProfileTagList"; import LoadingPage from "@/components/LoadingPage"; import CustomEditable from "@/components/layout/profile/CustomEditable"; import CustomFalseEditable from "@/components/layout/profile/CustomFalseEditable"; import CustomEditableArea from "@/components/layout/profile/CustomEditableArea"; import CustomRadioGender from "@/components/layout/profile/CustomRadioGender"; import CustomRangeSlider from "@/components/layout/profile/CustomRangeSlider"; import CustomSlider from "@/components/layout/profile/CustomSlider"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useQuery } from "@tanstack/react-query"; export default function UserProfile() { const router = useRouter(); const toast = useToast({ position: "top", isClosable: true }); const [currentlyLoading, setCurrentlyLoading] = useState(false); const [passions, setPassions] = useState([] as any[]); const [address, setAddress] = useState({} as any); const [showTooltipAge, setShowTooltipAge] = useState(false); const [sliderAgeValue, setSliderAgeValue] = useState([[] as number[]]); const [showTooltipDistance, setShowTooltipDistance] = useState(false); const [sliderDistanceValue, setSliderDistanceValue] = useState(0); const { handleSubmit, control, formState: { errors }, } = useForm({ mode: "onBlur" }); useEffect(() => { fetch(`/api/passions`) .then((res) => res.json()) .then((data) => { setPassions([...data]); }) .catch((err) => { console.log(err); }); }, []); const { data: session, status } = useSession(); const { isLoading, isError, data: userData, error, } = useQuery({ queryKey: ["user"], enabled: status === "authenticated", queryFn: async () => { const { user } = session as unknown as Session; setSliderAgeValue([user.ageMin, user.ageMax]); setSliderDistanceValue(user.distance); return fetch(`/api/users/${user.id}`) .then((res) => res.json()) .catch((err) => { return err; }); }, }); const { data: addressData, isSuccess: addressIsSuccess } = useQuery({ queryKey: ["address"], enabled: Boolean(userData?.location), queryFn: async () => { const [lat, long] = userData.location.split(","); return fetch( `https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat=${lat}&lon=${long}` ) .then((res) => res.json()) .catch((err) => { return err; }); }, }); if (isLoading) { if (status === "unauthenticated") router.push("/login"); return ; } if (isError) { toast({ title: `Erreur lors de la récupération des données du profil`, status: "error", position: "top", }); if (status === "unauthenticated") router.push("/"); } const saveData = (values: any) => { let trueValues = {}; for (const [key, value] of Object.entries(values)) { if (value !== "" && value !== undefined) { if (key === "age") { trueValues["ageMin"] = value[0]; trueValues["ageMax"] = value[1]; } else { trueValues[key] = value; } } } const options = { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify(trueValues), }; if (Object.keys(trueValues).length > 0) { setCurrentlyLoading(true); fetch(`/api/users/${userData.id}`, options) .then((res) => { setCurrentlyLoading(false); toast({ position: "top", title: `Modifications effectuées`, status: "success", isClosable: true, }); }) .catch((err) => { setCurrentlyLoading(false); toast({ title: `Erreur lors de l'envoi des modifications`, position: "top", status: "error", isClosable: true, }); console.log(err); }); } }; return ( Modifiez les champs en les selectionnants Centre d'intéret :
Préférences
); }