Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 7014 | 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
 
7040 stevensc 31
  const loadEntities = async (page = 1, keyword = '', category = 'user') => {
7002 stevensc 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
 
7011 stevensc 135
  const changeCategory = (newCategory) => {
136
    const urlParams = { keyword }
137
 
138
    activeFilters.current.forEach(({ name, value }) => {
139
      urlParams[name] = value
140
    })
141
 
7012 stevensc 142
    setCategory(newCategory)
7013 stevensc 143
    history.push(`/search/entity/${newCategory}?${jsonToParams(urlParams)}`)
7011 stevensc 144
  }
145
 
7002 stevensc 146
  useEffect(() => {
7040 stevensc 147
    loadEntities(currentPage, keyword, category)
7010 stevensc 148
    setEntity(keyword)
7014 stevensc 149
    return () => {
150
      setCategory('user')
151
      setEntity('')
152
      activeFilters.current = []
153
      addressKeys.current = []
154
    }
7040 stevensc 155
  }, [keyword, category, currentPage])
7002 stevensc 156
 
157
  return (
158
    <>
7003 stevensc 159
      <Container as="main">
7004 stevensc 160
        <SearchInput
7003 stevensc 161
          as="form"
162
          onSubmit={onSubmitHandler}
163
          onChange={(e) => setEntity(e.target.value)}
164
          value={entity}
7011 stevensc 165
          plackeyword
7004 stevensc 166
          style={{ backgroundColor: 'var(--bg-color)' }}
7003 stevensc 167
        />
7006 stevensc 168
        <Row className="mt-3">
7003 stevensc 169
          <Col as="aside" md="4">
7007 stevensc 170
            <FiltersSidebar>
7011 stevensc 171
              <CategoryFilter onChange={changeCategory} />
7007 stevensc 172
              <LocationFilter onChange={getAddressHandler} />
173
            </FiltersSidebar>
7003 stevensc 174
          </Col>
175
          <Col as="section" md="8">
176
            <div className="posts-section">
177
              {loading && <Spinner />}
178
              {entities.length ? (
179
                entities.map((entity) => (
180
                  <SearchItem
181
                    key={entity.id}
182
                    onChangePage={onChangePageHandler}
183
                    {...entity}
184
                  />
185
                ))
186
              ) : (
187
                <EmptySection message="No hay resultados" />
188
              )}
189
            </div>
190
            <PaginationComponent
191
              pages={pages}
192
              currentActivePage={currentPage}
193
              onChangePage={loadEntities}
194
              isRow
195
            />
196
          </Col>
197
        </Row>
7002 stevensc 198
      </Container>
199
    </>
200
  )
201
}
202
 
203
export default SearchPage