Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 649 | Rev 651 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
485 stevensc 1
import React, { useState, useRef, useEffect } from 'react'
650 stevensc 2
import { useDispatch } from 'react-redux'
3
import { addNotification } from '../../redux/notification/notification.actions'
4
import { Col, Container, Row } from 'react-bootstrap'
5
import { useHistory, useLocation, useParams } from 'react-router-dom'
649 stevensc 6
import { axios, debounce, jsonToParams } from '../../utils'
485 stevensc 7
import SearchIcon from '@mui/icons-material/Search'
5 stevensc 8
 
650 stevensc 9
import Input from 'components/UI/Input'
10
import Spinner from 'components/UI/Spinner'
11
import SearchItem from 'components/search/SearchItem'
12
import EmptySection from 'components/UI/EmptySection'
13
import FiltersSidebar from 'components/search/FiltersSidebar'
14
import CategoryFilter from 'components/search/CategoryFilter'
15
import LocationFilter from 'components/search/LocationFilter'
16
import PaginationComponent from 'components/UI/PaginationComponent'
5 stevensc 17
 
18
const SearchPage = () => {
485 stevensc 19
  const [entities, setEntities] = useState([])
20
  const [loading, setLoading] = useState(true)
21
  const [category, setCategory] = useState('user')
22
  const [entity, setEntity] = useState('')
23
  const [address, setAddress] = useState({})
24
  const [currentPage, setCurrentPage] = useState(1)
25
  const [pages, setPages] = useState(1)
649 stevensc 26
  const { search } = useLocation()
650 stevensc 27
  const { category: categoryParam } = useParams()
485 stevensc 28
  const history = useHistory()
649 stevensc 29
  const dispatch = useDispatch()
5 stevensc 30
 
485 stevensc 31
  const params = new URLSearchParams(search)
32
  const keyword = params.get('keyword')
5 stevensc 33
 
649 stevensc 34
  const searchEntities = (
35
    page = 1,
36
    keyword = '',
37
    category = 'user',
38
    address = {}
39
  ) => {
485 stevensc 40
    setLoading(true)
41
    const urlParams = { page, keyword }
649 stevensc 42
    Object.entries(address).forEach(([key, value]) => (urlParams[key] = value))
5 stevensc 43
 
650 stevensc 44
    const url = `/search/entity/${category}?${jsonToParams(urlParams)}`
5 stevensc 45
 
650 stevensc 46
    history.replace(url)
47
 
649 stevensc 48
    axios
650 stevensc 49
      .get(url)
649 stevensc 50
      .then(({ data: responseData }) => {
51
        const { success, data } = responseData
5 stevensc 52
 
649 stevensc 53
        if (!success) {
54
          throw new Error(data)
5 stevensc 55
        }
649 stevensc 56
 
57
        setEntities(data.current.items)
58
        setPages(data.total.pages)
485 stevensc 59
      })
649 stevensc 60
      .catch((err) => {
61
        dispatch(addNotification({ style: 'danger', msg: err }))
62
      })
63
      .finally(() => setLoading(false))
485 stevensc 64
  }
5 stevensc 65
 
649 stevensc 66
  const onSearch = debounce((value) => setEntity(value), 500)
67
 
5 stevensc 68
  useEffect(() => {
649 stevensc 69
    searchEntities(currentPage, entity, category, address)
70
  }, [entity, category, currentPage, address])
71
 
72
  useEffect(() => {
485 stevensc 73
    setEntity(keyword)
650 stevensc 74
    setCategory(categoryParam)
649 stevensc 75
  }, [])
5 stevensc 76
 
77
  return (
78
    <>
649 stevensc 79
      <Container as='main'>
375 stevensc 80
        <Input
208 stevensc 81
          icon={SearchIcon}
649 stevensc 82
          onChange={(e) => onSearch(e.target.value)}
650 stevensc 83
          defaultValue={entity}
5 stevensc 84
        />
649 stevensc 85
        <Row className='mt-3'>
86
          <Col as='aside' md='4'>
5 stevensc 87
            <FiltersSidebar>
650 stevensc 88
              <CategoryFilter
89
                onChange={(newCategory) => setCategory(newCategory)}
90
              />
91
              <LocationFilter
92
                onChange={(newAddress) => setAddress(newAddress)}
93
              />
5 stevensc 94
            </FiltersSidebar>
95
          </Col>
649 stevensc 96
          <Col as='section' md='8'>
97
            <div className='posts-section'>
5 stevensc 98
              {loading && <Spinner />}
99
              {entities.length ? (
100
                entities.map((entity) => (
649 stevensc 101
                  <SearchItem key={entity.id} {...entity} />
5 stevensc 102
                ))
103
              ) : (
649 stevensc 104
                <EmptySection message='No hay resultados' />
5 stevensc 105
              )}
106
            </div>
107
            <PaginationComponent
108
              pages={pages}
109
              currentActivePage={currentPage}
650 stevensc 110
              onChangePage={(newCurrentPage) => setCurrentPage(newCurrentPage)}
5 stevensc 111
              isRow
112
            />
113
          </Col>
114
        </Row>
115
      </Container>
116
    </>
485 stevensc 117
  )
118
}
5 stevensc 119
 
485 stevensc 120
export default SearchPage