Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5391 | Rev 5393 | 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
5392 stevensc 180
        className='filter-form'
5388 stevensc 181
        ref={formRef}
5390 stevensc 182
        onSubmit={(e) => e.preventDefault()}
5388 stevensc 183
      >
184
        <div className="py-2 d-flex" style={{ gap: '10px' }}>
185
          <h2 className="font-weight-bold search-title">Filtros</h2>
186
          <div className="show_filters">
5390 stevensc 187
            {displayFilters
188
              ? <FaMinus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />
189
              : <FaPlus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />}
5388 stevensc 190
          </div>
191
        </div>
5390 stevensc 192
 
193
        <div className={`filter-secs ${displayFilters ? 'show_filters' : 'hidden_filters'}`}>
194
          <div className="filter-heading">
195
            <h3>Buscar por</h3>
5388 stevensc 196
          </div>
5391 stevensc 197
          <ul className="avail-checks">
5390 stevensc 198
            <li>
199
              <a
200
                href="#"
201
                onClick={(e) => {
202
                  e.preventDefault
203
                  setSearchType('user')
204
                }}
205
                className={(searchType && searchType === 'user' ? 'search-item-selected' : '') + ' text-dark'}
206
              >
207
                Personas
208
              </a>
209
            </li>
210
            {filters.allowSearchCompany &&
211
              <li>
212
                <a
213
                  className={(searchType && searchType === 'job' ? 'search-item-selected' : '') + ' text-dark'}
214
                  href="#"
215
                  onClick={(e) => {
216
                    e.preventDefault
217
                    setSearchType('job')
218
                  }}
219
                >
220
                  Trabajos
221
                </a>
222
              </li>
223
            }
224
            {filters.allowSearchCompany &&
225
              <li>
226
                <a
227
                  className={(searchType && searchType === 'company' ? 'search-item-selected' : '') + ' text-dark'}
228
                  href="#"
229
                  onClick={(e) => {
230
                    e.preventDefault
231
                    // searchType.current = "company";
232
                    setSearchType('company')
233
                  }}
234
                >
235
                  Empresas
236
                </a>
237
              </li>
238
            }
239
            <li>
240
              <a
241
                className={(searchType && searchType === 'group' ? 'search-item-selected' : '') + ' text-dark'}
242
                href="#"
243
                onClick={(e) => {
244
                  e.preventDefault
245
                  setSearchType('group')
246
                }}
247
              >
248
                Grupos
249
              </a>
250
            </li>
251
          </ul>
1 www 252
        </div>
5390 stevensc 253
 
5392 stevensc 254
        {(searchType === 'user' && filters.allowViewConnectionLevelFilter) &&
255
          <div className={displayFilters ? 'show_filters' : 'hidden_filters'}>
5388 stevensc 256
            <Filters
257
              filters={filters}
258
              searchType={searchType}
259
              onCheck={onCheckHandler}
260
              onUncheckAll={onUncheckAllHandler}
261
              register={register}
262
            />
5392 stevensc 263
          </div>
264
        }
5390 stevensc 265
 
266
        <div className={`filter-secs ${displayFilters ? 'show_filters' : 'hidden_filters'}`}>
5388 stevensc 267
          <div className="filter-heading">
5390 stevensc 268
            <h3>Ubicación</h3>
5388 stevensc 269
          </div>
5390 stevensc 270
          <UbicationInput
271
            onGetAddress={getAddressHandler}
272
            placeholder="Buscar un lugar"
273
          />
5388 stevensc 274
        </div>
5390 stevensc 275
 
5388 stevensc 276
      </form>
277
      <div className="main-ws-sec">
278
        <div className="posts-section">
279
          {loading && <Spinner />}
280
          {entities.length
281
            ? entities.map((entity) => (
5390 stevensc 282
              <EntityTemplate
283
                entity={entity}
284
                key={entity.id}
285
                onChangePage={onChangePageHandler}
286
              />
5388 stevensc 287
            ))
288
            : <EmptySection message='No hay resultados' />
289
          }
290
        </div>
291
        <PaginationComponent
292
          pages={pages}
293
          currentActivePage={currentPage}
294
          onChangePage={loadEntities}
295
        />
296
      </div>
297
      <div className="right-sidebar" />
298
    </main>
5122 stevensc 299
  )
300
}
1 www 301
 
5122 stevensc 302
export default MainSection