feat: enhance domain handling for global representatives

- Updated `getStateInfo` to fetch site context for domains not in city.json, returning `repContext` with representative details.
- Implemented caching for site context requests to optimize performance.
- Modified doctor and clinic listing pages to pass the `domain` parameter when fetching data for global representatives.
- Adjusted metadata generation in layout and pages to reflect representative branding based on `repContext`.
- Added documentation for the new functionality in `.claude/prompt/global-rep-domain-site.md`.
This commit is contained in:
hamed
2026-07-09 07:34:09 +03:30
parent a56b7e8de5
commit ab2ab0dea2
12 changed files with 612 additions and 135 deletions
+10 -3
View File
@@ -18,8 +18,8 @@ function listingRobots(params) {
export async function generateMetadata({ searchParams }) {
const awaitedParams = await searchParams;
const { matchedCity, matchedState } = await getStateInfo();
const siteName = matchedCity?.site_name || "نوبت 724";
const { matchedCity, matchedState, repContext } = await getStateInfo();
const siteName = matchedCity?.site_name || repContext?.full_name || "نوبت 724";
const cityName = matchedCity?.name || matchedState?.name || "";
const title = cityName
? `کلینیک‌های ${cityName} | جستجو و رزرو نوبت | ${siteName}`
@@ -39,7 +39,7 @@ export async function generateMetadata({ searchParams }) {
export default async function Clinics({ searchParams }) {
const awaitedSearchParams = await searchParams;
const { matchedCity, matchedState, isRoot } = await getStateInfo();
const { matchedCity, matchedState, isRoot, repContext, host } = await getStateInfo();
const API_URL = process.env.NEXT_PUBLIC_API_URL;
const stateParams = awaitedSearchParams.state;
const cityParams = awaitedSearchParams.city;
@@ -59,6 +59,13 @@ export default async function Clinics({ searchParams }) {
const params = buildClinicParams(newSearchParams);
// دامنه‌ی نماینده سراسری: backend فقط کلینیک‌های همان نماینده را برمی‌گرداند؛ فیلتر شهر بی‌معنی است.
if (repContext?.is_global) {
delete params.city;
delete params.state;
params.domain = host;
}
// Req
clinics = await fetchReq(`${API_URL}/api/v1/clinics`, {
params,
+10 -3
View File
@@ -18,8 +18,8 @@ function listingRobots(params) {
export async function generateMetadata({ searchParams }) {
const awaitedParams = await searchParams;
const { matchedCity, matchedState } = await getStateInfo();
const siteName = matchedCity?.site_name || "نوبت 724";
const { matchedCity, matchedState, repContext } = await getStateInfo();
const siteName = matchedCity?.site_name || repContext?.full_name || "نوبت 724";
const cityName = matchedCity?.name || matchedState?.name || "";
const title = cityName
? `پزشکان ${cityName} | جستجو و رزرو نوبت | ${siteName}`
@@ -39,7 +39,7 @@ export async function generateMetadata({ searchParams }) {
async function Doctors({ searchParams }) {
const awaitedSearchParams = await searchParams;
const { matchedCity, matchedState, isRoot } = await getStateInfo();
const { matchedCity, matchedState, isRoot, repContext, host } = await getStateInfo();
const API_URL = process.env.NEXT_PUBLIC_API_URL;
let doctors = null;
@@ -59,6 +59,13 @@ async function Doctors({ searchParams }) {
const params = buildDoctorParams(newSearchParams);
// دامنه‌ی نماینده سراسری: backend فقط پزشکان همان نماینده را برمی‌گرداند؛ فیلتر شهر بی‌معنی است.
if (repContext?.is_global) {
delete params.city_id;
delete params.state_id;
params.domain = host;
}
doctors = await fetchReq(`${API_URL}/api/v1/doctors`, {
params,
});
+5 -3
View File
@@ -16,7 +16,7 @@ export const viewport = {
};
export async function generateMetadata() {
const { matchedCity } = await getStateInfo();
const { matchedCity, repContext } = await getStateInfo();
const headersList = await headers();
const metadataBase = new URL(buildCanonicalUrl(headersList.get("host"), "/"));
@@ -27,7 +27,9 @@ export async function generateMetadata() {
matchedCity?.title ||
(matchedCity?.name
? `نوبت‌دهی آنلاین پزشکان ${matchedCity.name} | نوبت 724`
: "نوبت 724 | سیستم نوبت‌دهی آنلاین پزشکی");
: repContext?.full_name
? `نوبت‌دهی آنلاین پزشکان | ${repContext.full_name}`
: "نوبت 724 | سیستم نوبت‌دهی آنلاین پزشکی");
const description = matchedCity?.description || "نوبت 724 - سیستم آنلاین نوبت‌دهی برای پزشکان و کلینیک‌ها. با استفاده از نوبت 724، به راحتی نوبت پزشکی خود را به صورت آنلاین رزرو کنید و از خدمات سریع و کارآمد ما بهره‌مند شوید";
const baseMetadata = {
@@ -42,7 +44,7 @@ export async function generateMetadata() {
description,
type: "website",
locale: "fa_IR",
siteName: matchedCity?.site_name || "نوبت 724",
siteName: matchedCity?.site_name || repContext?.full_name || "نوبت 724",
images: ["https://nobat724.com/assets/images/logo.png"],
},
twitter: {