UNPKG

@mittwald/react-use-promise

Version:

Simple and declarative use of Promises in your React components. Observe their state and refresh them in various advanced ways.

47 lines (46 loc) 1.34 kB
import { DateTime, Duration } from "luxon"; export class ConsolidatedTimeout { callback; startTime; timeoutMillis = new Set(); runningTimeout; constructor(callback) { this.startTime = DateTime.now(); this.callback = callback; } start() { this.startTime = DateTime.now(); this.startNextTimeout(); } clear() { if (this.runningTimeout) { clearTimeout(this.runningTimeout); this.runningTimeout = undefined; } } addTimeout(timeout) { const timeoutMs = Duration.fromDurationLike(timeout).toMillis(); this.timeoutMillis.add(timeoutMs); this.startNextTimeout(); return () => { this.timeoutMillis.delete(timeoutMs); this.startNextTimeout(); }; } startNextTimeout() { this.clear(); if (this.timeoutMillis.size === 0) { return; } const shortestTimeout = Math.min(...this.timeoutMillis); const elapsedTime = this.startTime.diffNow().negate().toMillis(); const ms = shortestTimeout - elapsedTime; if (ms <= 0) { this.callback(); } else { this.runningTimeout = setTimeout(() => this.callback(), ms); } } } export default ConsolidatedTimeout;