@snap/camera-kit
Version:
Camera Kit Web
52 lines • 2.21 kB
JavaScript
import { Injectable } from "@snap/ts-inject";
export class PageVisibility {
constructor() {
this.onHiddenHandlers = new Set();
this.onVisibleHandlers = new Set();
this.previousVisibilityState = document.visibilityState;
this.visibilityTransition = false;
this.onVisibilityChange = this.onVisibilityChange.bind(this);
this.isDuringVisibilityTransition = this.isDuringVisibilityTransition.bind(this);
this.onPageHidden = this.onPageHidden.bind(this);
this.onPageVisible = this.onPageVisible.bind(this);
this.destroy = this.destroy.bind(this);
document.addEventListener("visibilitychange", this.onVisibilityChange);
}
isDuringVisibilityTransition(test) {
return test === this.visibilityTransition;
}
onPageHidden(handler) {
this.onHiddenHandlers.add(handler);
return () => this.onHiddenHandlers.delete(handler);
}
onPageVisible(handler) {
this.onVisibleHandlers.add(handler);
return () => this.onVisibleHandlers.delete(handler);
}
destroy() {
document.removeEventListener("visibilitychange", this.onVisibilityChange);
this.onHiddenHandlers.clear();
this.onVisibleHandlers.clear();
}
onVisibilityChange() {
const handlers = this.previousVisibilityState === "visible" && document.visibilityState === "hidden"
? this.onHiddenHandlers
: this.previousVisibilityState === "hidden" && document.visibilityState === "visible"
? this.onVisibleHandlers
: new Set();
this.visibilityTransition = document.visibilityState;
for (const handler of handlers) {
try {
handler();
}
catch (error) {
if (typeof window !== "undefined")
window.dispatchEvent(new CustomEvent("error", { detail: error }));
}
}
this.previousVisibilityState = this.visibilityTransition;
this.visibilityTransition = false;
}
}
export const pageVisibilityFactory = Injectable("pageVisibility", () => new PageVisibility());
//# sourceMappingURL=pageVisibility.js.map