vuestic-ui
Version:
Vue 3 UI Framework
1 lines • 6.46 kB
Source Map (JSON)
{"version":3,"file":"useCarouselAnimation.mjs","sources":["../../../../../../src/components/va-carousel/hooks/useCarouselAnimation.ts"],"sourcesContent":["import { computed, onBeforeUnmount, onMounted, ref, Ref, watch } from 'vue'\n\nexport const useCarouselAnimation = (props: {\n items: any[],\n autoscrollInterval: number,\n autoscrollPauseDuration: number,\n autoscroll: boolean,\n infinite: boolean,\n effect: 'fade' | 'transition',\n vertical: boolean,\n fadeKeyframe: string,\n}, currentSlide: Ref<number>) => {\n let animationInterval = -1\n\n const start = () => {\n if (!props.autoscroll) { return }\n\n clearInterval(animationInterval)\n animationInterval = setInterval(() => {\n currentSlide.value += 1\n if (currentSlide.value >= props.items.length) { currentSlide.value = 0 }\n }, props.autoscrollInterval) as any\n }\n\n let pauseTimeout: number\n const pause = () => {\n if (!props.autoscroll) { return }\n\n clearInterval(animationInterval)\n\n pauseTimeout = setTimeout(() => {\n start()\n clearTimeout(pauseTimeout)\n }, props.autoscrollPauseDuration) as any\n }\n\n const stop = () => {\n clearInterval(animationInterval)\n clearTimeout(pauseTimeout)\n }\n\n onMounted(() => start())\n onBeforeUnmount(() => stop())\n\n const withPause = <T extends (...args: any[]) => any>(fn: T) => {\n return (...args: Parameters<T>) => { pause(); fn(...args) }\n }\n\n const slidesContainerStyle = ref<Record<string, any>>({\n transition: undefined as string | undefined,\n })\n\n /**\n * Used for infinite loop. In infinite loop additional first item is placed after all items.\n * Use own currentSlider, which will not update model value if we need to show slide that placed after all items\n */\n const sliderToBeShown = ref(0)\n\n const computedSlidesStyle = computed(() => {\n if (props.effect === 'fade') {\n return {\n ...slidesContainerStyle.value,\n transition: 'none',\n }\n }\n\n if (props.vertical) {\n return {\n ...slidesContainerStyle.value,\n transform: `translateY(${sliderToBeShown.value * -100}%)`,\n }\n }\n\n return {\n ...slidesContainerStyle.value,\n transform: `translateX(${sliderToBeShown.value * -100}%)`,\n }\n })\n\n const animator = {\n isAnimating: false,\n\n speed: 0.3,\n\n order: [] as { to: number, animate?: boolean }[],\n\n move (from: number, to: number) {\n const last = props.items.length - 1\n const firstAfterLast = props.items.length\n\n if (to === 0 && from === last) {\n this.order.push({ to: firstAfterLast })\n this.order.push({ to: 0, animate: false })\n } else if (to === last && from === 0) {\n this.order.push({ to: firstAfterLast, animate: false })\n this.order.push({ to })\n } else {\n this.order.push({ to })\n }\n\n if (!this.isAnimating) { this.runAnimation() }\n },\n\n runAnimation () {\n this.isAnimating = true\n\n const animation = this.order.shift()\n\n if (!animation) { this.isAnimating = false; return }\n\n sliderToBeShown.value = animation?.to\n\n if (animation.animate || animation.animate === undefined) {\n slidesContainerStyle.value.transition = `all ${this.speed}s linear`\n setTimeout(() => { this.runAnimation() }, this.speed * 1000)\n } else {\n slidesContainerStyle.value.transition = 'none'\n setTimeout(() => { this.runAnimation() }, 16)\n }\n },\n }\n\n watch(currentSlide, (newValue, oldValue) => {\n animator.move(oldValue, newValue)\n })\n\n /** Animation should control how much slides to display */\n const slides = computed(() => {\n if (props.effect === 'fade') {\n return [props.items[currentSlide.value]]\n }\n\n if (props.infinite || props.autoscroll) {\n return [...props.items, props.items[0]]\n }\n\n return props.items\n })\n\n return {\n start,\n pause,\n stop,\n withPause,\n computedSlidesStyle,\n slides,\n }\n}\n"],"names":[],"mappings":"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"}