UNPKG

@taiga-ui/addon-mobile

Version:

Extension package for Taiga UI that adds support for mobile specific behaviors such as custom data pickers, dropdowns, etc.

37 lines 11.2 kB
import { inject, Injectable } from '@angular/core'; import { tuiScrollFrom, tuiTypedFromEvent, tuiZonefreeScheduler, tuiZoneOptimized, } from '@taiga-ui/cdk/observables'; import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom'; import { TUI_SCROLL_REF } from '@taiga-ui/core/tokens'; import { debounceTime, distinctUntilChanged, EMPTY, endWith, filter, map, Observable, scan, share, startWith, switchMap, takeUntil, takeWhile, tap, } from 'rxjs'; import { TUI_PULL_TO_REFRESH_COMPONENT, TUI_PULL_TO_REFRESH_LOADED, TUI_PULL_TO_REFRESH_THRESHOLD, } from './pull-to-refresh.providers'; import * as i0 from "@angular/core"; export const MICRO_OFFSET = 10 ** -6; const EXCLUSION_SELECTORS = 'tui-dialog, tui-dropdown, tui-dropdown-mobile'; class TuiPullToRefreshService extends Observable { constructor() { const component = inject(TUI_PULL_TO_REFRESH_COMPONENT); super((subscriber) => (component ? this.pulling$ : EMPTY).subscribe(subscriber)); this.el = tuiInjectElement(); this.scrollRef = inject(TUI_SCROLL_REF); this.loaded$ = inject(TUI_PULL_TO_REFRESH_LOADED); this.threshold = inject(TUI_PULL_TO_REFRESH_THRESHOLD); // Hack for iOS to determine if pulling stopped due to scroll // because Safari does not support `touch-action: pan-down` this.touched = false; this.pulling$ = this.loaded$.pipe(startWith(null), switchMap(() => tuiTypedFromEvent(this.el, 'touchstart', { passive: true }).pipe(filter(() => !this.scrollRef.nativeElement.scrollTop && !this.el.querySelector(EXCLUSION_SELECTORS)), map(({ touches }) => touches[0]?.clientY ?? 0), switchMap((start) => tuiTypedFromEvent(this.el, 'touchmove').pipe(tap(() => { this.touched = true; }), map(({ touches }) => (touches[0]?.clientY ?? 0) - start), filter((distance) => distance > 0), takeUntil(tuiTypedFromEvent(this.el, 'touchend').pipe(tap(() => { this.touched = false; }))), takeUntil(tuiScrollFrom(this.scrollRef.nativeElement)), endWith(0))), scan((prev, current) => !current && !this.touched && prev > this.threshold ? this.threshold : current + current * MICRO_OFFSET, 0), takeWhile((distance) => distance !== this.threshold, true), startWith(0))), debounceTime(0, tuiZonefreeScheduler()), distinctUntilChanged(), tuiZoneOptimized(), share()); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPullToRefreshService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPullToRefreshService }); } } export { TuiPullToRefreshService }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiPullToRefreshService, decorators: [{ type: Injectable }], ctorParameters: function () { return []; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC10by1yZWZyZXNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi1tb2JpbGUvY29tcG9uZW50cy9wdWxsLXRvLXJlZnJlc2gvcHVsbC10by1yZWZyZXNoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFrQixNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xFLE9BQU8sRUFDSCxhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsR0FDbkIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUNILFlBQVksRUFDWixvQkFBb0IsRUFDcEIsS0FBSyxFQUNMLE9BQU8sRUFDUCxNQUFNLEVBQ04sR0FBRyxFQUNILFVBQVUsRUFDVixJQUFJLEVBQ0osS0FBSyxFQUNMLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEdBQ04sTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0gsNkJBQTZCLEVBQzdCLDBCQUEwQixFQUMxQiw2QkFBNkIsR0FDaEMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNLG1CQUFtQixHQUFHLCtDQUErQyxDQUFDO0FBRTVFLE1BQ2EsdUJBQXdCLFNBQVEsVUFBa0I7SUF1RDNEO1FBQ0ksTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFeEQsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUF6RHBFLE9BQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLGNBQVMsR0FBNEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVELFlBQU8sR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM3QyxjQUFTLEdBQUcsTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFFbkUsNkRBQTZEO1FBQzdELDJEQUEyRDtRQUNuRCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRVAsYUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6QyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQ2YsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUNYLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsSUFBSSxDQUMxRCxNQUFNLENBQ0YsR0FBRyxFQUFFLENBQ0QsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTO1lBQ3ZDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FDbEQsRUFDRCxHQUFHLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUM1QyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNoQixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FDeEMsR0FBRyxDQUFDLEdBQVMsRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsRUFDdEQsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQ2xDLFNBQVMsQ0FDTCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FDdkMsR0FBRyxDQUFDLEdBQVMsRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUNMLENBQ0osRUFDRCxTQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDdEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNiLENBQ0osRUFDRCxJQUFJLENBQ0EsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FDZCxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTO1lBQzlDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNoQixDQUFDLENBQUMsT0FBTyxHQUFHLE9BQU8sR0FBRyxZQUFZLEVBQzFDLENBQUMsQ0FDSixFQUNELFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEVBQzFELFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FDZixDQUNKLEVBQ0QsWUFBWSxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLEVBQ3ZDLG9CQUFvQixFQUFFLEVBQ3RCLGdCQUFnQixFQUFFLEVBQ2xCLEtBQUssRUFBRSxDQUNWLENBQUM7SUFNRixDQUFDOytHQTNEUSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7U0FBdkIsdUJBQXVCOzRGQUF2Qix1QkFBdUI7a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3R5cGUgRWxlbWVudFJlZiwgaW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgdHVpU2Nyb2xsRnJvbSxcbiAgICB0dWlUeXBlZEZyb21FdmVudCxcbiAgICB0dWlab25lZnJlZVNjaGVkdWxlcixcbiAgICB0dWlab25lT3B0aW1pemVkLFxufSBmcm9tICdAdGFpZ2EtdWkvY2RrL29ic2VydmFibGVzJztcbmltcG9ydCB7dHVpSW5qZWN0RWxlbWVudH0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9kb20nO1xuaW1wb3J0IHtUVUlfU0NST0xMX1JFRn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvdG9rZW5zJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxuICAgIEVNUFRZLFxuICAgIGVuZFdpdGgsXG4gICAgZmlsdGVyLFxuICAgIG1hcCxcbiAgICBPYnNlcnZhYmxlLFxuICAgIHNjYW4sXG4gICAgc2hhcmUsXG4gICAgc3RhcnRXaXRoLFxuICAgIHN3aXRjaE1hcCxcbiAgICB0YWtlVW50aWwsXG4gICAgdGFrZVdoaWxlLFxuICAgIHRhcCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgVFVJX1BVTExfVE9fUkVGUkVTSF9DT01QT05FTlQsXG4gICAgVFVJX1BVTExfVE9fUkVGUkVTSF9MT0FERUQsXG4gICAgVFVJX1BVTExfVE9fUkVGUkVTSF9USFJFU0hPTEQsXG59IGZyb20gJy4vcHVsbC10by1yZWZyZXNoLnByb3ZpZGVycyc7XG5cbmV4cG9ydCBjb25zdCBNSUNST19PRkZTRVQgPSAxMCAqKiAtNjtcbmNvbnN0IEVYQ0xVU0lPTl9TRUxFQ1RPUlMgPSAndHVpLWRpYWxvZywgdHVpLWRyb3Bkb3duLCB0dWktZHJvcGRvd24tbW9iaWxlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFR1aVB1bGxUb1JlZnJlc2hTZXJ2aWNlIGV4dGVuZHMgT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc2Nyb2xsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChUVUlfU0NST0xMX1JFRik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkZWQkID0gaW5qZWN0KFRVSV9QVUxMX1RPX1JFRlJFU0hfTE9BREVEKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRocmVzaG9sZCA9IGluamVjdChUVUlfUFVMTF9UT19SRUZSRVNIX1RIUkVTSE9MRCk7XG5cbiAgICAvLyBIYWNrIGZvciBpT1MgdG8gZGV0ZXJtaW5lIGlmIHB1bGxpbmcgc3RvcHBlZCBkdWUgdG8gc2Nyb2xsXG4gICAgLy8gYmVjYXVzZSBTYWZhcmkgZG9lcyBub3Qgc3VwcG9ydCBgdG91Y2gtYWN0aW9uOiBwYW4tZG93bmBcbiAgICBwcml2YXRlIHRvdWNoZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHVsbGluZyQgPSB0aGlzLmxvYWRlZCQucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZWwsICd0b3VjaHN0YXJ0Jywge3Bhc3NpdmU6IHRydWV9KS5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLnNjcm9sbFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuZWwucXVlcnlTZWxlY3RvcihFWENMVVNJT05fU0VMRUNUT1JTKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcCgoe3RvdWNoZXN9KSA9PiB0b3VjaGVzWzBdPy5jbGllbnRZID8/IDApLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoc3RhcnQpID0+XG4gICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZWwsICd0b3VjaG1vdmUnKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKCgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKHt0b3VjaGVzfSkgPT4gKHRvdWNoZXNbMF0/LmNsaWVudFkgPz8gMCkgLSBzdGFydCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGRpc3RhbmNlKSA9PiBkaXN0YW5jZSA+IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KHRoaXMuZWwsICd0b3VjaGVuZCcpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcCgoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodHVpU2Nyb2xsRnJvbSh0aGlzLnNjcm9sbFJlZi5uYXRpdmVFbGVtZW50KSksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRXaXRoKDApLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgc2NhbihcbiAgICAgICAgICAgICAgICAgICAgKHByZXYsIGN1cnJlbnQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAhY3VycmVudCAmJiAhdGhpcy50b3VjaGVkICYmIHByZXYgPiB0aGlzLnRocmVzaG9sZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy50aHJlc2hvbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1cnJlbnQgKyBjdXJyZW50ICogTUlDUk9fT0ZGU0VULFxuICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGFrZVdoaWxlKChkaXN0YW5jZSkgPT4gZGlzdGFuY2UgIT09IHRoaXMudGhyZXNob2xkLCB0cnVlKSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgoMCksXG4gICAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCwgdHVpWm9uZWZyZWVTY2hlZHVsZXIoKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHR1aVpvbmVPcHRpbWl6ZWQoKSxcbiAgICAgICAgc2hhcmUoKSxcbiAgICApO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGluamVjdChUVUlfUFVMTF9UT19SRUZSRVNIX0NPTVBPTkVOVCk7XG5cbiAgICAgICAgc3VwZXIoKHN1YnNjcmliZXIpID0+IChjb21wb25lbnQgPyB0aGlzLnB1bGxpbmckIDogRU1QVFkpLnN1YnNjcmliZShzdWJzY3JpYmVyKSk7XG4gICAgfVxufVxuIl19