diff --git a/src/config-loader.js b/src/config-loader.js index 5b2d1ab..88364d0 100644 --- a/src/config-loader.js +++ b/src/config-loader.js @@ -357,6 +357,11 @@ } function showServerUnavailable() { + if (configTimeoutId) { + clearTimeout(configTimeoutId); + configTimeoutId = null; + } + mainScriptLoaded = true; // جلوی timeout برای لود main var appRoot = document.querySelector('#app') || document.body; appRoot.innerHTML = '
' + @@ -392,6 +397,12 @@ try { const { config } = await fetchConfig(); + if (isServerUnreachable(config)) { + writeCachedAppConfig(config); + showServerUnavailable(); + cancelVersionUpdateLock(); + return true; + } clearBootstrapCachesKeepToken(); writeCachedAppConfig(config); applyConfig(config); @@ -402,31 +413,43 @@ } catch (error) { console.error('Version update failed:', error); cancelVersionUpdateLock(); - return false; + // بعد از bump نسخه (مثلاً قفل سوپر) کش قدیمی reachable را قبول نکن + showServerUnavailable(); + return true; } } async function loadConfig() { + let versionChanged = false; + let needsFreshForVersion = false; + try { - // ۱) کش get_user — اگر بود سریع اعمال شود + // کش قدیمی را فقط اگر خودش قفل باشد اعمال/قطع کن؛ وگرنه تا get_user تازه صبر کن const cachedConfig = readCachedAppConfig(); - if (cachedConfig) { - applyConfig(cachedConfig); - console.log('Applied cached get_user'); + if (cachedConfig && isServerUnreachable(cachedConfig)) { + showServerUnavailable(); + return; } - // ۲) get_version — اگر تغییر کرده hard refresh const remoteVersion = await loadVersion(); - if (remoteVersion && shouldUpdateForVersion(remoteVersion) && canStartVersionUpdate(remoteVersion)) { + needsFreshForVersion = Boolean(remoteVersion && shouldUpdateForVersion(remoteVersion)); + versionChanged = Boolean( + needsFreshForVersion && canStartVersionUpdate(remoteVersion) + ); + + if (versionChanged) { const updating = await applyVersionUpdate(remoteVersion); if (updating) { return; } } - // ۳) تازه کردن get_user و کش const { config, url } = await fetchConfig(); applyConfig(config); + writeCachedAppConfig(config); + if (remoteVersion) { + writeStoredAppVersion(remoteVersion); + } console.log('Config loaded successfully from', url, config); finishConfigLoad(config); } catch (error) { @@ -436,7 +459,12 @@ } console.warn('Config loader: Could not fetch config from any endpoint'); console.warn('Error details:', error && error.message ? error.message : error); - console.warn('App will continue with empty/cached config.'); + + // اگر نسخه عوض شده (قفل/آنلاک)، هرگز با کش قدیمی reachable ادمین را بالا نیاور + if (versionChanged || needsFreshForVersion) { + showServerUnavailable(); + return; + } const cachedConfig = readCachedAppConfig(); if (cachedConfig) { @@ -470,20 +498,14 @@ configTimeoutId = setTimeout(function() { if (!mainScriptLoaded) { - console.warn('Config loader: Timeout reached. Loading main.ts with empty/cached config.'); + console.warn('Config loader: Timeout reached.'); const cachedConfig = readCachedAppConfig(); if (isServerUnreachable(cachedConfig) || isServerUnreachable(window.__APP_CONFIG__)) { showServerUnavailable(); return; } - window.__APP_CONFIG__ = cachedConfig || window.__APP_CONFIG__ || {}; - window.__CONFIG_READY__ = true; - - if (configResolve) { - configResolve(window.__APP_CONFIG__); - } - - loadMainScript(); + // بدون تأیید تازه از get_user، ادمین را با کش بالا نیاور (دور زدن قفل) + showServerUnavailable(); } }, CONFIG_TIMEOUT); diff --git a/src/core/utils/useAxios.ts b/src/core/utils/useAxios.ts index b8dc45b..9d64972 100644 --- a/src/core/utils/useAxios.ts +++ b/src/core/utils/useAxios.ts @@ -88,6 +88,16 @@ _axios.interceptors.response.use( showServerUnavailableOverlay('خطا در برقراری ارتباط با سرور') return Promise.reject(error) } + // PHP fatal / memory (گاهی به‌جای 503 تمیز) — پنل را باز نگه ندار + if ( + error.response && + error.response.status >= 500 && + typeof error.response.data?.message === 'string' && + /Allowed memory size|Fatal error|server/i.test(error.response.data.message) + ) { + showServerUnavailableOverlay('خطا در برقراری ارتباط با سرور') + return Promise.reject(error) + } if (error.response && error.response.status == 401) { ///removeToken() console.log('error')