From ad52a9746d5db9d94ea8c56829c690f948e9d8e1 Mon Sep 17 00:00:00 2001 From: marzban-dev Date: Sun, 1 Jun 2025 22:15:48 +0330 Subject: [PATCH] Create slider composable --- frontend/composables/global/useSlider.ts | 91 ++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 frontend/composables/global/useSlider.ts diff --git a/frontend/composables/global/useSlider.ts b/frontend/composables/global/useSlider.ts new file mode 100644 index 0000000..6e11af2 --- /dev/null +++ b/frontend/composables/global/useSlider.ts @@ -0,0 +1,91 @@ +type Props = { + duration?: number; + count: number; +}; + +const useSlider = ({ duration = 0, count }: Props) => { + // states + + const sliderTimer = ref(null); + const progressTimer = ref(null); + + const progress = ref(0); + const activeSlide = ref(0); + + // methods + + const slideTo = (index: number) => { + activeSlide.value = index; + restartSliderTimer(); + }; + + const nextSlide = () => { + if (activeSlide.value > count - 2) { + activeSlide.value = 0; + } else { + activeSlide.value = activeSlide.value + 1; + } + }; + + const prevSlide = () => { + if (activeSlide.value < 1) { + activeSlide.value = count - 1; + } else { + activeSlide.value = activeSlide.value - 1; + } + }; + + const prevSlideHandler = () => { + restartSliderTimer(); + runProgress(); + prevSlide(); + }; + + const nextSlideHandler = () => { + restartSliderTimer(); + runProgress(); + nextSlide(); + }; + + const runProgress = () => { + const delay = duration / 100; + + if (progressTimer.value) clearInterval(progressTimer.value); + progress.value = 0; + + progressTimer.value = setInterval(() => { + if (progress.value < 100) { + progress.value = progress.value + 1; + } + }, delay); + }; + + const restartSliderTimer = () => { + if (sliderTimer.value) clearInterval(sliderTimer.value); + runProgress(); + + if (duration > 0) { + sliderTimer.value = setInterval(() => { + runProgress(); + nextSlide(); + }, duration); + } + }; + + onMounted(() => { + restartSliderTimer(); + }); + + onUnmounted(() => {}); + + return { + activeSlide, + progress, + slideTo, + nextSlide: nextSlideHandler, + prevSlide: prevSlideHandler, + restart: restartSliderTimer, + }; +}; + +export default useSlider;