Rev 4845 | Rev 5389 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
/* eslint-disable react/prop-types */import React from 'react'import { useState, useRef, useEffect } from 'react'import { useLocation } from 'react-router-dom'import { useForm } from 'react-hook-form'import { FaPlus, FaMinus } from 'react-icons/fa'import { axios, jsonToParams } from '../../../utils'import styled from 'styled-components'import Filters from './filters/Filters'import Spinner from '../../../shared/loading-spinner/Spinner'import EntityTemplate from '../entity-template/EntityTemplate'import PaginationComponent from '../../../shared/pagination/PaginationComponent'import UbicationInput from '../../../shared/ubication-input/UbicationInput'const SpinnerStyled = styled.div`width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;`const MainSection = (props) => {// statesconst [entities, setEntities] = useState([])const [loading, setLoading] = useState(true)const [displayFilters, setDisplayFilters] = useState(false)const [error, setError] = useState('')const [searchType, setSearchType] = useState('user')const [currentPage, setCurrentPage] = useState(1)const [pages, setPages] = useState(1)// refsconst activeFilters = useRef([])const addressFilter = useRef([])const formRef = useRef()// useLocationconst location = useLocation()// props destructuringconst { filters } = props// react hook formconst { register, setValue } = useForm()// getting keywordconst locationParams = new URLSearchParams(location.search)const keyword = locationParams.get('keyword')useEffect(() => {loadEntities()formRef.current.reset()if (activeFilters.current.length) activeFilters.current = []}, [searchType, keyword])const onCheckHandler = (event, filterType) => {const checkBoxEl = event.targetif (checkBoxEl.checked) {const newActiveFilters = [...activeFilters.current,{ name: checkBoxEl.name, value: 1, type: filterType }]activeFilters.current = newActiveFilters} else {const newActiveFilters = activeFilters.current.filter((activeFilter) => activeFilter.name !== checkBoxEl.name)activeFilters.current = newActiveFilters}loadEntities()}const onUncheckAllHandler = (event, filterType) => {event.preventDefault()const activeFiltersToDisable = activeFilters.current.filter(({ type }) => type === filterType)activeFiltersToDisable.map(({ name }) => {setValue(name, '')})if (activeFilters.current.length) {const newActiveFilters = activeFilters.current.filter(({ type }) => type !== filterType)activeFilters.current = newActiveFiltersloadEntities()}}const loadEntities = async (page = 1) => {setLoading(true)setError(false)setCurrentPage(page)const urlParams = {page,keyword}addressFilter.current.forEach(({ name, type }) => {urlParams[type] = name})activeFilters.current.forEach(({ name, value }) => {urlParams[name] = value})await axios.get(`/search/entity/${searchType}?${jsonToParams(urlParams)}`).then((response) => {const responseData = response.dataif (responseData.success) {setEntities(responseData.data.current.items)setPages(responseData.data.total.pages)} else {const newError = responseData.datasetError(newError)}})setLoading(false)}const getAddressHandler = (addresObject) => {const { address_components } = addresObjectif (address_components) {addressFilter.current = []address_components.map((address_component) => {const address_component_name = address_component.long_nameconst address_component_type = address_component.types[0]switch (address_component_type) {case 'route':addressFilter.current = [...addressFilter.current,{ type: 'route', name: address_component_name }]breakcase 'sublocality':addressFilter.current = [...addressFilter.current,{ type: 'sublocality', name: address_component_name }]breakcase 'locality':addressFilter.current = [...addressFilter.current,{ type: 'locality', name: address_component_name }]breakcase 'administrative_area_level_2':addressFilter.current = [...addressFilter.current,{type: 'administrative_area_level_2',name: address_component_name}]breakcase 'administrative_area_level_1':addressFilter.current = [...addressFilter.current,{type: 'administrative_area_level_1',name: address_component_name}]breakcase 'country':addressFilter.current = [...addressFilter.current,{ type: 'country', name: address_component_name }]breakcase 'postal_code':addressFilter.current = [...addressFilter.current,{ type: 'postal_code', name: address_component_name }]breakdefault:break}})loadEntities()} else {if (addressFilter.current.length) {addressFilter.current = []loadEntities()}}}const onChangePageHandler = (currentPage) => {setCurrentPage(currentPage)}return (<div><main><div className="main-section"><div className="container"><div className="main-section-data"><formname="form-filter"id="form-filter"ref={formRef}onSubmit={(e) => {e.preventDefault()}}><div className="py-2 d-flex" style={{ gap: '10px' }}><h2 className="font-weight-bold search-title">Filtros</h2><div className="show_filters">{displayFilters? <FaMinus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />: <FaPlus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />}</div></div><div className={`filter-secs border-gray border-radius ${displayFilters ? 'show_filters' : 'hidden_filters'}`}><div className="filter-heading m-0"><h3 className="text-dark font-weight-bold">Buscar por</h3></div>{/* <!--filter-heading end--> */}<div className="paddy"><div className="filter-dd"><ul className="avail-checks avail-checks-search-type"><li><ahref="#"onClick={(e) => {e.preventDefaultsetSearchType('user')}}className={(searchType && searchType === 'user' ? 'search-item-selected' : '') + ' text-dark'}>Personas</a></li>{filters.allowSearchCompany &&<li><aclassName={(searchType && searchType === 'job' ? 'search-item-selected' : '') + ' text-dark'}href="#"onClick={(e) => {e.preventDefaultsetSearchType('job')}}>Trabajos</a></li>}{filters.allowSearchCompany &&<li><aclassName={(searchType && searchType === 'company' ? 'search-item-selected' : '') + ' text-dark'}href="#"onClick={(e) => {e.preventDefault// searchType.current = "company";setSearchType('company')}}>Empresas</a></li>}<li><aclassName={(searchType && searchType === 'group' ? 'search-item-selected' : '') + ' text-dark'}href="#"onClick={(e) => {e.preventDefaultsetSearchType('group')}}>Grupos</a></li></ul></div></div></div><div className={displayFilters ? 'show_filters' : 'hidden_filters'}>{(searchType === 'user' && filters.allowViewConnectionLevelFilter) &&<Filtersfilters={filters}searchType={searchType}onCheck={onCheckHandler}onUncheckAll={onUncheckAllHandler}register={register}/>}</div><div className={`filter-secs border-gray border-radius ${displayFilters ? 'show_filters' : 'hidden_filters'}`}><div className="filter-heading"><h3 className="text-dark font-weight-bold">Ubicación</h3></div><divclassName="container mb-2"><UbicationInputonGetAddress={getAddressHandler}placeholder="Buscar un lugar"/></div></div></form><div className="main-ws-sec"><div className="posts-section">{/* <!--post-bar end--> */}{loading? (<SpinnerStyled><Spinner /></SpinnerStyled>): error? (<div>{error}</div>): entities && entities.length? (entities.map((entity) => (<EntityTemplateentity={entity}key={entity.id}onChangePage={onChangePageHandler}/>))): (<divstyle={{display: 'flex',justifyContent: 'center',alignItems: 'center',padding: '1rem 0 3rem 0'}}>No hay resultados</div>)}</div><PaginationComponentpages={pages}currentActivePage={currentPage}onChangePage={loadEntities}/>{/* <div className="process-comm" id="paginator-process-comm"><div className="spinner"><div className="bounce1"></div><div className="bounce2"></div><div className="bounce3"></div></div></div> */}{/* <!--process-comm end--><!--posts-section end--> */}</div><div className="right-sidebar"></div></div></div></div></main></div>)}export default MainSection