From b088f68fd7b2168edfb32b27e349a1919f96aadd Mon Sep 17 00:00:00 2001 From: aramesh-site deploy Date: Fri, 9 Oct 2026 19:08:41 +0000 Subject: [PATCH] =?UTF-8?q?feat(projects):=20=D9=BE=DB=8C=D9=85=D8=A7?= =?UTF-8?q?=DB=8C=D8=B4=20=D9=BE=D8=B1=D9=88=DA=98=D9=87=D9=94=20=D9=82?= =?UTF-8?q?=D8=A8=D9=84=DB=8C/=D8=A8=D8=B9=D8=AF=DB=8C=20=D8=AF=D8=B1=20?= =?UTF-8?q?=D8=B5=D9=81=D8=AD=D9=87=D9=94=20=D9=87=D8=B1=20=D9=BE=D8=B1?= =?UTF-8?q?=D9=88=DA=98=D9=87=20(=D8=AD=D9=84=D9=82=D9=87=E2=80=8C=D8=A7?= =?UTF-8?q?=DB=8C=D8=8C=20=D8=AF=D9=88=D8=B2=D8=A8=D8=A7=D9=86=D9=87)=20?= =?UTF-8?q?=E2=80=94=20=DA=A9=D8=A7=D9=88=D8=B4=20=D8=A8=D8=AF=D9=88=D9=86?= =?UTF-8?q?=20=D8=A8=D8=A7=D8=B2=DA=AF=D8=B4=D8=AA=20=D8=A8=D9=87=20=D9=81?= =?UTF-8?q?=D9=87=D8=B1=D8=B3=D8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/i18n/dict.ts | 6 ++++ frontend/src/pages/ProjectDetail.tsx | 51 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/frontend/src/i18n/dict.ts b/frontend/src/i18n/dict.ts index 1e5bade..8602c7f 100644 --- a/frontend/src/i18n/dict.ts +++ b/frontend/src/i18n/dict.ts @@ -13,6 +13,9 @@ export const fa = { switchLangAria: 'تغییر زبان به انگلیسی', understood: 'متوجه شدم', paginationAria: 'صفحه‌بندی پروژه‌ها', + prevProject: 'پروژهٔ قبلی', + nextProject: 'پروژهٔ بعدی', + projectNavAria: 'پیمایش بین پروژه‌ها', previousPage: 'صفحهٔ قبل', nextPage: 'صفحهٔ بعد', @@ -145,6 +148,9 @@ export const en: Dict = { switchLangAria: 'Switch language to Persian (Farsi)', understood: 'Got it', paginationAria: 'Projects pagination', + prevProject: 'Previous project', + nextProject: 'Next project', + projectNavAria: 'Browse projects', previousPage: 'Previous page', nextPage: 'Next page', diff --git a/frontend/src/pages/ProjectDetail.tsx b/frontend/src/pages/ProjectDetail.tsx index 27148ac..67a4d5a 100644 --- a/frontend/src/pages/ProjectDetail.tsx +++ b/frontend/src/pages/ProjectDetail.tsx @@ -79,6 +79,15 @@ export function ProjectDetail() { } const related = projects.filter((p) => p.slug !== project.slug).slice(0, 3) + + /** + * پیمایش پروژه‌ها — همان ترتیبی که فهرست پروژه‌ها دارد (position از API). + * در ابتدا/انتهای فهرست، حلقه می‌زند تا کاوش هیچ‌وقت قطع نشود. + */ + const currentIndex = projects.findIndex((p) => p.slug === project.slug) + const total = projects.length + const prevProject = total > 1 ? projects[(currentIndex - 1 + total) % total] : undefined + const nextProject = total > 1 ? projects[(currentIndex + 1) % total] : undefined // مشخصات هر پروژه — همان فهرستی که تیم داده دارد: // وضعیت / سال / تعداد طبقات / واحدها / نوع پروژه / زیربنا / کاربری @@ -219,6 +228,48 @@ export function ProjectDetail() { + {/* پیمایش پروژه‌ها — رفتن به پروژهٔ قبلی/بعدی بدون بازگشت به فهرست */} + {(prevProject || nextProject) && ( + + )} +

{t('otherProjects')}