/// Chemins des icônes (logos) des moyens de paiement pour listes déroulantes et composants. /// /// Les assets sont dans [assets/images/payment_methods/{compagnie}/logo.svg] ou logo.png. /// Utiliser [paymentMethodIconAssetSvg] / [paymentMethodIconAssetPng] ou le widget [PaymentMethodIcon]. library; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; /// Base path des icônes de moyens de paiement. const String kPaymentMethodIconsBase = 'assets/images/payment_methods'; /// Retourne le chemin du logo SVG pour un code (ex: WAVE_MONEY). String? paymentMethodIconAssetSvg(String? code) => _pathFor(code, 'logo.svg'); /// Retourne le chemin du logo PNG pour un code. String? paymentMethodIconAssetPng(String? code) => _pathFor(code, 'logo.png'); /// Retourne le chemin SVG (rétrocompatibilité). String? paymentMethodIconAsset(String? code) => paymentMethodIconAssetSvg(code); String? _pathFor(String? code, String filename) { if (code == null || code.isEmpty) return null; final path = _codeToPath[code.toUpperCase().trim()]; if (path != null) return '$kPaymentMethodIconsBase/$path/$filename'; return null; } /// Mapping code API → sous-dossier asset. const Map _codeToPath = { 'ESPECES': 'especes', 'VIREMENT': 'virement', 'CHEQUE': 'cheque', 'CARTE_BANCAIRE': 'carte_bancaire', 'WAVE_MONEY': 'wave', 'ORANGE_MONEY': 'orange_money', 'FREE_MONEY': 'free_money', 'MTN_MONEY': 'mtn_money', 'MOOV_MONEY': 'moov_money', 'MOBILE_MONEY': 'mobile_money', 'AUTRE': 'autre', }; /// Liste des codes de méthode de paiement ayant une icône (pour itération). List get paymentMethodCodesWithIcon => _codeToPath.keys.toList(); /// Widget qui affiche le logo (PNG prioritaire, sinon SVG) pour une méthode de paiement. class PaymentMethodIcon extends StatelessWidget { final String? paymentMethodCode; final double width; final double height; const PaymentMethodIcon({ super.key, required this.paymentMethodCode, this.width = 24, this.height = 24, }); @override Widget build(BuildContext context) { final pngPath = paymentMethodIconAssetPng(paymentMethodCode); final svgPath = paymentMethodIconAssetSvg(paymentMethodCode); if (pngPath == null && svgPath == null) return const SizedBox.shrink(); if (pngPath != null) { return Image.asset( pngPath, width: width, height: height, fit: BoxFit.contain, errorBuilder: (_, __, ___) { if (svgPath != null) { return SvgPicture.asset(svgPath, width: width, height: height); } return const SizedBox.shrink(); }, ); } if (svgPath != null) { return SvgPicture.asset(svgPath, width: width, height: height); } return const SizedBox.shrink(); } }