vevet
Version:
Vevet is a JavaScript library for creative development that simplifies crafting rich interactions like split text animations, carousels, marquees, preloading, and more.
67 lines (55 loc) • 1.35 kB
text/typescript
import { isFiniteNumber } from '@/internal/isFiniteNumber';
import { SnapLogic } from '..';
import { Snap } from '../..';
export class SnapInterval extends SnapLogic {
/** Interval reference */
private _interval?: NodeJS.Timeout;
constructor(
ctx: Snap,
private _onPrev: () => void,
private _onNext: () => void,
) {
super(ctx);
this.callbacks.on('update', () => this._handleUpdate(), {
protected: true,
});
this.addDestructor(() => this._clearInterval());
}
private get allowInterval() {
return (
!this.isSwiping &&
!this.hasInertia &&
!this.isTransitioning &&
!this.isInterpolating &&
isFiniteNumber(this.props.interval)
);
}
/** Handle Snap update */
private _handleUpdate() {
if (!this.allowInterval) {
this._clearInterval();
return;
}
if (!this._interval) {
this._interval = setInterval(
() => this._handleInterval(),
this.props.interval,
);
}
}
/** Handle interval action */
private _handleInterval() {
if (this.props.intervalDirection === 'prev') {
this._onPrev();
} else {
this._onNext();
}
}
/** Clear interval */
private _clearInterval() {
if (this._interval) {
clearInterval(this._interval);
this._interval = undefined;
}
}
}