Create slider composable
This commit is contained in:
@@ -0,0 +1,91 @@
|
|||||||
|
type Props = {
|
||||||
|
duration?: number;
|
||||||
|
count: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
const useSlider = ({ duration = 0, count }: Props) => {
|
||||||
|
// states
|
||||||
|
|
||||||
|
const sliderTimer = ref<NodeJS.Timeout | null>(null);
|
||||||
|
const progressTimer = ref<NodeJS.Timeout | null>(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;
|
||||||
Reference in New Issue
Block a user