1- import { useEffect , useRef , useState } from 'react' ;
1+ import { useRef , useState } from 'react' ;
22import Swiper from 'swiper' ;
3- import { Navigation , A11y } from 'swiper/modules' ;
43import 'swiper/css' ;
54import 'swiper/css/navigation' ;
5+ import PreviewSlider from './Slider/PreviewSlider'
6+ import FullscreenSlider from './Slider/FullscreenSlider'
67
78interface Props {
89 images : string [ ] ;
@@ -12,65 +13,10 @@ export default function FullscreenSliderModal({ images }: Props) {
1213 const [ isFullscreen , setIsFullscreen ] = useState ( false ) ;
1314 const previewSwiperRef = useRef < HTMLDivElement > ( null ) ;
1415 const fullscreenSwiperRef = useRef < HTMLDivElement > ( null ) ;
15- const nextButtonRef = useRef < HTMLDivElement > ( null ) ;
16- const prevButtonRef = useRef < HTMLDivElement > ( null ) ;
17- const fullNextButtonRef = useRef < HTMLDivElement > ( null ) ;
18- const fullPrevButtonRef = useRef < HTMLDivElement > ( null ) ;
1916
2017 const [ previewSwiper , setPreviewSwiper ] = useState < Swiper | null > ( null ) ;
2118 const [ fullscreenSwiper , setFullscreenSwiper ] = useState < Swiper | null > ( null ) ;
2219
23- useEffect ( ( ) => {
24- if ( previewSwiperRef . current ) {
25- const swiper = new Swiper ( previewSwiperRef . current , {
26- modules : [ Navigation , A11y ] ,
27- slidesPerView : 1 ,
28- spaceBetween : 20 ,
29- navigation : {
30- nextEl : nextButtonRef . current ,
31- prevEl : prevButtonRef . current ,
32- } ,
33- loop : true ,
34- a11y : {
35- prevSlideMessage : 'Previous slide' ,
36- nextSlideMessage : 'Next slide' ,
37- } ,
38- } ) ;
39- setPreviewSwiper ( swiper ) ;
40- return ( ) => swiper . destroy ( ) ;
41- }
42- } , [ ] ) ;
43-
44- useEffect ( ( ) => {
45- if ( isFullscreen && fullscreenSwiperRef . current ) {
46- const swiper = new Swiper ( fullscreenSwiperRef . current , {
47- modules : [ Navigation , A11y ] ,
48- slidesPerView : 1 ,
49- navigation : {
50- nextEl : fullNextButtonRef . current ,
51- prevEl : fullPrevButtonRef . current ,
52- } ,
53- loop : true ,
54- a11y : {
55- prevSlideMessage : 'Previous slide' ,
56- nextSlideMessage : 'Next slide' ,
57- } ,
58- } ) ;
59-
60- if ( previewSwiper ) {
61- swiper . slideTo ( previewSwiper . realIndex ) ;
62- }
63-
64- setFullscreenSwiper ( swiper ) ;
65- document . body . style . overflow = 'hidden' ;
66-
67- return ( ) => {
68- swiper . destroy ( ) ;
69- document . body . style . overflow = 'auto' ;
70- } ;
71- }
72- } , [ isFullscreen , previewSwiper ] ) ;
73-
7420 const openFullscreen = ( ) => {
7521 setIsFullscreen ( true ) ;
7622 } ;
@@ -85,61 +31,21 @@ export default function FullscreenSliderModal({ images }: Props) {
8531
8632 return (
8733 < >
88- < div className = "relative mt-8" >
89- < button
90- onClick = { openFullscreen }
91- className = "absolute top-4 right-4 bg-black/70 text-white px-3 py-1 rounded text-sm flex items-center gap-1 z-10"
92- aria-label = "View in fullscreen"
93- >
94- Fullscreen
95- </ button >
96- < div className = "swiper" ref = { previewSwiperRef } >
97- < div className = "swiper-wrapper" >
98- { images . map ( ( image , index ) => (
99- < div key = { `preview-${ index } ` } className = "swiper-slide" >
100- < img
101- src = { image }
102- alt = { `Preview ${ index + 1 } ` }
103- className = "w-full h-auto object-contain rounded-lg cursor-zoom-in"
104- loading = "lazy"
105- onClick = { openFullscreen }
106- />
107- </ div >
108- ) ) }
109- </ div >
110- < div ref = { prevButtonRef } className = "swiper-button-prev" > </ div >
111- < div ref = { nextButtonRef } className = "swiper-button-next" > </ div >
112- </ div >
113- </ div >
114-
115- { isFullscreen && (
116- < div className = "fixed inset-0 bg-black/70 z-50 p-4 w-full h-full" >
117- < button
118- className = "absolute top-4 right-4 text-center text-white z-10 hover:cursor-pointer text-2xl rounded-full"
119- onClick = { closeFullscreen }
120- aria-label = "Close fullscreen"
121- >
122- ×
123- </ button >
124-
125- < div className = "flex justify-center items-center swiper w-full h-full" ref = { fullscreenSwiperRef } >
126- < div className = "swiper-wrapper" onClick = { closeFullscreen } >
127- { images . map ( ( image , index ) => (
128- < div key = { `full-${ index } ` } className = "swiper-slide" >
129- < img
130- src = { image }
131- alt = { `Slide ${ index + 1 } ` }
132- className = "w-full h-full object-contain"
133- loading = "lazy"
134- />
135- </ div >
136- ) ) }
137- </ div >
138- < div ref = { fullPrevButtonRef } className = "swiper-button-prev text-white" > </ div >
139- < div ref = { fullNextButtonRef } className = "swiper-button-next text-white" > </ div >
140- </ div >
141- </ div >
142- ) }
34+ < PreviewSlider
35+ images = { images }
36+ setPreviewSwiper = { setPreviewSwiper }
37+ handleOnFullscreenClick = { openFullscreen }
38+ previewSwiperRef = { previewSwiperRef }
39+ />
40+
41+ < FullscreenSlider
42+ images = { images }
43+ fullscreenSwiperRef = { fullscreenSwiperRef }
44+ handleCloseFullscreen = { closeFullscreen }
45+ isFullscreen = { isFullscreen }
46+ previewSwiper = { previewSwiper }
47+ setFullscreenSwiper = { setFullscreenSwiper }
48+ />
14349 </ >
14450 ) ;
14551}
0 commit comments