Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
4845 stevensc 1
/* eslint-disable react/prop-types */
5388 stevensc 2
import React, { useState, useRef, useEffect } from 'react'
5122 stevensc 3
import { useLocation } from 'react-router-dom'
4
import { useForm } from 'react-hook-form'
5
import { FaPlus, FaMinus } from 'react-icons/fa'
6
import { axios, jsonToParams } from '../../../utils'
7
import Filters from './filters/Filters'
8
import Spinner from '../../../shared/loading-spinner/Spinner'
9
import EntityTemplate from '../entity-template/EntityTemplate'
10
import PaginationComponent from '../../../shared/pagination/PaginationComponent'
11
import UbicationInput from '../../../shared/ubication-input/UbicationInput'
5388 stevensc 12
import EmptySection from '../../../shared/empty-section/EmptySection'
1 www 13
 
14
const MainSection = (props) => {
15
  // states
5122 stevensc 16
  const [entities, setEntities] = useState([])
17
  const [loading, setLoading] = useState(true)
18
  const [displayFilters, setDisplayFilters] = useState(false)
19
  const [searchType, setSearchType] = useState('user')
20
  const [currentPage, setCurrentPage] = useState(1)
21
  const [pages, setPages] = useState(1)
1 www 22
  // refs
5122 stevensc 23
  const activeFilters = useRef([])
24
  const addressFilter = useRef([])
25
  const formRef = useRef()
1 www 26
  // useLocation
5122 stevensc 27
  const location = useLocation()
1 www 28
  // props destructuring
5122 stevensc 29
  const { filters } = props
1 www 30
  // react hook form
5122 stevensc 31
  const { register, setValue } = useForm()
1 www 32
 
33
  // getting keyword
5122 stevensc 34
  const locationParams = new URLSearchParams(location.search)
35
  const keyword = locationParams.get('keyword')
2275 stevensc 36
 
1018 stevensc 37
  useEffect(() => {
5122 stevensc 38
    loadEntities()
39
    formRef.current.reset()
40
    if (activeFilters.current.length) activeFilters.current = []
41
  }, [searchType, keyword])
1 www 42
 
43
  const onCheckHandler = (event, filterType) => {
5122 stevensc 44
    const checkBoxEl = event.target
1 www 45
    if (checkBoxEl.checked) {
46
      const newActiveFilters = [
47
        ...activeFilters.current,
5122 stevensc 48
        { name: checkBoxEl.name, value: 1, type: filterType }
49
      ]
50
      activeFilters.current = newActiveFilters
1 www 51
    } else {
52
      const newActiveFilters = activeFilters.current.filter(
53
        (activeFilter) => activeFilter.name !== checkBoxEl.name
5122 stevensc 54
      )
55
      activeFilters.current = newActiveFilters
1 www 56
    }
5122 stevensc 57
    loadEntities()
58
  }
1 www 59
 
60
  const onUncheckAllHandler = (event, filterType) => {
5122 stevensc 61
    event.preventDefault()
1 www 62
    const activeFiltersToDisable = activeFilters.current.filter(
63
      ({ type }) => type === filterType
5122 stevensc 64
    )
1 www 65
    activeFiltersToDisable.map(({ name }) => {
5122 stevensc 66
      setValue(name, '')
67
    })
1 www 68
 
69
    if (activeFilters.current.length) {
70
      const newActiveFilters = activeFilters.current.filter(
71
        ({ type }) => type !== filterType
5122 stevensc 72
      )
73
      activeFilters.current = newActiveFilters
74
      loadEntities()
1 www 75
    }
5122 stevensc 76
  }
1 www 77
 
78
  const loadEntities = async (page = 1) => {
5122 stevensc 79
    setLoading(true)
1 www 80
    setCurrentPage(page)
5122 stevensc 81
    const urlParams = {
1 www 82
      page,
83
      keyword
84
    }
85
    addressFilter.current.forEach(({ name, type }) => {
86
      urlParams[type] = name
5122 stevensc 87
    })
1 www 88
    activeFilters.current.forEach(({ name, value }) => {
89
      urlParams[name] = value
5122 stevensc 90
    })
1 www 91
    await axios
92
      .get(`/search/entity/${searchType}?${jsonToParams(urlParams)}`)
93
      .then((response) => {
5122 stevensc 94
        const responseData = response.data
1 www 95
        if (responseData.success) {
5122 stevensc 96
          setEntities(responseData.data.current.items)
97
          setPages(responseData.data.total.pages)
1 www 98
        }
5122 stevensc 99
      })
100
    setLoading(false)
101
  }
1 www 102
 
103
  const getAddressHandler = (addresObject) => {
5122 stevensc 104
    const { address_components } = addresObject
1 www 105
    if (address_components) {
5122 stevensc 106
      addressFilter.current = []
1 www 107
      address_components.map((address_component) => {
5122 stevensc 108
        const address_component_name = address_component.long_name
109
        const address_component_type = address_component.types[0]
1 www 110
        switch (address_component_type) {
5122 stevensc 111
          case 'route':
1 www 112
            addressFilter.current = [
113
              ...addressFilter.current,
5122 stevensc 114
              { type: 'route', name: address_component_name }
115
            ]
116
            break
117
          case 'sublocality':
1 www 118
            addressFilter.current = [
119
              ...addressFilter.current,
5122 stevensc 120
              { type: 'sublocality', name: address_component_name }
121
            ]
122
            break
123
          case 'locality':
1 www 124
            addressFilter.current = [
125
              ...addressFilter.current,
5122 stevensc 126
              { type: 'locality', name: address_component_name }
127
            ]
128
            break
129
          case 'administrative_area_level_2':
1 www 130
            addressFilter.current = [
131
              ...addressFilter.current,
132
              {
5122 stevensc 133
                type: 'administrative_area_level_2',
134
                name: address_component_name
135
              }
136
            ]
137
            break
138
          case 'administrative_area_level_1':
1 www 139
            addressFilter.current = [
140
              ...addressFilter.current,
141
              {
5122 stevensc 142
                type: 'administrative_area_level_1',
143
                name: address_component_name
144
              }
145
            ]
146
            break
147
          case 'country':
1 www 148
            addressFilter.current = [
149
              ...addressFilter.current,
5122 stevensc 150
              { type: 'country', name: address_component_name }
151
            ]
152
            break
153
          case 'postal_code':
1 www 154
            addressFilter.current = [
155
              ...addressFilter.current,
5122 stevensc 156
              { type: 'postal_code', name: address_component_name }
157
            ]
158
            break
1 www 159
          default:
5122 stevensc 160
            break
1 www 161
        }
5122 stevensc 162
      })
163
      loadEntities()
1 www 164
    } else {
165
      if (addressFilter.current.length) {
5122 stevensc 166
        addressFilter.current = []
167
        loadEntities()
1 www 168
      }
169
    }
5122 stevensc 170
  }
1 www 171
 
172
  const onChangePageHandler = (currentPage) => {
5122 stevensc 173
    setCurrentPage(currentPage)
174
  }
1 www 175
 
176
  return (
5388 stevensc 177
    <main className="main-section-data container">
178
      <form
179
        name="form-filter"
180
        id="form-filter"
181
        ref={formRef}
182
        onSubmit={(e) => {
183
          e.preventDefault()
184
        }}
185
      >
186
        <div className="py-2 d-flex" style={{ gap: '10px' }}>
187
          <h2 className="font-weight-bold search-title">Filtros</h2>
188
          <div className="show_filters">
189
            {
190
              displayFilters
191
                ? <FaMinus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />
192
                : <FaPlus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />
193
            }
194
          </div>
195
        </div>
196
        <div className={`filter-secs border-gray border-radius ${displayFilters ? 'show_filters' : 'hidden_filters'}`}>
197
          <div className="filter-heading m-0">
198
            <h3 className="text-dark font-weight-bold">Buscar por</h3>
199
          </div>
200
          <div className="paddy">
201
            <div className="filter-dd">
202
              <ul className="avail-checks avail-checks-search-type">
203
                <li>
204
                  <a
205
                    href="#"
206
                    onClick={(e) => {
207
                      e.preventDefault
208
                      setSearchType('user')
209
                    }}
210
                    className={(searchType && searchType === 'user' ? 'search-item-selected' : '') + ' text-dark'}
2445 stevensc 211
                  >
5388 stevensc 212
                    Personas
213
                  </a>
214
                </li>
215
                {filters.allowSearchCompany &&
216
                  <li>
217
                    <a
218
                      className={(searchType && searchType === 'job' ? 'search-item-selected' : '') + ' text-dark'}
219
                      href="#"
220
                      onClick={(e) => {
221
                        e.preventDefault
222
                        setSearchType('job')
2445 stevensc 223
                      }}
224
                    >
5388 stevensc 225
                      Trabajos
226
                    </a>
227
                  </li>
228
                }
229
                {filters.allowSearchCompany &&
230
                  <li>
231
                    <a
232
                      className={(searchType && searchType === 'company' ? 'search-item-selected' : '') + ' text-dark'}
233
                      href="#"
234
                      onClick={(e) => {
235
                        e.preventDefault
236
                        // searchType.current = "company";
237
                        setSearchType('company')
238
                      }}
239
                    >
240
                      Empresas
241
                    </a>
242
                  </li>
243
                }
244
                <li>
245
                  <a
246
                    className={(searchType && searchType === 'group' ? 'search-item-selected' : '') + ' text-dark'}
247
                    href="#"
248
                    onClick={(e) => {
249
                      e.preventDefault
250
                      setSearchType('group')
251
                    }}
252
                  >
253
                    Grupos
254
                  </a>
255
                </li>
256
              </ul>
1 www 257
            </div>
258
          </div>
259
        </div>
5388 stevensc 260
        <div className={displayFilters ? 'show_filters' : 'hidden_filters'}>
261
          {(searchType === 'user' && filters.allowViewConnectionLevelFilter) &&
262
            <Filters
263
              filters={filters}
264
              searchType={searchType}
265
              onCheck={onCheckHandler}
266
              onUncheckAll={onUncheckAllHandler}
267
              register={register}
268
            />
269
          }
270
        </div>
271
        <div className={`filter-secs border-gray border-radius ${displayFilters ? 'show_filters' : 'hidden_filters'}`}>
272
          <div className="filter-heading">
273
            <h3 className="text-dark font-weight-bold">Ubicación</h3>
274
          </div>
275
          <div
276
            className="container mb-2"
277
          >
278
            <UbicationInput
279
              onGetAddress={getAddressHandler}
280
              placeholder="Buscar un lugar"
281
            />
282
          </div>
283
        </div>
284
      </form>
285
      <div className="main-ws-sec">
286
        <div className="posts-section">
287
          {loading && <Spinner />}
288
          {entities.length
289
            ? entities.map((entity) => (
290
                <EntityTemplate
291
                  entity={entity}
292
                  key={entity.id}
293
                  onChangePage={onChangePageHandler}
294
                />
295
            ))
296
            : <EmptySection message='No hay resultados' />
297
          }
298
        </div>
299
        <PaginationComponent
300
          pages={pages}
301
          currentActivePage={currentPage}
302
          onChangePage={loadEntities}
303
        />
304
      </div>
305
      <div className="right-sidebar" />
306
    </main>
5122 stevensc 307
  )
308
}
1 www 309
 
5122 stevensc 310
export default MainSection