The backend now answers 503 with code MAINTENANCE_MODE while maintenance is on. Without this change a visitor got a red error toast over a broken page client-side, and a silently empty page server-side, because fetchReq discards the status and returns null on any failure. - lib/maintenance.js detects the state by BOTH status 503 and the error code; a bare 503 can come from a reverse proxy and is not maintenance - The axios interceptor checks it before the 401 branch, so a maintenance response never triggers the refresh-token path or logs the user out - fetchReq redirects to /maintenance, with a silentMaintenance opt-out used by getStateInfo: that one runs inside generateMetadata and while rendering the maintenance page itself, where a redirect is either ineffective or loops - redirect() works by throwing, so the try/catch blocks in the doctors, clinics and specialties pages now rethrow NEXT_REDIRECT instead of swallowing it - clinicApi.js handles 503 too; it previously rendered maintenance as a clinic with zero doctors - The page reuses the existing 404 design and is marked noindex Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
29 lines
1.1 KiB
JavaScript
29 lines
1.1 KiB
JavaScript
export const MAINTENANCE_CODE = "MAINTENANCE_MODE";
|
|
|
|
export const MAINTENANCE_PATH = "/maintenance";
|
|
|
|
export const DEFAULT_MAINTENANCE_MESSAGE =
|
|
"سامانه موقتاً در دسترس نیست. لطفاً چند دقیقه دیگر مجدداً تلاش کنید.";
|
|
|
|
/**
|
|
* تشخیص پاسخ حالت تعمیرات backend.
|
|
*
|
|
* هر دو شرط لازم است: یک ۵۰۳ خالی میتواند از reverse proxy یا load balancer هم
|
|
* بیاید و آن حالت تعمیرات نیست.
|
|
*/
|
|
export function isMaintenanceError(error) {
|
|
const response = error?.response;
|
|
if (response?.status !== 503) return false;
|
|
|
|
return response?.data?.errors?.[0]?.code === MAINTENANCE_CODE;
|
|
}
|
|
|
|
export function maintenanceMessage(data) {
|
|
return data?.errors?.[0]?.message ?? DEFAULT_MAINTENANCE_MESSAGE;
|
|
}
|
|
|
|
/** خطای redirect نکست با throw کار میکند و نباید در catchهای عمومی بلعیده شود. */
|
|
export function isNextRedirectError(error) {
|
|
return typeof error?.digest === "string" && error.digest.startsWith("NEXT_REDIRECT");
|
|
}
|