From ca96a91dee9b3387e5f651effed964c3e13fdbdd Mon Sep 17 00:00:00 2001 From: AliReza Date: Wed, 14 Oct 2026 16:55:17 +0330 Subject: [PATCH] =?UTF-8?q?No=20diacritics=20or=20written=20ezafe=20=DB=8C?= =?UTF-8?q?=20in=20the=20UI;=20map=20without=20the=20speech=20banner,=20co?= =?UTF-8?q?mpanions=20cheering=20along=20the=20path;=20familiar=20payment?= =?UTF-8?q?=20sheet=20with=20gateway=20logos=20and=20per-channel=20methods?= =?UTF-8?q?;=20account=20deletion=20moved=20under=20=C2=AB=D8=AD=D8=B3?= =?UTF-8?q?=D8=A7=D8=A8=20=DA=A9=D8=A7=D8=B1=D8=A8=D8=B1=DB=8C=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Text: kasra/fatha/damma/shadda/sukun/hamza-above and «ه‌ی» ezafe removed from every user-visible string (comments untouched); tanwin kept. Stale copy fixed (question packs are no longer sold), awkward onboarding sentences rewritten, سؤال → سوال. plainPersian() in MathText cleans the live tutor stream. - Home: the mascot + speech bubble header is gone; the selected companion hops beside the current island and sits at every third bend (CSS transform animations only). - Checkout: order summary, payment-method rows with Zarinpal/Bazaar icons and radio, amount on the pay button, lock trust line, darker overlay. paymentMethods in config.js per channel (web: zarinpal, app: zarinpal+bazaar by default). - Profile: «ورود با حساب دیگر» removed (it was logout); new «حساب کاربری» sheet shows phone/ID and holds «حذف حساب کاربری»; logout is a red row. Delete sheet tells Bazaar subscribers to cancel renewal in Bazaar. Co-Authored-By: Claude Opus 5.5 --- README.md | 12 +++ index.html | 8 +- pay.html | 2 +- public/config.js | 4 + src/api/http.ts | 2 +- src/app/MainApp.tsx | 6 +- src/assets/pay/bazaar.png | Bin 0 -> 14071 bytes src/assets/pay/zarinpal.png | Bin 0 -> 3099 bytes src/components/BirthDatePicker.tsx | 6 +- src/components/BrandFooter.tsx | 4 +- src/components/FeedbackBar.tsx | 20 ++--- src/components/IslandPath.tsx | 83 +++++++++++++++++++- src/components/IslandSheet.tsx | 10 +-- src/components/NoHeartsScreen.tsx | 16 ++-- src/components/Sheet.tsx | 2 +- src/components/StreakFlame.tsx | 4 +- src/components/ui.tsx | 2 +- src/dev/DiagramGallery.tsx | 2 +- src/dev/diagramSamples.ts | 106 ++++++++++++------------- src/diagram/expr.ts | 6 +- src/diagram/misc.tsx | 6 +- src/diagram/numberline.tsx | 2 +- src/lib/MathText.tsx | 6 +- src/lib/paymentMethods.ts | 30 ++++++++ src/lib/plainMath.ts | 20 +++-- src/mascots/seyar.ts | 6 +- src/pay.ts | 4 +- src/screens/AskScreen.tsx | 12 +-- src/screens/CharactersScreen.tsx | 4 +- src/screens/HomeScreen.tsx | 37 ++------- src/screens/InviteScreen.tsx | 6 +- src/screens/InvoicesScreen.tsx | 20 ++--- src/screens/LeaderboardScreen.tsx | 4 +- src/screens/LessonScreen.tsx | 6 +- src/screens/LessonsScreen.tsx | 4 +- src/screens/LoginScreen.tsx | 14 ++-- src/screens/OnboardingScreen.tsx | 12 +-- src/screens/ProfileScreen.tsx | 113 +++++++++++++++------------ src/screens/QuizScreen.tsx | 24 +++--- src/screens/ReportScreen.tsx | 38 ++++----- src/screens/SetupScreen.tsx | 8 +- src/screens/StreakScreen.tsx | 10 +-- src/screens/SubscriptionScreen.tsx | 120 +++++++++++++++++------------ src/screens/SupportScreen.tsx | 8 +- src/screens/UnitScreen.tsx | 2 +- src/state/companion.ts | 6 +- src/styles/index.css | 6 ++ src/vite-env.d.ts | 6 +- 48 files changed, 492 insertions(+), 337 deletions(-) create mode 100644 src/assets/pay/bazaar.png create mode 100644 src/assets/pay/zarinpal.png create mode 100644 src/lib/paymentMethods.ts diff --git a/README.md b/README.md index f578bb2..d189eb0 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,18 @@ VITE_DEV_PROXY_TARGET=https://mathapi.tadrisino2.ir - **سمتِ بک‌اند** هم دامنه‌ی تازه‌ی فرانت باید مجاز باشد (`FRONTEND_URL` در `.env` بک‌اند). جزئیات در `docs/operations.md` همان ریپو. +## روش‌های پرداخت + +برگه‌ی پرداخت روش‌ها را از `paymentMethods` در `dist/config.js` می‌خواند (`src/lib/paymentMethods.ts`)، جدا برای +مرورگر (`web`) و داخلِ اپِ اندروید (`app`)؛ مقدارها `"zarinpal"` و `"bazaar"`. پیش‌فرض: مرورگر فقط زرین‌پال، اپ هر دو. +نسخه‌ای که فقط در کافه‌بازار است: `paymentMethods: { app: ["bazaar"] }`؛ build لازم نیست، فقط کشِ CDNِ این فایل را پاک کنید. + +## متنِ فارسی + +هیچ اعرابی (کسره، فتحه، تشدید، …) و هیچ «ی»ِ اضافه‌ی نوشته‌شده («پایه‌ی سوم») به کاربر نمی‌رسد (تصمیمِ شرکت، +۲۰۲۶-۱۰-۱۴)؛ تنوین («قبلاً») می‌ماند. متنِ تازه را همین‌طور بنویسید. متنِ سرور را بک‌اند هنگامِ ساختنِ پاسخ پاک می‌کند +و `plainPersian` در `MathText` همان کار را برای پاسخِ زنده‌ی دستیار. + ## دیپلوی روی سرور (`~/mathapp_frontend_new`، که nginxِ `math.tadrisino2.ir` از `dist/`ش سرو می‌کند): diff --git a/index.html b/index.html index 0df6ad0..8d78ed4 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ - + تدریسینو @@ -24,9 +24,9 @@ .boot-splash { position: fixed; inset: 0; z-index: 50; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 20px; background: #fff; } .boot-splash img { width: 144px; height: 144px; display: block; } - /* داخلِ اپِ اندروید اسپلشِ بومی روی صفحه است و سایت زیرش بار می‌شود؛ اسپلشِ وب نباید یک بار دیگر - «عوض شدن» نشان دهد. APKِ تازه (appReady دارد): اسپلشِ وب نامرئی است. APKِ قدیمی: فقط آیکون، - بی‌نام، تا کمتر از اسپلشِ سیستم فرق کند. */ + /* داخل اپ اندروید اسپلش بومی روی صفحه است و سایت زیرش بار می‌شود؛ اسپلش وب نباید یک بار دیگر + «عوض شدن» نشان دهد. APK تازه (appReady دارد): اسپلش وب نامرئی است. APK قدیمی: فقط آیکون، + بی‌نام، تا کمتر از اسپلش سیستم فرق کند. */ .in-app .boot-splash > * { visibility: hidden; } .in-old-app .boot-splash span { display: none; } .in-old-app .boot-splash img { width: 160px; height: 160px; } diff --git a/pay.html b/pay.html index 07a2463..f8c6b8c 100644 --- a/pay.html +++ b/pay.html @@ -20,7 +20,7 @@
-

داریم می‌ریم به درگاهِ پرداخت…

+

داریم می‌ریم به درگاه پرداخت…

رفتن به درگاه
diff --git a/public/config.js b/public/config.js index 91378a6..7679fdf 100644 --- a/public/config.js +++ b/public/config.js @@ -4,6 +4,10 @@ // برای جابه‌جا کردنِ بک‌اند بدونِ build دوباره، آدرسِ کامل را اینجا بنویسید: // apiBaseUrl: "https://api.new-domain.ir/api", // اگر CDN (آروان) جلوی سایت است، بعد از ویرایش کشِ این فایل را پاک کنید. +// +// paymentMethods: روش‌های پرداختی که برگه‌ی پرداخت نشان می‌دهد، به همین ترتیب؛ «zarinpal» و «bazaar». +// web = سایت در مرورگر، app = داخلِ اپِ اندروید. نسخه‌ی کافه‌بازار: app: ["bazaar"]. +// نبودنِ این کلید یعنی پیش‌فرضِ src/lib/paymentMethods.ts. window.__TADRISINO_CONFIG__ = { apiBaseUrl: "", }; diff --git a/src/api/http.ts b/src/api/http.ts index bc8a281..c31195e 100644 --- a/src/api/http.ts +++ b/src/api/http.ts @@ -254,7 +254,7 @@ export function createHttpClient(options: HttpClientOptions) { } catch (err) { if (opts.signal?.aborted) throw err; const timedOut = err instanceof DOMException && (err.name === 'TimeoutError' || err.name === 'AbortError'); - throw new ApiError(0, timedOut ? 'زمانِ درخواست تمام شد' : 'ارتباط با سرور برقرار نشد', {}, timedOut); + throw new ApiError(0, timedOut ? 'زمان درخواست تمام شد' : 'ارتباط با سرور برقرار نشد', {}, timedOut); } } diff --git a/src/app/MainApp.tsx b/src/app/MainApp.tsx index 639f6f0..2caf221 100644 --- a/src/app/MainApp.tsx +++ b/src/app/MainApp.tsx @@ -332,14 +332,14 @@ function PaymentResult({ payment }: { payment: PaymentReturn }) {
{paid ? : }

- {paid ? 'پرداخت موفق بود! 🎉' : state === 'unknown' ? 'وضعیتِ پرداخت معلوم نشد' : 'پرداخت انجام نشد'} + {paid ? 'پرداخت موفق بود! 🎉' : state === 'unknown' ? 'وضعیت پرداخت معلوم نشد' : 'پرداخت انجام نشد'}

{paid ? 'اشتراکت فعال شد؛ از الان قلب‌هات نامحدوده.' : state === 'unknown' - ? 'چند دقیقه‌ی دیگه از «پرداخت‌ها و فاکتورها» در پروفایل نگاه کن. اگه مبلغی کم شده، یا خریدت فعال می‌شه یا پول خودکار برمی‌گرده.' - : 'اگه مبلغی از حسابت کم شده، نگران نباش؛ طیِ چند ساعت خودکار برمی‌گرده یا اشتراکت فعال می‌شه.'} + ? 'چند دقیقه دیگه از «پرداخت‌ها و فاکتورها» در پروفایل نگاه کن. اگه مبلغی کم شده، یا خریدت فعال می‌شه یا پول خودکار برمی‌گرده.' + : 'اگه مبلغی از حسابت کم شده، نگران نباش؛ طی چند ساعت خودکار برمی‌گرده یا اشتراکت فعال می‌شه.'}

setOpen(false)}>باشه
diff --git a/src/assets/pay/bazaar.png b/src/assets/pay/bazaar.png new file mode 100644 index 0000000000000000000000000000000000000000..2037bbb33ebe2cc27b80e5718364349424fec648 GIT binary patch literal 14071 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 D$Y5jR literal 0 HcmV?d00001 diff --git a/src/assets/pay/zarinpal.png b/src/assets/pay/zarinpal.png new file mode 100644 index 0000000000000000000000000000000000000000..e37463a821f95560f2bbac961031e24c8ed716d3 GIT binary patch literal 3099 zcmV+$4CM2PP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuHg-Jv~RCodHT1#x4R~5c@>@l|M zrV~n$kSKPgbdidJ-Jq%sK};l45G?3|O{GdP5{R-22&60>Be6sji5&}UiCuZLR4fpS zOp*$acv&cbkSb-|Mu-BzcKnFr$A9_0@7(*(xbe*VGoGxNoBa22&bfEa_nmX^e`gZs z24%p&fPn!60|o{R3>X+N@PEpHKPv7@HB|22cC#h#K8m%bLvR(Y>AkB5=T?1iua!q! zZS}XlPI)TfMy295cjtl+&r?Q60{(bR#2TFct^%Q~C}y7pM$L8yO_rR`zV1(M*JawG zYM$Q0>=y33e0)oQUq^8Gcpd~?G+ckxA6f9D}1fzgkXnFj3RNw}!d zkPxYtfOeJzF4|LbA*>5J#x%EqX?L?vu= zoR7wgw2ghh{t>ij7v-X)!4zjofTGy9VIF5AEX@E-$?$a?^Heh6sF?%MUo-Rj1e z%dqDYXnGtYYZ+mW;FbC@ z{T*6vhqbL^AmK#5Oau`@D(XZ?3L@C3f-Kpx%?tax`&aUDn@(E-vMw$=m_x}7p-qaqBA;QHQoljMf}h#0!?t6gC#_4mt$Cngnw4+7_@D_ZV50ol$nJVW%A-#l`V`s(vMv*=S+d2k1E0w-*%34%SQ zHAF%lqb#_FT~Ns&*>FQHt4UI@YI_JG8viFENC4}m5gH^j3fdzbtveT7Oh*nZkqv{zw^w1 z)#A$?v<$nqB6xfKDHF&!wuF&F{)gR%-uGX3=83-`;)*_zL`?B;R}>_*aG>TcqBt3% zyIh{>eDgc#VS%eKKH+=so>XXz!_T`t9e#G<0SUMPD&_O^=eP{;j6Sg#QpMK#_$WfO z2YWu+$WF-sWqh-Cclad?Z8LyIBYW;;G+k!_(_edCuRmUTEZPLDLlJUj!Q}gIxr@*L zD1pf%YkM0zfrmW*T2^Rl*!GajuFIfhzqDVYzulIO1gtK3{;)aU-NM-0@#4d8e0B(; zWd_78Kq5*QzjW@WZt{_LEd0FCu<&gL&;l+2dKz=*v!h}ivs)M|c=Jn>Q`?aM8gBm4 zzYNa`Z-s#Lx82oz-6i-)0^KDF|3VXNE;uXkK9`AS_*m~z<%+}-i@CX0qUjOEo-9zKI zZ8;!@GeAnPgb%SYL3aSNNp2N`kg=oe=dDi@jgbV**oi=4na|T& zl$*<-VQKvIot_WB z2|U;FYonv(SDVaw?)HU%JC{eN5UE*42oHBDv9mAWbeS?15yG)F_Z+ObT^v=I)Q9NHSPLQQ2m>-j*`gWAkq#A#8HzRxIOalH3^Pj$ zGU`*s@2E#A_}ThAyn=V&5>V+TfW|{kuK})aue=z1g0ccjM!O*pV1r62dZ z4Q1JUoZPqONEv`%sOE^5jz(`8Q{}y!2MGLIjWL3jT~?7CP{2QFMpA3{#O0_Ib*yS* zXSeGT^s(wW16F=DQN&lyniy7>v2{8e~0#G8O%7&MFt-JZw^hT758$Ng^>oWjU+1PbFk<7|22lbee) z=y&NU16FwR+vUv<1&-2J6*$gJ5Dt+5jcw*AjfrBrL_kFonL;tz*w-4ykgZv>59oj0 zTL$b6PnjzgcJ_%=+W_u!9CtU-;L#pX+zC^Moj?jVjrl0*5Q8Z;C6ElQTa~OFZo0dQVPnEKU6wh;Xzluoib@7#7 zj$ZPm(&rJnih(9PE{T>Yu3TvPh?pk173h!F)^ds%!zKx#zK?&8IDT%s)~kPmc>@Lp p3=9|;Ffd?Xz`%fk0RwFq_#cC53!9SFPMH7z002ovPDHLkV1iB4vt - setD(e.target.value ? +e.target.value : '')} className={`${select} ${tone(d)}`}> {Array.from({ length: days }, (_, i) => i + 1).map((n) => )} - setM(e.target.value ? +e.target.value : '')} className={`${select} ${tone(m)}`}> {JALALI_MONTHS.map((name, i) => )} - setY(e.target.value ? +e.target.value : '')} className={`${select} ${tone(y)}`}> {years.map((n) => )} diff --git a/src/components/BrandFooter.tsx b/src/components/BrandFooter.tsx index 375f0c3..8480a22 100644 --- a/src/components/BrandFooter.tsx +++ b/src/components/BrandFooter.tsx @@ -6,8 +6,8 @@ export function BrandFooter() { return (
- ریاضی، قدم‌به‌قدم، از روی کتابِ درسی - © {toFa(1405)} تدریسینو · همه‌ی حقوق محفوظ است + ریاضی، قدم‌به‌قدم، از روی کتاب درسی + © {toFa(1405)} تدریسینو · همه حقوق محفوظ است
); } diff --git a/src/components/FeedbackBar.tsx b/src/components/FeedbackBar.tsx index 1402e76..bbec9ed 100644 --- a/src/components/FeedbackBar.tsx +++ b/src/components/FeedbackBar.tsx @@ -10,18 +10,18 @@ type Kind = 'question' | 'lesson'; const REASONS: Record = { question: [ - { id: 'wrong_answer', label: 'جوابِ درست اشتباهه' }, - { id: 'unclear', label: 'صورتِ سوال گنگه' }, - { id: 'typo', label: 'غلطِ تایپی داره' }, + { id: 'wrong_answer', label: 'جواب درست اشتباهه' }, + { id: 'unclear', label: 'صورت سوال گنگه' }, + { id: 'typo', label: 'غلط تایپی داره' }, { id: 'too_hard', label: 'برای این درس خیلی سخته' }, - { id: 'other', label: 'یه چیزِ دیگه' }, + { id: 'other', label: 'یه چیز دیگه' }, ], lesson: [ - { id: 'wrong_content', label: 'مطلبِ درس اشتباهه' }, + { id: 'wrong_content', label: 'مطلب درس اشتباهه' }, { id: 'unclear', label: 'توضیح گنگه' }, - { id: 'typo', label: 'غلطِ تایپی داره' }, + { id: 'typo', label: 'غلط تایپی داره' }, { id: 'bad_figure', label: 'شکل ایراد داره' }, - { id: 'other', label: 'یه چیزِ دیگه' }, + { id: 'other', label: 'یه چیز دیگه' }, ], }; @@ -72,7 +72,7 @@ export function FeedbackBar({ kind, id }: { kind: Kind; id: string }) { خوب نبود setOpen(false)} /> @@ -121,11 +121,11 @@ function ReportSheet({ open, kind, id, onClose }: { open: boolean; kind: Kind; i