source: frontend/src/screens/Home.js

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

Prototype

  • Property mode set to 100644
File size: 6.3 KB
Line 
1import React, { useEffect, useReducer, useState } from "react";
2import "../styles/Home.css";
3import Header from "../components/Header";
4import ImageSlider from "../components/ImageSlider";
5import image1 from "../Images/slideshow1.png";
6import image2 from "../Images/slideshow2.png";
7import image3 from "../Images/slideshow3.png";
8import icon1 from "../Images/icon1.svg";
9import icon2 from "../Images/icon2.svg";
10import icon3 from "../Images/icon3.svg";
11import Footer from "../components/Footer";
12// import data from "./data";
13import Product from "../components/Product";
14import axios from "axios";
15import { Helmet } from "react-helmet-async";
16import { useNavigate } from "react-router-dom";
17
18const reducer = (state, action) => {
19 switch (action.type) {
20 case "FETCH_REQUEST":
21 return { ...state, loading: true };
22 case "FETCH_SUCCESS":
23 return { ...state, products: action.payload, loading: false };
24 case "FETCH_FAIL":
25 return { ...state, loading: false, error: action.payload };
26 default:
27 return state;
28 }
29};
30
31function Home() {
32 const [{ loading, error, products }, dispatch] = useReducer(reducer, {
33 products: [],
34 loading: true,
35 error: "",
36 });
37 const navigate = useNavigate();
38 //const [products, setProducts] = useState([]);
39 useEffect(() => {
40 const fetchData = async () => {
41 dispatch({ type: "FETCH_REQUEST" });
42 try {
43 const result = await axios.get("/api/products");
44 dispatch({ type: "FETCH_SUCCESS", payload: result.data });
45 } catch (err) {
46 dispatch({ type: "FETCH_FAIL", payload: err.message });
47 }
48
49 //setProducts(result.data);
50 };
51 fetchData();
52 }, []);
53
54 const slides = [
55 { url: image1, title: "Shiping" },
56 { url: image2, title: "SchoolDiscount" },
57 { url: image3, title: "OfficeDiscount" },
58 ];
59
60 const clearActive = () => {
61 let icon1 = document.getElementById("icon1");
62 icon1.classList.remove("activeIcon");
63 let icon2 = document.getElementById("icon2");
64 icon2.classList.remove("activeIcon");
65 let icon3 = document.getElementById("icon3");
66 icon3.classList.remove("activeIcon");
67
68 let icon1Text = document.getElementById("icon1-text");
69 icon1Text.classList.remove("activeIcon");
70 let icon2Text = document.getElementById("icon2-text");
71 icon2Text.classList.remove("activeIcon");
72 let icon3Text = document.getElementById("icon3-text");
73 icon3Text.classList.remove("activeIcon");
74
75 let icon1Container = document.getElementById("1");
76 icon1Container.classList.remove("activeIconContainer");
77 let icon2Container = document.getElementById("2");
78 icon2Container.classList.remove("activeIconContainer");
79 let icon3Container = document.getElementById("3");
80 icon3Container.classList.remove("activeIconContainer");
81 };
82
83 const handleClick = (event) => {
84 let clickedIcon = document.getElementById("icon" + event.currentTarget.id);
85 let clickedIconText = document.getElementById(
86 "icon" + event.currentTarget.id + "-text"
87 );
88 clearActive();
89 clickedIcon.classList.add("activeIcon");
90 clickedIconText.classList.add("activeIcon");
91
92 let iconContainer = document.getElementById(event.currentTarget.id);
93 iconContainer.classList.add("activeIconContainer");
94
95 const icon1Text = "Бесплатна достава за нарачки над 1500 ден.";
96 const icon2Text =
97 "Ние можеме да го монтираме мебелот наместо Вас – брзо, лесно и чисто.";
98 const icon3Text = "Доставуваме над 1000 производи до 10 дена.";
99
100 let p = document.querySelector(".icon-description");
101 if (event.currentTarget.id === "1") p.textContent = icon1Text;
102 else if (event.currentTarget.id === "2") p.textContent = icon2Text;
103 else p.textContent = icon3Text;
104 };
105
106 return (
107 <div>
108 <Helmet>
109 <title>MebelCity</title>
110 </Helmet>
111 <Header />
112 <div className="sliderContainer">
113 <ImageSlider slides={slides} />
114 </div>
115 <div className="section">
116 <div className="iconWrapper">
117 <div
118 className="iconContainer activeIconContainer"
119 id="1"
120 onClick={handleClick}
121 >
122 <img
123 src={icon1}
124 alt="бесплатна достава"
125 className="icon activeIcon"
126 id="icon1"
127 />
128 <p className="icon-text activeIcon" id="icon1-text">
129 Бесплатна достава
130 </p>
131 </div>
132 <div className="iconContainer" id="2" onClick={handleClick}>
133 <img src={icon2} className="icon" alt="монтажа" id="icon2" />
134 <p className="icon-text" id="icon2-text">
135 Монтажа
136 </p>
137 </div>
138 <div className="iconContainer" onClick={handleClick} id="3">
139 <img src={icon3} alt="брза достава" className="icon" id="icon3" />
140 <p className="icon-text" id="icon3-text">
141 Брза достава
142 </p>
143 </div>
144 </div>
145 <div className="descriptionContainer">
146 <p className="icon-description">
147 Бесплатна достава за нарачки над 1500 ден.
148 </p>
149 </div>
150 </div>
151 <div className="grid-container">
152 <div
153 className="grid-item item1"
154 onClick={() => navigate("/products/dnevna/all")}
155 >
156 Дневна
157 </div>
158 <div className="grid-item item2">Ходник</div>
159 <div className="grid-item item3">Трпезарија</div>
160 <div className="grid-item item4">Спална</div>
161 <div className="grid-item item5">Кујна</div>
162 <div className="grid-item item6">Канцеларија</div>
163 <div className="grid-item item7">Детска соба</div>
164 <div className="grid-item item8">Мебел за градина</div>
165 </div>
166 <div className="most-popular-products">
167 {loading ? (
168 <div>Loading...</div>
169 ) : error ? (
170 <div>{error}</div>
171 ) : (
172 products.map((product) => (
173 <Product key={product.slug} product={product} />
174 ))
175 )}
176 </div>
177 <Footer />
178 </div>
179 );
180}
181
182export default Home;
Note: See TracBrowser for help on using the repository browser.