welloo_sdk 0.0.68 copy "welloo_sdk: ^0.0.68" to clipboard
welloo_sdk: ^0.0.68 copied to clipboard

Package de transaction Welloo

example/lib/main.dart

import 'dart:async';

import 'package:app_links/app_links.dart';
import 'package:flutter/material.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:welloo_sdk/welloo_sdk.dart';

// 1. DÉCLARATION GLOBALE DE LA CLÉ DE NAVIGATION
// Cela permet d'accéder au navigateur depuis n'importe où (même hors du contexte)
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 2. CHARGEMENT DES VARIABLES D'ENVIRONNEMENT
  try {
    await dotenv.load(fileName: '.env');
  } catch (e) {
    debugPrint('⚠️ Fichier .env introuvable. Assurez-vous d\'en créer un.');
  }

  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welloo SDK - Nouveau Système',
      // 3. INJECTION DE LA CLÉ DANS MATERIAL APP
      navigatorKey: navigatorKey,
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorSchemeSeed: Colors.blue,
        useMaterial3: true,
      ),
      home: const DemoWello(),
    );
  }
}

class DemoWello extends StatefulWidget {
  const DemoWello({super.key});

  @override
  State<DemoWello> createState() => _DemoWelloState();
}

class _DemoWelloState extends State<DemoWello> {
  // Getters pour sécuriser l'accès aux variables d'env
  String get _accessToken => dotenv.env['ACCESS_TOKEN'] ?? '';
  String get _refreshToken => dotenv.env['REFRESH_TOKEN'] ?? '';

  StreamSubscription<Uri>? _linkSubscription;

  @override
  void initState() {
    super.initState();
    initDeepLinks();
  }

  @override
  void dispose() {
    _linkSubscription?.cancel();
    super.dispose();
  }

  // --- LOGIQUE DEEP LINK ---

  Future<void> initDeepLinks() async {
    _linkSubscription = AppLinks().uriLinkStream.listen((uri) {
      debugPrint('🔗 DeepLink reçu : $uri');

      // CAS 1 : Retour de Paiement Finapay
      if (uri.host == 'api-transaction-dev.finapay.net') {
        // Petit délai pour assurer que l'UI est prête
        // Future.delayed(const Duration(milliseconds: 500), () {
        //   debugPrint("🚀 Navigation vers le résultat de paiement...");

        //   // Utilisation de la clé globale définie tout en haut
        //   navigatorKey.currentState?.pushAndRemoveUntil(
        //     MaterialPageRoute(
        //       builder: (context) => const Scaffold(
        //         body: Center(
        //           child: Column(
        //             mainAxisAlignment: MainAxisAlignment.center,
        //             children: [
        //               Icon(Icons.check_circle, color: Colors.green, size: 80),
        //               SizedBox(height: 20),
        //               Text('Paiement Terminé !',
        //                   style: TextStyle(fontSize: 20)),
        //             ],
        //           ),
        //         ),
        //       ),
        //     ),
        //     (route) => false, // Supprime tout l'historique
        //     // (route) => route.isFirst // Alternative : Garder l'accueil derrière
        //   );
        // });
      }
      // CAS 2 : Autres liens
      else {
        if (uri.fragment.isNotEmpty) {
          navigatorKey.currentState?.pushNamed(uri.fragment);
        }
      }
    });
  }

  // --- HANDLERS DU SDK ---

  Future<void> _handleDeposit() async {
    Navigator.of(context).push(
      MaterialPageRoute(
        builder: (_) => WellooDeposit(
          accessToken: _accessToken,
          refreshToken: _refreshToken,
          // Utilisation correcte de Uri.parse
          linkError: Uri.parse("LinkError"),
          linkSuccess: Uri.parse("LinkSuccess"),
          waitResponse: (response) {
            // debugPrint("✅ Dépôt Réussi : $response");
            // ScaffoldMessenger.of(context)
            //     .showSnackBar(const SnackBar(content: Text("Dépôt réussi")));
          },
          onError: (error) {
            debugPrint("❌ Erreur Dépôt : $error");
          },
        ),
      ),
    );
  }

  Future<void> _handleTransfer() async {
    Navigator.of(context).push(
      MaterialPageRoute(
        builder: (_) => WellooTransfer(
          accessToken: _accessToken,
          refreshToken: _refreshToken,
          waitResponse: (response) {
            debugPrint("✅ Transfert Réussi : $response");
          },
          onError: (error) {
            debugPrint("❌ Erreur Transfert : $error");
          },
        ),
      ),
    );
  }

  Future<void> _handleScanner() async {
    Navigator.of(context).push(
      MaterialPageRoute(
        builder: (_) => WellooScanQr(
          accessToken: _accessToken,
          refreshToken: _refreshToken,
          waitResponse: (response) {
            debugPrint("✅ Scan Réussi : $response");
          },
          onError: (error) {
            debugPrint("❌ Erreur Scan : $error");
          },
        ),
      ),
    );
  }

  // --- UI ---

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Welloo SDK Demo'),
        centerTitle: true,
      ),
      backgroundColor: Colors.grey[100],
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              _buildMenuButton(
                icon: Icons.download,
                label: "Initier un Dépôt",
                onPressed: _handleDeposit,
                color: Colors.green,
              ),
              const SizedBox(height: 20),
              _buildMenuButton(
                icon: Icons.send,
                label: "Initier un Transfert",
                onPressed: _handleTransfer,
                color: Colors.blue,
              ),
              const SizedBox(height: 20),
              _buildMenuButton(
                icon: Icons.qr_code_scanner,
                label: "Scanner QR Code",
                onPressed: _handleScanner,
                color: Colors.purple,
              ),
            ],
          ),
        ),
      ),
    );
  }

  // Widget helper pour éviter la répétition de code
  Widget _buildMenuButton({
    required IconData icon,
    required String label,
    required VoidCallback onPressed,
    required Color color,
  }) {
    return SizedBox(
      width: double.infinity,
      height: 60,
      child: ElevatedButton.icon(
        onPressed: onPressed,
        icon: Icon(icon),
        label: Text(label, style: const TextStyle(fontSize: 16)),
        style: ElevatedButton.styleFrom(
          backgroundColor: color,
          foregroundColor: Colors.white,
          elevation: 2,
          shape:
              RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
        ),
      ),
    );
  }
}