Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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