Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 2275 | Rev 2458 | 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");
2275 stevensc 43
 
1018 stevensc 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">
2445 stevensc 193
              <form
194
                name="form-filter"
195
                id="form-filter"
196
                ref={formRef}
197
                onSubmit={(e) => {
198
                  e.preventDefault();
199
                }}
200
              >
201
                <h2 className="font-weight-bold search-title">Filtros</h2>
202
                <div className="filter-secs border-gray border-radius">
203
                  <div className="filter-heading m-0">
204
                    <h3 className="text-dark font-weight-bold">Buscar por</h3>
205
                  </div>
206
                  {/* <!--filter-heading end--> */}
207
                  <div className="paddy">
208
                    <div className="filter-dd">
209
                      <ul className="avail-checks avail-checks-search-type">
210
                        <li>
211
                          <a
212
                            href="#"
213
                            onClick={(e) => {
214
                              e.preventDefault;
215
                              setSearchType("user");
216
                            }}
217
                            className={(searchType && searchType === 'user' ? 'search-item-selected' : '') + ' text-dark'}
218
                          >
219
                            Personas
220
                          </a>
221
                        </li>
222
                        <li>
223
                          <a
224
                            className={(searchType && searchType === 'job' ? 'search-item-selected' : '') + ' text-dark'}
225
                            href="#"
226
                            onClick={(e) => {
227
                              e.preventDefault;
228
                              setSearchType("job");
229
                            }}
230
                          >
231
                            Trabajos
232
                          </a>
233
                        </li>
234
                        <li>
235
                          <a
236
                            className={(searchType && searchType === 'company' ? 'search-item-selected' : '') + ' text-dark'}
237
                            href="#"
238
                            onClick={(e) => {
239
                              e.preventDefault;
240
                              // searchType.current = "company";
241
                              setSearchType("company");
242
                            }}
243
                          >
244
                            Empresas
245
                          </a>
246
                        </li>
247
                        <li>
248
                          <a
249
                            className={(searchType && searchType === 'group' ? 'search-item-selected' : '') + ' text-dark'}
250
                            href="#"
251
                            onClick={(e) => {
252
                              e.preventDefault;
253
                              setSearchType("group");
254
                            }}
255
                          >
256
                            Grupos
257
                          </a>
258
                        </li>
259
                      </ul>
1 www 260
                    </div>
2445 stevensc 261
                  </div>
262
                </div>
263
                {/* <!--filter-secs end--> */}
2275 stevensc 264
 
2445 stevensc 265
                {/* <!--filter-heading end--> */}
266
                <Filters
267
                  filters={filters}
268
                  searchType={searchType}
269
                  onCheck={onCheckHandler}
270
                  onUncheckAll={onUncheckAllHandler}
271
                  register={register}
272
                />
273
 
274
                <div className="filter-secs border-gray border-radius">
275
                  <div className="filter-heading">
276
                    <h3 className="text-dark font-weight-bold">Ubicación</h3>
277
                  </div>
278
                  {/* <!--filter-heading end--> */}
279
                  <div
280
                    className="container mb-2"
281
                  >
282
                    <UbicationInput
283
                      onGetAddress={getAddressHandler}
284
                      placeholder="Buscar un lugar"
2275 stevensc 285
                    />
2445 stevensc 286
                  </div>
287
                </div>
288
              </form>
289
              <div className="main-ws-sec">
290
                <div className="posts-section">
291
                  {/* <!--post-bar end--> */}
292
                  {loading ? (
293
                    <SpinnerStyled>
294
                      <Spinner />
295
                    </SpinnerStyled>
296
                  ) : error ? (
297
                    <div>{error}</div>
298
                  ) : entities && entities.length ? (
299
                    entities.map((entity) => (
300
                      <EntityTemplate
301
                        entity={entity}
302
                        key={entity.id}
303
                        onChangePage={onChangePageHandler}
304
                      />
305
                    ))
306
                  ) : (
307
                    <div
308
                      style={{
309
                        display: "flex",
310
                        justifyContent: "center",
311
                        alignItems: "center",
312
                        padding: "1rem 0 3rem 0",
313
                      }}
314
                    >
315
                      No hay resultados
1 www 316
                    </div>
2445 stevensc 317
                  )}
1 www 318
                </div>
2445 stevensc 319
                <PaginationComponent
320
                  pages={pages}
321
                  currentActivePage={currentPage}
322
                  onChangePage={loadEntities}
323
                />
324
                {/* <div className="process-comm" id="paginator-process-comm">
1 www 325
                      <div className="spinner">
326
                        <div className="bounce1"></div>
327
                        <div className="bounce2"></div>
328
                        <div className="bounce3"></div>
329
                      </div>
330
                    </div> */}
2445 stevensc 331
                {/* <!--process-comm end-->
1 www 332
              <!--posts-section end--> */}
333
              </div>
2445 stevensc 334
              <div className="right-sidebar"></div>
1 www 335
            </div>
336
          </div>
337
        </div>
338
      </main>
339
    </div>
340
  );
341
};
342
 
343
export default MainSection;