Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 485 | Rev 649 | 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'
2
import { axios, jsonToParams } from '../../utils'
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'
5 stevensc 15
 
16
const SearchPage = () => {
485 stevensc 17
  const [entities, setEntities] = useState([])
18
  const [loading, setLoading] = useState(true)
19
  const [category, setCategory] = useState('user')
20
  const [entity, setEntity] = useState('')
21
  const [address, setAddress] = useState({})
22
  const [currentPage, setCurrentPage] = useState(1)
23
  const [pages, setPages] = useState(1)
24
  const activeFilters = useRef([])
5 stevensc 25
 
485 stevensc 26
  const { search, pathname } = useLocation()
27
  const history = useHistory()
5 stevensc 28
 
485 stevensc 29
  const params = new URLSearchParams(search)
30
  const keyword = params.get('keyword')
5 stevensc 31
 
485 stevensc 32
  const loadEntities = async (page = 1, keyword = '', category = 'user') => {
33
    setLoading(true)
34
    setCurrentPage(page)
5 stevensc 35
 
485 stevensc 36
    const urlParams = { page, keyword }
5 stevensc 37
 
485 stevensc 38
    Object.entries(address).forEach(([key, value]) => {
39
      urlParams[key] = value
40
    })
5 stevensc 41
 
42
    activeFilters.current.forEach(({ name, value }) => {
485 stevensc 43
      urlParams[name] = value
44
    })
5 stevensc 45
 
46
    await axios
47
      .get(`/search/entity/${category}?${jsonToParams(urlParams)}`)
48
      .then((response) => {
485 stevensc 49
        const { success, data } = response.data
5 stevensc 50
 
51
        if (success) {
485 stevensc 52
          setEntities(data.current.items)
53
          setPages(data.total.pages)
5 stevensc 54
        }
485 stevensc 55
      })
56
    setLoading(false)
57
  }
5 stevensc 58
 
59
  const onChangePageHandler = (currentPage) => {
485 stevensc 60
    setCurrentPage(currentPage)
61
  }
5 stevensc 62
 
485 stevensc 63
  const addressHandler = (address) => {
64
    setAddress(address)
65
  }
5 stevensc 66
 
172 stevensc 67
  const onSearch = (e) => {
485 stevensc 68
    if (e.key !== 'Enter') {
69
      return
172 stevensc 70
    }
5 stevensc 71
 
485 stevensc 72
    history.push({ pathname, search: `?keyword=${entity}` })
73
  }
172 stevensc 74
 
5 stevensc 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
 
86
  useEffect(() => {
485 stevensc 87
    loadEntities(currentPage, keyword, category)
88
    setEntity(keyword)
5 stevensc 89
    return () => {
485 stevensc 90
      setCategory('user')
91
      setEntity('')
92
      activeFilters.current = []
93
    }
486 stevensc 94
  }, [keyword, category, currentPage, address])
5 stevensc 95
 
96
  return (
97
    <>
98
      <Container as="main">
375 stevensc 99
        <Input
208 stevensc 100
          icon={SearchIcon}
172 stevensc 101
          onKeyDown={onSearch}
5 stevensc 102
          onChange={(e) => setEntity(e.target.value)}
103
          value={entity}
104
        />
105
        <Row className="mt-3">
106
          <Col as="aside" md="4">
107
            <FiltersSidebar>
108
              <CategoryFilter onChange={changeCategory} />
485 stevensc 109
              <LocationFilter onChange={addressHandler} />
5 stevensc 110
            </FiltersSidebar>
111
          </Col>
112
          <Col as="section" md="8">
113
            <div className="posts-section">
114
              {loading && <Spinner />}
115
              {entities.length ? (
116
                entities.map((entity) => (
117
                  <SearchItem
118
                    key={entity.id}
119
                    onChangePage={onChangePageHandler}
120
                    {...entity}
121
                  />
122
                ))
123
              ) : (
124
                <EmptySection message="No hay resultados" />
125
              )}
126
            </div>
127
            <PaginationComponent
128
              pages={pages}
129
              currentActivePage={currentPage}
130
              onChangePage={loadEntities}
131
              isRow
132
            />
133
          </Col>
134
        </Row>
135
      </Container>
136
    </>
485 stevensc 137
  )
138
}
5 stevensc 139
 
485 stevensc 140
export default SearchPage