feat: add domain parameter to sendCode for OTP requests to include city site name
This commit is contained in:
@@ -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 نساز.
|
||||||
@@ -24,7 +24,7 @@ function LogInPage({ setIsSendMsg, num, setNum, setUuid, matchedCity, setStep })
|
|||||||
const handleReq = async () => {
|
const handleReq = async () => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
request
|
request
|
||||||
.sendCode(num, "")
|
.sendCode(num, "", typeof window !== "undefined" ? window.location.hostname : "")
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
if (response.uuid) {
|
if (response.uuid) {
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ function Recode({ retryIcon, timer, setUuid, num, setTimer }) {
|
|||||||
rotateIcon();
|
rotateIcon();
|
||||||
}, 1200);
|
}, 1200);
|
||||||
request
|
request
|
||||||
.sendCode(changeNumToDefault(num), "")
|
.sendCode(changeNumToDefault(num), "", typeof window !== "undefined" ? window.location.hostname : "")
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
clearInterval(animIntervalRef.current);
|
clearInterval(animIntervalRef.current);
|
||||||
animIntervalRef.current = null;
|
animIntervalRef.current = null;
|
||||||
|
|||||||
@@ -2,12 +2,13 @@ import { removeTokenHead } from "@/helper";
|
|||||||
import api from "./api";
|
import api from "./api";
|
||||||
|
|
||||||
export const request = {
|
export const request = {
|
||||||
sendCode: (mobile, captcha_token) =>
|
sendCode: (mobile, captcha_token, domain) =>
|
||||||
api.post(
|
api.post(
|
||||||
"api/v1/user/send-code",
|
"api/v1/user/send-code",
|
||||||
{
|
{
|
||||||
mobile,
|
mobile,
|
||||||
captcha_token,
|
captcha_token,
|
||||||
|
...(domain ? { domain } : {}),
|
||||||
},
|
},
|
||||||
removeTokenHead
|
removeTokenHead
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user