import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:pshared/controllers/balance_mask/wallets.dart'; import 'package:pshared/provider/ledger.dart'; import 'package:pshared/models/payment/wallet.dart'; import 'package:pweb/pages/dashboard/buttons/balance/carousel.dart'; import 'package:pweb/pages/dashboard/buttons/balance/controller.dart'; import 'package:pweb/pages/dashboard/buttons/balance/balance_item.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; class BalanceWidget extends StatelessWidget { final ValueChanged onTopUp; const BalanceWidget({super.key, required this.onTopUp}); @override Widget build(BuildContext context) => _BalanceWidgetBody(onTopUp: onTopUp); } class _BalanceWidgetBody extends StatefulWidget { final ValueChanged onTopUp; const _BalanceWidgetBody({required this.onTopUp}); @override State<_BalanceWidgetBody> createState() => _BalanceWidgetBodyState(); } class _BalanceWidgetBodyState extends State<_BalanceWidgetBody> { WalletsController? _walletsController; LedgerAccountsProvider? _ledgerProvider; CarouselIndexController? _carouselController; @override void didChangeDependencies() { super.didChangeDependencies(); final nextWallets = context.read(); final nextLedger = context.read(); final nextCarousel = context.read(); if (!identical(_walletsController, nextWallets)) { _walletsController?.removeListener(_syncSelection); _walletsController = nextWallets; _walletsController?.addListener(_syncSelection); } if (!identical(_ledgerProvider, nextLedger)) { _ledgerProvider?.removeListener(_syncSelection); _ledgerProvider = nextLedger; _ledgerProvider?.addListener(_syncSelection); } if (!identical(_carouselController, nextCarousel)) { _carouselController?.removeListener(_syncSelection); _carouselController = nextCarousel; _carouselController?.addListener(_syncSelection); } WidgetsBinding.instance.addPostFrameCallback((_) => _syncSelection()); } @override void dispose() { _walletsController?.removeListener(_syncSelection); _ledgerProvider?.removeListener(_syncSelection); _carouselController?.removeListener(_syncSelection); super.dispose(); } void _syncSelection() { final walletsController = _walletsController; final carousel = _carouselController; final ledgerProvider = _ledgerProvider; if (walletsController == null || carousel == null || ledgerProvider == null) { return; } final items = [ ...walletsController.wallets.map(BalanceItem.wallet), ...ledgerProvider.accounts.map(BalanceItem.ledger), const BalanceItem.addAction(), ]; if (items.isEmpty) return; final safeIndex = carousel.index.clamp(0, items.length - 1); if (safeIndex != carousel.index) { carousel.setIndex(safeIndex, items.length); return; } final current = items[safeIndex]; if (!current.isWallet) return; final wallet = current.wallet!; if (walletsController.selectedWallet?.id != wallet.id) { walletsController.selectWallet(wallet); } } @override Widget build(BuildContext context) { final walletsController = context.watch(); final ledgerProvider = context.watch(); final carousel = context.watch(); final loc = AppLocalizations.of(context)!; final wallets = walletsController.wallets; final accounts = ledgerProvider.accounts; final isLoading = walletsController.isLoading && ledgerProvider.isLoading && wallets.isEmpty && accounts.isEmpty; if (isLoading) { return const Center(child: CircularProgressIndicator()); } final items = [ ...wallets.map(BalanceItem.wallet), ...accounts.map(BalanceItem.ledger), const BalanceItem.addAction(), ]; if (items.isEmpty) { return const SizedBox.shrink(); } final index = carousel.index.clamp(0, items.length - 1); final carouselWidget = BalanceCarousel( items: items, currentIndex: index, onIndexChanged: (i) { carousel.setIndex(i, items.length); final next = items[carousel.index]; if (next.isWallet) { walletsController.selectWallet(next.wallet!); } }, onTopUp: widget.onTopUp, ); if (wallets.isEmpty && accounts.isEmpty) { return Column( mainAxisSize: MainAxisSize.min, children: [ Center(child: Text(loc.noWalletsAvailable)), const SizedBox(height: 12), carouselWidget, ], ); } return carouselWidget; } }