112 lines
2.8 KiB
JavaScript
112 lines
2.8 KiB
JavaScript
|
|
import Logger from './logger.js';
|
||
|
|
import AppState from './state.js';
|
||
|
|
import PerformanceMonitor from './perf-monitor.js';
|
||
|
|
import LazyLoader from './lazy-loader.js';
|
||
|
|
import { APIClient, setSharedAPIInstance } from './api.js';
|
||
|
|
|
||
|
|
class Application {
|
||
|
|
constructor() {
|
||
|
|
try {
|
||
|
|
this.logger = new Logger({
|
||
|
|
level: 'debug',
|
||
|
|
maxLogs: 200,
|
||
|
|
enableRemote: false
|
||
|
|
});
|
||
|
|
|
||
|
|
this.appState = new AppState({
|
||
|
|
currentView: 'files',
|
||
|
|
currentPage: 'files',
|
||
|
|
user: null,
|
||
|
|
isLoading: false,
|
||
|
|
notifications: []
|
||
|
|
});
|
||
|
|
|
||
|
|
this.perfMonitor = new PerformanceMonitor(this.logger);
|
||
|
|
|
||
|
|
this.api = new APIClient('/', this.logger, this.perfMonitor, this.appState);
|
||
|
|
|
||
|
|
setSharedAPIInstance(this.api);
|
||
|
|
|
||
|
|
this.lazyLoader = new LazyLoader({
|
||
|
|
threshold: 0.1,
|
||
|
|
rootMargin: '50px',
|
||
|
|
logger: this.logger
|
||
|
|
});
|
||
|
|
|
||
|
|
this._setupStateSubscriptions();
|
||
|
|
this._makeGloballyAccessible();
|
||
|
|
|
||
|
|
this.initialized = true;
|
||
|
|
|
||
|
|
this.logger.info('Application initialized successfully', {
|
||
|
|
version: '1.0.0',
|
||
|
|
timestamp: new Date().toISOString()
|
||
|
|
});
|
||
|
|
} catch (error) {
|
||
|
|
console.error('CRITICAL: Application initialization failed', error);
|
||
|
|
this.initialized = false;
|
||
|
|
throw error;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
_setupStateSubscriptions() {
|
||
|
|
this.appState.subscribe((newState, prevState, action) => {
|
||
|
|
this.logger.debug('State changed', {
|
||
|
|
from: prevState,
|
||
|
|
to: newState,
|
||
|
|
action
|
||
|
|
});
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
_makeGloballyAccessible() {
|
||
|
|
if (typeof window !== 'undefined') {
|
||
|
|
window.app = this;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
isReady() {
|
||
|
|
return this.initialized === true;
|
||
|
|
}
|
||
|
|
|
||
|
|
getLogger() {
|
||
|
|
if (!this.initialized) {
|
||
|
|
console.warn('Application not fully initialized');
|
||
|
|
}
|
||
|
|
return this.logger;
|
||
|
|
}
|
||
|
|
|
||
|
|
getState() {
|
||
|
|
if (!this.initialized) {
|
||
|
|
console.warn('Application not fully initialized');
|
||
|
|
}
|
||
|
|
return this.appState;
|
||
|
|
}
|
||
|
|
|
||
|
|
getAPI() {
|
||
|
|
if (!this.initialized) {
|
||
|
|
console.warn('Application not fully initialized');
|
||
|
|
}
|
||
|
|
return this.api;
|
||
|
|
}
|
||
|
|
|
||
|
|
getPerfMonitor() {
|
||
|
|
if (!this.initialized) {
|
||
|
|
console.warn('Application not fully initialized');
|
||
|
|
}
|
||
|
|
return this.perfMonitor;
|
||
|
|
}
|
||
|
|
|
||
|
|
getLazyLoader() {
|
||
|
|
if (!this.initialized) {
|
||
|
|
console.warn('Application not fully initialized');
|
||
|
|
}
|
||
|
|
return this.lazyLoader;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const app = new Application();
|
||
|
|
|
||
|
|
export { Application, app };
|
||
|
|
export default app;
|