export class PullToRefresh { isDragging : boolean = false; posStart : number = 0; private _dragDistance : number = 0; private _threshold: number = 60; private _el : HTMLElement; private _updateDragPosition : Function; private _onRefresh : Function; private _isRefreshing : boolean = false; constructor(config: { el: HTMLElement, threshold: number, updateDragPosition: (el: HTMLElement, position: number, reset : boolean) => void, onRefresh: () => any }) { this._el = config.el; this._threshold = config.threshold; this._updateDragPosition = config.updateDragPosition; this._onRefresh = config.onRefresh; this._dragDistance = 0; const self = this; this._el.addEventListener('touchstart', (e) => self.mouseStart(e)); this._el.addEventListener('mousedown', (e) => self.mouseStart(e)); this._el.addEventListener('touchend', () => self.mouseEnd()); this._el.addEventListener('mouseup', () => self.mouseEnd()); this._el.addEventListener('touchmove', (e) => self.mouseMove(e)); this._el.addEventListener('touchmove', (e) => self.mouseMove(e)); } private getPageY(e) { if (e.pageY === undefined && e.touches !== undefined) { if (e.touches.length <= 0) { return false; } e.pageY = e.touches[e.touches.length - 1].pageY; } return e.pageY; } private mouseStart(e: any) { if (this._isRefreshing) return; this.isDragging = true; this.posStart = this.getPageY(e) + this._el.scrollTop; } private mouseEnd() { if (this._isRefreshing) return; if (!this.isDragging) return; if (this._dragDistance >= this._threshold) { this.isDragging = false; this._isRefreshing = true; this._onRefresh().finally(() => { this._updateDragPosition(this._el, 0, true); this._isRefreshing = false; }) return; } else { this._updateDragPosition(this._el, 0); } this.isDragging = false; } private mouseMove(e: any) { if (this._isRefreshing) return; if (!this.isDragging) return; e.pageY = this.getPageY(e); if (e.pageY === false) { return; } this._dragDistance = (e.pageY - (this.posStart + this._el.scrollTop)); if (this._dragDistance <= 0) return; this._dragDistance = Math.min(this._dragDistance, this._threshold); this._updateDragPosition(this._el, this._dragDistance); } }
new PullToRefresh({ el: (this.scrollElement as any).element.nativeElement, threshold: 90, updateDragPosition: (el: HTMLElement, distance: number, reset : boolean) => { if (reset) { GsapHelpers.timeLineAnimate([ { $e: el, set: { y: 90 }, to: { y: distance }, duration: 300 }, { $e: re, set: { y: 90 }, to: { y: distance }, duration: 300 }, ]); } else { el.style.transform = `translate(0, ${distance}px)`; re.style.transform = `translate(0, ${distance}px)`; } }, onRefresh: async () => { (re.firstChild as HTMLElement).classList.add('fa-spin'); await self.loadData(true); await Task.delay(100); (re.firstChild as HTMLElement).classList.remove('fa-spin'); } });
164600cookie-checkPull to refresh (touch events)