# حکم‌شو — فرانت (Flutter + Flame) کلاینت بازی حکم. فازهای انجام‌شده: **اسکلت + احراز هویت OTP + لابی/کیف‌پول + فروشگاه + صحنه‌ی بازی با Flame**. ## پیش‌نیاز شبکه (میرور مایکت) به‌خاطر محدودیت دسترسی، از میرور مایکت استفاده می‌شود: ```bash export PUB_HOSTED_URL=https://pub.myket.ir export FLUTTER_STORAGE_BASE_URL=https://pub.myket.ir ``` این دو خط در `~/.zshrc` ست شده‌اند (دائمی). برای Gradle هم یک init script سراسری در `~/.gradle/init.gradle` همه‌ی buildها را به `maven.myket.ir` هدایت می‌کند، و `android/` به همین مخزن تنظیم شده است. ## اجرا ```bash flutter pub get flutter run -d chrome # وب (بدون نیاز به NDK/Gradle) ✓ flutter run # موبایل (نیازمند نصب NDK — به پایین رجوع کنید) ``` اتصال به بک‌اند با `--dart-define=BASE_URL=...` قابل تنظیم است: - امولاتور اندروید → پیش‌فرض `http://10.0.2.2:8080` (localhostِ میزبان). - وب / شبیه‌ساز iOS → `--dart-define=BASE_URL=http://localhost:8080`. - پروداکشن → `--dart-define=BASE_URL=https://api.hakemsho.ir`. ## وضعیت تأیید - `flutter analyze` → بدون خطا ✓ - `flutter test` → پاس (تست مدل Wallet) ✓ - `flutter build web` → موفق ✓ ## نکات build اندروید (شبکه‌ی محدود) - **NDK**: AGP به NDK `27.0.12077973` نیاز دارد. اگر NDK را دستی دانلود کرده‌اید (مثلاً `android-ndk-r27`)، باید پوشه به‌نامِ **شماره‌ی نسخه** باشد تا AGP پیدایش کند: ```bash cd ~/Library/Android/sdk/ndk && ln -sfn android-ndk-r27 27.0.12077973 ``` - **گریدل از مایکت**: `~/.gradle/init.gradle` همه‌ی buildها را (شامل `buildscript` پلاگین‌ها) به `maven.myket.ir` هدایت می‌کند. این برای `flutter_secure_storage` لازم است که خودش `com.android.tools.build:gradle:8.13.2` را اعلام می‌کند. - **minSdk 23 / compileSdk 36**: به‌خاطر `flutter_secure_storage` در [android/app/build.gradle.kts](android/app/build.gradle.kts) تنظیم شده. - هشدار «unable to detect Gradle/AGP versions» بی‌ضرر است (به‌خاطر بلاک‌بودن `dl.google.com` برای چک نسخه). `flutter build apk --debug` ✓ موفق. ## ساختار ``` lib/ ├── main.dart نقطه ورود (تعیین مسیر اولیه بر اساس توکن) ├── app.dart MaterialApp.router + RTL + BlocProviderها ├── core/ │ ├── config.dart baseUrl و آدرس WebSocket │ ├── network/api_client.dart Dio + تزریق خودکار Bearer │ ├── storage/token_storage.dart ذخیره‌ی امن JWT │ └── theme/app_theme.dart تم قرمز/طلایی، فونت فارسی، RTL └── features/ ├── auth/ repository، cubit، صفحه موبایل و OTP ├── lobby/ مدل Wallet، cubit، صفحه لابی ├── shop/ مدل‌ها، repository، cubit، صفحه فروشگاه (۴ تب) └── game/ مدل‌ها، WS cubit، لیست میزها، صفحه بازی └── flame/ HokmGame (صحنه میز) + CardComponent ``` کارت‌ها از `assets/images/cards/.png` بارگذاری می‌شوند (۵۲ کارت + `back.jpg`)؛ اگر تصویری نبود، `CardComponent` نسخه‌ی برداری می‌کشد. ## قدم بعدی - انیمیشن‌ها (پخش/انداختن کارت)، صدا، و صفحه‌ی نتایج بهتر. - اتصال خرید واقعی IAP (پلاگین بازار/مایکت) و تبلیغ تپسل (فعلاً توکن توسعه‌ای به بک‌اند می‌رود). - به [../FRONTEND_PLAN.md](../FRONTEND_PLAN.md) رجوع کنید.