Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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