library-ts/browser/app/App.ts

233 lines
5.8 KiB
TypeScript
Raw Permalink Normal View History

2025-03-25 06:42:27 +00:00
import { nextFrame } from "../animation/nextFrame";
import { OnAnimationFrame } from "../animation/OnAnimationFrame";
2025-09-06 11:33:04 +00:00
import { sleep } from "../animation/sleep";
2025-03-25 06:42:27 +00:00
import { DateMath } from "../date/DateMath";
import { ActivityAnalyser } from "../dom/ActivityAnalyser";
2025-09-06 11:33:04 +00:00
import { ClassFlag } from "../dom/ClassFlag";
import { Fullscreen } from "../dom/Fullscreen";
2025-03-25 06:42:27 +00:00
import { Insight } from "../dom/Insight";
import { LandscapeScale } from "../dom/LandscapeScale";
2025-09-06 11:33:04 +00:00
import { HashScroll } from "../dom/page-features/features/HashScroll";
2025-03-25 06:42:27 +00:00
import { PageHandler, PageHandlerMode } from "../dom/PageHandler";
import { UserAgentDeviceTypes } from "../dom/UserAgentDeviceType";
2025-09-06 11:33:04 +00:00
import { EventSlot } from "../events/EventSlot";
2025-03-25 06:42:27 +00:00
import { TemplatesManager, TemplatesManagerMode } from "../templates/TemplatesManager";
2025-09-06 11:33:04 +00:00
import { waitAround } from "../tools/sleep";
2025-03-25 06:42:27 +00:00
import { AppPathConverter } from "./AppPathConverter";
export class AppInitializerData
{
localAdress:string;
webAdress:string;
templatesList:string[];
addTemplateStyles:boolean = false;
pageRoot:string;
pagesPath?:string;
disableForceHTTPS?:boolean;
htmlMode?:boolean;
allowWWWSubdomain?:boolean;
}
export class ElectronAppInitializerData
{
appLocation:string;
templatesList:string[];
pageRoot:string;
disableForceHTTPS?:boolean;
htmlMode?:boolean;
allowWWWSubdomain:boolean;
}
export class App
{
readonly activityAnalyser = new ActivityAnalyser();
readonly onAnimationFrame = new OnAnimationFrame();
readonly templatesManager = new TemplatesManager();
readonly insight = new Insight();
readonly landscapeScale = new LandscapeScale();
readonly pathConverter = new AppPathConverter( this );
private _pageHandler:PageHandler;
private _initializerData:AppInitializerData;
private _electronInitializerData:ElectronAppInitializerData;
protected _loaded = false;
get loaded()
{
return this._loaded;
}
protected _loadedTime:Date = null;
get timeElapsedSinceLoaded()
{
return DateMath.getDifferenceMs( new Date(), this._loadedTime ) / 1000;
}
setLoaded()
{
this._loaded = true;
this._loadedTime = new Date();
}
get initializerData(){ return this._initializerData; }
get pageHandler(){ return this._pageHandler; }
get webAdress()
{
return this._initializerData.webAdress;
}
get isHTMLMode()
{
return this._initializerData.htmlMode === true;
}
grabHash()
{
let hash = window.location.hash;
return hash;
}
get isLocal()
{
return false;
}
async initializeApp( data:AppInitializerData|ElectronAppInitializerData ):Promise<void>
{
if ( document.readyState === "loading" )
{
document.addEventListener(
"DOMContentLoaded",
()=>
{
this.setLoaded();
}
);
}
else
{
this.setLoaded();
}
2025-09-06 11:33:04 +00:00
setTimeout( ()=>{ this.setLoaded(); App.appReadyFlag.set( document.body ) }, 3000 )
2025-03-25 06:42:27 +00:00
if ( ! data.allowWWWSubdomain )
{
let url = window.location + "";
if ( url.startsWith( "https://www." ) )
{
let realURL = url.replace( /^https:\/\/www\./, "https://" );
window.location.assign( realURL );
return Promise.resolve();
}
}
UserAgentDeviceTypes.setOnBody();
if ( ( data as ElectronAppInitializerData ).appLocation )
{
console.log( "ELECTRON APP" );
this._electronInitializerData = data as ElectronAppInitializerData;
}
else
{
this._initializerData = data as AppInitializerData;
}
if ( data.templatesList )
{
let templatesList = data.templatesList;
let templateStylesMode = this.initializerData.addTemplateStyles ?
TemplatesManagerMode.ADD_STYLES_TO_HEAD :
TemplatesManagerMode.IGNORE_STYLES;
this.templatesManager.setMode( templateStylesMode );
templatesList.forEach( c => this.templatesManager.addTemplateHTML( c ) );
}
if ( this._initializerData )
{
//console.log( "PAGE HANDLER FOR WEB" );
let appData = this._initializerData;
this._pageHandler = new PageHandler( appData.localAdress, appData.webAdress, data.disableForceHTTPS );
}
else
{
//console.log( "PAGE HANDLER FOR APP" );
let electronData = this._electronInitializerData;
this._pageHandler = new PageHandler( electronData.appLocation, null, electronData.disableForceHTTPS, PageHandlerMode.ELECTRON );
}
this.pageHandler.setPageRootTag( data.pageRoot );
if ( this._initializerData.pagesPath )
{
this.pageHandler.setPagesPath( this._initializerData.pagesPath );
}
this.onAnimationFrame.run();
this.onAnimationFrame.addListener(
()=>
{
this.landscapeScale.update();
this.insight.update();
}
)
this.activityAnalyser.start();
2025-09-06 11:33:04 +00:00
Fullscreen.setFlagOnChange();
2025-03-25 06:42:27 +00:00
await this.pageHandler.initialize();
2025-09-06 11:33:04 +00:00
await this.initializePage();
HashScroll.applyOnDocument( this.onAnimationFrame );
2025-03-25 06:42:27 +00:00
2025-09-06 11:33:04 +00:00
await sleep( 300 );
App.appReadyFlag.set( document.body );
2025-03-25 06:42:27 +00:00
}
2025-09-06 11:33:04 +00:00
static appReadyFlag = new ClassFlag( "app-ready" );
2025-03-25 06:42:27 +00:00
async initializePage()
{
while ( ! this.loaded )
{
await nextFrame();
}
//console.log( "App.initializePage" );
2025-09-06 11:33:04 +00:00
// this.insight.grabElements();
2025-03-25 06:42:27 +00:00
this.templatesManager.processChildren( document.body );
2025-09-06 11:33:04 +00:00
this.insight.grabElements();
2025-03-25 06:42:27 +00:00
this.pageHandler.replaceLinks();
2025-09-06 11:33:04 +00:00
this.pageHandler.resolveRootPaths( document );
2025-03-25 06:42:27 +00:00
return Promise.resolve();
2025-09-06 11:33:04 +00:00
}
2025-03-25 06:42:27 +00:00
static updateAll()
{
Insight.updateAll();
}
}