source: frontend/src/screens/Home.js@ 16237c4

Last change on this file since 16237c4 was b612ab1, checked in by Nace Gjorgjievski <nace.gorgievski123@…>, 22 months ago

Basic functions added

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