{"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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"}