Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 486 | Rev 650 | 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'
649 stevensc 2
import { axios, debounce, jsonToParams } from '../../utils'
485 stevensc 3
import { Col, Container, Row } from 'react-bootstrap'
4
import { useHistory, useLocation } from 'react-router-dom'
5
import SearchIcon from '@mui/icons-material/Search'
5 stevensc 6
 
485 stevensc 7
import Spinner from '../../components/UI/Spinner'
8
import SearchItem from '../../components/search/SearchItem'
9
import Input from '../../components/UI/Input'
10
import EmptySection from '../../components/UI/EmptySection'
11
import PaginationComponent from '../../components/UI/PaginationComponent'
12
import FiltersSidebar from '../../components/search/FiltersSidebar'
13
import CategoryFilter from '../../components/search/CategoryFilter'
14
import LocationFilter from '../../components/search/LocationFilter'
649 stevensc 15
import { useDispatch } from 'react-redux'
16
import { addNotification } from '../../redux/notification/notification.actions'
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)
26
  const activeFilters = useRef([])
649 stevensc 27
  const { search } = useLocation()
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 }
5 stevensc 42
 
649 stevensc 43
    Object.entries(address).forEach(([key, value]) => (urlParams[key] = value))
5 stevensc 44
 
649 stevensc 45
    activeFilters.current.forEach(
46
      ({ name, value }) => (urlParams[name] = value)
47
    )
5 stevensc 48
 
649 stevensc 49
    axios
5 stevensc 50
      .get(`/search/entity/${category}?${jsonToParams(urlParams)}`)
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) => {
62
        dispatch(addNotification({ style: 'danger', msg: err }))
63
      })
64
      .finally(() => setLoading(false))
485 stevensc 65
  }
5 stevensc 66
 
67
  const onChangePageHandler = (currentPage) => {
485 stevensc 68
    setCurrentPage(currentPage)
69
  }
5 stevensc 70
 
485 stevensc 71
  const addressHandler = (address) => {
72
    setAddress(address)
73
  }
5 stevensc 74
 
75
  const changeCategory = (newCategory) => {
485 stevensc 76
    const urlParams = { keyword }
5 stevensc 77
 
78
    activeFilters.current.forEach(({ name, value }) => {
485 stevensc 79
      urlParams[name] = value
80
    })
5 stevensc 81
 
485 stevensc 82
    setCategory(newCategory)
83
    history.push(`/search/entity/${newCategory}?${jsonToParams(urlParams)}`)
84
  }
5 stevensc 85
 
649 stevensc 86
  const onSearch = debounce((value) => setEntity(value), 500)
87
 
5 stevensc 88
  useEffect(() => {
649 stevensc 89
    searchEntities(currentPage, entity, category, address)
90
  }, [entity, category, currentPage, address])
91
 
92
  useEffect(() => {
485 stevensc 93
    setEntity(keyword)
649 stevensc 94
  }, [])
5 stevensc 95
 
96
  return (
97
    <>
649 stevensc 98
      <Container as='main'>
375 stevensc 99
        <Input
208 stevensc 100
          icon={SearchIcon}
649 stevensc 101
          onChange={(e) => onSearch(e.target.value)}
5 stevensc 102
          value={entity}
103
        />
649 stevensc 104
        <Row className='mt-3'>
105
          <Col as='aside' md='4'>
5 stevensc 106
            <FiltersSidebar>
107
              <CategoryFilter onChange={changeCategory} />
485 stevensc 108
              <LocationFilter onChange={addressHandler} />
5 stevensc 109
            </FiltersSidebar>
110
          </Col>
649 stevensc 111
          <Col as='section' md='8'>
112
            <div className='posts-section'>
5 stevensc 113
              {loading && <Spinner />}
114
              {entities.length ? (
115
                entities.map((entity) => (
649 stevensc 116
                  <SearchItem key={entity.id} {...entity} />
5 stevensc 117
                ))
118
              ) : (
649 stevensc 119
                <EmptySection message='No hay resultados' />
5 stevensc 120
              )}
121
            </div>
122
            <PaginationComponent
123
              pages={pages}
124
              currentActivePage={currentPage}
649 stevensc 125
              onChangePage={onChangePageHandler}
5 stevensc 126
              isRow
127
            />
128
          </Col>
129
        </Row>
130
      </Container>
131
    </>
485 stevensc 132
  )
133
}
5 stevensc 134
 
485 stevensc 135
export default SearchPage