import { action, makeObservable, observable, runInAction } from 'mobx'; import { Networking } from '../Network'; import { SnappingManager } from './SnappingManager'; export class PingManager { // create static instance and getter for global use // eslint-disable-next-line no-use-before-define @observable static _instance: PingManager; @observable IsBeating = true; static get Instance(): PingManager { return PingManager._instance; } // not used now, but may need to clear interval private _interval: NodeJS.Timeout | null = null; INTERVAL_SECONDS = 1; constructor() { makeObservable(this); PingManager._instance = this; this._interval = setInterval(this.sendPing, this.INTERVAL_SECONDS * 1000); } private setIsBeating = action((status: boolean) => { this.IsBeating = status; setTimeout(this.showAlert, 100); }); showAlert = () => { alert(PingManager.Instance.IsBeating ? 'The server connection is active' : 'The server connection has been interrupted.NOTE: Any changes made will appear to persist but will be lost after a browser refreshes.'); }; sendPing = async (): Promise => { try { const res = await Networking.PostToServer('/ping', { date: new Date() }); runInAction(() => { SnappingManager.SetServerVersion(res.message); }); !this.IsBeating && this.setIsBeating(true); } catch { if (this.IsBeating) { this.setIsBeating(false); } } }; }