diff --git a/.claude/prompt/otp-sms-site-name.md b/.claude/prompt/otp-sms-site-name.md new file mode 100644 index 0000000..7272f1f --- /dev/null +++ b/.claude/prompt/otp-sms-site-name.md @@ -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 نساز. diff --git a/components/register/LogInPage.js b/components/register/LogInPage.js index 1f433f0..43b7680 100644 --- a/components/register/LogInPage.js +++ b/components/register/LogInPage.js @@ -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) { diff --git a/components/register/verificationPage/Recode.js b/components/register/verificationPage/Recode.js index e703d51..1cce081 100644 --- a/components/register/verificationPage/Recode.js +++ b/components/register/verificationPage/Recode.js @@ -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; diff --git a/services/response.js b/services/response.js index 1e916e6..217d365 100644 --- a/services/response.js +++ b/services/response.js @@ -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 ),