Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 973 | Rev 975 | 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'
974 stevensc 5
import { useHistory, useLocation } from 'react-router-dom'
970 stevensc 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 { search, pathname } = useLocation()
651 stevensc 25
  const dispatch = useDispatch()
485 stevensc 26
  const history = useHistory()
5 stevensc 27
 
485 stevensc 28
  const params = new URLSearchParams(search)
29
  const keyword = params.get('keyword')
970 stevensc 30
  const currentPage = params.get('page')
5 stevensc 31
 
970 stevensc 32
  const searchEntities = (address = {}) => {
485 stevensc 33
    setLoading(true)
5 stevensc 34
 
649 stevensc 35
    axios
971 stevensc 36
      .get(`${pathname}?${params.toString()}`)
649 stevensc 37
      .then(({ data: responseData }) => {
38
        const { success, data } = responseData
5 stevensc 39
 
649 stevensc 40
        if (!success) {
41
          throw new Error(data)
5 stevensc 42
        }
649 stevensc 43
 
44
        setEntities(data.current.items)
45
        setPages(data.total.pages)
485 stevensc 46
      })
649 stevensc 47
      .catch((err) => {
655 stevensc 48
        dispatch(addNotification({ style: 'danger', msg: err.message }))
649 stevensc 49
      })
50
      .finally(() => setLoading(false))
485 stevensc 51
  }
5 stevensc 52
 
970 stevensc 53
  const onChangeKeyword = debounce((value) => {
54
    params.set('page', '1')
649 stevensc 55
 
970 stevensc 56
    if (value) {
57
      params.set('keyword', value)
58
    } else {
59
      params.delete('keyword')
60
    }
649 stevensc 61
 
970 stevensc 62
    history.replace(`${pathname}?${params.toString()}`)
63
  }, 500)
64
 
65
  const onChangePage = (currentPage = 1) => {
66
    params.set('page', `${currentPage}`)
67
    history.replace(`${pathname}?${params.toString()}`)
68
  }
69
 
70
  const onChangeCategory = (newCategory = 'user') => {
974 stevensc 71
    console.log(params)
970 stevensc 72
    params.set('page', '1')
73
    history.replace(`/search/entity/${newCategory}?${params.toString()}`)
74
  }
75
 
649 stevensc 76
  useEffect(() => {
970 stevensc 77
    searchEntities(address)
973 stevensc 78
  }, [address, search, pathname])
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