mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-16 03:31:45 +08:00
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import { Observable } from '../data/observable';
|
|
import { trace as profilingTrace, time, uptime, level as profilingLevel } from '../profiling';
|
|
console.log('here in globals/global-utils!');
|
|
|
|
/**
|
|
* Manages internal framework global state
|
|
*/
|
|
export class NativeScriptGlobalState {
|
|
events: Observable;
|
|
launched = false;
|
|
// used by various classes to setup callbacks to wire up global app event handling when the app instance is ready
|
|
appEventWiring: Array<any>;
|
|
private _appInstanceReady = false;
|
|
private _setLaunched: () => void;
|
|
constructor() {
|
|
// console.log('creating NativeScriptGlobals...')
|
|
this.events = new Observable();
|
|
this._setLaunched = this._setLaunchedFn.bind(this);
|
|
this.events.on('launch', this._setLaunched);
|
|
if (profilingLevel() > 0) {
|
|
this.events.on('displayed', () => {
|
|
const duration = uptime();
|
|
const end = time();
|
|
const start = end - duration;
|
|
profilingTrace(`Displayed in ${duration.toFixed(2)}ms`, start, end);
|
|
});
|
|
}
|
|
}
|
|
|
|
get appInstanceReady() {
|
|
return this._appInstanceReady;
|
|
}
|
|
|
|
set appInstanceReady(value: boolean) {
|
|
this._appInstanceReady = value;
|
|
// app instance ready, wire up any app events waiting in startup queue
|
|
if (this.appEventWiring && this.appEventWiring.length) {
|
|
for (const callback of this.appEventWiring) {
|
|
callback();
|
|
}
|
|
// cleanup
|
|
this.appEventWiring = null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ability for classes to initialize app event handling early even before the app instance is ready during boot cycle avoiding boot race conditions
|
|
* @param callback wire up any global event handling inside the callback
|
|
*/
|
|
addEventWiring(callback: () => void) {
|
|
if (this._appInstanceReady) {
|
|
callback();
|
|
} else {
|
|
if (!this.appEventWiring) {
|
|
this.appEventWiring = [];
|
|
}
|
|
this.appEventWiring.push(callback);
|
|
}
|
|
}
|
|
|
|
private _setLaunchedFn() {
|
|
// console.log('NativeScriptGlobals launch fired!');
|
|
this.launched = true;
|
|
this.events.off('launch', this._setLaunched);
|
|
this._setLaunched = null;
|
|
}
|
|
}
|
|
export function getNativeScriptGlobals() {
|
|
if (!global.NativeScriptGlobals) {
|
|
// init global state handler
|
|
global.NativeScriptGlobals = new NativeScriptGlobalState();
|
|
}
|
|
return global.NativeScriptGlobals;
|
|
}
|