diff --git a/src/Assets/css/styles.css b/src/Assets/css/styles.css index 44fa0fc..2ee0ab8 100644 --- a/src/Assets/css/styles.css +++ b/src/Assets/css/styles.css @@ -5,7 +5,7 @@ padding: 0; outline: 0; box-sizing: border-box; - font-family: 'Quicksand', 'Poppins', sans-serif; + font-family: "Poppins Regular"; } html, @@ -21,6 +21,11 @@ scroll-behavior: smooth; } + + h1 { + font-family: "Poppins Regular"; + text-transform: uppercase; + } @font-face { font-family: "Poppins Regular"; diff --git a/src/Components/InputsAddress/index.tsx b/src/Components/InputsAddress/index.tsx new file mode 100644 index 0000000..e51d679 --- /dev/null +++ b/src/Components/InputsAddress/index.tsx @@ -0,0 +1,172 @@ +import axios from "axios"; +import { useEffect, useState } from "react"; +import { useFetchRequestState } from "../../Services/Address/query"; +import { StateList } from "../../Services/Address/type"; +import { Padding } from "../../Styles/styles"; +import DropdownComponent from "../Dropdown"; +import MaskInput from "../InputMask"; +import TextInput from "../TextInput"; + + +const InputAddressState = () => { + + const [state, setState] = useState(); + const [stateId, setStateId] = useState() + + + const { data: stateRequest } = useFetchRequestState() + + + useEffect(() => { + if (stateRequest) { + setState(stateRequest) + } + }, [stateRequest]) + + + const dadosCep = async (value: string, setFieldValue: any) => { + if (value) { + + const cep = value.replace(/[^a-zA-Z0-9 ]/g, ''); + + await axios.get("https://viacep.com.br/ws/" + cep + "/json/").then((data) => { + const stateCep = state?.find(props => props.acronym === data.data.uf) + const cityCep = stateCep?.city.find(props => props.name === data.data.localidade.toUpperCase()) + + setFieldValue("address", data.data.logradouro); + setFieldValue("neighborhood", data.data.bairro); + setFieldValue("complement", data.data.complemento); + setFieldValue("state", stateCep?.id) + setFieldValue("city", cityCep?.id) + }).catch( + (error) => { + return error + } + ) + } + } + + return { dadosCep, state, setStateId, stateId } +} + +const InputAddress = ({ errors, handleChange, touched, values, setFieldValue }: { values: any, handleChange: any, errors: any, touched: any, setFieldValue: any }) => { + + const props = InputAddressState(); + + useEffect(() => { + if (values.state) { + props.setStateId(values.state) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [values.state]) + + return ( +
+
+ + + { + setFieldValue("cep", e.target.value) + props.dadosCep(e.target.value!, setFieldValue) + }} + name="cep" + /> + {errors.cep && touched.cep ? ( +
+ {errors.cep} +
+ ) : null} +
+
+ + + + {errors.address && touched.address ? ( +
+ {errors.address} +
+ ) : null} +
+
+ + + + {errors.neighborhood && touched.neighborhood ? ( +
+ {errors.neighborhood} +
+ ) : null} +
+
+ + + + {errors.neighborhood && touched.neighborhood ? ( +
+ {errors.neighborhood} +
+ ) : null} +
+ {props.state && <> +
+ + + { + setFieldValue("state", e.target.value) + props.setStateId(e.target.value.id) + }} + options={props.state} + /> + {errors.state ? ( +
+ {errors.state} +
+ ) : null} +
+ {props.stateId &&
+ + + item.id === props.stateId)?.city} + /> + {errors.city ? ( +
+ {errors.city} +
+ ) : null} +
} + } +
+ ) +} + +export default InputAddress \ No newline at end of file diff --git a/src/Context/Beneficiaries/BeneficiaresCreate/state.tsx b/src/Context/Beneficiaries/BeneficiaresCreate/state.tsx index 818f735..32afbf9 100644 --- a/src/Context/Beneficiaries/BeneficiaresCreate/state.tsx +++ b/src/Context/Beneficiaries/BeneficiaresCreate/state.tsx @@ -47,9 +47,16 @@ export const BeneficiariesCreateState = () => { zone: undefined, project: undefined, status: "", - classroom: 0, + classroom: undefined, deficiency_description: "", - kinship: "" + kinship: "", + address: "", + cep: "", + neighborhood: "", + number: "", + complement: "", + state: undefined, + city: undefined }; diff --git a/src/Context/Beneficiaries/BeneficiaresCreate/type.ts b/src/Context/Beneficiaries/BeneficiaresCreate/type.ts index 1c35190..5daf8d2 100644 --- a/src/Context/Beneficiaries/BeneficiaresCreate/type.ts +++ b/src/Context/Beneficiaries/BeneficiaresCreate/type.ts @@ -13,7 +13,7 @@ export interface BeneficiariesCreateType { responsable_cpf: string; responsable_telephone: string; status: string; - classroom: number; + classroom: number | undefined; zone: number | undefined, project: number | undefined, deficiency_description: string | undefined diff --git a/src/Context/Beneficiaries/BeneficiaresEdit/context.tsx b/src/Context/Beneficiaries/BeneficiaresEdit/context.tsx index b1332a6..2033524 100644 --- a/src/Context/Beneficiaries/BeneficiaresEdit/context.tsx +++ b/src/Context/Beneficiaries/BeneficiaresEdit/context.tsx @@ -22,7 +22,8 @@ const BeneficiariesEditProvider = ({ projectRequet, setProject, file, - setFile + setFile, + CreateRegisterTerm } = BeneficiariesEditState(); return ( @@ -40,6 +41,7 @@ const BeneficiariesEditProvider = ({ project, projectRequet, setProject, + CreateRegisterTerm }} > {children} diff --git a/src/Context/Beneficiaries/BeneficiaresEdit/state.tsx b/src/Context/Beneficiaries/BeneficiaresEdit/state.tsx index 1a0c113..0cda69f 100644 --- a/src/Context/Beneficiaries/BeneficiaresEdit/state.tsx +++ b/src/Context/Beneficiaries/BeneficiaresEdit/state.tsx @@ -1,10 +1,5 @@ import { useEffect, useState } from "react"; import { useParams } from "react-router-dom"; -import { - useFetchRequestProjectList, - useFetchRequestRegistrationOne, -} from "../../../Services/PreRegistration/query"; -import { Registration } from "./type"; import { converterData, formatarData, @@ -12,10 +7,15 @@ import { VerifyColor, VerifySex, } from "../../../Controller/controllerGlobal"; +import { useFetchRequestClassroom } from "../../../Services/Classroom/query"; import { ControllerUpdateRegistration } from "../../../Services/PreRegistration/controller"; -import { CreateRegistrationClassroomType } from "../../../Services/PreRegistration/types"; +import { + useFetchRequestProjectList, + useFetchRequestRegistrationOne, +} from "../../../Services/PreRegistration/query"; +import { CreateRegistrationClassroomType, CreateRegistrationTermType } from "../../../Services/PreRegistration/types"; import { UpdateRegister } from "../../Classroom/Registration/type"; -import { useFetchRequestClassroom } from "../../../Services/Classroom/query"; +import { Registration } from "./type"; export const BeneficiariesEditState = () => { const [project, setProject] = useState(); @@ -30,6 +30,7 @@ export const BeneficiariesEditState = () => { requestDeleteRegistrationClassroomMutation, requestPreRegistrationMutation, requestCHangeAvatarRegistrationMutation, + requestRegisterTermMutation } = ControllerUpdateRegistration(); const { data: registrationsRequests, isLoading } = useFetchRequestRegistrationOne(id!); @@ -50,7 +51,6 @@ export const BeneficiariesEditState = () => { }, [registrationsRequests]); const date = new Date(registrations?.birthday!); - const initialValue = { name: registrations?.name, sex: VerifySex(registrations?.sex!), @@ -68,12 +68,24 @@ export const BeneficiariesEditState = () => { status: getStatus(registrations?.status!), deficiency_description: registrations?.deficiency_description, kinship: registrations?.kinship, + address: registrations?.address ?? "", + cep: registrations?.cep ?? "", + neighborhood: registrations?.neighborhood ?? "", + number: registrations?.number ?? "", + complement: registrations?.complement ?? "", + state: registrations?.state_fk ?? "", + city: registrations?.city_fk ?? "" }; const CreateRegisterClassroom = (data: CreateRegistrationClassroomType) => { requestRegistrationClassroomMutation.mutate(data); }; + const CreateRegisterTerm = (data: CreateRegistrationTermType) => { + requestRegisterTermMutation.mutate({data: data}); + }; + + const DeleteRegistration = (id: number) => { requestDeleteRegistrationClassroomMutation.mutate(id); }; @@ -114,5 +126,6 @@ export const BeneficiariesEditState = () => { classrooms, file, setFile, + CreateRegisterTerm }; }; diff --git a/src/Context/Beneficiaries/BeneficiaresEdit/type.ts b/src/Context/Beneficiaries/BeneficiaresEdit/type.ts index ea392b7..0f7fc02 100644 --- a/src/Context/Beneficiaries/BeneficiaresEdit/type.ts +++ b/src/Context/Beneficiaries/BeneficiaresEdit/type.ts @@ -1,5 +1,5 @@ import { Dispatch, SetStateAction } from "react"; -import { CreateRegistrationClassroomType } from "../../../Services/PreRegistration/types"; +import { CreateRegistrationClassroomType, CreateRegistrationTermType } from "../../../Services/PreRegistration/types"; import { UpdateRegister } from "../../Classroom/Registration/type"; export interface BeneficiariesEditType { @@ -15,27 +15,37 @@ export interface BeneficiariesEditType { classrooms: any file: any | undefined setFile: Dispatch> + CreateRegisterTerm: (data: CreateRegistrationTermType) => void } export interface Registration { - id: number; - name: string; - birthday: string; - cpf: string; - sex: number; - avatar_url: string | null - color_race: number; - deficiency: boolean; - deficiency_description: string; - responsable_name: any; - responsable_cpf: any; - responsable_telephone: string; - zone: number; - status: string; - createdAt: string; - updatedAt: string; - register_classroom: RegisterClassroom[]; + id: number + avatar_url: string + name: string + birthday: string + cpf: string + sex: number + color_race: number + deficiency: boolean + deficiency_description: string + responsable_name: string + responsable_cpf: string + responsable_telephone: string + zone: number kinship: string + kinship_description: any + status: string + createdAt: string + updatedAt: string + cep: string + address: any + number: any + complement: string + neighborhood: string + city_fk: number + state_fk: number + register_classroom: RegisterClassroom[] + register_term: any } export interface RegisterClassroom { diff --git a/src/Context/Classroom/Registration/type.tsx b/src/Context/Classroom/Registration/type.tsx index e56d86e..7a19088 100644 --- a/src/Context/Classroom/Registration/type.tsx +++ b/src/Context/Classroom/Registration/type.tsx @@ -59,4 +59,5 @@ export interface Registration { createdAt: string updatedAt: string kinship: string + register_term?: any } diff --git a/src/Context/Register/state.tsx b/src/Context/Register/state.tsx index 18bbb9a..45155d9 100644 --- a/src/Context/Register/state.tsx +++ b/src/Context/Register/state.tsx @@ -74,6 +74,8 @@ export const RegisterState = () => { responsable_cpf: "", responsable_name: "", responsable_telephone: "", + city: null, + state: null }; return { diff --git a/src/Context/Register/type.tsx b/src/Context/Register/type.tsx index 5ca45ef..9a6d5f1 100644 --- a/src/Context/Register/type.tsx +++ b/src/Context/Register/type.tsx @@ -37,6 +37,8 @@ export interface Registration { responsable_telephone?: string; kinship?: string | null; zone: number | null; + city: number | null, + state: number | null } diff --git a/src/Controller/controllerGlobal.tsx b/src/Controller/controllerGlobal.tsx index da74fc3..55e93db 100644 --- a/src/Controller/controllerGlobal.tsx +++ b/src/Controller/controllerGlobal.tsx @@ -1,5 +1,6 @@ import axios from "axios"; import { Buffer } from 'buffer'; +import { FormikErrors } from "formik"; export const gerarIdAleatorio = (tamanho: number) => { @@ -15,12 +16,36 @@ export const gerarIdAleatorio = (tamanho: number) => { return id; }; +export const getErrorsAsArray = (errors: FormikErrors): string[] => { + const flattenErrors = (obj: any): string[] => { + let messages: string[] = []; + Object.entries(obj).forEach(([key, value]) => { + if (typeof value === 'string') { + messages.push(value); + } else if (typeof value === 'object' && value !== null) { + messages = [...messages, ...flattenErrors(value)]; + } + }); + return messages; + }; + + return flattenErrors(errors); +}; + + export function formatarData(data: string): string { var date = data.toString().split("T")[0]; var dataEdit = date.split("-").reverse().join("/"); return dataEdit; } +export function isWithinOneYear(date1: any, date2: any) { + const oneYearInMilliseconds = 365 * 24 * 60 * 60 * 1000; // Um ano em milissegundos + + const timeDifference = Math.abs(new Date(date1).getUTCMilliseconds() - new Date(date2).getUTCMilliseconds()); // Diferença absoluta em ms + return timeDifference <= oneYearInMilliseconds; // Verifica se está dentro de um ano +} + export function converterData(data: string) { // Divide a string pelo separador "/" const partes = data.split('/'); diff --git a/src/Pages/Beneficiaries/BeneficiariesCreate/index.tsx b/src/Pages/Beneficiaries/BeneficiariesCreate/index.tsx index 7ea7332..7fa1656 100644 --- a/src/Pages/Beneficiaries/BeneficiariesCreate/index.tsx +++ b/src/Pages/Beneficiaries/BeneficiariesCreate/index.tsx @@ -15,11 +15,13 @@ import BeneficiariesCreateProvider, { import { BeneficiariesCreateType } from "../../../Context/Beneficiaries/BeneficiaresCreate/type"; import { color_race, + getErrorsAsArray, kinship, typesex, } from "../../../Controller/controllerGlobal"; import { validaCPF } from "../../../Controller/controllerValidCPF"; import { Column, Padding, Row } from "../../../Styles/styles"; +import InputAddress from "../../../Components/InputsAddress"; const BeneficiariesCreate = () => { return ( @@ -43,7 +45,7 @@ const RegistrationPage = () => { return validaCPF(value); } return true; - }), + }).required("CPF é obrigatório"), responsable_cpf: Yup.string().test("cpf-valid", "CPF inválido", (value) => { if (value && value.trim() !== "") { return validaCPF(value); @@ -56,8 +58,9 @@ const RegistrationPage = () => { .required("Data de nascimento é obrigatória"), zone: Yup.string().nullable().required("Zona é obrigatório"), project: Yup.string().nullable().required("Projeto é obrigatório"), - classroom: Yup.string().nullable().required("Classroom é obrigatório"), - + classroom: Yup.string().nullable().required("Turma é obrigatório"), + state: Yup.string().nullable().required("Estado é obrigatório"), + city: Yup.string().nullable().required("Cidade é obrigatório"), sex: Yup.string().nullable().required("Sexo é obrigatória"), }); @@ -79,7 +82,8 @@ const RegistrationPage = () => { }} > {({ values, handleChange, errors, touched, setFieldValue }) => { - console.log(errors); + const errorArray = getErrorsAsArray(errors); + return (
@@ -87,17 +91,29 @@ const RegistrationPage = () => {