Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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