supercharged-slider
Version:
A super modular tiny slider library.
72 lines (57 loc) • 1.79 kB
text/typescript
import { Middleware, Slider } from '~/types';
import getElement, { Selector } from '~/utils/getElement';
const disabledItems = new Map();
const disableElement = (element: HTMLElement) => {
if (disabledItems.has(element)) return;
disabledItems.set(element, true);
element.setAttribute('disabled', 'disabled');
};
const enableElement = (element: HTMLElement) => {
if (!disabledItems.has(element)) return;
disabledItems.delete(element);
element.removeAttribute('disabled');
};
interface Props {
prev?: Selector,
next?: Selector
}
const navigation = (props: Props): Middleware => ({
name: 'navigation',
callback: (slider) => {
const prevElement = getElement(props.prev);
const nextElement = getElement(props.next);
prevElement?.addEventListener('click', slider.prev);
nextElement?.addEventListener('click', slider.next);
slider.onCleanUp(() => {
prevElement?.removeEventListener('click', slider.prev);
nextElement?.removeEventListener('click', slider.next);
});
const onSlideChange = (newSlider: Slider) => {
if (prevElement) {
if (newSlider.activeView === 0) {
disableElement(prevElement);
} else {
enableElement(prevElement);
}
}
if (nextElement) {
if (
newSlider.activeView + newSlider.slidesPerView
>= newSlider.slides.length
) {
disableElement(nextElement);
} else {
enableElement(nextElement);
}
}
};
onSlideChange(slider);
const onCleanUp = () => {
slider.removeSlideChangeHook(onSlideChange);
slider.removeCleanUpHook(onCleanUp);
};
slider.onSlideChange(onSlideChange);
slider.onCleanUp(onCleanUp);
},
});
export default navigation;