import { loadAppConfig } from '@/config/load-config' import { setAppConfig } from '@/config/app-config' import { applyAppConfig } from '@/config/apply-config' import { startPwaManifest } from '@/modules/pwa/manifest' import { createVueApp } from '@/app/createApp' import { setupRouterGuards } from '@/app/setupRouter' import router from '@/router' import { applyProjectTheme } from '@/utils/config' import { useSettingsStore } from '@/store/settingsStore' import { useUserStore } from '@/store/userStore' import { getToken } from '@/utils' import { initPriceRealtimeChannel } from '@/utils/priceSocket' type BootWindow = Window & { __BOOT_TIMEOUT__?: number __APP_BOOTSTRAPPED__?: boolean } function clearBootTimeout() { const bootWindow = window as BootWindow if (bootWindow.__BOOT_TIMEOUT__) { window.clearTimeout(bootWindow.__BOOT_TIMEOUT__) bootWindow.__BOOT_TIMEOUT__ = undefined } } function withTimeout(promise: Promise, ms: number, message: string): Promise { return Promise.race([ promise, new Promise((_, reject) => { window.setTimeout(() => { reject(new Error(message)) }, ms) }) ]) } function showBootstrapError(error: unknown) { clearBootTimeout() console.error('Bootstrap failed:', error) const appRoot = document.querySelector('#app') if (!appRoot) return appRoot.innerHTML = `
⚠️

خطا در راه‌اندازی برنامه

لطفاً اتصال اینترنت خود را بررسی کنید و دوباره تلاش کنید.

` } function applyTenantThemeVars() { applyProjectTheme() const color = window.__APP_CONFIG__?.user?.color const secondaryColor = window.__APP_CONFIG__?.user?.secondary_color const backgroundColor = window.__APP_CONFIG__?.user?.background_color if (color) { document.documentElement.style.setProperty('--App-primary-color', color) } if (secondaryColor) { document.documentElement.style.setProperty('--App-secondary-color', secondaryColor) } if (backgroundColor) { document.documentElement.style.setProperty('--App-background-color', backgroundColor) } } function detectTWA() { const fromReferrer = document.referrer.startsWith('android-app://'); const fromParam = new URLSearchParams(window.location.search).get('source') === 'twa'; if (fromReferrer || fromParam) { sessionStorage.setItem('appMode', 'twa'); // پاک کردن پارامتر از URL if (fromParam) { const url = new URL(window.location.href); url.searchParams.delete('source'); window.history.replaceState({}, '', url); } } } export async function bootstrapApp() { try { detectTWA() const config = await withTimeout(loadAppConfig(), 20000, 'Config loading timeout') setAppConfig(config) applyTenantThemeVars() startPwaManifest(config) applyAppConfig() const { app } = createVueApp() const settingsStore = useSettingsStore() const userStore = useUserStore() await withTimeout(settingsStore.fetchSettings(), 45000, 'Settings loading timeout') initPriceRealtimeChannel((key) => settingsStore.getSettingByKey(key)) if (getToken()) { await withTimeout(userStore.getMyInfo(), 45000, 'User session loading timeout') } setupRouterGuards() app.mount('#app') await router.isReady() if (!getToken() && router.currentRoute.value.name !== 'login') { await router.replace({ name: 'login' }) } ;(window as BootWindow).__APP_BOOTSTRAPPED__ = true clearBootTimeout() sessionStorage.removeItem('__APP_BOOT_RECOVERY_DONE__') sessionStorage.removeItem('__APP_BOOT_RETRY_CLICKED__') } catch (error) { showBootstrapError(error) } }