Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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