|
@@ -9,6 +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 ZoomInIcon from '@mui/icons-material/ZoomIn';
|
|
13
|
+import ZoomOutIcon from '@mui/icons-material/ZoomOut';
|
12
|
14
|
import defaultImage from "../../assets/images/default.png";
|
13
|
15
|
import { Carousel } from 'react-responsive-carousel';
|
14
|
16
|
|
|
@@ -21,6 +23,7 @@ const ImageView = () => {
|
21
|
23
|
|
22
|
24
|
const [previewImage, setPreviewImage] = useState("");
|
23
|
25
|
const [isZoomed, setIsZoomed] = useState(false);
|
|
26
|
+ const [zoomSize, setZoomSize] = useState(100)
|
24
|
27
|
const [currentIndex, setCurrentIndex] = useState(0);
|
25
|
28
|
|
26
|
29
|
useEffect(() => {
|
|
@@ -43,6 +46,17 @@ const ImageView = () => {
|
43
|
46
|
setPreviewImage(product?.images[index]?.url)
|
44
|
47
|
};
|
45
|
48
|
|
|
49
|
+ const onZoomIn = () => {
|
|
50
|
+ if (zoomSize > 310) return
|
|
51
|
+ setZoomSize(zoomSize + 20)
|
|
52
|
+ }
|
|
53
|
+
|
|
54
|
+ const onZoomOut = () => {
|
|
55
|
+ if (zoomSize < 40) return
|
|
56
|
+ setZoomSize(zoomSize - 20)
|
|
57
|
+ }
|
|
58
|
+
|
|
59
|
+
|
46
|
60
|
return (
|
47
|
61
|
<Box sx={{ flexGrow: 1 }}>
|
48
|
62
|
<Grid container spacing={2}>
|
|
@@ -60,7 +74,15 @@ const ImageView = () => {
|
60
|
74
|
}}
|
61
|
75
|
>
|
62
|
76
|
|
63
|
|
- <Carousel showStatus={false} showIndicators={false} onClickItem={() => { handleZoomToggle() }} onChange={(index) => handleSlideChange(index)} selectedItem={currentIndex}>
|
|
77
|
+ <Carousel
|
|
78
|
+ showStatus={false}
|
|
79
|
+ showIndicators={false}
|
|
80
|
+ onClickItem={() => {
|
|
81
|
+ handleZoomToggle()
|
|
82
|
+ setZoomSize(100)
|
|
83
|
+ }}
|
|
84
|
+ onChange={(index) => handleSlideChange(index)}
|
|
85
|
+ selectedItem={currentIndex}>
|
64
|
86
|
{product?.images?.map(({ src, url }, index) => (
|
65
|
87
|
<Box
|
66
|
88
|
key={index}
|
|
@@ -106,7 +128,7 @@ const ImageView = () => {
|
106
|
128
|
setCurrentIndex(index)
|
107
|
129
|
}}
|
108
|
130
|
sx={{
|
109
|
|
- p:0.4,
|
|
131
|
+ p: 0.4,
|
110
|
132
|
borderRadius: 1,
|
111
|
133
|
backgroundColor: (previewImage == url) ? "#95AAC5" : "none"
|
112
|
134
|
}}
|
|
@@ -128,12 +150,13 @@ const ImageView = () => {
|
128
|
150
|
</Grid>
|
129
|
151
|
|
130
|
152
|
{/* Zoom Dialog */}
|
131
|
|
- <Dialog open={isZoomed} onClose={handleZoomToggle} maxWidth="lg">
|
|
153
|
+ <Dialog fullScreen open={isZoomed} onClose={handleZoomToggle} maxWidth="lg">
|
132
|
154
|
<DialogContent
|
133
|
155
|
sx={{
|
134
|
156
|
position: "relative",
|
135
|
157
|
overflow: "hidden", // Prevent scrolling on DialogContent
|
136
|
158
|
height: "90vh", // Adjust height as needed
|
|
159
|
+ p: 0
|
137
|
160
|
}}
|
138
|
161
|
>
|
139
|
162
|
{/* Fixed position close button */}
|
|
@@ -143,7 +166,11 @@ const ImageView = () => {
|
143
|
166
|
height: 50,
|
144
|
167
|
position: "absolute",
|
145
|
168
|
top: 10,
|
146
|
|
- right: 1.5,
|
|
169
|
+ right: {
|
|
170
|
+ xs: 1.5,
|
|
171
|
+ sm: 1.5,
|
|
172
|
+ md: 10
|
|
173
|
+ },
|
147
|
174
|
zIndex: 2, // Ensure it stays above other content
|
148
|
175
|
}}
|
149
|
176
|
>
|
|
@@ -159,6 +186,32 @@ const ImageView = () => {
|
159
|
186
|
>
|
160
|
187
|
<CloseIcon />
|
161
|
188
|
</IconButton>
|
|
189
|
+ <IconButton
|
|
190
|
+ onClick={onZoomIn}
|
|
191
|
+ sx={{
|
|
192
|
+ backgroundColor: "white",
|
|
193
|
+ color: "black",
|
|
194
|
+ mt: 1,
|
|
195
|
+ "&:hover": {
|
|
196
|
+ backgroundColor: "lightgray",
|
|
197
|
+ },
|
|
198
|
+ }}
|
|
199
|
+ >
|
|
200
|
+ <ZoomInIcon />
|
|
201
|
+ </IconButton>
|
|
202
|
+ <IconButton
|
|
203
|
+ onClick={onZoomOut}
|
|
204
|
+ sx={{
|
|
205
|
+ backgroundColor: "white",
|
|
206
|
+ color: "black",
|
|
207
|
+ mt: 1,
|
|
208
|
+ "&:hover": {
|
|
209
|
+ backgroundColor: "lightgray",
|
|
210
|
+ },
|
|
211
|
+ }}
|
|
212
|
+ >
|
|
213
|
+ <ZoomOutIcon />
|
|
214
|
+ </IconButton>
|
162
|
215
|
</Box>
|
163
|
216
|
|
164
|
217
|
{/* Scrollable content */}
|
|
@@ -166,13 +219,15 @@ const ImageView = () => {
|
166
|
219
|
sx={{
|
167
|
220
|
overflow: "auto", // Allow scrolling within this Box
|
168
|
221
|
height: "100%", // Fill available height of DialogContent
|
|
222
|
+ display: "flex"
|
169
|
223
|
}}
|
170
|
224
|
>
|
171
|
225
|
<img
|
172
|
226
|
src={previewImage || defaultImage}
|
173
|
227
|
alt="Zoomed Preview"
|
174
|
228
|
style={{
|
175
|
|
- width: "100%",
|
|
229
|
+ width: `${zoomSize}%`,
|
|
230
|
+ margin: "auto auto",
|
176
|
231
|
height: "auto",
|
177
|
232
|
}}
|
178
|
233
|
/>
|