File

src/utils/event.service.ts

Index

Properties
Methods

Constructor

constructor(documentService: DocumentService)
Parameters :
Name Type Optional
documentService DocumentService No

Methods

ngOnDestroy
ngOnDestroy()
Returns : void
on
on(targetElement: HTMLElement | Element, eventType: string, callback: EventHandler)
Parameters :
Name Type Optional
targetElement HTMLElement | Element No
eventType string No
callback EventHandler No
Returns : void
onDocument
onDocument(eventType: string, callback: EventHandler)
Parameters :
Name Type Optional
eventType string No
callback EventHandler No
Returns : void

Properties

Protected subscriptions
subscriptions:
Default value : new Subscription()
Protected targets
targets:
Default value : new WeakMap<HTMLElement | Element | Document, Map<string, Observable<Event>>>()
import { Injectable, OnDestroy } from "@angular/core";
import { Observable, fromEvent, Subscription } from "rxjs";
import { DocumentService } from "./document.service";

export type EventHandler = (event: Event) => void;

export const getEventObservable = (targetElement: HTMLElement | Element, eventType: string): Observable<Event> => {
	switch (eventType) {
		case "scroll":
		case "resize":
		case "touchstart":
		case "touchmove":
		case "touchend":
			return fromEvent(targetElement, eventType, { passive: true });
		default:
			return fromEvent(targetElement, eventType);
	}
};

@Injectable()
export class EventService implements OnDestroy {
	protected subscriptions = new Subscription();

	protected targets = new WeakMap<HTMLElement | Element | Document, Map<string, Observable<Event>>>();

	constructor(protected documentService: DocumentService) {}

	on(targetElement: HTMLElement | Element, eventType: string, callback: EventHandler) {
		if (!this.targets.has(targetElement)) {
			this.targets.set(targetElement, new Map());
		}

		const eventMap = this.targets.get(targetElement);

		if (!eventMap.has(eventType)) {
			eventMap.set(eventType, getEventObservable(targetElement, eventType));
		}

		const subscription = eventMap.get(eventType).subscribe(callback);
		this.subscriptions.add(subscription);
	}

	onDocument(eventType: string, callback: EventHandler) {
		this.documentService.handleEvent(eventType, callback);
	}

	ngOnDestroy() {
		this.subscriptions.unsubscribe();
	}
}

result-matching ""

    No results matching ""