@applicaster/zapp-react-native-utils
Version:
Applicaster Zapp React Native utilities package
58 lines (44 loc) • 1.5 kB
text/typescript
import { DeviceEventEmitter, NativeModules } from "react-native";
import { platformSelect } from "../reactUtils";
const { BackgroundTimer: RNBackgroundTimer } = NativeModules;
class BackgroundTimer {
private uniqueId: number;
private readonly callbacks: Record<number, () => void>;
constructor() {
this.uniqueId = 0;
this.callbacks = {};
const EventEmitter = platformSelect({
android: DeviceEventEmitter,
android_tv: DeviceEventEmitter,
amazon: DeviceEventEmitter, // probably does not exist and uses android_tv
default: undefined,
});
EventEmitter?.addListener("BackgroundTimer.timer.fired", (id: number) => {
const callback = this.callbacks[id];
if (callback) {
delete this.callbacks[id];
callback();
}
});
}
setTimeout(callback, timeout): number | NodeJS.Timeout {
if (!RNBackgroundTimer) {
return global.setTimeout(callback, timeout);
}
this.uniqueId += 1;
const timeoutId = this.uniqueId;
this.callbacks[timeoutId] = callback;
RNBackgroundTimer.setTimeout(timeoutId, timeout);
return timeoutId;
}
clearTimeout(timeoutId: number | NodeJS.Timeout): void {
if (!RNBackgroundTimer) {
return global.clearTimeout(timeoutId as NodeJS.Timeout);
}
if (this.callbacks[timeoutId as number]) {
delete this.callbacks[timeoutId as number];
RNBackgroundTimer.clearTimeout(timeoutId);
}
}
}
export default new BackgroundTimer();