feat: add domain parameter to sendCode for OTP requests to include city site name

This commit is contained in:
hamed
2026-07-04 11:01:56 +03:30
parent 41f7739726
commit 97cc4fdc69
4 changed files with 106 additions and 3 deletions
+102
View File
@@ -0,0 +1,102 @@
# ارسال دامنه‌ی شهر همراه درخواست کد تأیید (برای اسم سایت در پیامک 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`:
```js
export const request = {
sendCode: (mobile, captcha_token) =>
api.post(
"api/v1/user/send-code",
{
mobile,
captcha_token,
},
removeTokenHead
),
```
فراخوانی‌ها (client component، داخل مرورگر):
```js
// components/register/LogInPage.js:27
.sendCode(num, "")
// components/register/verificationPage/Recode.js:52
.sendCode(changeNumToDefault(num), "")
```
## وظایف
### ۱. افزودن `domain` به wrapper `sendCode`
`services/response.js` — پارامتر سوم اختیاری `domain`، فقط اگر مقدار داشت به body اضافه شود:
```js
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` (خط ۲۷):
```js
const domain = typeof window !== "undefined" ? window.location.hostname : "";
// ...
.sendCode(num, "", domain)
```
`components/register/verificationPage/Recode.js` (خط ۵۲):
```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 ندارد.
- تست:
```bash
cd nobat724_front
npm run lint
npm run build
```
- الگوی پروژه: از همان `request.sendCode` استفاده کن؛ فراخوانی مستقیم axios نساز.
+1 -1
View File
@@ -24,7 +24,7 @@ function LogInPage({ setIsSendMsg, num, setNum, setUuid, matchedCity, setStep })
const handleReq = async () => {
setLoading(true);
request
.sendCode(num, "")
.sendCode(num, "", typeof window !== "undefined" ? window.location.hostname : "")
.then((response) => {
setLoading(false);
if (response.uuid) {
@@ -49,7 +49,7 @@ function Recode({ retryIcon, timer, setUuid, num, setTimer }) {
rotateIcon();
}, 1200);
request
.sendCode(changeNumToDefault(num), "")
.sendCode(changeNumToDefault(num), "", typeof window !== "undefined" ? window.location.hostname : "")
.then((response) => {
clearInterval(animIntervalRef.current);
animIntervalRef.current = null;
+2 -1
View File
@@ -2,12 +2,13 @@ import { removeTokenHead } from "@/helper";
import api from "./api";
export const request = {
sendCode: (mobile, captcha_token) =>
sendCode: (mobile, captcha_token, domain) =>
api.post(
"api/v1/user/send-code",
{
mobile,
captcha_token,
...(domain ? { domain } : {}),
},
removeTokenHead
),