Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3639 | Rev 4845 | 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
2460 stevensc 208
                        ? <FaMinus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />
209
                        : <FaPlus className="cursor-pointer" onClick={() => setDisplayFilters(!displayFilters)} />
2458 stevensc 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>
3907 stevensc 233
                        {filters.allowSearchCompany &&
234
                          <li>
235
                            <a
236
                              className={(searchType && searchType === 'job' ? 'search-item-selected' : '') + ' text-dark'}
237
                              href="#"
238
                              onClick={(e) => {
239
                                e.preventDefault;
240
                                setSearchType("job");
241
                              }}
242
                            >
243
                              Trabajos
244
                            </a>
245
                          </li>
246
                        }
247
                        {filters.allowSearchCompany &&
248
                          <li>
249
                            <a
250
                              className={(searchType && searchType === 'company' ? 'search-item-selected' : '') + ' text-dark'}
251
                              href="#"
252
                              onClick={(e) => {
253
                                e.preventDefault;
254
                                // searchType.current = "company";
255
                                setSearchType("company");
256
                              }}
257
                            >
258
                              Empresas
259
                            </a>
260
                          </li>
261
                        }
2445 stevensc 262
                        <li>
263
                          <a
264
                            className={(searchType && searchType === 'group' ? 'search-item-selected' : '') + ' text-dark'}
265
                            href="#"
266
                            onClick={(e) => {
267
                              e.preventDefault;
268
                              setSearchType("group");
269
                            }}
270
                          >
271
                            Grupos
272
                          </a>
273
                        </li>
274
                      </ul>
1 www 275
                    </div>
2445 stevensc 276
                  </div>
277
                </div>
2458 stevensc 278
                <div className={displayFilters ? 'show_filters' : 'hidden_filters'}>
279
                  <Filters
280
                    filters={filters}
281
                    searchType={searchType}
282
                    onCheck={onCheckHandler}
283
                    onUncheckAll={onUncheckAllHandler}
284
                    register={register}
285
                  />
286
                </div>
287
                <div className={`filter-secs border-gray border-radius ${displayFilters ? 'show_filters' : 'hidden_filters'}`}>
2445 stevensc 288
                  <div className="filter-heading">
289
                    <h3 className="text-dark font-weight-bold">Ubicación</h3>
290
                  </div>
291
                  <div
292
                    className="container mb-2"
293
                  >
294
                    <UbicationInput
295
                      onGetAddress={getAddressHandler}
296
                      placeholder="Buscar un lugar"
2275 stevensc 297
                    />
2445 stevensc 298
                  </div>
299
                </div>
300
              </form>
301
              <div className="main-ws-sec">
302
                <div className="posts-section">
303
                  {/* <!--post-bar end--> */}
304
                  {loading ? (
305
                    <SpinnerStyled>
306
                      <Spinner />
307
                    </SpinnerStyled>
308
                  ) : error ? (
309
                    <div>{error}</div>
310
                  ) : entities && entities.length ? (
311
                    entities.map((entity) => (
312
                      <EntityTemplate
313
                        entity={entity}
314
                        key={entity.id}
315
                        onChangePage={onChangePageHandler}
316
                      />
317
                    ))
318
                  ) : (
319
                    <div
320
                      style={{
321
                        display: "flex",
322
                        justifyContent: "center",
323
                        alignItems: "center",
324
                        padding: "1rem 0 3rem 0",
325
                      }}
326
                    >
327
                      No hay resultados
1 www 328
                    </div>
2445 stevensc 329
                  )}
1 www 330
                </div>
2445 stevensc 331
                <PaginationComponent
332
                  pages={pages}
333
                  currentActivePage={currentPage}
334
                  onChangePage={loadEntities}
335
                />
336
                {/* <div className="process-comm" id="paginator-process-comm">
1 www 337
                      <div className="spinner">
338
                        <div className="bounce1"></div>
339
                        <div className="bounce2"></div>
340
                        <div className="bounce3"></div>
341
                      </div>
342
                    </div> */}
2445 stevensc 343
                {/* <!--process-comm end-->
1 www 344
              <!--posts-section end--> */}
345
              </div>
2445 stevensc 346
              <div className="right-sidebar"></div>
1 www 347
            </div>
348
          </div>
349
        </div>
350
      </main>
351
    </div>
352
  );
353
};
354
 
355
export default MainSection;