import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:pshared/models/payment/payment.dart'; import 'package:pshared/models/payment/status.dart'; import 'package:pshared/provider/payment/payments.dart'; import 'package:pweb/app/router/payout_routes.dart'; import 'package:pweb/pages/report/details/content.dart'; import 'package:pweb/pages/report/details/states/error.dart'; import 'package:pweb/pages/report/details/states/not_found.dart'; import 'package:pweb/utils/report/download_act.dart'; import 'package:pweb/utils/report/payment_mapper.dart'; import 'package:pweb/generated/i18n/app_localizations.dart'; class PaymentDetailsPage extends StatelessWidget { final String paymentId; const PaymentDetailsPage({ super.key, required this.paymentId, }); @override Widget build(BuildContext context) { return Padding( padding: const EdgeInsets.all(16), child: Consumer( builder: (context, provider, child) { final loc = AppLocalizations.of(context)!; if (provider.isLoading) { return const Center(child: CircularProgressIndicator()); } if (provider.error != null) { return PaymentDetailsError( message: provider.error?.toString() ?? loc.noErrorInformation, onRetry: () => provider.refresh(), ); } final payment = _findPayment(provider.payments, paymentId); if (payment == null) { return PaymentDetailsNotFound(onBack: () => _handleBack(context)); } final status = statusFromPayment(payment); final paymentRef = payment.paymentRef ?? ''; final canDownload = status == OperationStatus.success && paymentRef.trim().isNotEmpty; return PaymentDetailsContent( payment: payment, onBack: () => _handleBack(context), onDownloadAct: canDownload ? () => downloadPaymentAct(context, paymentRef) : null, ); }, ), ); } Payment? _findPayment(List payments, String paymentId) { final trimmed = paymentId.trim(); if (trimmed.isEmpty) return null; for (final payment in payments) { if (payment.paymentRef == trimmed) return payment; if (payment.idempotencyKey == trimmed) return payment; } return null; } void _handleBack(BuildContext context) { final router = GoRouter.of(context); if (router.canPop()) { context.pop(); return; } context.go(PayoutRoutes.reportsPath); } }