oneapp_sdk 0.0.3
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();
}
}