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

Package de transaction Welloo

example/lib/main.dart

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await WellooSdk.init(mockMode: false);
  runApp(const MainApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Welloo SDK V2 Demo',
      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> {
  final _sdk = WellooSdk();

  final _accessToken =
      "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ3V1BYTi1wZXc0a2l1T0Y2SDBQaHBuUF96UUFrU3dMZVB3c1pfU0tfbWhnIn0.eyJleHAiOjE3NjQ0MDE2NDEsImlhdCI6MTc2NDM5OTg0MSwianRpIjoib25ydHJvOmE5NDgzMTM2LTQ5NDgtNGUxOC1hZjZkLTYyZGZlZjRmNjQ3MiIsImlzcyI6Imh0dHBzOi8vYXV0aC1kZXYuZmluYXBheS5uZXQvcmVhbG1zL2ZpbmFwYXkiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiN2ExODU4MzktZjBiNy00ODVjLWJmMTUtZGMxNmFiOTY0YzQ3IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiZmluYXBheS1hcGkiLCJzaWQiOiIwYWU3MzI0Mi1jNWMxLTQ3ZDktYWE3Mi05ZmZlMTdjMmY5MTIiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIi8qIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLWZpbmFwYXkiLCJvZmZsaW5lX2FjY2VzcyIsImRlbGV0ZV9zZXJ2aWNlIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIiwicGluX2NoYW5nZSI6ZmFsc2UsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiaWRfbWFyY2hhbmQiOiI2ODM2ZjUxZjE3ODBkZWExYmFiYTRjMzgiLCJncm91cHMiOlsiY2xpZW50Il0sInByZWZlcnJlZF91c2VybmFtZSI6IjA3NzgyODE3NTIifQ.ifKhLji9QGwUdglkspiXSiaaYqGsnA98Bq6HEuTteI3WmNjijS6XvwOnt1A7JBUZYcAEZb_e3FzDsMDTpITLQsST3UH2IKllvf7ZiulZZbnNhtQUR-ues0IVB6Gqd8Nkz3hZh-8ua4l8MOrBGrCWp--QlQsIL6trZgrsf9XjHmER7zroItzVAiQ_p4UXr9JXR7oZ9OJpL0U8407w0ztxaqk7s9rhh6U6OBWYFWdnVITDzQkPbYk02mpmGbKiSDwAoxwE4QQYNMT9bJEFtKj5SjbzBjlew8ovQKmpSC9oHpYUWw2Y3B_C1jSD0WIeQXNF2_1BJKv1J4esmGx4rGy9-A";

  final _refreshToken =
      "eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1NzEwYzYwOC1jMmNiLTRhZDctYjU2Yi1kYmQ2NDMyZmJmOTMifQ.eyJleHAiOjE3OTU5MzU4NDEsImlhdCI6MTc2NDM5OTg0MSwianRpIjoiYTQ5Yjg5NjctNTUzMC00YjE5LTgzNTYtM2MyOWViN2VkYzJmIiwiaXNzIjoiaHR0cHM6Ly9hdXRoLWRldi5maW5hcGF5Lm5ldC9yZWFsbXMvZmluYXBheSIsImF1ZCI6Imh0dHBzOi8vYXV0aC1kZXYuZmluYXBheS5uZXQvcmVhbG1zL2ZpbmFwYXkiLCJzdWIiOiI3YTE4NTgzOS1mMGI3LTQ4NWMtYmYxNS1kYzE2YWI5NjRjNDciLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiZmluYXBheS1hcGkiLCJzaWQiOiIwYWU3MzI0Mi1jNWMxLTQ3ZDktYWE3Mi05ZmZlMTdjMmY5MTIiLCJzY29wZSI6Im9wZW5pZCB3ZWItb3JpZ2lucyBwcm9maWxlIGFjciBlbWFpbCByb2xlcyBiYXNpYyJ9.4z4BfHCP_Egrcd-rlXaVJXV88WVd-lVsAOYsZ1oTU610wfv9fyBZ4VlBs9m1wa1z5NSKSAgIUqtWNf26VXPuPQ";
  bool _isRegistered = false;
  Wallet? _wallet;
  String? _pendingTransactionId;

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

  Future<void> _checkRegistration() async {
    final registeredResult = await _sdk.isUserRegistered();
    final walletResult = await _sdk.getCurrentWallet();
    setState(() {
      _isRegistered = registeredResult.success
          ? (registeredResult.data ?? false)
          : false;
      _wallet = walletResult.success ? walletResult.data : null;
    });
  }

  Future<void> _handleRegister() async {
    try {
      final result = await _sdk.registerClient(
        accessToken: _accessToken,
        refreshToken: _refreshToken,
      );

      if (result.success) {
        await _checkRegistration();
        if (!mounted) return;
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Registered! Phone: ${_wallet?.telephone}')),
        );
      } else {
        if (!mounted) return;
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Registration failed: ${result.error}')),
        );
      }
    } catch (e) {
      if (!mounted) return;
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(SnackBar(content: Text('Error: $e')));
    }
  }

  Future<void> _handleDeposit() async {
    Navigator.of(context).push<TransactionResult>(
      MaterialPageRoute(
        builder: (_) => WellooDeposit(
          accessToken:
              "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ3V1BYTi1wZXc0a2l1T0Y2SDBQaHBuUF96UUFrU3dMZVB3c1pfU0tfbWhnIn0.eyJleHAiOjE3NjQ0MDE2NDEsImlhdCI6MTc2NDM5OTg0MSwianRpIjoib25ydHJvOmE5NDgzMTM2LTQ5NDgtNGUxOC1hZjZkLTYyZGZlZjRmNjQ3MiIsImlzcyI6Imh0dHBzOi8vYXV0aC1kZXYuZmluYXBheS5uZXQvcmVhbG1zL2ZpbmFwYXkiLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiN2ExODU4MzktZjBiNy00ODVjLWJmMTUtZGMxNmFiOTY0YzQ3IiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiZmluYXBheS1hcGkiLCJzaWQiOiIwYWU3MzI0Mi1jNWMxLTQ3ZDktYWE3Mi05ZmZlMTdjMmY5MTIiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbIi8qIl0sInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWZhdWx0LXJvbGVzLWZpbmFwYXkiLCJvZmZsaW5lX2FjY2VzcyIsImRlbGV0ZV9zZXJ2aWNlIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIiwicGluX2NoYW5nZSI6ZmFsc2UsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwiaWRfbWFyY2hhbmQiOiI2ODM2ZjUxZjE3ODBkZWExYmFiYTRjMzgiLCJncm91cHMiOlsiY2xpZW50Il0sInByZWZlcnJlZF91c2VybmFtZSI6IjA3NzgyODE3NTIifQ.ifKhLji9QGwUdglkspiXSiaaYqGsnA98Bq6HEuTteI3WmNjijS6XvwOnt1A7JBUZYcAEZb_e3FzDsMDTpITLQsST3UH2IKllvf7ZiulZZbnNhtQUR-ues0IVB6Gqd8Nkz3hZh-8ua4l8MOrBGrCWp--QlQsIL6trZgrsf9XjHmER7zroItzVAiQ_p4UXr9JXR7oZ9OJpL0U8407w0ztxaqk7s9rhh6U6OBWYFWdnVITDzQkPbYk02mpmGbKiSDwAoxwE4QQYNMT9bJEFtKj5SjbzBjlew8ovQKmpSC9oHpYUWw2Y3B_C1jSD0WIeQXNF2_1BJKv1J4esmGx4rGy9-A",
          refreshToken:
              "eyJhbGciOiJIUzUxMiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1NzEwYzYwOC1jMmNiLTRhZDctYjU2Yi1kYmQ2NDMyZmJmOTMifQ.eyJleHAiOjE3OTU5MzU4NDEsImlhdCI6MTc2NDM5OTg0MSwianRpIjoiYTQ5Yjg5NjctNTUzMC00YjE5LTgzNTYtM2MyOWViN2VkYzJmIiwiaXNzIjoiaHR0cHM6Ly9hdXRoLWRldi5maW5hcGF5Lm5ldC9yZWFsbXMvZmluYXBheSIsImF1ZCI6Imh0dHBzOi8vYXV0aC1kZXYuZmluYXBheS5uZXQvcmVhbG1zL2ZpbmFwYXkiLCJzdWIiOiI3YTE4NTgzOS1mMGI3LTQ4NWMtYmYxNS1kYzE2YWI5NjRjNDciLCJ0eXAiOiJSZWZyZXNoIiwiYXpwIjoiZmluYXBheS1hcGkiLCJzaWQiOiIwYWU3MzI0Mi1jNWMxLTQ3ZDktYWE3Mi05ZmZlMTdjMmY5MTIiLCJzY29wZSI6Im9wZW5pZCB3ZWItb3JpZ2lucyBwcm9maWxlIGFjciBlbWFpbCByb2xlcyBiYXNpYyJ9.4z4BfHCP_Egrcd-rlXaVJXV88WVd-lVsAOYsZ1oTU610wfv9fyBZ4VlBs9m1wa1z5NSKSAgIUqtWNf26VXPuPQ",
          waitResponse: (response) {
            print(response);
          },
          onError: (error) {
            print(error);
          },
        ),
      ),
    );
    // if (!_isRegistered) {
    //   ScaffoldMessenger.of(
    //     context,
    //   ).showSnackBar(const SnackBar(content: Text('Please register first')));
    //   return;
    // }

    // try {
    //   final result = await _sdk.initDeposit(context: context);

    //   if (!mounted) return;

    //   if (result.status.name == 'inProgress') {
    //     setState(() {
    //       _pendingTransactionId = result.transactionId;
    //     });
    //     ScaffoldMessenger.of(context).showSnackBar(
    //       SnackBar(
    //         content: Text(
    //           'Transaction en cours (ID: ${result.transactionId}). Finalisez dans Wave puis vérifiez le statut.',
    //         ),
    //         duration: const Duration(seconds: 5),
    //       ),
    //     );
    //   } else {
    //     ScaffoldMessenger.of(
    //       context,
    //     ).showSnackBar(SnackBar(content: Text('Deposit: ${result.status}')));
    //   }
    // } catch (e) {
    //   if (!mounted) return;
    //   ScaffoldMessenger.of(
    //     context,
    //   ).showSnackBar(SnackBar(content: Text('Error: $e')));
    // }
  }

  Future<void> _handleCheckStatus() async {
    if (_pendingTransactionId == null) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('Aucune transaction en cours')),
      );
      return;
    }

    try {
      final result = await _sdk.checkTransactionStatus(
        context: context,
        transactionId: _pendingTransactionId!,
      );

      if (!mounted) return;

      if (result.status.name == 'succeeded') {
        setState(() {
          _pendingTransactionId = null;
        });
      }

      ScaffoldMessenger.of(
        context,
      ).showSnackBar(SnackBar(content: Text('Statut: ${result.status.name}')));
    } catch (e) {
      if (!mounted) return;
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(SnackBar(content: Text('Error: $e')));
    }
  }

  Future<void> _handleTransfer() async {
    if (!_isRegistered) {
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(const SnackBar(content: Text('Please register first')));
      return;
    }

    try {
      final result = await _sdk.initTransfer(context: context);

      if (!mounted) return;
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(SnackBar(content: Text('Transfer: ${result.status}')));
    } catch (e) {
      if (!mounted) return;
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(SnackBar(content: Text('Error: $e')));
    }
  }

  Future<void> _handleLogout() async {
    try {
      await _sdk.logout();
      await _checkRegistration();
      if (!mounted) return;
      ScaffoldMessenger.of(
        context,
      ).showSnackBar(const SnackBar(content: Text('Logged out')));
    } catch (e) {}
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Welloo SDK V2 Demo')),
      backgroundColor: Colors.white,
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              const Text(
                'Welloo SDK V2',
                style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
              ),
              const SizedBox(height: 10),
              Text(
                _isRegistered
                    ? 'Registered: ${_wallet?.telephone}'
                    : 'Not registered',
              ),
              const SizedBox(height: 40),
              if (!_isRegistered)
                ElevatedButton.icon(
                  onPressed: _handleRegister,
                  icon: const Icon(Icons.person_add),
                  label: const Text("Enregistrer Client"),
                  style: ElevatedButton.styleFrom(
                    minimumSize: const Size(200, 50),
                  ),
                ),
              if (_isRegistered) ...[
                ElevatedButton.icon(
                  onPressed: _handleDeposit,
                  icon: const Icon(Icons.add_circle),
                  label: const Text("Dépôt"),
                  style: ElevatedButton.styleFrom(
                    minimumSize: const Size(200, 50),
                  ),
                ),
                const SizedBox(height: 12),
                if (_pendingTransactionId != null) ...[
                  ElevatedButton.icon(
                    onPressed: _handleCheckStatus,
                    icon: const Icon(Icons.search),
                    label: const Text("Vérifier statut"),
                    style: ElevatedButton.styleFrom(
                      minimumSize: const Size(200, 50),
                      backgroundColor: Colors.orange,
                      foregroundColor: Colors.white,
                    ),
                  ),
                  const SizedBox(height: 8),
                  Text(
                    'TX ID: $_pendingTransactionId',
                    style: const TextStyle(fontSize: 10, color: Colors.grey),
                  ),
                  const SizedBox(height: 12),
                ],
                ElevatedButton.icon(
                  onPressed: _handleTransfer,
                  icon: const Icon(Icons.send),
                  label: const Text("Transfert"),
                  style: ElevatedButton.styleFrom(
                    minimumSize: const Size(200, 50),
                  ),
                ),

                const SizedBox(height: 20),
                ElevatedButton.icon(
                  onPressed: _handleLogout,
                  icon: const Icon(Icons.logout),
                  label: const Text("Déconnexion"),
                  style: ElevatedButton.styleFrom(
                    minimumSize: const Size(200, 50),
                  ),
                ),
              ],
              const SizedBox(height: 40),
              const Text(
                'Types de transaction: Dépôt, Paiement, Transfert',
                style: TextStyle(fontSize: 12, color: Colors.grey),
              ),
              const SizedBox(height: 8),
              const Text(
                'Opérateurs: Wello, Wave',
                style: TextStyle(fontSize: 12, color: Colors.grey),
              ),
            ],
          ),
        ),
      ),
    );
  }
}