feat(maintenance): show maintenance page when the API is in maintenance
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>
This commit is contained in:
@@ -2,6 +2,11 @@ import axios from "axios";
|
||||
import Cookies from "js-cookie";
|
||||
import { toast } from "react-toastify";
|
||||
import { getAccessToken, setAccessToken, clearAccessToken } from "@/lib/tokenStore";
|
||||
import {
|
||||
isMaintenanceError,
|
||||
maintenanceMessage,
|
||||
MAINTENANCE_PATH,
|
||||
} from "@/lib/maintenance";
|
||||
|
||||
function extractErrorMessage(error) {
|
||||
const errors = error?.response?.data?.errors;
|
||||
@@ -74,6 +79,23 @@ api.interceptors.response.use(
|
||||
async (error) => {
|
||||
const original = error?.config;
|
||||
|
||||
// پیش از بررسی ۴۰۱: در حالت تعمیرات نباید مسیر refresh token طی شود و کاربر
|
||||
// نباید logout شود. toast هم نمایش داده نمیشود چون صفحهی تعمیرات جایگزین است.
|
||||
if (isMaintenanceError(error)) {
|
||||
if (typeof window !== "undefined") {
|
||||
try {
|
||||
sessionStorage.setItem(
|
||||
"maintenance_message",
|
||||
maintenanceMessage(error.response.data)
|
||||
);
|
||||
} catch { }
|
||||
if (window.location.pathname !== MAINTENANCE_PATH) {
|
||||
window.location.replace(MAINTENANCE_PATH);
|
||||
}
|
||||
}
|
||||
return Promise.reject(error);
|
||||
}
|
||||
|
||||
if (
|
||||
error?.response?.status === 401 &&
|
||||
original?.requireAuth &&
|
||||
|
||||
Reference in New Issue
Block a user