۲ — فیلدها و اندپوینتی که صفحه‌ها لازم داشتند #3

Closed
AliReza_Zareian wants to merge 3 commits from AliReza_Zareian/MathApp_frontend:zareian/api-client-2 into main

3 Commits

Author SHA1 Message Date
21cce5ea2b make the relative /api paths in App.tsx actually reach the backend
کدِ auth داخلِ App.tsx مسیرهای نسبی صدا می‌زند (`/api/auth/login` و مانندش).
این مسیرها به دامنه‌ی خودِ فرانت می‌روند، nginx چون آن مسیر را نمی‌شناسد
index.html برمی‌گرداند، و نتیجه پاسخِ ۲۰۰ با بدنه‌ی HTML است — یعنی res.ok
درست به نظر می‌رسد و بعد res.json() با «Unexpected token '<'» می‌شکند.
همین الان روی math.tadrisino2.ir قابلِ بازتولید است.

در حالتِ توسعه پروکسیِ vite حلش می‌کند: هر /api به بک‌اند فرستاده می‌شود و
کدِ موجود بدونِ هیچ تغییری کار می‌کند. مقصد با VITE_API_PROXY_TARGET قابلِ
عوض کردن است، پیش‌فرض بک‌اندِ مشترک.

برای بیلدِ نهایی apiUrl() اضافه شد: fetch(apiUrl('/auth/login')) به‌جای
fetch('/api/auth/login'). یا اگر روی سرور مسیرِ /api به بک‌اند پروکسی شود،
مسیرهای نسبی همان‌طور که هستند درست کار می‌کنند — آن راه حتی بهتر است چون
same-origin می‌شود و CORS از میان برمی‌دارد.

App.tsx دست نخورده؛ تصمیمِ اینکه کدام راه را بروند با خودشان است.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 02:25:55 +03:30
007c450c0a add the subscription card fields
plans() حالا features و badge می‌دهد؛ بندهای کارتِ اشتراک و برچسبِ بالایش
دیگر لازم نیست در کد بمانند و عوض کردنشان به دیپلویِ تازه نیاز ندارد.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 02:03:19 +03:30
7dd457d2fc expose the fields and endpoint the screens were missing
بعد از merge شدنِ PR اول، صفحه‌های اپ با API مقایسه شدند و چند چیز کم بود.
همه‌ی تغییراتِ بک‌اند افزایشی‌اند، پس کدِ فعلی نمی‌شکند — این فقط دسترسی به
آن‌ها را اضافه می‌کند.

grades() حالا lessonCount دارد: فهرستِ پایه‌ها تا دوازدهم می‌رود ولی محتوا
تا نهم است، و بدونِ این عدد کاربر پایه‌ی خالی را انتخاب می‌کند و صفحه‌ی
خالی می‌بیند بی‌آنکه بفهمد چرا.

home() در هر مبحث icon و color و در هر فصل blurb می‌دهد، تا رنگ‌ها لازم
نباشد در کد هاردکد بمانند.

nodes.lessons(nodeId) تازه است. home() فقط شناسه‌ی درس‌ها را می‌دهد، ولی
کارتِ نقشه‌ی مهارت عنوان، نوع (آزمون/ویدیو)، زیرنویس («۵ سوال» / «۱۲
دقیقه») و «انجام شد» می‌خواهد — بدونِ این، برای هر کارت یک درخواستِ intro
جدا لازم بود.

lessons.intro() متن را سه‌تکه می‌دهد: introText (توضیح)، example، و steps
(حلِ گام‌به‌گام)؛ به‌علاوه kind و videoUrl و durationMinutes.

profile.update({ age }) هم پذیرفته می‌شود چون صفحه‌ی ثبت‌نام سن می‌پرسد؛
سرور خودش به سالِ تولدِ شمسی تبدیل می‌کند.

هنوز هیچ فایلِ موجودی دست نخورده و پکیجی اضافه نشده. هر ۲۰ صدا در برابرِ
یک بک‌اندِ در حالِ اجرا تست شد.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 01:50:04 +03:30