Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5388 stevensc 1
import React, { useState, useRef, useEffect } from 'react'
5122 stevensc 2
import { useLocation } from 'react-router-dom'
3
import { useForm } from 'react-hook-form'
4
import { axios, jsonToParams } from '../../../utils'
5
import Spinner from '../../../shared/loading-spinner/Spinner'
6
import EntityTemplate from '../entity-template/EntityTemplate'
7
import PaginationComponent from '../../../shared/pagination/PaginationComponent'
5388 stevensc 8
import EmptySection from '../../../shared/empty-section/EmptySection'
6363 stevensc 9
import FiltersSidebar from '../../components/FiltersSidebar'
1 www 10
 
6363 stevensc 11
const MainSection = ({ filters }) => {
5122 stevensc 12
  const [entities, setEntities] = useState([])
13
  const [loading, setLoading] = useState(true)
14
  const [searchType, setSearchType] = useState('user')
15
  const [currentPage, setCurrentPage] = useState(1)
16
  const [pages, setPages] = useState(1)
6363 stevensc 17
 
5122 stevensc 18
  const activeFilters = useRef([])
19
  const addressFilter = useRef([])
6363 stevensc 20
 
5122 stevensc 21
  const location = useLocation()
6363 stevensc 22
 
5122 stevensc 23
  const { register, setValue } = useForm()
1 www 24
 
25
  // getting keyword
5122 stevensc 26
  const locationParams = new URLSearchParams(location.search)
27
  const keyword = locationParams.get('keyword')
2275 stevensc 28
 
1018 stevensc 29
  useEffect(() => {
5122 stevensc 30
    loadEntities()
31
    if (activeFilters.current.length) activeFilters.current = []
32
  }, [searchType, keyword])
1 www 33
 
34
  const onCheckHandler = (event, filterType) => {
5122 stevensc 35
    const checkBoxEl = event.target
1 www 36
    if (checkBoxEl.checked) {
37
      const newActiveFilters = [
38
        ...activeFilters.current,
6363 stevensc 39
        { name: checkBoxEl.name, value: 1, type: filterType },
5122 stevensc 40
      ]
41
      activeFilters.current = newActiveFilters
1 www 42
    } else {
43
      const newActiveFilters = activeFilters.current.filter(
44
        (activeFilter) => activeFilter.name !== checkBoxEl.name
5122 stevensc 45
      )
46
      activeFilters.current = newActiveFilters
1 www 47
    }
5122 stevensc 48
    loadEntities()
49
  }
1 www 50
 
51
  const onUncheckAllHandler = (event, filterType) => {
5122 stevensc 52
    event.preventDefault()
1 www 53
    const activeFiltersToDisable = activeFilters.current.filter(
54
      ({ type }) => type === filterType
5122 stevensc 55
    )
1 www 56
    activeFiltersToDisable.map(({ name }) => {
5122 stevensc 57
      setValue(name, '')
58
    })
1 www 59
 
60
    if (activeFilters.current.length) {
61
      const newActiveFilters = activeFilters.current.filter(
62
        ({ type }) => type !== filterType
5122 stevensc 63
      )
64
      activeFilters.current = newActiveFilters
65
      loadEntities()
1 www 66
    }
5122 stevensc 67
  }
1 www 68
 
69
  const loadEntities = async (page = 1) => {
5122 stevensc 70
    setLoading(true)
1 www 71
    setCurrentPage(page)
5122 stevensc 72
    const urlParams = {
1 www 73
      page,
6363 stevensc 74
      keyword,
1 www 75
    }
76
    addressFilter.current.forEach(({ name, type }) => {
77
      urlParams[type] = name
5122 stevensc 78
    })
1 www 79
    activeFilters.current.forEach(({ name, value }) => {
80
      urlParams[name] = value
5122 stevensc 81
    })
1 www 82
    await axios
83
      .get(`/search/entity/${searchType}?${jsonToParams(urlParams)}`)
84
      .then((response) => {
5122 stevensc 85
        const responseData = response.data
1 www 86
        if (responseData.success) {
5122 stevensc 87
          setEntities(responseData.data.current.items)
88
          setPages(responseData.data.total.pages)
1 www 89
        }
5122 stevensc 90
      })
91
    setLoading(false)
92
  }
1 www 93
 
94
  const getAddressHandler = (addresObject) => {
5122 stevensc 95
    const { address_components } = addresObject
1 www 96
    if (address_components) {
5122 stevensc 97
      addressFilter.current = []
1 www 98
      address_components.map((address_component) => {
5122 stevensc 99
        const address_component_name = address_component.long_name
100
        const address_component_type = address_component.types[0]
1 www 101
        switch (address_component_type) {
5122 stevensc 102
          case 'route':
1 www 103
            addressFilter.current = [
104
              ...addressFilter.current,
6363 stevensc 105
              { type: 'route', name: address_component_name },
5122 stevensc 106
            ]
107
            break
108
          case 'sublocality':
1 www 109
            addressFilter.current = [
110
              ...addressFilter.current,
6363 stevensc 111
              { type: 'sublocality', name: address_component_name },
5122 stevensc 112
            ]
113
            break
114
          case 'locality':
1 www 115
            addressFilter.current = [
116
              ...addressFilter.current,
6363 stevensc 117
              { type: 'locality', name: address_component_name },
5122 stevensc 118
            ]
119
            break
120
          case 'administrative_area_level_2':
1 www 121
            addressFilter.current = [
122
              ...addressFilter.current,
123
              {
5122 stevensc 124
                type: 'administrative_area_level_2',
6363 stevensc 125
                name: address_component_name,
126
              },
5122 stevensc 127
            ]
128
            break
129
          case 'administrative_area_level_1':
1 www 130
            addressFilter.current = [
131
              ...addressFilter.current,
132
              {
5122 stevensc 133
                type: 'administrative_area_level_1',
6363 stevensc 134
                name: address_component_name,
135
              },
5122 stevensc 136
            ]
137
            break
138
          case 'country':
1 www 139
            addressFilter.current = [
140
              ...addressFilter.current,
6363 stevensc 141
              { type: 'country', name: address_component_name },
5122 stevensc 142
            ]
143
            break
144
          case 'postal_code':
1 www 145
            addressFilter.current = [
146
              ...addressFilter.current,
6363 stevensc 147
              { type: 'postal_code', name: address_component_name },
5122 stevensc 148
            ]
149
            break
1 www 150
          default:
5122 stevensc 151
            break
1 www 152
        }
5122 stevensc 153
      })
154
      loadEntities()
1 www 155
    } else {
156
      if (addressFilter.current.length) {
5122 stevensc 157
        addressFilter.current = []
158
        loadEntities()
1 www 159
      }
160
    }
5122 stevensc 161
  }
1 www 162
 
163
  const onChangePageHandler = (currentPage) => {
5122 stevensc 164
    setCurrentPage(currentPage)
165
  }
1 www 166
 
167
  return (
5389 stevensc 168
    <main className="main-section-data container px-0 mt-3">
6363 stevensc 169
      <FiltersSidebar
170
        filtersOptions={filters}
171
        getAddressHandler={getAddressHandler}
172
        onCheckHandler={onCheckHandler}
173
        onUncheckAllHandler={onUncheckAllHandler}
174
        filters={searchType}
175
        setFilters={(value) => setSearchType(value)}
176
        register={register}
177
      />
5388 stevensc 178
      <div className="main-ws-sec">
179
        <div className="posts-section">
180
          {loading && <Spinner />}
6363 stevensc 181
          {entities.length ? (
182
            entities.map((entity) => (
5390 stevensc 183
              <EntityTemplate
184
                entity={entity}
185
                key={entity.id}
186
                onChangePage={onChangePageHandler}
187
              />
5388 stevensc 188
            ))
6363 stevensc 189
          ) : (
190
            <EmptySection message="No hay resultados" />
191
          )}
5388 stevensc 192
        </div>
193
        <PaginationComponent
194
          pages={pages}
195
          currentActivePage={currentPage}
196
          onChangePage={loadEntities}
197
        />
198
      </div>
199
      <div className="right-sidebar" />
200
    </main>
5122 stevensc 201
  )
202
}
1 www 203
 
5122 stevensc 204
export default MainSection