Commit 8341e589 authored by Izol's avatar Izol

#1 topup confirm

parent 4878f810
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" project-jdk-name="Android Studio default JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
......
...@@ -15,6 +15,11 @@ import io.flutter.embedding.engine.FlutterEngine; ...@@ -15,6 +15,11 @@ import io.flutter.embedding.engine.FlutterEngine;
public final class GeneratedPluginRegistrant { public final class GeneratedPluginRegistrant {
private static final String TAG = "GeneratedPluginRegistrant"; private static final String TAG = "GeneratedPluginRegistrant";
public static void registerWith(@NonNull FlutterEngine flutterEngine) { public static void registerWith(@NonNull FlutterEngine flutterEngine) {
try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.connectivity.ConnectivityPlugin());
} catch(Exception e) {
Log.e(TAG, "Error registering plugin connectivity_plus, dev.fluttercommunity.plus.connectivity.ConnectivityPlugin", e);
}
try { try {
flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin()); flutterEngine.getPlugins().add(new dev.fluttercommunity.plus.device_info.DeviceInfoPlusPlugin());
} catch(Exception e) { } catch(Exception e) {
......
...@@ -407,7 +407,7 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT ...@@ -407,7 +407,7 @@ class MainActivity : MethodChannel.MethodCallHandler, FlutterActivity(), MifareT
// _mifareTicketing?.setBaseUrl( // _mifareTicketing?.setBaseUrl(
//// "https://postrend.dev.dolanapp.com", //// "https://postrend.dev.dolanapp.com",
////// "http://202.159.28.42:33101", ////// "http://202.159.28.42:33000",
////// "http://202.159.28.42:8150", ////// "http://202.159.28.42:8150",
//// "http://192.168.7.8:33101", //// "http://192.168.7.8:33101",
//// "http://192.168.7.8:8150", //// "http://192.168.7.8:8150",
......
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
#import "GeneratedPluginRegistrant.h" #import "GeneratedPluginRegistrant.h"
#if __has_include(<connectivity_plus/ConnectivityPlusPlugin.h>)
#import <connectivity_plus/ConnectivityPlusPlugin.h>
#else
@import connectivity_plus;
#endif
#if __has_include(<device_info_plus/FLTDeviceInfoPlusPlugin.h>) #if __has_include(<device_info_plus/FLTDeviceInfoPlusPlugin.h>)
#import <device_info_plus/FLTDeviceInfoPlusPlugin.h> #import <device_info_plus/FLTDeviceInfoPlusPlugin.h>
#else #else
...@@ -51,6 +57,7 @@ ...@@ -51,6 +57,7 @@
@implementation GeneratedPluginRegistrant @implementation GeneratedPluginRegistrant
+ (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry { + (void)registerWithRegistry:(NSObject<FlutterPluginRegistry>*)registry {
[ConnectivityPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"ConnectivityPlusPlugin"]];
[FLTDeviceInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTDeviceInfoPlusPlugin"]]; [FLTDeviceInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTDeviceInfoPlusPlugin"]];
[FLTPackageInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPackageInfoPlusPlugin"]]; [FLTPackageInfoPlusPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTPackageInfoPlusPlugin"]];
[PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]]; [PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]];
......
...@@ -81,7 +81,7 @@ class GeneralStatusApiBloc extends Bloc<ApiEvent, ApiState> { ...@@ -81,7 +81,7 @@ class GeneralStatusApiBloc extends Bloc<ApiEvent, ApiState> {
if (event is DoCheckStatusQris) { if (event is DoCheckStatusQris) {
try { try {
yield OnWaitingProcess(); yield OnWaitingProcess();
Map<String, dynamic> response = await ServiceApi.statusQris(event.body); Map<String, dynamic> response = await ServiceApi.statusQris(event.body, "");
if (response['response']['code'].toString() == "200") { if (response['response']['code'].toString() == "200") {
if (response['data']['status'] if (response['data']['status']
.toString() .toString()
......
...@@ -206,7 +206,13 @@ class ServiceApi { ...@@ -206,7 +206,13 @@ class ServiceApi {
static Future<Map<String, dynamic>> requestQris(String body, String mid) async { static Future<Map<String, dynamic>> requestQris(String body, String mid) async {
String baseUrl = _getBaseUrl(); String baseUrl = _getBaseUrl();
String url = "${PreferencesHelper.getString(kUrlCorePayment)}/payment-gateway/v1/general-payment/status/order" ?? DEFAULT_URL_ORDER;
String url = PreferencesHelper.getString(kUrlCorePayment)?.isNotEmpty == true
? PreferencesHelper.getString(kUrlCorePayment)
: DEFAULT_URL_ORDER;
if (PreferencesHelper.getString(kUrlCorePayment)?.isNotEmpty == true) {
url = "$url/v1/general-payment/order";
}
var headers = { var headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Accept': 'application/json', 'Accept': 'application/json',
...@@ -227,12 +233,18 @@ class ServiceApi { ...@@ -227,12 +233,18 @@ class ServiceApi {
static const String DEFAULT_URL_STATUS = static const String DEFAULT_URL_STATUS =
"https://api-portal.multidaya.id/payment-gateway/v1/general-payment/status"; "https://api-portal.multidaya.id/payment-gateway/v1/general-payment/status";
static Future<Map<String, dynamic>> statusQris(String body) async { static Future<Map<String, dynamic>> statusQris(String body, String mid) async {
String url = "${PreferencesHelper.getString(kUrlCorePayment)}/payment-gateway/v1/general-payment/status" ?? DEFAULT_URL_ORDER;
String url = PreferencesHelper.getString(kUrlCorePayment)?.isNotEmpty == true
? PreferencesHelper.getString(kUrlCorePayment)
: DEFAULT_URL_STATUS;
if (PreferencesHelper.getString(kUrlCorePayment)?.isNotEmpty == true) {
url = "$url/v1/general-payment/status";
}
var headers = { var headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
'Accept': 'application/json', 'Accept': 'application/json',
'X-Merchant-ID': '7e5aba0fdd4af4f6370eb456b6df497e' 'X-Merchant-ID': mid
}; };
var response; var response;
var uri = Uri.parse(url); var uri = Uri.parse(url);
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'package:awesome_dialog/awesome_dialog.dart'; import 'package:awesome_dialog/awesome_dialog.dart';
import 'package:otp_text_field/otp_field.dart'; import 'package:otp_text_field/otp_field.dart';
...@@ -23,6 +25,7 @@ import 'package:self_service_3/reader/reader_flutter.dart'; ...@@ -23,6 +25,7 @@ import 'package:self_service_3/reader/reader_flutter.dart';
import 'package:self_service_3/services/api_helpert.dart'; import 'package:self_service_3/services/api_helpert.dart';
import 'package:self_service_3/shared/theme.dart'; import 'package:self_service_3/shared/theme.dart';
import 'package:self_service_3/ui/pages/set_merchant.dart';
import 'package:self_service_3/ui/widgets/buttons.dart'; import 'package:self_service_3/ui/widgets/buttons.dart';
...@@ -57,6 +60,7 @@ import '../../shared/preference_constant.dart'; ...@@ -57,6 +60,7 @@ import '../../shared/preference_constant.dart';
import '../../shared/preferences_helper.dart'; import '../../shared/preferences_helper.dart';
import '../utils/dialog_helper.dart'; import '../utils/dialog_helper.dart';
import '../widgets/currency.dart'; import '../widgets/currency.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
final Map<String, dynamic>? cardInfo; final Map<String, dynamic>? cardInfo;
...@@ -73,6 +77,9 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -73,6 +77,9 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
late Future<List<OutletModel>> listOutlet; late Future<List<OutletModel>> listOutlet;
late Timer? timer; late Timer? timer;
bool isShowingDialog = false; bool isShowingDialog = false;
late ConnectivityResult _connectivityResult;
late Color _statusColor = Colors.grey;
double _downloadSpeed = 0;
var infoCard, var infoCard,
prevInfoCard, prevInfoCard,
...@@ -107,6 +114,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -107,6 +114,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
Timer? timerCheckStatus; Timer? timerCheckStatus;
String idle = PreferencesHelper.getString("idle"); String idle = PreferencesHelper.getString("idle");
bool isHitApi = false; bool isHitApi = false;
bool _isLoading = false;
@override @override
void initState() { void initState() {
...@@ -116,14 +124,79 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -116,14 +124,79 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
_showTap(); _showTap();
tapDial(); tapDial();
}); });
idleDuration = ValueNotifier<int>(_maxDuration);
Timer.periodic(Duration(seconds: 1), (timer) {
if (idleDuration.value > 0) {
setState(() {
idleDuration.value--;
});
} else {
timer.cancel();
}
});
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult connectivityResult) {
_checkInternetStatus();
});
} }
@override @override
void dispose() { void dispose() {
idleDuration.dispose();
// timer?.cancel(); // timer?.cancel();
super.dispose(); super.dispose();
} }
Future<void> _checkInternetStatus() async {
final connectivityResult = await Connectivity().checkConnectivity();
setState(() {
_connectivityResult = connectivityResult;
if (_connectivityResult == ConnectivityResult.none) {
_statusColor = Colors.red;
_downloadSpeed =
0; // set download speed to 0 when there is no internet connection
} else if (_connectivityResult == ConnectivityResult.mobile ||
_connectivityResult == ConnectivityResult.wifi) {
_statusColor = Colors.green;
_checkInternetSpeed(); // call _checkInternetSpeed function when there is internet connection
} else {
_statusColor = Colors.yellow;
}
});
}
Future<void> _checkInternetSpeed() async {
final connectivityResult = await Connectivity().checkConnectivity();
if (connectivityResult == ConnectivityResult.none) {
setState(() {
_downloadSpeed = 0;
});
return;
}
try {
final response = await http.get(Uri.parse(
'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png'));
final contentLength = response.contentLength!;
final start = DateTime.now();
await http.read(Uri.parse(
'https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png'));
final end = DateTime.now();
final duration = end.difference(start).inMilliseconds;
final downloadSpeed =
((contentLength / 1024) / (duration / 1000)).toStringAsFixed(2);
setState(() {
_downloadSpeed = double.parse(downloadSpeed);
});
} on SocketException catch (_) {
setState(() {
_downloadSpeed = 0;
});
}
}
String getSystemTime() { String getSystemTime() {
var now = DateTime.now(); var now = DateTime.now();
return DateFormat("HH:mm:ss").format(now); return DateFormat("HH:mm:ss").format(now);
...@@ -137,13 +210,15 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -137,13 +210,15 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
String _getPayQrisStatus() { String _getPayQrisStatus() {
String sc = PreferencesHelper.getString("multioutletservicecharge"); String sc = PreferencesHelper.getString("multioutletservicecharge");
String sca = PreferencesHelper.getString("multioutletservicechargeamount"); String sca = PreferencesHelper.getString("multioutletservicechargeamount");
String tid = PreferencesHelper.getString('outletname');
tid = tid.substring(tid.length - 4);
var body = GeneralStatusPaymentRequest( var body = GeneralStatusPaymentRequest(
trxId.toString(), trxId.toString(),
//ini untuk menyimpan int menjumlahkan ke bentuk tipe integer //ini untuk menyimpan int menjumlahkan ke bentuk tipe integer
(int.parse("10") + int.parse(sca) + int.parse(sc)).toString(), (int.parse("10") + int.parse(sca) + int.parse(sc)).toString(),
PreferencesHelper.getString('provider'), PreferencesHelper.getString('provider'),
PreferencesHelper.getString('mid'), PreferencesHelper.getString('mid'),
PreferencesHelper.getString('tid'), tid,
PreferencesHelper.getString('token'), PreferencesHelper.getString('token'),
); );
return jsonEncode(body); return jsonEncode(body);
...@@ -204,15 +279,18 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -204,15 +279,18 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
Future<Map<String, dynamic>?> _getQris() async { Future<Map<String, dynamic>?> _getQris() async {
Map<String, dynamic>? result; Map<String, dynamic>? result;
var body = _getPayLoadQrisCreate(); var body = _getPayLoadQrisCreate();
print("payload ${body}");
try { try {
Map<String, dynamic> response = await ServiceApi.requestQris( Map<String, dynamic> response = await ServiceApi.requestQris(
body, PreferencesHelper.getString("mid")); body, PreferencesHelper.getString("mid"));
if (response['response']['code'].toString() == "200") { if (response['response']['code'].toString() == "200") {
print( print(
"message qris : ${response['response']['message']}", "message qris succes : ${response['response']['message']}",
); );
result = response; result = response;
} else {} } else {
print("message qris gagal : ${response['response']['message']}");
}
} catch (error) {} } catch (error) {}
return result; return result;
} }
...@@ -306,6 +384,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -306,6 +384,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
paymentProvider, paymentProvider,
metodeBayar, metodeBayar,
status; status;
info = await StartService.topupBalanceCard(cardNumber, int.parse(amount)); info = await StartService.topupBalanceCard(cardNumber, int.parse(amount));
infoMap = jsonDecode(info); infoMap = jsonDecode(info);
lastBalance = infoMap['balance'].toString(); lastBalance = infoMap['balance'].toString();
...@@ -315,8 +394,9 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -315,8 +394,9 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
if (int.parse(lastBalance) > int.parse(prevBalance!)) { if (int.parse(lastBalance) > int.parse(prevBalance!)) {
countMax = 0; countMax = 0;
var infoConfirm = await StartService.topUpConfirm(cardNumber, lastBalance, var result = await StartService.topUpConfirm(cardNumber, lastBalance,
samReport, approvalCode, paymentMethod, paymentProvider); samReport, approvalCode, paymentMethod, paymentProvider);
print('topUpConfirm result: $result');
String readerDate, String readerDate,
gateId, gateId,
...@@ -327,9 +407,11 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -327,9 +407,11 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
rawData; rawData;
readerDate = DateFormat("ddMMyyyyHHmmss").format(DateTime.now()); readerDate = DateFormat("ddMMyyyyHHmmss").format(DateTime.now());
gateId = PreferencesHelper.getString('tid'); gateId = PreferencesHelper.getString('outletname');
gateId = gateId.substring(gateId.length - 4);
persoReff = infoMap['regDb']; persoReff = infoMap['regDb'];
kodeGate = PreferencesHelper.getString('tid'); kodeGate = PreferencesHelper.getString('outletname');
kodeGate = kodeGate.substring(kodeGate.length - 4);
outletName = PreferencesHelper.getString('outletname'); outletName = PreferencesHelper.getString('outletname');
versionApp = PreferencesHelper.getString(kVersionApp); versionApp = PreferencesHelper.getString(kVersionApp);
...@@ -366,7 +448,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -366,7 +448,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
"M", "M",
rawData, rawData,
persoReff, persoReff,
'Link-Aja', PreferencesHelper.getString("provider"),
'Berhasil'); 'Berhasil');
DatabaseHelper.insertTransaction(wristbandInfo); DatabaseHelper.insertTransaction(wristbandInfo);
...@@ -379,7 +461,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -379,7 +461,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
String sca = String sca =
PreferencesHelper.getString("multioutletservicechargeamount"); PreferencesHelper.getString("multioutletservicechargeamount");
String sc = PreferencesHelper.getString("multioutletservicecharge"); String sc = PreferencesHelper.getString("multioutletservicecharge");
String metodeBayar = "link-aja"; String metodeBayar = PreferencesHelper.getString("provider");
String status = "Berhasil"; String status = "Berhasil";
_getInfoBalance(info); _getInfoBalance(info);
...@@ -427,7 +509,8 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -427,7 +509,8 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
bool result = false; bool result = false;
String body = _getPayQrisStatus(); String body = _getPayQrisStatus();
try { try {
Map<String, dynamic> response = await ServiceApi.statusQris(body); Map<String, dynamic> response =
await ServiceApi.statusQris(body, PreferencesHelper.getString("mid"));
if (response['response']['code'].toString() == "200") { if (response['response']['code'].toString() == "200") {
if (response['data']['status'] if (response['data']['status']
.toString() .toString()
...@@ -551,24 +634,26 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -551,24 +634,26 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
'Gagal', 'Gagal',
); );
AwesomeDialog( AwesomeDialog(
context: context, context: context,
dismissOnTouchOutside: false, dismissOnTouchOutside: false,
dialogType: DialogType.error, dialogType: DialogType.error,
animType: AnimType.rightSlide, animType: AnimType.rightSlide,
headerAnimationLoop: true, headerAnimationLoop: true,
title: 'Transaksi anda gagal ! saldo tidak bertambah', title:
desc: "Your transaction failed! Your balance did not increase.", 'Transaksi anda gagal ! saldo tidak bertambah',
btnOkOnPress: () { desc:
countMax = 0; "Your transaction failed! Your balance did not increase.",
setState(() { btnOkOnPress: () {
isShowingDialog = false; countMax = 0;
}); setState(() {
if (timer != null) timer?.cancel(); isShowingDialog = false;
tapIdle(); });
Navigator.pop(context); if (timer != null) timer?.cancel();
}, tapIdle();
btnOkIcon: Icons.cancel, Navigator.pop(context);
btnOkColor: Colors.red) },
btnOkIcon: Icons.cancel,
btnOkColor: Colors.red)
.show(); .show();
// Navigator.pop(context); // Navigator.pop(context);
}, },
...@@ -713,6 +798,12 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -713,6 +798,12 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
String _getPayLoadQrisCreate() { String _getPayLoadQrisCreate() {
String sc = PreferencesHelper.getString("multioutletservicecharge"); String sc = PreferencesHelper.getString("multioutletservicecharge");
String sca = PreferencesHelper.getString("multioutletservicechargeamount"); String sca = PreferencesHelper.getString("multioutletservicechargeamount");
String url = PreferencesHelper.getString(kUrlCorePayment);
String callbackUrl = "https://poss-api.multidaya.id/v1/callback/qris";
String fullCallbackUrl = url + callbackUrl;
String tid = PreferencesHelper.getString('outletname');
tid = tid.substring(tid.length - 4);
trxId = DateTime.now().millisecondsSinceEpoch.toString(); trxId = DateTime.now().millisecondsSinceEpoch.toString();
var request = GeneralPaymentRequest( var request = GeneralPaymentRequest(
trxId.toString(), trxId.toString(),
...@@ -720,20 +811,31 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -720,20 +811,31 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
"get-qr", "get-qr",
PreferencesHelper.getString('provider'), PreferencesHelper.getString('provider'),
PreferencesHelper.getString("mid"), PreferencesHelper.getString("mid"),
PreferencesHelper.getString('tid'), tid,
"https://poss-api.multidaya.id/v1/callback/qris", callbackUrl,
PreferencesHelper.getString('token'), PreferencesHelper.getString('token'),
trxId.toString(), trxId.toString(),
"", "",
"https://poss-api.multidaya.id/v1/callback/qris"); callbackUrl);
return jsonEncode(request); return jsonEncode(request);
} }
// ValueNotifier<int> idleDuration = ValueNotifier<int>(0); // buat ValueNotifier untuk idleDuration
int _maxDuration = int.parse(PreferencesHelper.getString("idle"));
late ValueNotifier<int> idleDuration;
void tapIdle() { void tapIdle() {
timer = Timer.periodic(Duration(seconds: int.parse(idle)), (timer) { int duration = int.parse(idle);
print("ini pesan waktu idle : $idle"); idleDuration.value =
duration; // set nilai awal untuk idleDuration// ubah string idle menjadi integer
timer = Timer.periodic(Duration(seconds: 1), (timer) {
// set timer dengan durasi 1 detik
duration -= 1;
idleDuration.value = duration; // set nilai baru untuk idleDuration
print("ini pesan waktu idle : $idleDuration");
print("isShowingdialog : $isShowingDialog"); print("isShowingdialog : $isShowingDialog");
if (!isShowingDialog) { if (duration == 0 && !isShowingDialog) {
// jika idleDuration sudah habis dan dialog tidak sedang ditampilkan
isShowingDialog = true; isShowingDialog = true;
timer?.cancel(); timer?.cancel();
_showTap(); _showTap();
...@@ -742,15 +844,29 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -742,15 +844,29 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
}); });
} }
// void tapIdle() {
// timer = Timer.periodic(Duration(seconds: int.parse(idle)), (timer) {
// print("ini pesan waktu idle : $idle");
// print("isShowingdialog : $isShowingDialog");
// if (!isShowingDialog) {
// isShowingDialog = true;
// timer?.cancel();
// _showTap();
// tapDial();
// }
// });
// }
void tapDial() async { void tapDial() async {
Future.delayed(const Duration(milliseconds: 500), () async { Future.delayed(const Duration(milliseconds: 500), () async {
var isTap = await StartService.getCard(); var isTap = await StartService.getCard();
try { try {
var infoMap = jsonDecode(isTap); var infoMap = jsonDecode(isTap);
_getInfoCard(isTap); _getInfoCard(isTap);
} catch (e){ } catch (e) {
print("Error $isTap"); print("Error $isTap");
tapDial(); tapDial();
} }
}); });
} }
...@@ -758,10 +874,10 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -758,10 +874,10 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
void tapBalance() async { void tapBalance() async {
Future.delayed(const Duration(milliseconds: 500), () async { Future.delayed(const Duration(milliseconds: 500), () async {
var isTap = await StartService.getCard(); var isTap = await StartService.getCard();
try{ try {
var infoMap = jsonDecode(isTap); var infoMap = jsonDecode(isTap);
_getInfoBeforeTopup(isTap); _getInfoBeforeTopup(isTap);
}catch (e){ } catch (e) {
print("Error $isTap"); print("Error $isTap");
tapBalance(); tapBalance();
} }
...@@ -791,6 +907,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -791,6 +907,7 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
...@@ -2001,7 +2118,6 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -2001,7 +2118,6 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
], ],
), ),
), ),
), ),
onWillPop: onWillPop); onWillPop: onWillPop);
} }
...@@ -2258,118 +2374,397 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback { ...@@ -2258,118 +2374,397 @@ class _HomePageState extends State<HomePage> implements AlertDialogCallback {
margin: const EdgeInsets.only( margin: const EdgeInsets.only(
top: 25, top: 25,
), ),
child: Column( child: Stack(
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
GestureDetector( // widget lainnya di sini
child: Row( Positioned(
mainAxisAlignment: MainAxisAlignment.center, bottom: 20,
right: 0,
child: Stack(
alignment: Alignment.center,
children: [ children: [
TextButton( ValueListenableBuilder(
onPressed: () { valueListenable: idleDuration,
isShowingDialog = true; builder: (context, value, child) => CircularProgressIndicator(
if (timer != null) timer?.cancel(); strokeWidth: 5,
tapIdle(); value: (idleDuration.value.toDouble()) / _maxDuration,
amountController?.clear(); valueColor: AlwaysStoppedAnimation<Color>(Colors.blue),
var infoMap = jsonDecode(infoCard);
plainCardExpirity = infoMap['cardExpirity'];
var change = DateTime.fromMillisecondsSinceEpoch(
int.parse(infoMap['cardExpirity']) * 1000);
dateTimeCardExpirity = change;
final DateFormat formatter = DateFormat('dd-MMM-yyyy');
cardExpirity = formatter.format(change);
deposit = CurrencyFormat.convertToIdr(
infoMap["deposit"],
2,
);
cardNumber = infoMap["cardNumber"];
name = infoMap["name"].toString().split("-")[0];
int lengthSplit =
infoMap["name"].toString().split("-").length;
String subPhone = "";
if (lengthSplit > 1) {
String fullPhone =
infoMap["name"].toString().split("-")[1].trim();
print("ini nomer telponnya $fullPhone");
subPhone = fullPhone.substring(
fullPhone.length - 4, fullPhone.length);
// Navigator.pop(context);
// _topUp(outletName, info);
phone4CharValidation(subPhone, infoCard, idle);
} else {
AwesomeDialog(
context: context,
dialogType: DialogType.error,
animType: AnimType.rightSlide,
headerAnimationLoop: true,
title: 'Nomor telepon tidak ditemukan !',
desc: "phone number not found !",
btnOkOnPress: () {
setState(() {
isShowingDialog = false;
});
if (timer != null) timer?.cancel();
tapIdle();
},
btnOkIcon: Icons.cancel,
btnOkColor: Colors.red)
.show();
}
},
child: const HomeServices(
iconUrl: 'assets/ic_topup.png',
title: 'Isi Ulang',
subtitle: "topup balance",
), ),
), ),
TextButton( RotatedBox(
onPressed: () { quarterTurns: 4,
timer?.cancel(); child: ValueListenableBuilder(
isShowingDialog = true; valueListenable: idleDuration,
_showTap(); builder: (context, value, child) => Text(
tapDial(); value.toString(),
}, style: TextStyle(fontSize: 18),
child: const HomeServices( ),
iconUrl: 'assets/ic_send.png',
title: 'Cek Saldo',
subtitle: 'balance',
), ),
), ),
// TextButton( ],
// onPressed: () async{ ),
// var info = {"balance":4004,"cardExpirity":"1706869211","cardNumber":"9876540165008514","cardType":4,"cardUid":"E46B63BA000000000000000000000000","deposit":10000,"isMember":false,"listGate":[],"minBalance":0,"name":"Enzo-08756789987654","point":0,"regDb":"1675333210000000","report":"00000000000000000000000000000000F3003EA8DB630100BB0B0000A40F0000FFFFFFFFFFFFFFFFFFFFFFFF4968968A","ticketExpirity":"1675357199"}.toString(); ),
// print("TestButton Press"); Positioned(
// await StartService.print( bottom: 36,
// info, left: 60,
// "Terminal POS Self Service", child: Row(
// "Jagakarsa", children: [
// "companyPhone", Container(
// "63dba48c81979", decoration: BoxDecoration(
// "3003", color: _statusColor,
// "10", shape: BoxShape.circle,
// "10", ),
// "10", width: 12,
// "linkaja", height: 12,
// "Berhasil", ),
// ); // SizedBox(width: 4), // add some space between the color and text
// }, // Text(
// child: const HomeServices( // '${_downloadSpeed.toStringAsFixed(2)} KB/s',
// iconUrl: 'assets/ic_send.png', // style: TextStyle(fontSize: 12, color: Colors.grey),
// title: 'Print test',
// subtitle: 'print',
// ),
// ),
// Container(
// height: 100,
// width: 100,
// color: Colors.greenAccent,
// child: Text("${seconds.idle}"),
// ), // ),
], ],
), ),
) ),
Positioned(
bottom: 20,
left: 0,
child: IconButton(
icon: Icon(Icons.settings),
onPressed: () {
// aksi yang ingin dilakukan ketika tombol ditekan
},
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
GestureDetector(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () {
isShowingDialog = true;
if (timer != null) timer?.cancel();
tapIdle();
amountController?.clear();
var infoMap = jsonDecode(infoCard);
plainCardExpirity = infoMap['cardExpirity'];
var change = DateTime.fromMillisecondsSinceEpoch(
int.parse(infoMap['cardExpirity']) * 1000);
dateTimeCardExpirity = change;
final DateFormat formatter = DateFormat('dd-MMM-yyyy');
cardExpirity = formatter.format(change);
deposit = CurrencyFormat.convertToIdr(
infoMap["deposit"],
2,
);
cardNumber = infoMap["cardNumber"];
name = infoMap["name"].toString().split("-")[0];
int lengthSplit =
infoMap["name"].toString().split("-").length;
String subPhone = "";
if (lengthSplit > 1) {
String fullPhone =
infoMap["name"].toString().split("-")[1].trim();
print("ini nomer telponnya $fullPhone");
subPhone = fullPhone.substring(
fullPhone.length - 4, fullPhone.length);
// Navigator.pop(context);
// _topUp(outletName, info);
phone4CharValidation(subPhone, infoCard, idle);
} else {
AwesomeDialog(
context: context,
dialogType: DialogType.error,
animType: AnimType.rightSlide,
headerAnimationLoop: true,
title: 'Nomor telepon tidak ditemukan !',
desc: "phone number not found !",
btnOkOnPress: () {
setState(() {
isShowingDialog = false;
});
if (timer != null) timer?.cancel();
tapIdle();
},
btnOkIcon: Icons.cancel,
btnOkColor: Colors.red)
.show();
}
},
child: const HomeServices(
iconUrl: 'assets/ic_topup.png',
title: 'Isi Ulang',
subtitle: "topup balance",
),
),
TextButton(
onPressed: () {
timer?.cancel();
isShowingDialog = true;
_showTap();
tapDial();
},
child: const HomeServices(
iconUrl: 'assets/ic_send.png',
title: 'Cek Saldo',
subtitle: 'balance',
),
),
// TextButton(
// onPressed: () {
// isShowingDialog = true;
// if (timer != null) timer?.cancel();
// tapIdle();
// showDialog(
// context: context,
// builder: (_) => AlertDialog(
// title: Text('Masukkan Password'),
// content: TextField(
// obscureText: true,
// decoration: InputDecoration(
// hintText: 'Password',
// ),
// ),
// actions: [
// TextButton(
// onPressed: () {
// setState(() {
// isShowingDialog = false;
// });
// Navigator.pop(context);
// if (timer != null) timer?.cancel();
// tapIdle(); },
// child: Text('Batal'),
// ),
// TextButton(
// onPressed: () {
// // Lakukan verifikasi password disini
// Navigator.pop(context);
// // Tampilkan halaman pengaturan jika verifikasi berhasil
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => SetMerchant(),
// ),
// );
// },
// child: Text('Konfirmasi'),
// ),
// ],
// ),
// );
// },
// child: const HomeServices(
// iconUrl: 'assets/ic_send.png',
// title: 'Pengaturan',
// subtitle: 'setting',
// ),
// ),
// TextButton(
// onPressed: () async{
// var info = {"balance":4004,"cardExpirity":"1706869211","cardNumber":"9876540165008514","cardType":4,"cardUid":"E46B63BA000000000000000000000000","deposit":10000,"isMember":false,"listGate":[],"minBalance":0,"name":"Enzo-08756789987654","point":0,"regDb":"1675333210000000","report":"00000000000000000000000000000000F3003EA8DB630100BB0B0000A40F0000FFFFFFFFFFFFFFFFFFFFFFFF4968968A","ticketExpirity":"1675357199"}.toString();
// print("TestButton Press");
// await StartService.print(
// info,
// "Terminal POS Self Service",
// "Jagakarsa",
// "companyPhone",
// "63dba48c81979",
// "3003",
// "10",
// "10",
// "10",
// "linkaja",
// "Berhasil",
// );
// },
// child: const HomeServices(
// iconUrl: 'assets/ic_send.png',
// title: 'Print test',
// subtitle: 'print',
// ),
// ),
// Container(
// height: 100,
// width: 100,
// color: Colors.greenAccent,
// child: Text("${seconds.idle}"),
// ),
],
),
)
],
),
], ],
), ),
// child: Column(
// crossAxisAlignment: CrossAxisAlignment.center,
// children: [
// GestureDetector(
// child: Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// TextButton(
// onPressed: () {
// isShowingDialog = true;
// if (timer != null) timer?.cancel();
// tapIdle();
// amountController?.clear();
// var infoMap = jsonDecode(infoCard);
// plainCardExpirity = infoMap['cardExpirity'];
// var change = DateTime.fromMillisecondsSinceEpoch(
// int.parse(infoMap['cardExpirity']) * 1000);
// dateTimeCardExpirity = change;
// final DateFormat formatter = DateFormat('dd-MMM-yyyy');
// cardExpirity = formatter.format(change);
// deposit = CurrencyFormat.convertToIdr(
// infoMap["deposit"],
// 2,
// );
// cardNumber = infoMap["cardNumber"];
// name = infoMap["name"].toString().split("-")[0];
// int lengthSplit =
// infoMap["name"].toString().split("-").length;
// String subPhone = "";
// if (lengthSplit > 1) {
// String fullPhone =
// infoMap["name"].toString().split("-")[1].trim();
// print("ini nomer telponnya $fullPhone");
// subPhone = fullPhone.substring(
// fullPhone.length - 4, fullPhone.length);
// // Navigator.pop(context);
// // _topUp(outletName, info);
// phone4CharValidation(subPhone, infoCard, idle);
// } else {
// AwesomeDialog(
// context: context,
// dialogType: DialogType.error,
// animType: AnimType.rightSlide,
// headerAnimationLoop: true,
// title: 'Nomor telepon tidak ditemukan !',
// desc: "phone number not found !",
// btnOkOnPress: () {
// setState(() {
// isShowingDialog = false;
// });
// if (timer != null) timer?.cancel();
// tapIdle();
// },
// btnOkIcon: Icons.cancel,
// btnOkColor: Colors.red)
// .show();
// }
// },
// child: const HomeServices(
// iconUrl: 'assets/ic_topup.png',
// title: 'Isi Ulang',
// subtitle: "topup balance",
// ),
// ),
// TextButton(
// onPressed: () {
// timer?.cancel();
// isShowingDialog = true;
// _showTap();
// tapDial();
// },
// child: const HomeServices(
// iconUrl: 'assets/ic_send.png',
// title: 'Cek Saldo',
// subtitle: 'balance',
// ),
// ),
// TextButton(
// onPressed: () {
// isShowingDialog = true;
// if (timer != null) timer?.cancel();
// tapIdle();
// showDialog(
// context: context,
// builder: (_) => AlertDialog(
// title: Text('Masukkan Password'),
// content: TextField(
// obscureText: true,
// decoration: InputDecoration(
// hintText: 'Password',
// ),
// ),
// actions: [
// TextButton(
// onPressed: () {
// setState(() {
// isShowingDialog = false;
// });
// Navigator.pop(context);
// if (timer != null) timer?.cancel();
// tapIdle(); },
// child: Text('Batal'),
// ),
// TextButton(
// onPressed: () {
// // Lakukan verifikasi password disini
// Navigator.pop(context);
// // Tampilkan halaman pengaturan jika verifikasi berhasil
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => SetMerchant(),
// ),
// );
// },
// child: Text('Konfirmasi'),
// ),
// ],
// ),
// );
// },
// child: const HomeServices(
// iconUrl: 'assets/ic_send.png',
// title: 'Pengaturan',
// subtitle: 'setting',
// ),
// ),
//
// // TextButton(
// // onPressed: () async{
// // var info = {"balance":4004,"cardExpirity":"1706869211","cardNumber":"9876540165008514","cardType":4,"cardUid":"E46B63BA000000000000000000000000","deposit":10000,"isMember":false,"listGate":[],"minBalance":0,"name":"Enzo-08756789987654","point":0,"regDb":"1675333210000000","report":"00000000000000000000000000000000F3003EA8DB630100BB0B0000A40F0000FFFFFFFFFFFFFFFFFFFFFFFF4968968A","ticketExpirity":"1675357199"}.toString();
// // print("TestButton Press");
// // await StartService.print(
// // info,
// // "Terminal POS Self Service",
// // "Jagakarsa",
// // "companyPhone",
// // "63dba48c81979",
// // "3003",
// // "10",
// // "10",
// // "10",
// // "linkaja",
// // "Berhasil",
// // );
// // },
// // child: const HomeServices(
// // iconUrl: 'assets/ic_send.png',
// // title: 'Print test',
// // subtitle: 'print',
// // ),
// // ),
// // Container(
// // height: 100,
// // width: 100,
// // color: Colors.greenAccent,
// // child: Text("${seconds.idle}"),
// // ),
// ],
// ),
// )
// ],
// ),
); );
} }
......
...@@ -587,6 +587,7 @@ class _SetMerchantState extends State<SetMerchant> { ...@@ -587,6 +587,7 @@ class _SetMerchantState extends State<SetMerchant> {
PreferencesHelper.setString('tid', outletpayment.tid); PreferencesHelper.setString('tid', outletpayment.tid);
PreferencesHelper.setString('mid', outletpayment.mid); PreferencesHelper.setString('mid', outletpayment.mid);
PreferencesHelper.setString('token', outletpayment.token); PreferencesHelper.setString('token', outletpayment.token);
PreferencesHelper.setString('provider', outletpayment.provider);
PreferencesHelper.setString(kVersionApp, getVersionApp()); PreferencesHelper.setString(kVersionApp, getVersionApp());
OutletPayment.fromJson(outletProvider[0]); OutletPayment.fromJson(outletProvider[0]);
......
...@@ -46,6 +46,8 @@ dependencies: ...@@ -46,6 +46,8 @@ dependencies:
build_runner: ^2.3.2 build_runner: ^2.3.2
intl: ^0.17.0 intl: ^0.17.0
qr_flutter: ^4.0.0 qr_flutter: ^4.0.0
connectivity_plus: ^3.0.3
ping_discover_network_forked: ^0.0.1
circular_countdown_timer: ^0.2.3 circular_countdown_timer: ^0.2.3
animated_text_kit: ^4.2.2 animated_text_kit: ^4.2.2
validators: ^2.0.0+1 validators: ^2.0.0+1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment