Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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