@@ -10,31 +10,63 @@ export default function ImageViewer() {
1010 const [ images , setImages ] = useState < string [ ] > ( [ ] ) ;
1111 const [ index , setIndex ] = useState < number > ( 0 ) ;
1212
13- function updateImages ( event : CustomEventInit < ImageEvent > ) {
14- const { images, index } = event . detail as ImageEvent ;
15- setImages ( images ) ;
16- setIndex ( index ) ;
17- setVisible ( true ) ;
18- console . log ( event ) ;
19- }
20-
2113 useEffect ( ( ) => {
14+ function updateImages ( event : CustomEventInit < ImageEvent > ) {
15+ const { images, index } = event . detail as ImageEvent ;
16+ setImages ( images ) ;
17+ setIndex ( index ) ;
18+ setVisible ( true ) ;
19+ }
20+
21+ function keyPressed ( event : KeyboardEvent ) {
22+ if ( event . key === "Escape" ) {
23+ setVisible ( false ) ;
24+ }
25+ }
26+
2227 window . addEventListener ( "image-viewer" , updateImages ) ;
28+ window . addEventListener ( "keyup" , keyPressed ) ;
2329 return ( ) => {
2430 window . removeEventListener ( "image-viewer" , updateImages ) ;
31+ window . removeEventListener ( "keyup" , keyPressed ) ;
2532 } ;
2633 } , [ ] ) ;
2734
35+ useEffect ( ( ) => {
36+ document . body . style . overflow = visible ? "hidden" : "" ;
37+ } , [ visible ] ) ;
38+
39+ useEffect ( ( ) => {
40+ const target = document . querySelector ( `[data-image-index="${ index } "]` ) ;
41+ if ( target ) {
42+ target . scrollIntoView ( {
43+ behavior : "smooth" ,
44+ block : "nearest" ,
45+ inline : "center" ,
46+ } ) ;
47+ }
48+ } , [ index , images ] ) ;
49+
2850 return (
2951 < div
30- className = { `${ visible ? "fixed" : "hidden" } top-0 left-0 w-full h-full flex justify-center items-center bg-black/50 backdrop-blur` }
52+ className = { `${ visible ? "fixed" : "hidden" } top-0 left-0 w-full h-full bg-black/50 backdrop-blur` }
3153 onClick = { ( ) => setVisible ( false ) }
3254 >
33- < img
34- src = { images [ index ] }
35- alt = { `Big image ${ index + 1 } ` }
36- className = "max-h-3/5 max-w-3/5 shadow-xl rounded"
37- />
55+ < div className = "relative w-full h-full flex items-center gap-20 snap-x snap-mandatory overflow-x-auto px-2 md:px-10 lg:px-20" >
56+ { images . map ( ( image , i ) => (
57+ < div
58+ key = { i }
59+ className = "w-full h-full md:h-4/5 md:w-4/5 shrink-0 snap-center"
60+ data-image-index = { i }
61+ >
62+ < img
63+ src = { image }
64+ alt = { `Big image ${ i } ` }
65+ className = "w-full h-full object-contain shrink-0 shadow-xl rounded"
66+ />
67+ </ div >
68+ ) ) }
69+ </ div >
3870 </ div >
3971 ) ;
4072}
0 commit comments