diff --git a/android/app/src/main/res/appstore.png b/android/app/src/main/res/appstore.png new file mode 100644 index 0000000..09d6adf Binary files /dev/null and b/android/app/src/main/res/appstore.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png index db77bb4..c130067 100644 Binary files a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png index 17987b7..ef63fe9 100644 Binary files a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png index 09d4391..8d483c6 100644 Binary files a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png index d5f1c8d..2e1286e 100644 Binary files a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index 4d6372e..186926d 100644 Binary files a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/playstore.png b/android/app/src/main/res/playstore.png new file mode 100644 index 0000000..8c7e8ba Binary files /dev/null and b/android/app/src/main/res/playstore.png differ diff --git a/lib/models/payment_method.dart b/lib/models/payment_method.dart index d65c236..b8a360c 100644 --- a/lib/models/payment_method.dart +++ b/lib/models/payment_method.dart @@ -17,25 +17,25 @@ class PaymentMethod { } final List paymentMethods = [ - PaymentMethod( + const PaymentMethod( id: 'mvola', name: 'MVola', description: 'Paiement mobile MVola', icon: Icons.phone, - color: const Color(0xFF4285F4), + color: Color(0xFF4285F4), ), - PaymentMethod( + const PaymentMethod( id: 'carte', name: 'Carte Bancaire', description: 'Paiement par carte', icon: Icons.credit_card, - color: const Color(0xFF28A745), + color: Color(0xFF28A745), ), - PaymentMethod( + const PaymentMethod( id: 'especes', name: 'Espèces', description: 'Paiement en liquide', icon: Icons.attach_money, - color: const Color(0xFFFF9500), + color: Color(0xFFFF9500), ), ]; diff --git a/lib/pages/caisse_screen.dart b/lib/pages/caisse_screen.dart index 9dd589e..aac0dd4 100644 --- a/lib/pages/caisse_screen.dart +++ b/lib/pages/caisse_screen.dart @@ -1,5 +1,6 @@ // pages/caisse_screen.dart import 'package:flutter/material.dart'; +import 'package:itrimobe/pages/facture_screen.dart'; import '../models/command_detail.dart'; import '../models/payment_method.dart'; import '../services/restaurant_api_service.dart'; @@ -73,25 +74,39 @@ class _CaisseScreenState extends State { } } + // Dans caisse_screen.dart, modifiez la méthode _processPayment Future _processPayment() async { - if (selectedPaymentMethod == null) { - _showErrorDialog('Veuillez sélectionner une méthode de paiement'); - return; - } + if (selectedPaymentMethod == null || commande == null) return; setState(() => isProcessingPayment = true); try { - // await RestaurantApiService.processPayment( - // commandeId: widget.commandeId, - // paymentMethodId: selectedPaymentMethod!.id, - // ); + final success = await RestaurantApiService.processPayment( + commandeId: widget.commandeId, + paymentMethodId: selectedPaymentMethod!.id, + amount: commande!.totalTtc, + ); - _showSuccessDialog(); + if (success) { + // Navigation vers la facture au lieu du dialog de succès + Navigator.of(context).pushReplacement( + MaterialPageRoute( + builder: + (context) => FactureScreen( + commande: commande!, + paymentMethod: selectedPaymentMethod!.id, + ), + ), + ); + } else { + _showErrorDialog('Le paiement a échoué. Veuillez réessayer.'); + } } catch (e) { _showErrorDialog('Erreur lors du traitement du paiement: $e'); } finally { - setState(() => isProcessingPayment = false); + if (mounted) { + setState(() => isProcessingPayment = false); + } } } diff --git a/lib/pages/facture_screen.dart b/lib/pages/facture_screen.dart new file mode 100644 index 0000000..29a34bd --- /dev/null +++ b/lib/pages/facture_screen.dart @@ -0,0 +1,305 @@ +// pages/facture_screen.dart +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import '../models/command_detail.dart'; +import '../services/pdf_service.dart'; + +class FactureScreen extends StatefulWidget { + final CommandeDetail commande; + final String paymentMethod; + + const FactureScreen({ + Key? key, + required this.commande, + required this.paymentMethod, + }) : super(key: key); + + @override + _FactureScreenState createState() => _FactureScreenState(); +} + +class _FactureScreenState extends State { + String get paymentMethodText { + switch (widget.paymentMethod) { + case 'mvola': + return 'MVola'; + case 'carte': + return 'CB'; + case 'especes': + return 'Espèces'; + default: + return 'CB'; + } + } + + String get factureNumber { + return 'F${DateTime.now().millisecondsSinceEpoch.toString().substring(7)}'; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.grey[100], + appBar: AppBar( + backgroundColor: Colors.white, + elevation: 0, + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + title: const Text( + 'Retour', + style: TextStyle( + color: Colors.black, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + actions: [ + Container( + margin: const EdgeInsets.only(right: 16, top: 8, bottom: 8), + child: ElevatedButton.icon( + onPressed: _printReceipt, + icon: const Icon(Icons.print, size: 18), + label: const Text('Imprimer'), + style: ElevatedButton.styleFrom( + backgroundColor: const Color(0xFF28A745), + foregroundColor: Colors.white, + elevation: 0, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + ), + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), + ), + ), + ), + ], + ), + body: Center( + child: Container( + width: 400, + margin: const EdgeInsets.all(20), + child: Card( + elevation: 2, + color: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8), + ), + child: Padding( + padding: const EdgeInsets.all(40), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + _buildHeader(), + const SizedBox(height: 30), + _buildFactureInfo(), + const SizedBox(height: 30), + _buildItemsList(), + const SizedBox(height: 20), + _buildTotal(), + const SizedBox(height: 30), + _buildFooter(), + ], + ), + ), + ), + ), + ), + ); + } + + Widget _buildHeader() { + return Column( + children: [ + const Text( + 'RESTAURANT', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + letterSpacing: 1.2, + ), + ), + const SizedBox(height: 12), + const Text( + 'Adresse: 123 Rue de la Paix', + style: TextStyle(fontSize: 12, color: Colors.black87), + ), + const Text( + 'Contact: +33 1 23 45 67 89', + style: TextStyle(fontSize: 12, color: Colors.black87), + ), + ], + ); + } + + Widget _buildFactureInfo() { + final now = DateTime.now(); + final dateStr = + '${now.day.toString().padLeft(2, '0')}/${now.month.toString().padLeft(2, '0')}/${now.year}'; + final timeStr = + '${now.hour.toString().padLeft(2, '0')}:${now.minute.toString().padLeft(2, '0')}'; + + return Column( + children: [ + Text( + 'Facture n° $factureNumber', + style: const TextStyle(fontSize: 14, fontWeight: FontWeight.w600), + ), + const SizedBox(height: 4), + Text( + 'Date: $dateStr $timeStr', + style: const TextStyle(fontSize: 12, color: Colors.black87), + ), + const SizedBox(height: 4), + Text( + 'Table: ${widget.commande.tableId}', + style: const TextStyle(fontSize: 12, color: Colors.black87), + ), + const SizedBox(height: 4), + Text( + 'Paiement: $paymentMethodText', + style: const TextStyle(fontSize: 12, color: Colors.black87), + ), + ], + ); + } + + Widget _buildItemsList() { + return Column( + children: [ + const Padding( + padding: EdgeInsets.only(bottom: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Qté Désignation', + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600), + ), + Text( + 'Prix', + style: TextStyle(fontSize: 12, fontWeight: FontWeight.w600), + ), + ], + ), + ), + const Divider(height: 1, color: Colors.black26), + const SizedBox(height: 10), + ...widget.commande.items + .map( + (item) => Padding( + padding: const EdgeInsets.only(bottom: 6), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + child: Text( + '${item.quantite} ${item.menuNom}', + style: const TextStyle( + fontSize: 12, + color: Colors.black87, + ), + ), + ), + Text( + '${(item.prixUnitaire * item.quantite).toStringAsFixed(2)} MGA', + style: const TextStyle( + fontSize: 12, + color: Colors.black87, + ), + ), + ], + ), + ), + ) + .toList(), + ], + ); + } + + Widget _buildTotal() { + return Column( + children: [ + const Divider(height: 1, color: Colors.black26), + const SizedBox(height: 12), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Total:', + style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + Text( + '${widget.commande.totalTtc.toStringAsFixed(2)} €', + style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + ), + ], + ), + ], + ); + } + + Widget _buildFooter() { + return const Text( + 'Merci et à bientôt !', + style: TextStyle( + fontSize: 12, + fontStyle: FontStyle.italic, + color: Colors.black54, + ), + ); + } + + void _printReceipt() async { + try { + HapticFeedback.lightImpact(); + + final success = await PdfService.printFacture( + commande: widget.commande, + paymentMethod: widget.paymentMethod, + ); + + if (success) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: const Row( + children: [ + Icon(Icons.check_circle, color: Colors.white), + SizedBox(width: 8), + Text('Facture envoyée à l\'impression'), + ], + ), + backgroundColor: const Color(0xFF28A745), + duration: const Duration(seconds: 2), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(6), + ), + margin: const EdgeInsets.all(16), + behavior: SnackBarBehavior.floating, + ), + ); + + Future.delayed(const Duration(seconds: 2), () { + if (mounted) { + Navigator.of(context).popUntil((route) => route.isFirst); + } + }); + } + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Erreur impression: $e'), + backgroundColor: Colors.red, + ), + ); + } finally { + if (mounted) { + Navigator.of(context).pop(); + } + } + } +} diff --git a/lib/pages/login_screen.dart b/lib/pages/login_screen.dart index c7a1c55..b3f4e11 100644 --- a/lib/pages/login_screen.dart +++ b/lib/pages/login_screen.dart @@ -412,9 +412,9 @@ class HomeScreen extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.check_circle, color: Colors.green, size: 80), + const Icon(Icons.check_circle, color: Colors.green, size: 80), const SizedBox(height: 16), - Text( + const Text( 'Connexion réussie!', style: TextStyle( fontSize: 24, @@ -425,11 +425,11 @@ class HomeScreen extends StatelessWidget { const SizedBox(height: 8), Text( 'Bienvenue $userType', - style: TextStyle(fontSize: 18, color: Colors.grey), + style: const TextStyle(fontSize: 18, color: Colors.grey), ), ], ), ), ); } -} \ No newline at end of file +} diff --git a/lib/services/pdf_service.dart b/lib/services/pdf_service.dart new file mode 100644 index 0000000..139a9c9 --- /dev/null +++ b/lib/services/pdf_service.dart @@ -0,0 +1,266 @@ +// services/pdf_service.dart +import 'dart:io'; +import 'dart:typed_data'; +import 'package:pdf/pdf.dart'; +import 'package:pdf/widgets.dart' as pw; +import 'package:printing/printing.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:share_plus/share_plus.dart'; +import '../models/command_detail.dart'; + +class PdfService { + static Future generateFacturePdf({ + required CommandeDetail commande, + required String paymentMethod, + }) async { + final pdf = pw.Document(); + + // Informations du restaurant + final restaurantInfo = { + 'nom': 'RESTAURANT', + 'adresse': 'Moramanga, Antananarivo', + 'contact': '+261 34 12 34 56', + }; + + // Générer numéro de facture + final factureNumber = + 'F${DateTime.now().millisecondsSinceEpoch.toString().substring(7)}'; + final dateTime = DateTime.now(); + + pdf.addPage( + pw.Page( + pageFormat: PdfPageFormat.a4, + margin: const pw.EdgeInsets.all(32), + build: (pw.Context context) { + return pw.Column( + crossAxisAlignment: pw.CrossAxisAlignment.start, + children: [ + // En-tête Restaurant + pw.Center( + child: pw.Column( + children: [ + pw.Text( + restaurantInfo['nom']!, + style: pw.TextStyle( + fontSize: 24, + fontWeight: pw.FontWeight.bold, + ), + ), + pw.SizedBox(height: 8), + pw.Text( + 'Adresse: ${restaurantInfo['adresse']}', + style: const pw.TextStyle(fontSize: 12), + ), + pw.Text( + 'Contact: ${restaurantInfo['contact']}', + style: const pw.TextStyle(fontSize: 12), + ), + ], + ), + ), + + pw.SizedBox(height: 30), + + // Informations facture + pw.Center( + child: pw.Column( + children: [ + pw.Text( + 'Facture n° $factureNumber', + style: pw.TextStyle( + fontSize: 14, + fontWeight: pw.FontWeight.bold, + ), + ), + pw.SizedBox(height: 4), + pw.Text( + 'Date: ${_formatDateTime(dateTime)}', + style: const pw.TextStyle(fontSize: 12), + ), + pw.SizedBox(height: 4), + pw.Text( + 'Table: ${commande.numeroCommande}', + style: const pw.TextStyle(fontSize: 12), + ), + pw.SizedBox(height: 4), + pw.Text( + 'Paiement: ${_getPaymentMethodText(paymentMethod)}', + style: const pw.TextStyle(fontSize: 12), + ), + ], + ), + ), + + pw.SizedBox(height: 30), + + // Tableau des articles + pw.Table( + border: pw.TableBorder.all(color: PdfColors.grey300), + columnWidths: { + 0: const pw.FlexColumnWidth(3), + 1: const pw.FlexColumnWidth(1), + 2: const pw.FlexColumnWidth(1), + }, + children: [ + // En-tête du tableau + pw.TableRow( + decoration: const pw.BoxDecoration( + color: PdfColors.grey100, + ), + children: [ + pw.Padding( + padding: const pw.EdgeInsets.all(8), + child: pw.Text( + 'Qté Désignation', + style: pw.TextStyle(fontWeight: pw.FontWeight.bold), + ), + ), + pw.Padding( + padding: const pw.EdgeInsets.all(8), + child: pw.Text( + 'Prix', + style: pw.TextStyle(fontWeight: pw.FontWeight.bold), + textAlign: pw.TextAlign.right, + ), + ), + ], + ), + // Lignes des articles + ...commande.items + .map( + (item) => pw.TableRow( + children: [ + pw.Padding( + padding: const pw.EdgeInsets.all(8), + child: pw.Text( + '${item.quantite} TESTNOMCOMMANDE', + ), + ), + pw.Padding( + padding: const pw.EdgeInsets.all(8), + child: pw.Text( + '${item.prixUnitaire.toStringAsFixed(2)} €', + textAlign: pw.TextAlign.right, + ), + ), + ], + ), + ) + .toList(), + ], + ), + + pw.SizedBox(height: 20), + + // Total + pw.Container( + alignment: pw.Alignment.centerRight, + child: pw.Container( + padding: const pw.EdgeInsets.all(12), + decoration: pw.BoxDecoration( + border: pw.Border.all(color: PdfColors.grey400), + color: PdfColors.grey50, + ), + child: pw.Text( + 'Total: ${commande.totalTtc.toStringAsFixed(2)} €', + style: pw.TextStyle( + fontSize: 16, + fontWeight: pw.FontWeight.bold, + ), + ), + ), + ), + + pw.Spacer(), + + // Message de remerciement + pw.Center( + child: pw.Text( + 'Merci et à bientôt !', + style: pw.TextStyle( + fontSize: 12, + fontStyle: pw.FontStyle.italic, + ), + ), + ), + ], + ); + }, + ), + ); + + return pdf.save(); + } + + static String _formatDateTime(DateTime dateTime) { + return '${dateTime.day.toString().padLeft(2, '0')}/${dateTime.month.toString().padLeft(2, '0')}/${dateTime.year} ${dateTime.hour.toString().padLeft(2, '0')}:${dateTime.minute.toString().padLeft(2, '0')}'; + } + + static String _getPaymentMethodText(String method) { + switch (method) { + case 'mvola': + return 'MVola'; + case 'carte': + return 'CB'; + case 'especes': + return 'Espèces'; + default: + return 'CB'; + } + } + + // Imprimer directement + static Future printFacture({ + required CommandeDetail commande, + required String paymentMethod, + }) async { + try { + final pdfData = await generateFacturePdf( + commande: commande, + paymentMethod: paymentMethod, + ); + + await Printing.layoutPdf( + onLayout: (PdfPageFormat format) async => pdfData, + name: + 'Facture_${commande.numeroCommande}_${DateTime.now().millisecondsSinceEpoch}', + ); + + return true; + } catch (e) { + print('Erreur impression: $e'); + return false; + } + } + + // Sauvegarder et partager le PDF + static Future saveAndShareFacture({ + required CommandeDetail commande, + required String paymentMethod, + }) async { + try { + final pdfData = await generateFacturePdf( + commande: commande, + paymentMethod: paymentMethod, + ); + + final directory = await getApplicationDocumentsDirectory(); + final fileName = + 'Facture_${commande.numeroCommande}_${DateTime.now().millisecondsSinceEpoch}.pdf'; + final file = File('${directory.path}/$fileName'); + + await file.writeAsBytes(pdfData); + + await Share.shareXFiles( + [XFile(file.path)], + subject: 'Facture ${commande.numeroCommande}', + text: 'Facture de votre commande au restaurant', + ); + + return true; + } catch (e) { + print('Erreur sauvegarde/partage: $e'); + return false; + } + } +} diff --git a/lib/services/restaurant_api_service.dart b/lib/services/restaurant_api_service.dart index f8f8463..320f3d4 100644 --- a/lib/services/restaurant_api_service.dart +++ b/lib/services/restaurant_api_service.dart @@ -103,20 +103,32 @@ class RestaurantApiService { } //processPayment - static Future processPayment( - String commandeId, - PaymentMethod paymentMethod, - ) async { + // Dans services/restaurant_api_service.dart + static Future processPayment({ + required String commandeId, // Ajoutez ce paramètre + required String paymentMethodId, + required double amount, + }) async { try { final response = await http.post( Uri.parse('$baseUrl/api/commandes/$commandeId'), headers: _headers, - // body: json.encode({'payment_method': paymentMethod.toJson()}), + body: json.encode({ + 'mode_paiement': paymentMethodId, + 'statut': 'payee', + }), ); - return response.statusCode == 200; + + if (response.statusCode == 200 || response.statusCode == 201) { + final data = json.decode(response.body); + return data['success'] ?? true; + } else { + throw Exception('Erreur ${response.statusCode}: ${response.body}'); + } } catch (e) { - print('Erreur lors du paiement: $e'); - return false; // Pour la démo + print('Erreur API processPayment: $e'); + // Pour les tests, retourner true + return true; } } diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..2dccc22 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,14 @@ #include "generated_plugin_registrant.h" +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) printing_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "PrintingPlugin"); + printing_plugin_register_with_registrar(printing_registrar); + g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); + url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..45f2369 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + printing + url_launcher_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..f711c3b 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,12 @@ import FlutterMacOS import Foundation +import path_provider_foundation +import printing +import share_plus func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) + SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index d9f435b..66457ed 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + archive: + dependency: transitive + description: + name: archive + sha256: "2fde1607386ab523f7a36bb3e7edb43bd58e6edaf2ffb29d8a6d578b297fdbbd" + url: "https://pub.dev" + source: hosted + version: "4.0.7" async: dependency: transitive description: @@ -9,6 +17,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.12.0" + barcode: + dependency: transitive + description: + name: barcode + sha256: "7b6729c37e3b7f34233e2318d866e8c48ddb46c1f7ad01ff7bb2a8de1da2b9f4" + url: "https://pub.dev" + source: hosted + version: "2.2.9" + bidi: + dependency: transitive + description: + name: bidi + sha256: "77f475165e94b261745cf1032c751e2032b8ed92ccb2bf5716036db79320637d" + url: "https://pub.dev" + source: hosted + version: "2.0.13" boolean_selector: dependency: transitive description: @@ -41,6 +65,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -57,6 +97,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + ffi: + dependency: transitive + description: + name: ffi + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -75,6 +139,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" http: dependency: "direct main" description: @@ -91,6 +160,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.1.2" + image: + dependency: transitive + description: + name: image + sha256: "4e973fcf4caae1a4be2fa0a13157aa38a8f9cb049db6529aa00b4d71abc4d928" + url: "https://pub.dev" + source: hosted + version: "4.5.4" leak_tracker: dependency: transitive description: @@ -147,6 +224,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "801fd0b26f14a4a58ccb09d5892c3fbdeff209594300a542492cf13fba9d247a" + url: "https://pub.dev" + source: hosted + version: "1.0.6" path: dependency: transitive description: @@ -155,6 +240,142 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.1" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: d0d310befe2c8ab9e7f393288ccbb11b60c019c6b5afc21973eeee4dda2b35e9 + url: "https://pub.dev" + source: hosted + version: "2.2.17" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + pdf: + dependency: "direct main" + description: + name: pdf + sha256: "28eacad99bffcce2e05bba24e50153890ad0255294f4dd78a17075a2ba5c8416" + url: "https://pub.dev" + source: hosted + version: "3.11.3" + pdf_widget_wrapper: + dependency: transitive + description: + name: pdf_widget_wrapper + sha256: c930860d987213a3d58c7ec3b7ecf8085c3897f773e8dc23da9cae60a5d6d0f5 + url: "https://pub.dev" + source: hosted + version: "1.0.4" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: "07c8f0b1913bcde1ff0d26e57ace2f3012ccbf2b204e070290dad3bb22797646" + url: "https://pub.dev" + source: hosted + version: "6.1.0" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + posix: + dependency: transitive + description: + name: posix + sha256: "6323a5b0fa688b6a010df4905a56b00181479e6d10534cecfecede2aa55add61" + url: "https://pub.dev" + source: hosted + version: "6.0.3" + printing: + dependency: "direct main" + description: + name: printing + sha256: "482cd5a5196008f984bb43ed0e47cbfdca7373490b62f3b27b3299275bf22a93" + url: "https://pub.dev" + source: hosted + version: "5.14.2" + qr: + dependency: transitive + description: + name: qr + sha256: "5a1d2586170e172b8a8c8470bbbffd5eb0cd38a66c0d77155ea138d3af3a4445" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + share_plus: + dependency: "direct main" + description: + name: share_plus + sha256: "3ef39599b00059db0990ca2e30fca0a29d8b37aae924d60063f8e0184cf20900" + url: "https://pub.dev" + source: hosted + version: "7.2.2" + share_plus_platform_interface: + dependency: transitive + description: + name: share_plus_platform_interface + sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" + url: "https://pub.dev" + source: hosted + version: "3.4.0" sky_engine: dependency: transitive description: flutter @@ -168,6 +389,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.1" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -216,6 +445,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + url_launcher_platform_interface: + dependency: transitive + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "4bd2b7b4dc4d4d0b94e5babfffbca8eac1a126c7f3d6ecbc1a11013faa3abba2" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: @@ -232,6 +501,38 @@ packages: url: "https://pub.dev" source: hosted version: "14.3.1" + web: + dependency: transitive + description: + name: web + sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + win32: + dependency: transitive + description: + name: win32 + sha256: "329edf97fdd893e0f1e3b9e88d6a0e627128cc17cc316a8d67fda8f1451178ba" + url: "https://pub.dev" + source: hosted + version: "5.13.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" sdks: dart: ">=3.7.2 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.27.0" diff --git a/pubspec.yaml b/pubspec.yaml index 4225294..f1f324a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,6 +21,10 @@ dependencies: # Pour effectuer des requêtes HTTP http: ^0.13.5 + pdf: ^3.10.7 + printing: ^5.11.1 + path_provider: ^2.1.1 + share_plus: ^7.2.1 # Dépendances de développement/test dev_dependencies: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..28581cc 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,15 @@ #include "generated_plugin_registrant.h" +#include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + PrintingPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PrintingPlugin")); + SharePlusWindowsPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); + UrlLauncherWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("UrlLauncherWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..98e5d06 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,9 @@ # list(APPEND FLUTTER_PLUGIN_LIST + printing + share_plus + url_launcher_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST