## الثيم مقرَّب من سيرو (قرار المالك 2026-08-05) - البذرة صارت كحليّ سيرو #1A2340 بدل الأزرق العام، والثانوي #8C9CF8 - fromSeed وحدها تنتج من بذرة داكنة أسطحاً باهتة، فثُبّت الأساسي والثانوي والأسطح صراحةً وتُرك الباقي للمشتقّ — شكل سيرو مع تباين M3 - الأدوار الدلالية بأرقام سيرو الميدانية: نجاح #22C55E · تحذير #F59E0B · خطأ #EF4444، وبطاقة الليلي #2C2C2E ## مفتاح الدولة عاد core/ui/phone_field.dart — النمط المجرَّب في سيرو، لكن بلا intl_phone_field: تلك الحزمة تحمل 240 دولة ونحتاج أربعاً. CountryCode صريح ومقصور على أسواقنا. - الاختيار من ورقة سفلية لا قائمة منسدلة: أهداف لمس أكبر وأربع دول لا مئتان - الترتيب يبدأ بحزمة دولة المستأجر — الأردنيّ يرى الأردن أولاً بلا بحث - الرقم يُرسل كاملاً بالمفتاح بلا + (962790000001) كما يقبله الخادم - التحقّق صار بطول الدولة لا برقم ثابت: jo/sy تسع خانات، eg/iq عشر ## العراق - CountryCode.iraq (+964) في قائمة الهاتف - قنوات دفعه: زين كاش · كي كارد · نقد ⚠️ الباك إند لا يعرف حزمة `iq`: default-tariffs.ts فيه jo/sy/eg فقط، فمستأجر عراقي يُزوَّد بلا أي تعرفة. موثَّق في الكود — وهو شغل خادم يسبق أي إطلاق عراقي. flutter analyze نظيف في التطبيقين. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
46 lines
1.4 KiB
Dart
46 lines
1.4 KiB
Dart
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
|
|
import '../../../core/api/api_exception.dart';
|
|
import '../../../core/ui/view_status.dart';
|
|
import '../data/wallet_repository.dart';
|
|
import 'wallet_state.dart';
|
|
|
|
class WalletCubit extends Cubit<WalletState> {
|
|
WalletCubit(this._repo) : super(const WalletState());
|
|
|
|
final WalletRepository _repo;
|
|
|
|
Future<void> load() async {
|
|
emit(state.copyWith(status: ViewStatus.loading));
|
|
try {
|
|
final wallet = await _repo.wallet();
|
|
final txns = await _repo.transactions();
|
|
if (isClosed) return;
|
|
emit(state.copyWith(
|
|
status: ViewStatus.success,
|
|
wallet: wallet,
|
|
transactions: txns,
|
|
));
|
|
} on ApiException catch (e) {
|
|
if (!isClosed) {
|
|
emit(state.copyWith(status: ViewStatus.error, error: e.message));
|
|
}
|
|
}
|
|
}
|
|
|
|
Future<void> topup(num amount) async {
|
|
if (amount <= 0) return;
|
|
emit(state.copyWith(action: WalletAction.toppingUp));
|
|
try {
|
|
await _repo.topup(amount);
|
|
if (isClosed) return;
|
|
emit(state.copyWith(action: WalletAction.topupDone));
|
|
// الرصيد يُعاد جلبه من الخادم لا يُحسب محلياً: المال لا يُقدَّر
|
|
// في التطبيق (docs/23 §0.2).
|
|
await load();
|
|
} on ApiException {
|
|
if (!isClosed) emit(state.copyWith(action: WalletAction.topupFailed));
|
|
}
|
|
}
|
|
}
|