UNPKG

react-vegas

Version:
176 lines (175 loc) 9.26 kB
import * as __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__ from "react/jsx-runtime"; import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasLoader_js_5249a791__ from "./components/VegasLoader.js"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasTimer_js_7a278d7f__ from "./components/VegasTimer.js"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasOverlay_js_173d1550__ from "./components/VegasOverlay.js"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasDefaultBackground_js_0a20f660__ from "./components/VegasDefaultBackground.js"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasSlideRenderer_js_2ea24338__ from "./components/VegasSlideRenderer.js"; import * as __WEBPACK_EXTERNAL_MODULE__components_VegasSlide_js_1830d2c0__ from "./components/VegasSlide.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_useLogger_js_1a2b7be5__ from "./hooks/useLogger.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_usePreload_js_407b09dd__ from "./hooks/usePreload.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_useAnimationVariants_js_e1ee2def__ from "./hooks/useAnimationVariants.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_useVegasState_js_4249f357__ from "./hooks/useVegasState.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_useAutoplay_js_fbba3b48__ from "./hooks/useAutoplay.js"; import * as __WEBPACK_EXTERNAL_MODULE__hooks_useVisibilityChange_js_fd195d27__ from "./hooks/useVisibilityChange.js"; const Vegas = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react__.forwardRef)((props, ref)=>{ const { slide = 0, delay = 5000, loop = true, preload = false, preloadImage = false, preLoadImageBatch = 3, preloadVideo = false, showLoading = false, timer = false, overlay = false, autoplay = true, shuffle = false, cover = true, color = null, align = "center", valign = "center", firstTransition = null, firstTransitionDuration = 3000, transition = "fade", transitionDuration = 1000, defaultBackground, defaultBackgroundDuration = 3000, debug = false, slides, onInit, onPlay, onPause, onWalk } = props; const [isTransitioning, setIsTransitioning] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(false); const [showDefaultBg, setShowDefaultBg] = (0, __WEBPACK_EXTERNAL_MODULE_react__.useState)(true); const { log, logWarn, logError } = (0, __WEBPACK_EXTERNAL_MODULE__hooks_useLogger_js_1a2b7be5__.useLogger)(debug); const containerRef = (0, __WEBPACK_EXTERNAL_MODULE_react__.useRef)(null); const { loading, loadProgress, loadedImages, batchPreloadImages } = (0, __WEBPACK_EXTERNAL_MODULE__hooks_usePreload_js_407b09dd__.usePreload)(slides, preloadImage, preloadVideo, preLoadImageBatch, log, logWarn, logError); const { variants } = (0, __WEBPACK_EXTERNAL_MODULE__hooks_useAnimationVariants_js_e1ee2def__.useAnimationVariants)(transitionDuration); const vegasState = (0, __WEBPACK_EXTERNAL_MODULE__hooks_useVegasState_js_4249f357__.useVegasState)(slide, slides, loop, shuffle, isTransitioning, firstTransition, firstTransitionDuration, log, onWalk); const { currentSlide, isPlaying, setIsPlaying, visibleSlides, isFirstTransition, setIsFirstTransition, play: statePlay, pause: statePause, next, previous } = vegasState; const play = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ statePlay(); if (isFirstTransition && showDefaultBg) { logWarn("默认背景显示中,等待动画完成"); setTimeout(()=>{ setShowDefaultBg(false); log("默认背景隐藏"); }, transitionDuration); setIsFirstTransition(false); } onPlay?.(); }, [ statePlay, isFirstTransition, showDefaultBg, onPlay ]); const pause = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)(()=>{ statePause(); onPause?.(); }, [ statePause, onPause ]); (0, __WEBPACK_EXTERNAL_MODULE__hooks_useAutoplay_js_fbba3b48__.useAutoplay)(isPlaying, isTransitioning, currentSlide, slides, delay, next, log); (0, __WEBPACK_EXTERNAL_MODULE__hooks_useVisibilityChange_js_fd195d27__.useVisibilityChange)(play, pause, log); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ log("Vegas组件开始初始化"); if (preload) { log("开始预加载资源"); setIsPlaying(false); batchPreloadImages().then(()=>{ if (autoplay && !defaultBackground) play(); }); } onInit?.(); const cleanup = ()=>{ log("Vegas组件卸载"); pause(); }; if (defaultBackground) { log(`存在默认背景,关闭自动播放`); setIsPlaying(false); log(`设置默认背景: ${defaultBackground}`); log(`设置默认背景显示定时器,延迟: ${defaultBackgroundDuration}ms`); const timer = window.setTimeout(()=>{ log("默认背景显示完成,开始自动播放"); if (autoplay) play(); }, defaultBackgroundDuration); return ()=>{ clearTimeout(timer); cleanup(); }; } if (autoplay) play(); return cleanup; }, []); (0, __WEBPACK_EXTERNAL_MODULE_react__.useEffect)(()=>{ if (isTransitioning) { const timer = setTimeout(()=>{ setIsTransitioning(false); log("幻灯片切换动画完成"); }, transitionDuration); return ()=>clearTimeout(timer); } }, [ isTransitioning, transitionDuration ]); const renderSlide = (0, __WEBPACK_EXTERNAL_MODULE_react__.useCallback)((index)=>{ try { const slide = slides[index]; if (!slide) { logError(`幻灯片索引 ${index} 不存在`); return null; } return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasSlideRenderer_js_2ea24338__.VegasSlideRenderer, { slide: slide, index: index, isFirstTransition: isFirstTransition, firstTransitionDuration: firstTransitionDuration, transitionDuration: transitionDuration, transition: transition, cover: cover, align: align, valign: valign, color: color, variants: variants, preloadImage: preloadImage, loadedImages: loadedImages, next: next, log: log, logError: logError }); } catch (error) { logError("渲染幻灯片时发生错误:", error); return null; } }, [ next, variants, transition, color, cover, align, valign, isFirstTransition, firstTransitionDuration, transitionDuration ]); (0, __WEBPACK_EXTERNAL_MODULE_react__.useImperativeHandle)(ref, ()=>({ previous, next, play, pause })); if (0 === slides.length) { logError("幻灯片数组不能为空"); return null; } if (transitionDuration <= 0) logWarn("transitionDuration 应该大于 0"); return /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsxs)("div", { ref: containerRef, style: { position: "relative", width: "100%", height: "100%", overflow: "hidden", backgroundColor: color || void 0 }, children: [ defaultBackground && showDefaultBg && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasDefaultBackground_js_0a20f660__.VegasDefaultBackground, { backgroundUrl: defaultBackground.toString() }), isPlaying && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasSlide_js_1830d2c0__.VegasSlide, { visibleSlides: visibleSlides, renderSlide: renderSlide }), overlay && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasOverlay_js_173d1550__.VegasOverlay, {}), timer && isPlaying && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasTimer_js_7a278d7f__.VegasTimer, { currentOrderIndex: vegasState.currentOrderIndex, totalSlides: slides.length }), showLoading && loading && /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime_225474f2__.jsx)(__WEBPACK_EXTERNAL_MODULE__components_VegasLoader_js_5249a791__.VegasLoader, { loadProgress: loadProgress }) ] }); }); Vegas.displayName = "Vegas"; export { Vegas };