import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import '../../../core/design/tokens.dart'; import '../../../core/design/tripz_colors.dart'; import '../../../core/di.dart'; import '../../../core/l10n/l10n.dart'; import '../../../core/ui/empty_view.dart'; import '../../../core/ui/status_banner.dart'; import '../../../core/ui/tripz_button.dart'; import '../../../core/ui/tripz_scaffold.dart'; import '../../../core/ui/tripz_sheet.dart'; import '../cubit/payout_cubit.dart'; import '../cubit/wallet_cubit.dart'; import '../cubit/wallet_state.dart'; import 'widgets/balance_card.dart'; import 'widgets/payout_sheet.dart'; import 'widgets/txn_tile.dart'; /// شاشة السائق المالية — **مختلفة عن محفظة الراكب عمداً**. /// /// محفظة السائق **إيراد** له (أرباح تُسحب)، ومحفظة الراكب **التزام** على /// المنصّة (رصيد مدفوع لم يُستهلك). دمجهما في شاشة واحدة خطأ محاسبي، ولذلك /// لا تُوحَّد الشاشتان مهما تشابه شكلهما (docs/39 §4). class EarningsPage extends StatefulWidget { const EarningsPage({super.key}); @override State createState() => _EarningsPageState(); } class _EarningsPageState extends State { late final WalletCubit _wallet = sl()..load(); @override void dispose() { _wallet.close(); super.dispose(); } @override Widget build(BuildContext context) { final l10n = context.l10n; return BlocProvider.value( value: _wallet, child: BlocBuilder( builder: (context, state) { return TripzScaffold( title: l10n.payoutTitle, status: state.status, error: state.error, onRetry: _wallet.load, child: ListView( children: [ BalanceCard( label: l10n.tripEarnings, balance: state.wallet?.balance, currency: state.currency, action: TripzButton.primary( label: l10n.payoutTitle, onPressed: () => _openPayout(context), ), ), const SizedBox(height: Space.md), // الرصيد التشغيلي **ليس** أرباحاً: منه تُخصم العمولة، ونفاده // يوقف وصول الطلبات. يُعرض منفصلاً كي لا يُخلط بالأرباح. StatusBanner( message: l10n.creditLead, tone: BannerTone.info, icon: Icons.account_balance_wallet_outlined, ), const SizedBox(height: Space.lg), Text(l10n.walletTransactions, style: context.texts.titleMedium), const SizedBox(height: Space.xs), if (state.transactions.isEmpty) Padding( padding: const EdgeInsets.only(top: Space.xl), child: EmptyView( icon: Icons.receipt_long_outlined, message: l10n.walletEmpty, ), ) else for (final txn in state.transactions) TxnTile(txn: txn, currency: state.currency), ], ), ); }, ), ); } void _openPayout(BuildContext context) { TripzSheet.show( context, child: BlocProvider( create: (_) => sl(), child: PayoutSheet(onDone: _wallet.load), ), ); } }