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')