react-vegas
Version:
Vegas.js for React
138 lines (137 loc) • 4.8 kB
JavaScript
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 };