4.2 KiB
ارسال دامنهی شهر همراه درخواست کد تأیید (برای اسم سایت در پیامک OTP)
پروژه
nobat724_front — cross-repo؛ پرامپت همتای backend: clinicpro/.claude/prompt/otp-sms-site-name.md (اول backend اجرا شود).
زمینه
سایت چند-دامنهای است؛ هر شهر یک دامنه (yasuj-nobat.ir, ahvaz-nobat.ir, ...). backend قابلیت اضافهشدن اسم سایتِ شهر به پیامک کد تأیید را دارد، اما چون درخواست به api.clinic-pro.ir میرود، backend نمیداند از کدام شهر آمده. پس frontend باید دامنهی خودش را در body درخواست send-code بفرستد.
مشکل / هدف
فراخوانی send-code فعلی فقط mobile و captcha_token میفرستد. باید فیلد domain (دامنهی فعلی مرورگر) هم ارسال شود تا backend اسم سایت شهر را در پیامک قرار دهد. تغییر باید ایمن باشد: اگر domain در دسترس نبود، ارسال نشود (backend fallback دارد).
فایلهای مرتبط
| فایل | نقش |
|---|---|
services/response.js |
wrapper فراخوانی request.sendCode |
components/register/LogInPage.js |
صفحه لاگین — فراخوانی sendCode (خط ۲۷) |
components/register/verificationPage/Recode.js |
ارسال مجدد کد — فراخوانی sendCode (خط ۵۲) |
وضعیت فعلی
services/response.js:
export const request = {
sendCode: (mobile, captcha_token) =>
api.post(
"api/v1/user/send-code",
{
mobile,
captcha_token,
},
removeTokenHead
),
فراخوانیها (client component، داخل مرورگر):
// components/register/LogInPage.js:27
.sendCode(num, "")
// components/register/verificationPage/Recode.js:52
.sendCode(changeNumToDefault(num), "")
وظایف
۱. افزودن domain به wrapper sendCode
services/response.js — پارامتر سوم اختیاری domain، فقط اگر مقدار داشت به body اضافه شود:
sendCode: (mobile, captcha_token, domain) =>
api.post(
"api/v1/user/send-code",
{
mobile,
captcha_token,
...(domain ? { domain } : {}),
},
removeTokenHead
),
۲. پاسدادن دامنهی فعلی از صفحههای فراخوان
چون این کامپوننتها client هستند، دامنه از window.location.hostname گرفته میشود (SSR-safe با گارد).
components/register/LogInPage.js (خط ۲۷):
const domain = typeof window !== "undefined" ? window.location.hostname : "";
// ...
.sendCode(num, "", domain)
components/register/verificationPage/Recode.js (خط ۵۲):
const domain = typeof window !== "undefined" ? window.location.hostname : "";
// ...
.sendCode(changeNumToDefault(num), "", domain)
window.location.hostnameمقدار خالص دامنه میدهد (مثلyasuj-nobat.ir) بدون پروتکل — دقیقاً همان چیزی که backend برای lookup درcities.domainمیخواهد.
نکات مهم
- اختیاری و ایمن: اگر
domainنبود (مثلاًlocalhostیا دامنهی اصلی)، backend fallback به برند «نوبت ۷۲۴» دارد؛ پس هیچ رفتار موجودی نمیشکند. - روی
localhost/دامنهی توسعه،hostnameمقدار غیرشهری میدهد → backend شهر پیدا نمیکند → برند پیشفرض. اشکالی ندارد. - قرارداد API: فیلد جدید body =
domain(string، اختیاری) درPOST /api/v1/user/send-code. مطابق backend نسخهیclinicpro/.claude/prompt/otp-sms-site-name.md. مطمئن شو backend اول اجرا/دیپلوی شده باشد. - این تغییر client-side است؛ نیازی به
generateMetadataیا تغییر SSR ندارد. - تست:
cd nobat724_front npm run lint npm run build - الگوی پروژه: از همان
request.sendCodeاستفاده کن؛ فراخوانی مستقیم axios نساز.