Files

4.2 KiB
Raw Permalink Blame History

ارسال دامنه‌ی شهر همراه درخواست کد تأیید (برای اسم سایت در پیامک OTP)

پروژه

nobat724_frontcross-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 نساز.