import 'package:flutter/material.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'package:em2rp/utils/colors.dart'; import 'package:em2rp/services/qr_code_service.dart'; import 'package:printing/printing.dart'; /// Widget réutilisable pour afficher un QR code avec option de téléchargement /// Utilisable pour équipements, containers, et autres entités class QRCodeDialog extends StatelessWidget { final T item; final String Function(T) getId; final String Function(T) getTitle; final List Function(T)? buildSubtitle; const QRCodeDialog({ super.key, required this.item, required this.getId, required this.getTitle, this.buildSubtitle, }); @override Widget build(BuildContext context) { final id = getId(item); final title = getTitle(item); return Dialog( child: Container( padding: const EdgeInsets.all(24), constraints: const BoxConstraints(maxWidth: 400), child: Column( mainAxisSize: MainAxisSize.min, children: [ // En-tête Row( children: [ const Icon(Icons.qr_code, color: AppColors.rouge, size: 32), const SizedBox(width: 12), Expanded( child: Text( 'QR Code - $id', style: const TextStyle( fontSize: 20, fontWeight: FontWeight.bold, ), ), ), IconButton( icon: const Icon(Icons.close), onPressed: () => Navigator.pop(context), ), ], ), const SizedBox(height: 24), // QR Code Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(8), border: Border.all(color: Colors.grey[300]!), ), child: QrImageView( data: id, version: QrVersions.auto, size: 250, backgroundColor: Colors.white, ), ), const SizedBox(height: 16), // Informations Container( padding: const EdgeInsets.all(12), decoration: BoxDecoration( color: Colors.grey[100], borderRadius: BorderRadius.circular(8), ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( id, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 16, ), ), const SizedBox(height: 4), Text( title, style: TextStyle(color: Colors.grey[700]), ), if (buildSubtitle != null) ...[ const SizedBox(height: 4), ...buildSubtitle!(item), ], ], ), ), const SizedBox(height: 24), // Bouton télécharger ElevatedButton.icon( onPressed: () => _downloadQRCode(context, id), style: ElevatedButton.styleFrom( backgroundColor: AppColors.rouge, minimumSize: const Size(double.infinity, 48), ), icon: const Icon(Icons.download, color: Colors.white), label: const Text( 'Télécharger l\'image', style: TextStyle(color: Colors.white), ), ), ], ), ), ); } Future _downloadQRCode(BuildContext context, String id) async { try { // Générer l'image QR code en haute résolution final qrImage = await QRCodeService.generateQRCode( id, size: 1024, useCache: false, ); // Utiliser la bibliothèque printing pour sauvegarder l'image await Printing.sharePdf( bytes: qrImage, filename: 'QRCode_$id.png', ); if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('Image QR Code téléchargée avec succès'), backgroundColor: Colors.green, ), ); } } catch (e) { if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text('Erreur lors du téléchargement: $e'), backgroundColor: Colors.red, ), ); } } } /// Factory pour équipement static QRCodeDialog forEquipment(dynamic equipment) { return QRCodeDialog( item: equipment, getId: (eq) => eq.id, getTitle: (eq) => '${eq.brand ?? ''} ${eq.model ?? ''}'.trim(), ); } /// Factory pour container static QRCodeDialog forContainer(dynamic container) { return QRCodeDialog( item: container, getId: (c) => c.id, getTitle: (c) => c.name, buildSubtitle: (c) { return [ Text( _getContainerTypeLabel(c.type), style: TextStyle( color: Colors.grey[600], fontSize: 12, ), ), ]; }, ); } static String _getContainerTypeLabel(dynamic type) { // Simple fallback - à améliorer avec import du model return type.toString().split('.').last; } }