pull/324/head
haroon amjad 2 months ago
parent 502fc82c28
commit ab86d53261

@ -41,6 +41,11 @@
android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE"
tools:node="remove" /> tools:node="remove" />
<!-- Gallery/Photo permissions for Android 13+ (API 33+) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
<!-- <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />-->
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove" />
<!-- Gallery/Photo permissions for Android 12 and below --> <!-- Gallery/Photo permissions for Android 12 and below -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />

@ -1850,5 +1850,6 @@
"points": "نقاط", "points": "نقاط",
"transactions": "المعاملات", "transactions": "المعاملات",
"pharmacy": "الصيدلية", "pharmacy": "الصيدلية",
"visitsOrders": "الزيارات/الطلبات" "visitsOrders": "الزيارات/الطلبات",
"earned": "حصل"
} }

@ -1840,7 +1840,8 @@
"points": "Points", "points": "Points",
"transactions": "Transactions", "transactions": "Transactions",
"pharmacy": "Pharmacy", "pharmacy": "Pharmacy",
"visitsOrders": "Visits/Orders" "visitsOrders": "Visits/Orders",
"earned": "Earned"
} }

@ -4,7 +4,7 @@ import 'package:hmg_patient_app_new/core/enums.dart';
class ApiConsts { class ApiConsts {
static const maxSmallScreen = 660; static const maxSmallScreen = 660;
static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.preProd; static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod;
// static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT

@ -46,7 +46,11 @@ class AppState {
AuthenticatedUser? _authenticatedRootUser; AuthenticatedUser? _authenticatedRootUser;
AuthenticatedUser? _authenticatedChildUser; AuthenticatedUser? _authenticatedChildUser;
bool isPaytabsEnabled = true; bool isPaytabsEnabled = false;
void setIsPaytabsEnabled(bool value) {
isPaytabsEnabled = value;
}
int? _superUserID; int? _superUserID;
bool isChildLoggedIn = false; bool isChildLoggedIn = false;

@ -1190,6 +1190,7 @@ class AuthenticationViewModel extends ChangeNotifier {
_appState.setAuthenticatedUser(activation.list!.first); _appState.setAuthenticatedUser(activation.list!.first);
_appState.setPrivilegeModelList(activation.list!.first.listPrivilege!); _appState.setPrivilegeModelList(activation.list!.first.listPrivilege!);
_appState.setUserBloodGroup = activation.patientBlodType ?? "N/A"; _appState.setUserBloodGroup = activation.patientBlodType ?? "N/A";
_appState.setIsPaytabsEnabled(Utils.havePrivilege(120));
// Refresh privileges after user switching to ensure correct privileges are loaded // Refresh privileges after user switching to ensure correct privileges are loaded
if (isSwitchUser) { if (isSwitchUser) {
@ -1719,6 +1720,7 @@ class AuthenticationViewModel extends ChangeNotifier {
projectDetailListModel.add(ProjectDetailListModel.fromJson(v)); projectDetailListModel.add(ProjectDetailListModel.fromJson(v));
}); });
_appState.setProjectsDetailList(projectDetailListModel); _appState.setProjectsDetailList(projectDetailListModel);
_appState.setIsPaytabsEnabled(Utils.havePrivilege(120));
} }
}, },
); );

@ -78,10 +78,15 @@ class PayTabsViewModel extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
startApplePayPayment({Function(PaytabsTransactionResponseModel)? onSuccess, Function(String)? onError}) { startApplePayPayment({Function(PaytabsTransactionResponseModel)? onSuccess, Function(String)? onError}) async {
FlutterPaytabsBridge.startApplePayPayment(paymentConfiguration, (event) { bool _callbackFired = false; // prevent duplicate callback invocations
await FlutterPaytabsBridge.startApplePayPayment(paymentConfiguration, (event) {
if (_callbackFired) return; // ignore any subsequent callback calls
final transactionDetails = event["data"] as Map<Object?, Object?>?; final transactionDetails = event["data"] as Map<Object?, Object?>?;
if (event["status"] == "success") { if (event["status"] == "success") {
_callbackFired = true;
// Cast Map<Object?, Object?> to Map<String, dynamic> // Cast Map<Object?, Object?> to Map<String, dynamic>
final data = Map<String, dynamic>.from(event["data"] as Map); final data = Map<String, dynamic>.from(event["data"] as Map);
paytabsTransactionResponseModel = PaytabsTransactionResponseModel.fromJson(data); paytabsTransactionResponseModel = PaytabsTransactionResponseModel.fromJson(data);
@ -95,11 +100,13 @@ class PayTabsViewModel extends ChangeNotifier {
onError!(errorMessage); onError!(errorMessage);
} }
} else if (event["status"] == "error") { } else if (event["status"] == "error") {
_callbackFired = true;
final errorMessage = event["message"] ?? "An error occurred"; final errorMessage = event["message"] ?? "An error occurred";
debugPrint("Error occurred in transaction: $errorMessage"); debugPrint("Error occurred in transaction: $errorMessage");
debugPrint("Full error event: $event"); debugPrint("Full error event: $event");
onError!(errorMessage); onError!(errorMessage);
} else if (event["status"] == "event") { } else if (event["status"] == "event") {
// Intermediate SDK events do NOT mark _callbackFired, just log
final eventMessage = event["message"] ?? "Event occurred"; final eventMessage = event["message"] ?? "Event occurred";
debugPrint("Event occurred: $eventMessage"); debugPrint("Event occurred: $eventMessage");
} }
@ -107,9 +114,14 @@ class PayTabsViewModel extends ChangeNotifier {
} }
startCardPayment({Function(PaytabsTransactionResponseModel)? onSuccess, Function(String)? onError}) { startCardPayment({Function(PaytabsTransactionResponseModel)? onSuccess, Function(String)? onError}) {
bool _callbackFired = false; // prevent duplicate callback invocations
FlutterPaytabsBridge.startCardPayment(paymentConfiguration, (event) { FlutterPaytabsBridge.startCardPayment(paymentConfiguration, (event) {
if (_callbackFired) return; // ignore any subsequent callback calls
final transactionDetails = event["data"] as Map<Object?, Object?>?; final transactionDetails = event["data"] as Map<Object?, Object?>?;
if (event["status"] == "success") { if (event["status"] == "success") {
_callbackFired = true;
// Cast Map<Object?, Object?> to Map<String, dynamic> // Cast Map<Object?, Object?> to Map<String, dynamic>
final data = Map<String, dynamic>.from(event["data"] as Map); final data = Map<String, dynamic>.from(event["data"] as Map);
paytabsTransactionResponseModel = PaytabsTransactionResponseModel.fromJson(data); paytabsTransactionResponseModel = PaytabsTransactionResponseModel.fromJson(data);
@ -123,11 +135,13 @@ class PayTabsViewModel extends ChangeNotifier {
onError!(errorMessage); onError!(errorMessage);
} }
} else if (event["status"] == "error") { } else if (event["status"] == "error") {
_callbackFired = true;
final errorMessage = event["message"] ?? "An error occurred"; final errorMessage = event["message"] ?? "An error occurred";
debugPrint("Error occurred in transaction: $errorMessage"); debugPrint("Error occurred in transaction: $errorMessage");
debugPrint("Full error event: $event"); debugPrint("Full error event: $event");
onError!(errorMessage); onError!(errorMessage);
} else if (event["status"] == "event") { } else if (event["status"] == "event") {
// Intermediate SDK events do NOT mark _callbackFired, just log
final eventMessage = event["message"] ?? "Event occurred"; final eventMessage = event["message"] ?? "Event occurred";
debugPrint("Event occurred: $eventMessage"); debugPrint("Event occurred: $eventMessage");
} }

@ -1843,5 +1843,6 @@ abstract class LocaleKeys {
static const transactions = 'transactions'; static const transactions = 'transactions';
static const pharmacy = 'pharmacy'; static const pharmacy = 'pharmacy';
static const visitsOrders = 'visitsOrders'; static const visitsOrders = 'visitsOrders';
static const earned = 'earned';
} }

@ -304,7 +304,7 @@ class LakumWalletDetails extends StatelessWidget {
Widget _buildTransactionItem(PointsDetails transaction) { Widget _buildTransactionItem(PointsDetails transaction) {
// Determine if points were gained or used // Determine if points were gained or used
bool isGained = transaction.operationType?.toLowerCase() == 'gain' || transaction.operationType?.toLowerCase() == 'credit' || (transaction.points ?? 0) > 0; bool isGained = transaction.subTransactionType == 1 || transaction.operationType?.toLowerCase() == 'cr' || (transaction.points ?? 0) > 0;
Color transactionColor = isGained ? AppColors.habibPharmacyColor : AppColors.primaryRedColor; Color transactionColor = isGained ? AppColors.habibPharmacyColor : AppColors.primaryRedColor;
String pointsText = "${isGained ? '+' : '-'}${transaction.points?.abs() ?? 0}"; String pointsText = "${isGained ? '+' : '-'}${transaction.points?.abs() ?? 0}";
@ -345,7 +345,7 @@ class LakumWalletDetails extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
(transaction.subTransactionTypeDescription ?? transaction.operationType ?? "Transaction").toText14( (isGained ? LocaleKeys.earned.tr() : LocaleKeys.consumed.tr()).toText14(
isBold: true, isBold: true,
maxlines: 2, maxlines: 2,
), ),

Loading…
Cancel
Save