Proyectos de Subversion LeadersLinked - SPA

Rev

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