# بازگشت به صفحهٔ مبدأ بعد از لاگین (redirect-back)
## پروژه
`nobat724_front` (سایت عمومی)
## زمینه
مکانیزم بازگشت بعد از لاگین **از قبل وجود دارد**: مرحلهٔ تأیید کد (`SendReq.js`) بعد از ورود موفق، پارامتر `?redirect=` را از URL میخواند و کاربر را به همان مسیر برمیگرداند (فقط مسیر داخلی امن). اما **لینکها/ناوبریهای لاگین در سایت این پارامتر را نمیسازند** — بهجز یک مورد (`components/doctor/claim/index.js`). نتیجه: کاربر از هر صفحهای (مثلاً صفحهٔ پزشک برای گرفتن نوبت) روی «ورود | ثبت نام» بزند، بعد از لاگین به `/` (خانه) میرود، نه صفحهٔ مبدأ.
## مشکل / هدف
هر جای سایت که به `/login` میرویم، باید مسیر فعلی را بهصورت `?redirect=<current-path>` به لینک لاگین اضافه کنیم تا بعد از ورود موفق کاربر به همان صفحه برگردد. الگوی درست از قبل در پروژه هست و فقط باید به بقیهٔ نقاط تعمیم داده شود.
لینک هدر که پارامتر ندارد (`components/layout/header/Content.js` L40–47) — این کامپوننت `"use client"` است و همین حالا `const pathname = usePathname();` را دارد (L17):
```jsx
{isLogged?(
<ProfileUser/>
):(
<Linkhref="/login">
<Buttonvariant="outlined"color="primary">
ورود|ثبتنام
</Button>
</Link>
)}
```
## وظایف
### ۱. لینک لاگین هدر (اصلیترین)
در `components/layout/header/Content.js` L43، `pathname` که همینجا موجود است را به لینک اضافه کن. از رفتن به `/login?redirect=/login` جلوگیری کن:
در `app/payment/[uuid]/page.js` L35 (`router.push("/login")`)، مسیر فعلی را ضمیمه کن. این کامپوننت client است؛ اگر `usePathname` وارد نشده، آن را از `next/navigation` وارد کن و استفاده کن:
در `app/dashboard/page.js` L29، صفحهٔ محافظتشده هنگام نبود auth به لاگین میرود؛ مقصد بازگشت را ثابت `/dashboard` بگذار:
```jsx
returnredirect("/login?redirect=/dashboard");
```
(چون این redirect سمت سرور است و به مسیر ثابت داشبورد مربوط است، نیازی به `usePathname` نیست.)
## نکات مهم
- **پارامتر در طول جریان لاگین حفظ میشود:** صفحهٔ `/login` → `ContentLogin` → `RegisterPage` مرحلهٔ ارسال کد و تأیید را با state داخلی (`isSendMsg`) عوض میکند و **ناوبری جدید انجام نمیدهد**، پس URL روی `/login?redirect=...` میماند و `SendReq.js` با `window.location.search` آن را میخواند. نیازی به پاسدادن prop اضافه نیست.
- **امنیت redirect از قبل هندل شده:** فقط مسیرِ داخلی که با `/` شروع شود و با `//` شروع نشود پذیرفته میشود (`SendReq.js` L92). مقدار را همیشه با `encodeURIComponent(pathname)` بساز.
- **`app/login/page.js`**: کاربرِ از قبل لاگینشده به `/` هدایت میشود (`ability.can("access","Login")`). این رفتار درست است و نباید تغییر کند؛ فقط برای کاربرِ مهمان `?redirect=` معنا دارد.
- **`ModalLogout.js` (L19) را تغییر نده:** بعد از *خروج* بردن کاربر به `/login` با `?redirect=` به صفحهٔ محافظتشده باعث حلقه/بازگشت ناخواسته میشود. لاگاوت باید به `/login` سادهٔ فعلی برود.
- **صفحهٔ appointment inline login دارد:** جریان گرفتن نوبت با `setStep(3)` بعد از لاگین در همان صفحه میماند (`SendReq.js` L86–87) و ناوبری نمیکند؛ نیازی به `?redirect=` ندارد و نباید دست بخورد.
-`usePathname` فقط در Client Component کار میکند؛ برای redirectهای سمت سرور (وظیفهٔ ۳) از مسیر ثابت استفاده کن.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.