UNPKG

react-vegas

Version:
138 lines (137 loc) 4.8 kB
import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react"; const useVegasState = (initialSlide, slides, loop, shuffle, isTransitioning, firstTransition, firstTransitionDuration, log, onWalk)=>{ const [currentSlide, setCurrentSlide] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(initialSlide); const [isPlaying, setIsPlaying] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(false); const [slideOrder, setSlideOrder] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)([]); const [currentOrderIndex, setCurrentOrderIndex] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(0); const [visibleSlides, setVisibleSlides] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)([ initialSlide ]); const [isFirstTransition, setIsFirstTransition] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(true); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ const order = Array.from({ length: slides.length }, (_, i)=>i); if (shuffle) { for(let i = order.length - 1; i > 0; i--){ const j = Math.floor(Math.random() * (i + 1)); [order[i], order[j]] = [ order[j], order[i] ]; } const initialSlideIndex = order[0]; setCurrentSlide(initialSlideIndex); setVisibleSlides([ initialSlideIndex ]); setCurrentOrderIndex(0); log("幻灯片随机排序完成:", order); if (firstTransition) { log(`设置第一个幻灯片的动画: ${firstTransition}`); slides[order[0]].transition = firstTransition; slides[order[0]].transitionDuration = firstTransitionDuration; } } else { setCurrentSlide(initialSlide); setVisibleSlides([ initialSlide ]); setCurrentOrderIndex(initialSlide); } setSlideOrder(order); }, []); const play = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ log("开始播放幻灯片"); setIsPlaying(true); }, []); const pause = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ log("暂停播放幻灯片"); setIsPlaying(false); }, []); const goTo = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((index)=>{ if (index >= 0 && index < slides.length && !isTransitioning) { log(`切换到幻灯片: ${index}`); setVisibleSlides([ index ]); setCurrentSlide(index); onWalk?.(); if (isFirstTransition) setIsFirstTransition(false); } }, [ slides.length, isTransitioning, onWalk ]); const next = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ if (isTransitioning) { log("正在切换中,跳过本次切换"); return; } let nextOrderIndex = currentOrderIndex + 1; if (nextOrderIndex >= slideOrder.length) { if (loop) { nextOrderIndex = 0; log("到达最后一张,循环回到第一张"); } else { log("到达最后一张,停止播放"); pause(); return; } } const nextSlideIndex = slideOrder[nextOrderIndex]; setCurrentOrderIndex(nextOrderIndex); goTo(nextSlideIndex); }, [ currentOrderIndex, slideOrder, isTransitioning, loop, goTo, pause ]); const previous = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ if (isTransitioning) { log("正在切换中,跳过本次切换"); return; } let prevOrderIndex = currentOrderIndex - 1; if (prevOrderIndex < 0) { if (loop) { prevOrderIndex = slideOrder.length - 1; log("到达第一张,循环到最后一张"); } else { log("到达第一张,停止播放"); pause(); return; } } const prevSlideIndex = slideOrder[prevOrderIndex]; setCurrentOrderIndex(prevOrderIndex); goTo(prevSlideIndex); }, [ currentOrderIndex, slideOrder, isTransitioning, loop, goTo, pause ]); return { currentSlide, isPlaying, setIsPlaying, slideOrder, currentOrderIndex, visibleSlides, isFirstTransition, setIsFirstTransition, play, pause, next, previous, goTo }; }; export { useVegasState };