Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
7002 stevensc 1
import React, { useState, useRef, useEffect } from 'react'
2
import { axios, jsonToParams } from '../../utils'
7003 stevensc 3
import { Col, Container, Row } from 'react-bootstrap'
4
import { useHistory, useLocation } from 'react-router-dom'
7002 stevensc 5
 
6
import Spinner from '../../components/UI/Spinner'
7
import SearchItem from '../../components/search/SearchItem'
8
import SearchInput from '../../components/UI/SearchInput'
9
import EmptySection from '../../components/UI/EmptySection'
10
import PaginationComponent from '../../components/UI/PaginationComponent'
7007 stevensc 11
import FiltersSidebar from '../../components/search/FiltersSidebar'
12
import CategoryFilter from '../../components/search/CategoryFilter'
13
import LocationFilter from '../../components/search/LocationFilter'
7002 stevensc 14
 
15
const SearchPage = () => {
16
  const [entities, setEntities] = useState([])
17
  const [loading, setLoading] = useState(true)
18
  const [category, setCategory] = useState('user')
7003 stevensc 19
  const [entity, setEntity] = useState('')
7002 stevensc 20
  const [currentPage, setCurrentPage] = useState(1)
21
  const [pages, setPages] = useState(1)
22
  const activeFilters = useRef([])
7007 stevensc 23
  const addressKeys = useRef([])
7002 stevensc 24
 
25
  const { search, pathname } = useLocation()
7003 stevensc 26
  const history = useHistory()
7002 stevensc 27
 
7003 stevensc 28
  const params = new URLSearchParams(search)
29
  const keyword = params.get('keyword')
7002 stevensc 30
 
31
  const loadEntities = async (page = 1) => {
32
    setLoading(true)
33
    setCurrentPage(page)
34
 
35
    const urlParams = { page, keyword }
36
 
7007 stevensc 37
    addressKeys.current.forEach(({ name, type }) => {
7002 stevensc 38
      urlParams[type] = name
39
    })
7007 stevensc 40
 
7002 stevensc 41
    activeFilters.current.forEach(({ name, value }) => {
42
      urlParams[name] = value
43
    })
44
 
45
    await axios
46
      .get(`/search/entity/${category}?${jsonToParams(urlParams)}`)
47
      .then((response) => {
48
        const { success, data } = response.data
7003 stevensc 49
 
7002 stevensc 50
        if (success) {
51
          setEntities(data.current.items)
52
          setPages(data.total.pages)
53
        }
54
      })
55
    setLoading(false)
56
  }
57
 
58
  const onChangePageHandler = (currentPage) => {
59
    setCurrentPage(currentPage)
60
  }
61
 
7007 stevensc 62
  const getAddressHandler = (addresObject) => {
63
    const { address_components } = addresObject
64
    if (address_components) {
65
      addressKeys.current = []
66
      address_components.map((address_component) => {
67
        const address_component_name = address_component.long_name
68
        const address_component_type = address_component.types[0]
69
        switch (address_component_type) {
70
          case 'route':
71
            addressKeys.current = [
72
              ...addressKeys.current,
73
              { type: 'route', name: address_component_name },
74
            ]
75
            break
76
          case 'sublocality':
77
            addressKeys.current = [
78
              ...addressKeys.current,
79
              { type: 'sublocality', name: address_component_name },
80
            ]
81
            break
82
          case 'locality':
83
            addressKeys.current = [
84
              ...addressKeys.current,
85
              { type: 'locality', name: address_component_name },
86
            ]
87
            break
88
          case 'administrative_area_level_2':
89
            addressKeys.current = [
90
              ...addressKeys.current,
91
              {
92
                type: 'administrative_area_level_2',
93
                name: address_component_name,
94
              },
95
            ]
96
            break
97
          case 'administrative_area_level_1':
98
            addressKeys.current = [
99
              ...addressKeys.current,
100
              {
101
                type: 'administrative_area_level_1',
102
                name: address_component_name,
103
              },
104
            ]
105
            break
106
          case 'country':
107
            addressKeys.current = [
108
              ...addressKeys.current,
109
              { type: 'country', name: address_component_name },
110
            ]
111
            break
112
          case 'postal_code':
113
            addressKeys.current = [
114
              ...addressKeys.current,
115
              { type: 'postal_code', name: address_component_name },
116
            ]
117
            break
118
          default:
119
            break
120
        }
121
      })
122
      loadEntities()
123
    } else {
124
      if (addressKeys.current.length) {
125
        loadEntities()
126
      }
127
    }
128
  }
129
 
7005 stevensc 130
  const onSubmitHandler = (e) => {
131
    e.preventDefault()
7003 stevensc 132
    history.push({ pathname, search: `?keyword=${entity}` })
133
  }
134
 
7002 stevensc 135
  useEffect(() => {
7003 stevensc 136
    loadEntities()
7010 stevensc 137
    setEntity(keyword)
138
  }, [keyword, category])
7002 stevensc 139
 
140
  return (
141
    <>
7003 stevensc 142
      <Container as="main">
7004 stevensc 143
        <SearchInput
7003 stevensc 144
          as="form"
145
          onSubmit={onSubmitHandler}
146
          onChange={(e) => setEntity(e.target.value)}
147
          value={entity}
148
          placeholder="¿Que desea encontrar?"
7004 stevensc 149
          style={{ backgroundColor: 'var(--bg-color)' }}
7003 stevensc 150
        />
7006 stevensc 151
        <Row className="mt-3">
7003 stevensc 152
          <Col as="aside" md="4">
7007 stevensc 153
            <FiltersSidebar>
154
              <CategoryFilter onChange={(value) => setCategory(value)} />
155
              <LocationFilter onChange={getAddressHandler} />
156
            </FiltersSidebar>
7003 stevensc 157
          </Col>
158
          <Col as="section" md="8">
159
            <div className="posts-section">
160
              {loading && <Spinner />}
161
              {entities.length ? (
162
                entities.map((entity) => (
163
                  <SearchItem
164
                    key={entity.id}
165
                    onChangePage={onChangePageHandler}
166
                    {...entity}
167
                  />
168
                ))
169
              ) : (
170
                <EmptySection message="No hay resultados" />
171
              )}
172
            </div>
173
            <PaginationComponent
174
              pages={pages}
175
              currentActivePage={currentPage}
176
              onChangePage={loadEntities}
177
              isRow
178
            />
179
          </Col>
180
        </Row>
7002 stevensc 181
      </Container>
182
    </>
183
  )
184
}
185
 
186
export default SearchPage