Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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