Proyectos de Subversion LeadersLinked - SPA

Rev

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

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