Autoría | Ultima modificación | Ver Log |
/* eslint-disable react/prop-types */import { CKEditor } from 'ckeditor4-react';import React, { useEffect, useRef, useState } from 'react'import { Button, Modal } from 'react-bootstrap'import { useForm } from 'react-hook-form';import { addNotification } from '../../../../../../redux/notification/notification.actions';import FormErrorFeedback from '../../../../../../shared/form-error-feedback/FormErrorFeedback';import Spinner from '../../../../../../shared/loading-spinner/Spinner';import UbicationInput from '../../../../../../shared/ubication-input/UbicationInput';import { axios, CKEDITOR_OPTIONS } from '../../../../../../utils';const ExperienceModal = ({ show, closeModal, setSettedUserExperiences, settedUserExperiences }) => {const { register, errors, handleSubmit, setValue, clearErrors, getValues, watch, setError, } = useForm();const [isModalOpen, setIsModalOpen] = useState(false);const [modalLoading, setModalLoading] = useState(false);const [settedDescription, setSettedDescription] = useState("");const isAddressEmpty = useRef(true);const postUrl = useRef("");const addressKeys = useRef(["address1","address2","country","state","city1","city2","postal_code","latitude","longitude",]);useEffect(() => {addressKeys.current.map((addressKey) => {register(addressKey);});register("formatted_address", {required: "Este campo es requerido",});register("description");}, []);const getAddressHandler = (addresObject) => {addressKeys.current.map((addressKey) => {setValue(addressKey, "");});const { address_components } = addresObject;if (address_components) {address_components.map((address_component) => {const address_component_name = address_component.long_name;const address_component_type = address_component.types[0];switch (address_component_type) {case "route":setValue("address1", address_component_name);break;case "sublocality":setValue("address2", address_component_name);break;case "locality":setValue("city1", address_component_name);break;case "administrative_area_level_2":setValue("city2", address_component_name);break;case "administrative_area_level_1":setValue("state", address_component_name);break;case "country":setValue("country", address_component_name);break;case "postal_code":setValue("postal_code", address_component_name);break;case "geometry":setValue("latitude", address_component.latitude);setValue("longitude", address_component.longitude);break;default:break;}});isAddressEmpty.current = false;} else {isAddressEmpty.current = true;}setValue("formatted_address", addresObject.formatted_address);clearErrors("formatted_address");};const getYears = () => {const date = new Date();const currentYear = date.getFullYear();let years = [];for (let index = currentYear; index > currentYear - 100; index--) {years = [...years, index];}return years;};const onSubmitHandler = async (data) => {console.log(data)setModalLoading(true);const formData = new FormData();Object.entries(data).map(([key, value]) => {if (value) formData.append(key, value);});await axios.post(postUrl.current, formData).then((response) => {const resData = response.data;if (resData.success) {setSettedUserExperiences(resData.data);closeModal();} else {const resError = resData.data;if (resError.constructor.name === "Object") {Object.entries(resError).map(([key, value]) => {if (key in getValues()) {setError(key, {type: "manual",message: Array.isArray(value) ? value[0] : value,});}});} else {addNotification({style: "danger",msg: resError,});}}});setModalLoading(false);};const handleNewExperience = (event) => {event.preventDefault();postUrl.current = `/profile/my-profiles/experience/${userIdEncrypted}/operation/add`;setSettedDescription("");handleModalOpen();};const handleEdit = async (linkEdit) => {postUrl.current = linkEdit;const currentDescription = settedUserExperiences.find(experience => experience.link_edit === linkEdit)setSettedDescription(currentDescription.description)setModalLoading(true)const { data } = await axios.get(linkEdit)if (!data.success) {addNotification({style: "danger",msg: typeof data.data === 'string' ? data.data : 'Ha ocurrido un error'})setModalLoading(false);return}handleModalOpen();Object.entries(data.data.experience).map(([key, value]) => value && setValue(key, value));Object.entries(data.data.location).map(([key, value]) => value && setValue(key, value));isAddressEmpty.current = false;setModalLoading(false)};return (<Modal show={show} onHide={closeModal} style={{ overflowY: "scroll" }}><Modal.Header closeButton><Modal.Title>Experiencia</Modal.Title></Modal.Header><form onSubmit={handleSubmit(onSubmitHandler)}><Modal.Body><div className="form-group"><inputtype="text"name="company"placeholder="Empresa"ref={register({required: "este campo es requerido",})}/>{errors.company && <FormErrorFeedback>{errors.company.message}</FormErrorFeedback>}</div><div className="form-group"><selectname="industry_id"id="industry_id"ref={register({required: "este campo es requerido",})}defaultValue=""><option value="" hidden>Industria</option>{Object.entries(industriesOptions).map(([key, value]) => (<option value={key} key={key}>{value}</option>))}</select>{errors.industry_id && (<FormErrorFeedback>{errors.industry_id.message}</FormErrorFeedback>)}</div><div className="form-group"><selectname="company_size_id"id="company_size_id"ref={register({required: "este campo es requerido",})}defaultValue=""><option value="" hidden>Tamaño de la Empresa</option>{Object.entries(companySizesOptions).map(([key, value]) => (<option value={key} key={key}>{value}</option>))}</select>{errors.company_size_id && (<FormErrorFeedback>{errors.company_size_id.message}</FormErrorFeedback>)}</div><div className="form-group"><inputtype="text"name="title"placeholder="Titulo"ref={register({required: "este campo es requerido",})}/>{errors.title && (<FormErrorFeedback>{errors.title.message}</FormErrorFeedback>)}</div><div className="form-group datefm"><UbicationInputonGetAddress={getAddressHandler}settedQuery={watch("formatted_address")}/><i className="fa fa-map-marker" />{errors.formatted_address &&<FormErrorFeedback>{errors.formatted_address.message}</FormErrorFeedback>}</div><div className="row profile-year" style={{ gap: '.5rem' }}><div className="input-c p-0"><div className="form-group"><selectname="from_month"id="from_month"ref={register({ required: "este campo es requerido" })}defaultValue=""><option value="">Mes desde</option>{months.map((month, id) => (<option key={id} value={id + 1}>{month}</option>))}</select>{errors.from_month &&<FormErrorFeedback>{errors.from_month.message}</FormErrorFeedback>}</div></div><div className="input-c p-0"><div className="form-group"><selectname="from_year"ref={register({ required: "este campo es requerido", })}defaultValue=""><option value="">Año desde</option>{getYears().map((year) => (<option key={year} value={year}>{year}</option>))}</select>{errors.from_year && (<FormErrorFeedback>{errors.from_year.message}</FormErrorFeedback>)}</div></div></div><label htmlFor="is_current"> Trabajo Actual</label><div className="form-group"><StyledSwitch className="switch"><inputtype="checkbox"name="is_current"id="is_current"value="y"ref={register}/><span className="slider round"></span></StyledSwitch></div>{!watch("is_current") && (<div className="row profile-year"><div className="input-c p-0"><div className="form-group"><selectname="to_month"id="to_month"ref={register({required: "este campo es requerido",})}defaultValue=""><option value="">Mes hasta</option>{months.map((month, id) => (<option key={id} value={id + 1}>{month}</option>))}</select>{errors.to_month && (<FormErrorFeedback>{errors.to_month.message}</FormErrorFeedback>)}</div></div><div className="input-c p-0"><div className="form-group"><selectname="to_year"id="to_year"ref={register({required: "este campo es requerido",})}defaultValue=""><option value="">Año hasta</option>{getYears().map((year) => (<option key={year} value={year}>{year}</option>))}</select>{errors.to_year && (<FormErrorFeedback>{errors.to_year.message}</FormErrorFeedback>)}</div></div></div>)}<div className="form-group"><CKEditoronChange={(e) => setValue('description', e.editor.getData())}onInstanceReady={(e) => e.editor.setData(settedDescription)}config={CKEDITOR_OPTIONS}/>{errors.description && (<FormErrorFeedback>{errors.description.message}</FormErrorFeedback>)}</div></Modal.Body><Modal.Footer><Button size="sm" type="submit">Enviar</Button><Button size="sm" variant="danger" onClick={handleModalOpen}>Cancelar</Button></Modal.Footer></form>{modalLoading && <Spinner />}</Modal>)}export default ExperienceModal