Commit 0607c5c1 authored by Omar Luna Hernández's avatar Omar Luna Hernández
Browse files

Se agregan las validaciones necesarias para los campos agregados...

Se agregan las validaciones necesarias para los campos agregados recientemente, además se agrega un método para actualizar el tiempo de apertura y cierre
parent 0c340cf3
Loading
Loading
Loading
Loading
+95 −18
Original line number Diff line number Diff line
import { FieldErrors, Resolver, SubmitHandler, useForm } from "react-hook-form"
import { PlaceFormValues } from "../infraestructure/entities/place";
import { PlaceFormValues, AvailableDays } from "../infraestructure/entities/place";
import { toast } from "react-toastify";
import { useEffect, useState } from "react";
import axios, { AxiosError } from "axios";
import { languaguesList } from "../constants/languages";
import { useGetStatesList } from "./useGetStatesList";
import { useTown } from "./useTown";
import { MIN_NUMBER_PLACE_IMAGES } from "../constants/images_nuber";

const resolver: Resolver<PlaceFormValues> = async (data) => {
  const errors: FieldErrors<PlaceFormValues> = {};
@@ -17,14 +18,42 @@ const resolver: Resolver<PlaceFormValues> = async (data) => {
    }
  }

  for(var index = languaguesList.length-1; index>=0; index--){
    if(!data.names || !data.names[index]){
      errors.names = {
  if(!data.openAt){
    errors.openAt = {
      type: "required",
      message: "La hora de apertura es requerida"
    };
  }

  if(!data.closeAt){
    errors.closeAt = {
      type: "required",
        message: "El nombre del lugar en "+languaguesList[index]+" es requerido"
      message: "La hora de cierre es requerida"
    };
  }

  if(data.openAt>data.closeAt){
    errors.closeAt = {
      type: "required",
      message: "La hora de apertura debe ser antes que la hora de cierre"
    };
  }

  if(data.openAt===data.closeAt){
    errors.closeAt = {
      type: "required",
      message: "Debe de haber al menos una hora de diferencia"
    };
  }

  if(!data.name){
    errors.name = {
      type: "required",
      message: "El nombre del lugar es requerido"
    };
  }

  for(var index = languaguesList.length-1; index>=0; index--){
    if(!data.descriptions || !data.descriptions[index]){
      errors.descriptions = {
        type: "required",
@@ -33,6 +62,40 @@ const resolver: Resolver<PlaceFormValues> = async (data) => {
    }
  }

  if(!data.available){
    errors.available = {
      type: "required",
      message: "Se requieren los días que está disponible el lugar"
    };
  }else{
    if(data.available === AvailableDays.CUSTOM){
      if(!data.startDate){
        errors.startDate = {
          type: "required",
          message: "Se requiere la fecha de inicio"
        };
      }
      
      if(!data.endDate){
        errors.endDate = {
          type: "required",
          message: "Se requiere la fecha de cierre"
        };
      }

      if(data.startDate && data.endDate){
        const startDate = new Date(data.startDate);
        const endDate = new Date(data.endDate);
        if(startDate.getTime() > endDate.getTime()){
          errors.endDate = {
            type: "required",
            message: "La fecha de inicio no puede ser después de la fecha de cierre"
          };
        }
      }
    }
  }

  if(!data.latitude || !data.longitude){
    errors.latitude = {
      type: "required",
@@ -40,10 +103,10 @@ const resolver: Resolver<PlaceFormValues> = async (data) => {
    }
  }

  if(!data.imagesList || data.imagesList.length<3){
  if(!data.imagesList || data.imagesList.length<MIN_NUMBER_PLACE_IMAGES){
    errors.imagesList = {
      type: "required",
      message: "Debe de haber al menos 3 imagénes representativas del lugar"
      message: "Debe de haber al menos "+MIN_NUMBER_PLACE_IMAGES+" imagénes representativas del lugar"
    }
  }

@@ -60,12 +123,12 @@ export const usePlaceRegister = () => {
    setValue,
    formState: {errors},
    clearErrors,
    resetField,
  } = useForm<PlaceFormValues>({resolver});
  const [errorMessage, setErrorMessage] = useState("");
  const [languageNameIndexSelected, setLanguageNameIndexSelected] = useState(0);
  const [languageDescriptionIndexSelected, setLanguageDescriptionIndexSelected] = useState(0);
  const [names, setNames] = useState<string[]>(new Array(languaguesList.length).fill(""));
  const [descriptions, setDescriptions] = useState<string[]>(new Array(languaguesList.length).fill(""));
  const [availableDays, setAvailableDays] = useState<AvailableDays>(AvailableDays.WEEKEND);
  const [isLoading, setIsLoading] = useState(false);
  const {townsList, getTownsByState} = useTown();
  const {getStates, statesList} = useGetStatesList();
@@ -101,6 +164,7 @@ export const usePlaceRegister = () => {
      }
    }
    getStatesList();
    setValue('available',availableDays,{shouldValidate: true});
    setIsLoading(false);
  },[]);

@@ -136,24 +200,37 @@ export const usePlaceRegister = () => {
    )
  }

  const updateTimeForm = (time: string, isOpeningHour: boolean) => {
    const timeSplitted = time.split(":");
    let hours = Number(timeSplitted[0]);
    const minutes = Number(timeSplitted[1]);
    hours += (minutes/60);
    hours = Math.round(hours);
    if(isOpeningHour){
      setValue("openAt", hours, {shouldValidate: true});
    }else{
      setValue("closeAt", hours, {shouldValidate: true});
    }
  }

  return {
    register, 
    handleSubmit, 
    errors, 
    onSubmit, 
    setValue,
    languageNameIndexSelected, 
    setLanguageNameIndexSelected,
    languageDescriptionIndexSelected,
    setLanguageDescriptionIndexSelected,
    names,
    setNames,
    descriptions,
    setDescriptions,
    clearErrors,
    isLoading,
    statesList,
    townsList,
    updateTownsList
    updateTownsList,
    updateTimeForm,
    availableDays,
    setAvailableDays,
    resetField
  };
}