import 'package:flutter/material.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:geosector_app/core/data/models/payment_link_result.dart'; /// Dialog qui affiche un QR code pour le paiement Stripe class QRCodePaymentDialog extends StatelessWidget { final PaymentLinkResult paymentLink; final VoidCallback? onClose; const QRCodePaymentDialog({ super.key, required this.paymentLink, this.onClose, }); @override Widget build(BuildContext context) { final amountEuros = (paymentLink.amount / 100).toStringAsFixed(2); return Dialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), child: Container( constraints: const BoxConstraints(maxWidth: 400), padding: const EdgeInsets.all(24), child: Column( mainAxisSize: MainAxisSize.min, children: [ // Titre Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ const Text( 'Paiement par QR Code', style: TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), IconButton( icon: const Icon(Icons.close), onPressed: () { Navigator.of(context).pop(); onClose?.call(); }, ), ], ), const SizedBox(height: 24), // Montant Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.blue.shade50, borderRadius: BorderRadius.circular(12), ), child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Icon( Icons.euro, color: Colors.blue, size: 32, ), const SizedBox(width: 8), Text( amountEuros, style: const TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Colors.blue, ), ), ], ), ), const SizedBox(height: 24), // QR Code Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, border: Border.all(color: Colors.grey.shade300, width: 2), borderRadius: BorderRadius.circular(12), ), child: QrImageView( data: paymentLink.url, version: QrVersions.auto, size: 250, backgroundColor: Colors.white, errorCorrectionLevel: QrErrorCorrectLevel.H, ), ), const SizedBox(height: 24), // Instructions const Text( 'Scannez ce QR code avec votre téléphone', textAlign: TextAlign.center, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 8), Text( 'Vous serez redirigé vers une page de paiement sécurisée Stripe', textAlign: TextAlign.center, style: TextStyle( fontSize: 14, color: Colors.grey.shade600, ), ), const SizedBox(height: 24), // Logo Stripe Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Icon( Icons.security, color: Colors.green.shade600, size: 20, ), const SizedBox(width: 8), Text( 'Paiement sécurisé par Stripe', style: TextStyle( fontSize: 12, color: Colors.grey.shade600, fontStyle: FontStyle.italic, ), ), ], ), const SizedBox(height: 16), // Bouton Fermer SizedBox( width: double.infinity, child: ElevatedButton( onPressed: () { Navigator.of(context).pop(); onClose?.call(); }, style: ElevatedButton.styleFrom( padding: const EdgeInsets.symmetric(vertical: 16), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), ), child: const Text( 'Fermer', style: TextStyle(fontSize: 16), ), ), ), ], ), ), ); } /// Afficher le dialog de paiement par QR code static Future show({ required BuildContext context, required PaymentLinkResult paymentLink, VoidCallback? onClose, }) { return showDialog( context: context, barrierDismissible: true, builder: (context) => QRCodePaymentDialog( paymentLink: paymentLink, onClose: onClose, ), ); } }