@@ -5,6 +5,7 @@ import ArrowRight from '@/svgs/arrow-right-line.svg'
5
5
import styles from './carousel.module.css'
6
6
import { useShowModal } from './modal'
7
7
import { Dropdown } from 'react-bootstrap'
8
+ import { useRouter } from 'next/router'
8
9
9
10
function useSwiping ( { moveLeft, moveRight } ) {
10
11
const [ touchStartX , setTouchStartX ] = useState ( null )
@@ -114,17 +115,29 @@ function CarouselOverflow ({ originalSrc, rel }) {
114
115
export function CarouselProvider ( { children } ) {
115
116
const media = useRef ( new Map ( ) )
116
117
const showModal = useShowModal ( )
118
+ const router = useRouter ( )
119
+ const isCarouselOpenRef = useRef ( false )
117
120
118
- const showCarousel = useCallback ( ( { src } ) => {
121
+ const showCarousel = useCallback ( async ( { src } ) => {
119
122
// only show confirmed entries
120
123
const confirmedEntries = Array . from ( media . current . entries ( ) )
121
124
. filter ( ( [ , entry ] ) => entry . confirmed )
122
125
126
+ const index = confirmedEntries . findIndex ( ( [ key ] ) => key === src )
127
+ const { nodata, ...rest } = router . query
128
+ const query = { ...rest , imageId : String ( index >= 0 ? index : 0 ) }
129
+ await router . push ( { pathname : router . pathname , query } , undefined , { shallow : true } )
130
+ isCarouselOpenRef . current = true
123
131
showModal ( ( close , setOptions ) => {
124
132
return < Carousel close = { close } mediaArr = { confirmedEntries } src = { src } setOptions = { setOptions } />
125
133
} , {
126
134
fullScreen : true ,
127
- overflow : < CarouselOverflow { ...media . current . get ( src ) } />
135
+ overflow : < CarouselOverflow { ...media . current . get ( src ) } /> ,
136
+ onClose : async ( ) => {
137
+ const { imageId, nodata, ...rest } = router . query
138
+ isCarouselOpenRef . current = false
139
+ await router . replace ( { pathname : router . pathname , query : rest } , undefined , { shallow : true } )
140
+ }
128
141
} )
129
142
} , [ showModal ] )
130
143
@@ -144,6 +157,20 @@ export function CarouselProvider ({ children }) {
144
157
media . current . delete ( src )
145
158
} , [ ] )
146
159
160
+ useEffect ( ( ) => {
161
+ const { imageId } = router . query
162
+ if ( ! imageId || isCarouselOpenRef . current ) return
163
+
164
+ const confirmedEntries = Array . from ( media . current . entries ( ) )
165
+ . filter ( ( [ , entry ] ) => entry . confirmed )
166
+
167
+ const index = Number ( imageId )
168
+ if ( Number . isInteger ( index ) && index >= 0 && index < confirmedEntries . length ) {
169
+ const srcAtIndex = confirmedEntries [ index ] [ 0 ]
170
+ showCarousel ( { src : srcAtIndex } )
171
+ }
172
+ } , [ router . query . imageId , showCarousel ] )
173
+
147
174
const value = useMemo (
148
175
( ) => ( { showCarousel, addMedia, confirmMedia, removeMedia } ) ,
149
176
[ showCarousel , addMedia , confirmMedia , removeMedia ]
0 commit comments