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>
33 lines
1.2 KiB
JavaScript
33 lines
1.2 KiB
JavaScript
import axios from "axios";
|
|
import https from "https";
|
|
import { redirect } from "next/navigation";
|
|
|
|
import { isMaintenanceError, MAINTENANCE_PATH } from "@/lib/maintenance";
|
|
|
|
export const axiosInstance = axios.create({
|
|
...(process.env.NODE_ENV === "development" && {
|
|
httpsAgent: new https.Agent({ rejectUnauthorized: false }),
|
|
}),
|
|
});
|
|
|
|
/**
|
|
* @param {object} [options]
|
|
* @param {boolean} [options.silentMaintenance] در حالت تعمیرات بهجای ریدایرکت
|
|
* `null` برگردان. برای فراخوانیهایی لازم است که داخل `generateMetadata` یا در
|
|
* مسیر رندرِ خودِ صفحهی تعمیرات اجرا میشوند و ریدایرکت آنها یا بیاثر است یا
|
|
* حلقه میسازد (مثل `getStateInfo`).
|
|
*/
|
|
export const fetchReq = async (url, headers, options = {}) => {
|
|
try {
|
|
const response = await axiosInstance.get(url, headers);
|
|
return response.data;
|
|
} catch (error) {
|
|
if (isMaintenanceError(error)) {
|
|
if (options.silentMaintenance) return null;
|
|
redirect(MAINTENANCE_PATH);
|
|
}
|
|
console.error("fetchReq error:", error.message);
|
|
return null;
|
|
}
|
|
};
|