oneapp_sdk 0.0.3 copy "oneapp_sdk: ^0.0.3" to clipboard
oneapp_sdk: ^0.0.3 copied to clipboard

OneApp Cobranding SDK - Flutter plugin for payment processing.

example/lib/main.dart

import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:flutter/material.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get_instance/src/extension_instance.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';
import 'package:http/http.dart' as http;
import 'package:oneapp_sdk/common/loadingscreen.dart';
import 'package:oneapp_sdk/common/url.dart';
import 'package:oneapp_sdk/oneapp_sdk.dart';
import 'package:tapay_sdk_example/MainTabBar.dart';

import 'loadingscreen.dart';



class LoginController extends GetxController {
  final phoneController = TextEditingController();

}

void main() {
  runApp(const TicketEaseApp());
}

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

  @override
  Widget build(BuildContext context) {

   return MaterialApp(
     
      debugShowCheckedModeBanner: false,
      title: 'Ticket Ease',
      theme: ThemeData(
        brightness: Brightness.light,
        primarySwatch: Colors.deepPurple,
        scaffoldBackgroundColor: const Color(0xFF6A5AE0),
      ),
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        primarySwatch: Colors.deepPurple,
        scaffoldBackgroundColor: const Color(0xFF2B2B4B),
      ),
      home: LoginScreen(),
    );
  }
}

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

  @override
  State<LoginScreen> createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen>
    with SingleTickerProviderStateMixin {
  late final AnimationController _animController;
  late final Animation<Offset> _panelOffset;
  late final Animation<double> _panelFade;
  final loginCtrl = Get.put(LoginController());
  String selectedValue = "";
  Color? selectedColor;
 // final themeCtrl = Get.find<ThemeController>();

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

    WidgetsBinding.instance.addPostFrameCallback((_) {

      getMobileDeviceToken(context);
    });

    _animController =
        AnimationController(vsync: this, duration: const Duration(milliseconds: 700));

    _panelOffset =
        Tween<Offset>(begin: const Offset(0, 0.15), end: Offset.zero).animate(
          CurvedAnimation(parent: _animController, curve: Curves.easeOutCubic),
        );

    _panelFade = Tween<double>(begin: 0, end: 1)
        .animate(CurvedAnimation(parent: _animController, curve: Curves.easeIn));

    WidgetsBinding.instance.addPostFrameCallback((_) => _animController.forward());
  }
var requestToken;
  @override
  void dispose() {
    _animController.dispose();
    loginCtrl.phoneController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final isDark = Theme.of(context).brightness == Brightness.dark;

    String Errortext = '';

    return Scaffold(
      body: SafeArea(
        child: LayoutBuilder(builder: (context, constraints) {
          final maxWidth = constraints.maxWidth;
          final isTablet = maxWidth > 600;

          return Stack(
            children: [
              /// Background
              Container(
                decoration: BoxDecoration(
                  gradient: LinearGradient(
                    colors: isDark
                        ? const [Color(0xFF3A3A6A), Color(0xFF2B2B4B)]
                        : const [Color(0xFF6A5AE0), Color(0xFF9B6CF1)],
                    begin: Alignment.topCenter,
                    end: Alignment.bottomCenter,
                  ),
                ),
              ),

              /// HEADER
              Positioned(
                top: isTablet ? 36 : 56,
                left: 16,
                right: 16,
                child: Column(
                  children: [
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        const SizedBox(width: 48),
                        /// THEME SWITCH
                       /* IconButton(
                          onPressed: () => themeCtrl.toggleTheme(),
                          icon: Icon(
                            isDark ? Icons.wb_sunny : Icons.nights_stay,
                            color: Colors.white,
                          ),
                        ),*/
                      ],
                    ),
                    const SizedBox(height: 8),
                    Text(
                      'Ticket Ease',
                      style: TextStyle(
                        color: Colors.white,
                        fontSize: isTablet ? 44 : 36,
                        fontWeight: FontWeight.w700,
                      ),
                    ),
                    SizedBox(height: 10,),
          Column(
            crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text("Select Theme",),
          RadioListTile(
          title: Text("Yellow"),
          value: "Yellow",
          groupValue: selectedValue,
          onChanged: (value) {
          setState(() {
            selectedColor = Colors.yellow;
          selectedValue = value!;
          });
          },
          ),
          RadioListTile(
          title: Text("Red"),
          value: "Red",
          groupValue: selectedValue,
          onChanged: (value) {
          setState(() {
            selectedColor = Colors.red;
          selectedValue = value!;
          });
          },
          ),
          RadioListTile(
          title: Text("Blue"),
          value: "Blue",
          groupValue: selectedValue,
          onChanged: (value) {
          setState(() {
            selectedColor = Colors.blue;
          selectedValue = value!;
          });
          },
          ),
          ],
          ),
                  ],
                ),
              ),

              /// LOGIN PANEL
              Align(
                alignment: Alignment.bottomCenter,
                child: SlideTransition(
                  position: _panelOffset,
                  child: FadeTransition(
                    opacity: _panelFade,
                    child: Container(
                      padding: EdgeInsets.symmetric(
                          horizontal: isTablet ? 32 : 20, vertical: 24),
                      height: isTablet ? 520 : 420,
                      width: double.infinity,
                      decoration: BoxDecoration(
                        color: isDark ? Colors.grey[900] : Colors.white,
                        borderRadius: const BorderRadius.only(
                          topLeft: Radius.circular(36),
                          topRight: Radius.circular(36),
                        ),
                      ),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text(
                            'Welcome Back',
                            style: TextStyle(
                              fontSize: isTablet ? 28 : 22,
                              fontWeight: FontWeight.w700,
                            ),
                          ),
                          const SizedBox(height: 20),

                          /// PHONE FIELD
                          TextField(
                            controller: loginCtrl.phoneController,
                            keyboardType: TextInputType.phone,
                            maxLength: 10,
                            decoration: InputDecoration(
                              hintText: 'Mobile Number',
                              errorText: Errortext,
                              prefixIcon: const Icon(Icons.phone_android),
                              filled: true,
                              fillColor: isDark ? Colors.grey[800] : Colors.grey[100],
                              border: OutlineInputBorder(
                                borderRadius: BorderRadius.circular(12),
                                borderSide: BorderSide.none,
                              ),
                            ),
                            onChanged: (value){
                              setState(() {
                                if(loginCtrl.phoneController.text.length < 10){

                                  Errortext = "Please enter valid number";
                                }else{

                                  Errortext = "";
                                }
                              });
                            },
                            onEditingComplete: (){


                            },
                          ),

                          const SizedBox(height: 16),

                          /// CONTINUE BUTTON
                          SizedBox(
                            width: double.infinity,
                            height: 54,
                            child: InkWell(
                              onTap: () async {

                                if(loginCtrl.phoneController.text.length == 10){

                                  var result = await OneAppSdk.modesetup(context,"TEST","5000159001","50001B2AB4A5956E548EAA1C3FC2D6C0C69D5",loginCtrl.phoneController.text,requestToken,true,selectedColor);

                                  if(result == true){
                                    var result = await OneAppSdk.ValidateUser(context: context, MobileNumber: loginCtrl.phoneController.text,orgID: '5000159001');

                                    if(result!.isRegistered == true){

                                      Navigator.push(
                                        context,
                                        MaterialPageRoute(
                                          builder: (_) => Maintabbar(),
                                        ),
                                      );


                                      // Get.to(() => Maintabbar());
                                      Navigator.pushAndRemoveUntil(
                                        context,
                                        MaterialPageRoute(builder: (_) => Maintabbar()),
                                            (route) => false,
                                      );
                                    }else{
                                      // LoadingScreen().showSnack(context, true, result.message);
                                      LoadingScreen().showSnack(context,true, result.message);

                                    }

                                  }
                                }

                              },
                              child: Container(
                                decoration: BoxDecoration(
                                  gradient: LinearGradient(
                                    colors: isDark
                                        ? const [Color(0xFF7A66E6), Color(0xFF5A49D9)]
                                        : const [Color(0xFF6A5AE0), Color(0xFF9B6CF1)],
                                  ),
                                  borderRadius: BorderRadius.circular(14),
                                ),
                                child: const Center(
                                  child: Text(
                                    'Continue',
                                    style: TextStyle(
                                        color: Colors.white,
                                        fontWeight: FontWeight.w600),
                                  ),
                                ),
                              ),
                            ),
                          ),

                          const SizedBox(height: 12),
                          Center(
                            child: Text('OR', style: TextStyle(color: Colors.grey[600])),
                          ),

                          const SizedBox(height: 12),

                          /// SOCIAL REGISTER BUTTON
                          Center(
                            child: InkWell(
                              onTap: () =>{},
                              child: _socialButton(context,isTablet ? 180 : 140, 'Register', Icons.g_mobiledata,loginCtrl.phoneController.text),
                            ),
                          ),
                          SizedBox(height: 5,),
                          Center(
                            child: InkWell(
                              onTap: () =>{},
                              child: _socialButton(context,isTablet ? 180 : 140, 'Account Clouser', Icons.g_mobiledata,loginCtrl.phoneController.text),
                            ),
                          ),
                        ],
                      ),
                    ),
                  ),
                ),
              ),
            ],
          );
        }),
      ),
    );
  }

  Widget _socialButton(BuildContext context,double width, String title, IconData icon, String mobilenumber) {
    return InkWell(
      onTap: () async {
        if (title == "Register") {

          var result = await OneAppSdk.modesetup(context,"TEST","5000159001","50001B2AB4A5956E548EAA1C3FC2D6C0C69D5",mobilenumber,requestToken,true,selectedColor);

          if(result == true){
            var result = await OneAppSdk.registration(context, mobilenumber,'5000159001');

            if(result?.isRegistered == true){
              // PopupAlert().showPopup(context, "SUCCESS", false);

             /* Navigator.push(
                context,
                MaterialPageRoute(builder: (context) => Maintabbar()),
              );*/

              // Get.to(Maintabbar());

              Navigator.pushAndRemoveUntil(
                context,
                MaterialPageRoute(builder: (_) => Maintabbar()),
                    (route) => false,
              );


            }else{
              LoadingScreen().showSnack(context,true, result?.message??"");


            }
          }
        }
        else if(title == "Account Clouser"){
          var result = await OneAppSdk.modesetup(context,"TEST","5000159001","50001B2AB4A5956E548EAA1C3FC2D6C0C69D5",mobilenumber,requestToken,true,selectedColor);

          if(result == true){
            var result = await OneAppSdk.clouserRequest(context, mobilenumber,'5000159001');

            if(result == true){

              Navigator.pushAndRemoveUntil(
                context,
                MaterialPageRoute(builder: (_) => Maintabbar()),
                    (route) => true,
              );


            }else{
              LoadingScreen().showSnack(context,false, "Failed");


            }
          }
        }
      },
      borderRadius: BorderRadius.circular(12),
      child: Container(
        width: width,
        height: 48,
        decoration: BoxDecoration(
          border: Border.all(color: Colors.grey.shade300),
          borderRadius: BorderRadius.circular(12),
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(icon, size: 20),
            const SizedBox(width: 8),
            Text(title),
          ],
        ),
      ),
    );
  }

 Future<void> getMobileDeviceToken(BuildContext context,{showProgress = true}) async {



    String url = 'https://staging.transactionanalysts.com:444/OnboardingApi/eapi/Service_API/' + AppUrl.CREATE_TOKEN;
    String body = jsonEncode({});

    String inputString = "${"5000159001"}&${body}&${"50001B2AB4A5956E548EAA1C3FC2D6C0C69D5"}";
    String Hash = getSHA512Hash(inputString);

    if (showProgress) {
      loadingscreen().showAlertDialog(context);
    }
    try {
      final response = await http.post(
        Uri.parse(url),
        headers: {
          "X-UserID":"5000159001",
          "X-IsTokenExpire": "true",
          "X-Hash": Hash,
        },
        body: body,
      );


      if (response.statusCode == 200) {
        final data = jsonDecode(response.body);

        if(data != null){
          if (showProgress) {
            Navigator.pop(context);
          }
        }

        String responseCode = data["Response_Code"] ?? "";

        if (responseCode.length == 4) {
           requestToken = data["New_Token"];
        //  requestToken = requestToken;



        } else {
          LoadingScreen().showSnack(context, true, data["Message"]);
          Navigator.pop(context,{data["Message"]});


        }

      } else {
        LoadingScreen().showSnack(context, true, "Request failed: ${response.statusCode}");
        Navigator.pop(context,{"Request failed: ${response.statusCode}"});
      }

    } catch (e) {
      LoadingScreen().showSnack(context, false, "Error: $e");
      Navigator.pop(context,{"Error: $e"});
    }
  }

  String getSHA512Hash(String input) {
    List<int> bytes = utf8.encode(input);
    Digest digest = sha512.convert(bytes);

    return digest.toString();
  }
}