source: frontend/src/screens/CategoryScreen.js@ 113029b

Last change on this file since 113029b was 113029b, checked in by Nace Gjorgjievski <nace.gorgievski123@…>, 21 months ago

Prototype

  • Property mode set to 100644
File size: 13.3 KB
Line 
1import React, { useEffect, useReducer } from "react";
2import "../styles/Home.css";
3// import data from "./data";
4import Product from "../components/Product";
5import axios from "axios";
6import { Helmet } from "react-helmet-async";
7import { getError } from "../components/utils";
8import { useLocation, useNavigate, useParams } from "react-router-dom";
9import Form from "react-bootstrap/Form";
10import Button from "react-bootstrap/Button";
11import LinkContainer from "react-router-bootstrap/LinkContainer";
12
13const reducer = (state, action) => {
14 switch (action.type) {
15 case "FETCH_REQUEST":
16 return { ...state, loading: true };
17 case "FETCH_SUCCESS":
18 return {
19 ...state,
20 products: action.payload.products,
21 page: action.payload.page,
22 pages: action.payload.pages,
23 countProducts: action.payload.countProducts,
24 loading: false,
25 };
26 case "FETCH_FAIL":
27 return { ...state, loading: false, error: action.payload };
28 default:
29 return state;
30 }
31};
32
33function Home() {
34 const params = useParams();
35 const { category, subCategory } = params;
36 const navigate = useNavigate();
37 const { search } = useLocation();
38 const sp = new URLSearchParams(search);
39 //const category = sp.get("category") || "all";
40 const query = sp.get("query") || "all";
41 //const subCategory = sp.get("subCategory") || "all";
42 //const name = sp.get("name") || "all";
43 const order = sp.get("order") || "newest";
44 const page = sp.get("page") || 1;
45
46 const [{ loading, error, products, pages, countProducts }, dispatch] =
47 useReducer(reducer, { loading: true, error: "" });
48
49 useEffect(() => {
50 const fetchData = async () => {
51 try {
52 dispatch({ type: "FETCH_REQUEST" });
53 /*
54 const { data } = await axios.get(
55 `/api/products/search?page=${page}&query=${query}&category=${category}&subCategory=${subCategory}&order=${order}`
56 );*/
57 const { data } = await axios.get(
58 `/api/products?page=${page}&query=${query}&category=${category}&subCategory=${subCategory}&order=${order}`
59 );
60 dispatch({ type: "FETCH_SUCCESS", payload: data });
61 } catch (err) {
62 dispatch({ type: "FETCH_FAIL", payload: getError(err) });
63 }
64 };
65 fetchData();
66 }, [category, page, query, order, subCategory, error]);
67
68 const getFilterUrl = (filter) => {
69 const filterPage = filter.page || page;
70 const filterCategorry = filter.category || category;
71 const filterQuery = filter.query || query;
72 const filterSubCategory = filter.subCategory || subCategory;
73 const sortOrder = filter.order || order;
74 return `?category=${filterCategorry}&query=${filterQuery}&subCategory=${filterSubCategory}&page=${filterPage}&order=${sortOrder}`;
75 };
76
77 return (
78 <div style={{ width: "100%" }}>
79 <Helmet>
80 <title>MebelCity</title>
81 </Helmet>
82
83 <div className="most-popular-products">
84 {loading ? (
85 <div>Loading...</div>
86 ) : error ? (
87 <div>{error}</div>
88 ) : (
89 <div style={{ width: "100%" }}>
90 {category === "kancelarija" ? (
91 <h1 style={{ textAlign: "center", marginTop: "10px" }}>
92 Канцеларија
93 </h1>
94 ) : category === "dnevna" ? (
95 <h1 style={{ textAlign: "center", marginTop: "10px" }}>Дневна</h1>
96 ) : category === "spalna" ? (
97 <h1 style={{ textAlign: "center", marginTop: "10px" }}>Спална</h1>
98 ) : category === "hodnik" ? (
99 <h1 style={{ textAlign: "center", marginTop: "10px" }}>Ходник</h1>
100 ) : category === "kujna" ? (
101 <h1 style={{ textAlign: "center", marginTop: "10px" }}>Кујна</h1>
102 ) : category === "gradina" ? (
103 <h1 style={{ textAlign: "center", marginTop: "10px" }}>
104 Градина
105 </h1>
106 ) : category === "trpezarija" ? (
107 <h1 style={{ textAlign: "center", marginTop: "10px" }}>
108 Трпезарија
109 </h1>
110 ) : (
111 <h1 style={{ textAlign: "center", marginTop: "10px" }}>
112 Детска соба
113 </h1>
114 )}
115
116 <div
117 style={{
118 width: "100%",
119 display: "flex",
120 justifyContent: "space-evenly",
121 alignItems: "center",
122 marginTop: "20px",
123 }}
124 >
125 <Form
126 style={{
127 width: "100%",
128 display: "flex",
129 justifyContent: "end",
130 marginRight: "40px",
131 alignItems: "center",
132 }}
133 >
134 {/*}
135 <Form.Group>
136 <Form.Select
137 value={subCategory}
138 onChange={(e) => {
139 navigate(
140 getFilterUrl({ subCategory: e.target.value, page: 1 })
141 );
142 }}
143 >
144 <option value="all">Подкатегорија</option>
145
146 {category === "dnevna" && (
147 <option value="agolni-garnituri">Аголни Гарнитури</option>
148 )}
149 {category === "dnevna" && (
150 <option value="sofi">Софи</option>
151 )}
152 {category === "dnevna" && (
153 <option value="fotelji">Фотелји</option>
154 )}
155 {category === "dnevna" && (
156 <option value="taburetki">Табуретки</option>
157 )}
158 {category === "dnevna" && (
159 <option value="klub-masi">Клуб маси</option>
160 )}
161 {category === "dnevna" && (
162 <option value="tv-komodi">ТВ комоди</option>
163 )}
164 {category === "dnevna" && (
165 <option value="komodi">Комоди</option>
166 )}
167 {category === "spalna" && (
168 <option value="spalni-kompleti">Спални Комплети</option>
169 )}
170 {category === "spalna" && (
171 <option value="lezai">Лежаи</option>
172 )}
173 {category === "spalna" && (
174 <option value="kreveti">Кревети</option>
175 )}
176 {category === "spalna" && (
177 <option value="plakari">Плакари</option>
178 )}
179 {category === "spalna" && (
180 <option value="nokni-skafcinja">Ноќни шкафчиња</option>
181 )}
182 {category === "spalna" && (
183 <option value="toaletni-masi">Тоалетни маси</option>
184 )}
185 {category === "kancelarija" && (
186 <option value="biroa">Бироа</option>
187 )}
188 {category === "kancelarija" && (
189 <option value="kancelariski-stolovi">
190 Канцелариски столови
191 </option>
192 )}
193 {category === "kancelarija" && (
194 <option value="gejmerski-stolovi">
195 Гејмерски столови
196 </option>
197 )}
198 {category === "kancelarija" && (
199 <option value="kancelariski-skafovi">
200 Канцелариски шкафови
201 </option>
202 )}
203 {category === "hodnik" && (
204 <option value="skafovi-za-cevli">Шкафови за чевли</option>
205 )}
206 {category === "hodnik" && (
207 <option value="zakacalki-i-ogledala">
208 Закачалки и огледала
209 </option>
210 )}
211 {category === "hodnik" && (
212 <option value="kolekcii-za-hodnik">
213 Колекции за ходник
214 </option>
215 )}
216 {category === "gradina" && (
217 <option value="gradinarski-kompleti">
218 Градинарски комплети
219 </option>
220 )}
221 {category === "gradina" && (
222 <option value="gradinarski-lulki">
223 Градинарски лулки
224 </option>
225 )}
226 {category === "gradina" && (
227 <option value="gradinarski-cadori">
228 Градинарски чадори
229 </option>
230 )}
231 {category === "gradina" && (
232 <option value="gradinarski-masi">Градинарски маси</option>
233 )}
234 {category === "gradina" && (
235 <option value="gradinarski-stolovi">
236 Градинарски столови
237 </option>
238 )}
239 {category === "gradina" && (
240 <option value="gradinarsko-osvetluvanje">
241 Градинарско осветлување
242 </option>
243 )}
244 {category === "trpezarija" && (
245 <option value="trpezariski-masi">Трпезариски маси</option>
246 )}
247 {category === "trpezarija" && (
248 <option value="trpezariski-stolovi">
249 Трпезариски столови
250 </option>
251 )}
252 {category === "trpezarija" && (
253 <option value="kujnski-garnituri">
254 Кујнски гарнитури
255 </option>
256 )}
257 {category === "trpezarija" && (
258 <option value="bar-stolovi-i-masi">
259 Бар столови и маси
260 </option>
261 )}
262 {category === "kujna" && (
263 <option value="kujnski-agolni-garnituri">
264 Кујнски аголни гарнитури
265 </option>
266 )}
267 {category === "kujna" && (
268 <option value="standardni-kujni">Стандардни кујни</option>
269 )}
270 {category === "detska" && (
271 <option value="kolekcii-za-detska-soba">
272 Колекции за детска соба
273 </option>
274 )}
275 {category === "detska" && (
276 <option value="detski-biroa">Детски бироа</option>
277 )}
278 {category === "detska" && (
279 <option value="detski-lezai">Детски лежаи</option>
280 )}
281 </Form.Select>
282 </Form.Group>*/}
283 <Form.Group>
284 <Form.Select
285 id="sortOrder"
286 onChange={(e) => {
287 navigate(getFilterUrl({ order: e.target.value }));
288 }}
289 >
290 <option value={"newest"}>Сортирај по цена</option>
291 <option value={"lowFirst"}>Од ниска кон висока</option>
292 <option value={"highFirst"}>Од висока кон ниска</option>
293 </Form.Select>
294 </Form.Group>
295 </Form>
296 </div>
297 <div
298 style={{
299 display: "flex",
300 flexWrap: "wrap",
301 justifyContent: "space-evenly",
302 alignItems: "center",
303 marginTop: "10px",
304 }}
305 >
306 {products.map((product) => (
307 <Product key={product.slug} product={product} />
308 ))}
309 </div>
310 <div
311 style={{
312 marginTop: "20px",
313 display: "flex",
314 justifyContent: "center",
315 alignItems: "center",
316 }}
317 >
318 {[...Array(pages).keys()].map((x) => (
319 <LinkContainer
320 key={x + 1}
321 className="mx-1"
322 to={getFilterUrl({ page: x + 1 })}
323 >
324 <Button
325 className={Number(page) === x + 1 ? "text-bold" : ""}
326 variant={Number(page) === x + 1 ? "danger" : "light"}
327 >
328 {x + 1}
329 </Button>
330 </LinkContainer>
331 ))}
332 </div>
333 </div>
334 )}
335 </div>
336 </div>
337 );
338}
339
340export default Home;
Note: See TracBrowser for help on using the repository browser.