Browse Source

image carousel on product view

master
azri 3 weeks ago
parent
commit
6c1b8c2b79

+ 0
- 1
src/components/CarouselContainer/CarouselContainer.jsx View File

@@ -5,7 +5,6 @@ import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos";
5 5
 import mainImage1 from "../../assets/images/MAINHEADER-01.webp";
6 6
 import mainImage2 from "../../assets/images/MAINHEADER-02.webp";
7 7
 import mainImageMobile from "../../assets/images/mainwallpaper-mobile.jpg";
8
-import "react-responsive-carousel/lib/styles/carousel.min.css"; // requires a loader
9 8
 import { Carousel } from 'react-responsive-carousel';
10 9
 
11 10
 const CarouselContainer = () => {

+ 73
- 29
src/components/ImageView/ImageView.jsx View File

@@ -9,7 +9,8 @@ import {
9 9
 } from "@mui/material";
10 10
 import Grid from '@mui/material/Grid2';
11 11
 import CloseIcon from "@mui/icons-material/Close";
12
-import defaultImage from "../../assets/images/default.png"
12
+import defaultImage from "../../assets/images/default.png";
13
+import { Carousel } from 'react-responsive-carousel';
13 14
 
14 15
 // Utility function to check if an object is empty
15 16
 const isEmptyObject = (obj) => Object.keys(obj).length === 0 && obj.constructor === Object;
@@ -20,6 +21,7 @@ const ImageView = () => {
20 21
 
21 22
   const [previewImage, setPreviewImage] = useState("");
22 23
   const [isZoomed, setIsZoomed] = useState(false);
24
+  const [currentIndex, setCurrentIndex] = useState(0);
23 25
 
24 26
   useEffect(() => {
25 27
 
@@ -37,6 +39,10 @@ const ImageView = () => {
37 39
     setIsZoomed(!isZoomed);
38 40
   };
39 41
 
42
+  const handleSlideChange = (index) => {
43
+    setPreviewImage(product?.images[index]?.url)
44
+  };
45
+
40 46
   return (
41 47
     <Box sx={{ flexGrow: 1 }}>
42 48
       <Grid container spacing={2}>
@@ -46,24 +52,32 @@ const ImageView = () => {
46 52
             sx={{
47 53
               overflow: "hidden",
48 54
               cursor: "pointer",
55
+              px: {
56
+                xs: 0,
57
+                sm: 0,
58
+                md: 15
59
+              }
49 60
             }}
50
-            onClick={handleZoomToggle}
51 61
           >
52
-            <Box
53
-              src={previewImage || defaultImage}
54
-              component="img"
55
-              alt="Preview"
56
-              sx={{
57
-                width: {
58
-                  xs: "100%",
59
-                  sm: "100%",
60
-                  md: "70%"
61
-                },
62
-                height: "auto",
63
-                display: "block",
64
-                margin: "auto auto"
65
-              }}
66
-            />
62
+
63
+            <Carousel showStatus={false} showIndicators={false} onClickItem={() => { handleZoomToggle() }} onChange={(index) => handleSlideChange(index)} selectedItem={currentIndex}>
64
+              {product?.images?.map(({ src, url }, index) => (
65
+                <Box
66
+                  key={index}
67
+                  component="img"
68
+                  src={url}
69
+                  alt={`img_${index + 1}`}
70
+                  sx={{
71
+                    width: "100%",
72
+                    zIndex: 0,
73
+                    position: "relative",
74
+                    top: "50%",
75
+                    transform: "translateY(-50%)"
76
+                  }}
77
+                />
78
+              ))}
79
+            </Carousel>
80
+
67 81
           </Box>
68 82
         </Grid>
69 83
 
@@ -87,10 +101,14 @@ const ImageView = () => {
87 101
             {product?.images?.map(({ src, url }, index) => (
88 102
               <IconButton
89 103
                 key={index}
90
-                onClick={() => handleThumbnailClick(url)}
104
+                onClick={() => {
105
+                  handleThumbnailClick(url)
106
+                  setCurrentIndex(index)
107
+                }}
91 108
                 sx={{
92
-                  borderRadius: 2,
93
-                  overflow: "hidden",
109
+                  p:0.4,
110
+                  borderRadius: 1,
111
+                  backgroundColor: (previewImage == url) ? "#95AAC5" : "none"
94 112
                 }}
95 113
               >
96 114
                 <img
@@ -111,16 +129,24 @@ const ImageView = () => {
111 129
 
112 130
       {/* Zoom Dialog */}
113 131
       <Dialog open={isZoomed} onClose={handleZoomToggle} maxWidth="lg">
114
-        <DialogContent sx={{ position: "relative" }}>
115
-          <img
116
-            src={previewImage || defaultImage}
117
-            alt="Zoomed Preview"
118
-            style={{
119
-              width: "100%",
120
-              height: "auto",
132
+        <DialogContent
133
+          sx={{
134
+            position: "relative",
135
+            overflow: "hidden", // Prevent scrolling on DialogContent
136
+            height: "90vh", // Adjust height as needed
137
+          }}
138
+        >
139
+          {/* Fixed position close button */}
140
+          <Box
141
+            sx={{
142
+              width: 50,
143
+              height: 50,
144
+              position: "absolute",
145
+              top: 10,
146
+              right: 1.5,
147
+              zIndex: 2, // Ensure it stays above other content
121 148
             }}
122
-          />
123
-          <Box sx={{ width: 50, height: 50, position: "absolute", top: 10, right: 10 }}>
149
+          >
124 150
             <IconButton
125 151
               onClick={handleZoomToggle}
126 152
               sx={{
@@ -134,8 +160,26 @@ const ImageView = () => {
134 160
               <CloseIcon />
135 161
             </IconButton>
136 162
           </Box>
163
+
164
+          {/* Scrollable content */}
165
+          <Box
166
+            sx={{
167
+              overflow: "auto", // Allow scrolling within this Box
168
+              height: "100%", // Fill available height of DialogContent
169
+            }}
170
+          >
171
+            <img
172
+              src={previewImage || defaultImage}
173
+              alt="Zoomed Preview"
174
+              style={{
175
+                width: "100%",
176
+                height: "auto",
177
+              }}
178
+            />
179
+          </Box>
137 180
         </DialogContent>
138 181
       </Dialog>
182
+
139 183
     </Box>
140 184
   );
141 185
 };

+ 1
- 0
src/index.js View File

@@ -10,6 +10,7 @@ import 'swiper/css';
10 10
 import 'swiper/css/navigation';
11 11
 import 'swiper/css/pagination';
12 12
 import 'animate.css';
13
+import "react-responsive-carousel/lib/styles/carousel.min.css";
13 14
 import '@fontsource/roboto/300.css';
14 15
 import '@fontsource/roboto/400.css';
15 16
 import '@fontsource/roboto/500.css';

Loading…
Cancel
Save