@tamagui/react-native-web-lite
Version:
React Native for Web
47 lines (46 loc) • 1.85 kB
JavaScript
import { canUseDOM, invariant } from "@tamagui/react-native-web-internals";
const isPrefixed =
// eslint-disable-next-line no-prototype-builtins
canUseDOM && !document.hasOwnProperty("hidden") && document.hasOwnProperty("webkitHidden"),
EVENT_TYPES = ["change", "memoryWarning"],
VISIBILITY_CHANGE_EVENT = isPrefixed ? "webkitvisibilitychange" : "visibilitychange",
VISIBILITY_STATE_PROPERTY = isPrefixed ? "webkitVisibilityState" : "visibilityState",
AppStates = {
BACKGROUND: "background",
ACTIVE: "active"
};
class EventEmitter {
listeners = {};
addListener(type, handler) {
this.listeners[type] ??= /* @__PURE__ */new Set(), this.listeners[type].add(handler);
}
emit(type, state) {
this.listeners[type]?.forEach(cb => cb(state));
}
removeListener(type, handler) {
this.listeners[type]?.delete(handler);
}
}
let hasBoundVisibilityChangeEvent = !1;
const changeEmitter = new EventEmitter();
class AppState {
static isAvailable = canUseDOM && document[VISIBILITY_STATE_PROPERTY];
static get currentState() {
if (!AppState.isAvailable) return AppStates.ACTIVE;
switch (document[VISIBILITY_STATE_PROPERTY]) {
case "hidden":
case "prerender":
case "unloaded":
return AppStates.BACKGROUND;
default:
return AppStates.ACTIVE;
}
}
static addEventListener(type, handler) {
if (AppState.isAvailable && (invariant(EVENT_TYPES.indexOf(type) !== -1, 'Trying to subscribe to unknown event: "%s"', type), type === "change")) return hasBoundVisibilityChangeEvent || (hasBoundVisibilityChangeEvent = !0, document.addEventListener(VISIBILITY_CHANGE_EVENT, () => {
changeEmitter && changeEmitter.emit("change", AppState.currentState);
}, !1)), changeEmitter.addListener(type, handler);
}
}
export { AppState };
//# sourceMappingURL=index.mjs.map