@egjs/flicking
Version:
Everyday 30 million people experience. It's reliable, flexible and extendable carousel.
115 lines (89 loc) • 2.86 kB
text/typescript
/*
* Copyright (c) 2015 NAVER Corp.
* egjs projects are licensed under the MIT license
*/
import Flicking from "../Flicking";
class AutoResizer {
private _flicking: Flicking;
private _enabled: boolean;
private _resizeObserver: ResizeObserver | null;
private _resizeTimer: number;
private _maxResizeDebounceTimer: number;
public get enabled() { return this._enabled; }
public constructor(flicking: Flicking) {
this._flicking = flicking;
this._enabled = false;
this._resizeObserver = null;
this._resizeTimer = -1;
this._maxResizeDebounceTimer = -1;
}
public enable(): this {
const flicking = this._flicking;
const viewport = flicking.viewport;
if (this._enabled) {
this.disable();
}
if (flicking.useResizeObserver && !!window.ResizeObserver) {
const viewportSizeNot0 = viewport.width !== 0 || viewport.height !== 0;
const resizeObserver = viewportSizeNot0
? new ResizeObserver(this._skipFirstResize)
: new ResizeObserver(this._onResize);
resizeObserver.observe(flicking.viewport.element);
this._resizeObserver = resizeObserver;
} else {
window.addEventListener("resize", this._onResize);
}
this._enabled = true;
return this;
}
public disable(): this {
if (!this._enabled) return this;
const resizeObserver = this._resizeObserver;
if (resizeObserver) {
resizeObserver.disconnect();
this._resizeObserver = null;
} else {
window.removeEventListener("resize", this._onResize);
}
this._enabled = false;
return this;
}
private _onResize = () => {
const flicking = this._flicking;
const resizeDebounce = flicking.resizeDebounce;
const maxResizeDebounce = flicking.maxResizeDebounce;
if (resizeDebounce <= 0) {
void flicking.resize();
} else {
if (this._maxResizeDebounceTimer <= 0) {
if (maxResizeDebounce > 0 && maxResizeDebounce >= resizeDebounce) {
this._maxResizeDebounceTimer = window.setTimeout(this._doScheduledResize, maxResizeDebounce);
}
}
if (this._resizeTimer > 0) {
clearTimeout(this._resizeTimer);
this._resizeTimer = 0;
}
this._resizeTimer = window.setTimeout(this._doScheduledResize, resizeDebounce);
}
};
private _doScheduledResize = () => {
clearTimeout(this._resizeTimer);
clearTimeout(this._maxResizeDebounceTimer);
this._maxResizeDebounceTimer = -1;
this._resizeTimer = -1;
void this._flicking.resize();
};
// eslint-disable-next-line @typescript-eslint/member-ordering
private _skipFirstResize = (() => {
let isFirstResize = true;
return (() => {
if (isFirstResize) {
isFirstResize = false;
return;
}
this._onResize();
});
})();
}
export default AutoResizer;