Merge branch 'wala_plus_with_dialog_removal' of http://34.17.182.140/Haroon6138/mohemm-flutter-app into wala_plus_with_dialog_removal

* 'wala_plus_with_dialog_removal' of http://34.17.182.140/Haroon6138/mohemm-flutter-app:
  Toast fixed
wala_plus_with_dialog_removal
Sultan khan 2 weeks ago
commit 99c2d658e1

@ -7,7 +7,6 @@ import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/models/marathon/marathon_generic_model.dart'; import 'package:mohem_flutter_app/models/marathon/marathon_generic_model.dart';
import 'package:mohem_flutter_app/models/marathon/marathon_model.dart'; import 'package:mohem_flutter_app/models/marathon/marathon_model.dart';
@ -105,24 +104,18 @@ class MarathonApiClient {
} }
Future<QuestionModel> getNextQuestion({required String? questionId, required String marathonId}) async { Future<QuestionModel> getNextQuestion({required String? questionId, required String marathonId}) async {
Map<String, String?> jsonObject = <String, String?>{ Map<String, String?> jsonObject = <String, String?>{"previousQuestionId": questionId, "marathonId": marathonId};
"previousQuestionId": questionId,
"marathonId": marathonId,
};
return await ApiClient().postJsonForObject( return await ApiClient().postJsonForObject(
(json) { (json) {
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
if (marathonModel.statusCode == 404 || marathonModel.statusCode == 208 || marathonModel.statusCode == 204 || marathonModel.statusCode == 500) { if (marathonModel.statusCode == 404 || marathonModel.statusCode == 208 || marathonModel.statusCode == 204 || marathonModel.statusCode == 500) {
AppToast.show( Utils.showToast(
marathonModel.message!, marathonModel.message!,
seconds: AppToast.actionSeconds,
onComplete: () { onComplete: () {
AppRoutes.navigatorKey.currentContext!.read<MarathonProvider>().resetValues(); AppRoutes.navigatorKey.currentContext!.read<MarathonProvider>().resetValues();
Navigator.of( Navigator.of(AppRoutes.navigatorKey.currentContext!).popUntil(ModalRoute.withName(AppRoutes.dashboard));
AppRoutes.navigatorKey.currentContext!,
).popUntil(ModalRoute.withName(AppRoutes.dashboard));
}, },
); );
} }
@ -215,99 +208,99 @@ class MarathonApiClient {
return null; return null;
} }
// late HubConnection hubConnection; // late HubConnection hubConnection;
// Future<void> buildHubConnection(BuildContext context, String prizeId) async { // Future<void> buildHubConnection(BuildContext context, String prizeId) async {
// HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true); // HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true);
// hubConnection = HubConnectionBuilder() // hubConnection = HubConnectionBuilder()
// .withUrl( // .withUrl(
// ApiConsts.marathonHubConnectionUrl + "?employeeNumber=${AppState().memberInformationList!.eMPLOYEENUMBER ?? ""}&employeeName=${AppState().memberInformationList!.eMPLOYEENAME ?? ""}", // ApiConsts.marathonHubConnectionUrl + "?employeeNumber=${AppState().memberInformationList!.eMPLOYEENUMBER ?? ""}&employeeName=${AppState().memberInformationList!.eMPLOYEENAME ?? ""}",
// options: httpOptions, // options: httpOptions,
// ) // )
// .withAutomaticReconnect( // .withAutomaticReconnect(
// retryDelays: <int>[2000, 5000, 10000, 20000], // retryDelays: <int>[2000, 5000, 10000, 20000],
// ) // )
// .configureLogging( // .configureLogging(
// Logger("Logging"), // Logger("Logging"),
// ) // )
// .build(); // .build();
// hubConnection.onclose( // hubConnection.onclose(
// ({Exception? error}) { // ({Exception? error}) {
// logger.i("onclose"); // logger.i("onclose");
// }, // },
// ); // );
// hubConnection.onreconnecting( // hubConnection.onreconnecting(
// ({Exception? error}) { // ({Exception? error}) {
// logger.i("onreconnecting"); // logger.i("onreconnecting");
// }, // },
// ); // );
// hubConnection.onreconnected( // hubConnection.onreconnected(
// ({String? connectionId}) { // ({String? connectionId}) {
// logger.i("onreconnected"); // logger.i("onreconnected");
// }, // },
// ); // );
// if (hubConnection.state != HubConnectionState.Connected) { // if (hubConnection.state != HubConnectionState.Connected) {
// await hubConnection.start(); // await hubConnection.start();
// logger.i("Started HubConnection"); // logger.i("Started HubConnection");
// //
// await hubConnection.invoke( // await hubConnection.invoke(
// "AddParticipant", // "AddParticipant",
// args: <Object>[ // args: <Object>[
// <String, dynamic>{ // <String, dynamic>{
// "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER ?? "", // "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER ?? "",
// "employeeName": AppState().memberInformationList!.eMPLOYEENAME ?? "", // "employeeName": AppState().memberInformationList!.eMPLOYEENAME ?? "",
// "marathonId": AppState().getMarathonProjectId, // "marathonId": AppState().getMarathonProjectId,
// "prizeId": "8577B2E8-5DD7-43F0-10DD-08DACB0AC064", // "prizeId": "8577B2E8-5DD7-43F0-10DD-08DACB0AC064",
// } // }
// ], // ],
// ).catchError((e) { // ).catchError((e) {
// logger.i("Error in AddParticipant: $e"); // logger.i("Error in AddParticipant: $e");
// }); // });
// //
// context.read<MarathonProvider>().addItemToList(ApiConsts.dummyQuestion); // context.read<MarathonProvider>().addItemToList(ApiConsts.dummyQuestion);
// //
// await hubConnection.invoke( // await hubConnection.invoke(
// "SendQuestionToParticipant", // "SendQuestionToParticipant",
// args: <Object>[ // args: <Object>[
// <String, dynamic>{ // <String, dynamic>{
// "marathonId": "${AppState().getMarathonProjectId}", // "marathonId": "${AppState().getMarathonProjectId}",
// } // }
// ], // ],
// ).catchError((e) { // ).catchError((e) {
// Utils.confirmDialog(context, e.toString()); // Utils.confirmDialog(context, e.toString());
// logger.i("Error in SendQuestionToParticipant: $e"); // logger.i("Error in SendQuestionToParticipant: $e");
// }); // });
// //
// try { // try {
// hubConnection.on("OnSendQuestionToParticipant", (List<Object?>? arguments) { // hubConnection.on("OnSendQuestionToParticipant", (List<Object?>? arguments) {
// onSendQuestionToParticipant(arguments, context); // onSendQuestionToParticipant(arguments, context);
// }); // });
// } catch (e, s) { // } catch (e, s) {
// logger.i("Error in OnSendQuestionToParticipant"); // logger.i("Error in OnSendQuestionToParticipant");
// } // }
// //
// try { // try {
// hubConnection.on("OnParticipantJoin", (List<Object?>? arguments) { // hubConnection.on("OnParticipantJoin", (List<Object?>? arguments) {
// onParticipantJoin(arguments, context); // onParticipantJoin(arguments, context);
// }); // });
// } catch (e, s) { // } catch (e, s) {
// logger.i("Error in OnParticipantJoin"); // logger.i("Error in OnParticipantJoin");
// } // }
// } // }
// } // }
// //
// Future<void> onSendQuestionToParticipant(List<Object?>? arguments, BuildContext context) async { // Future<void> onSendQuestionToParticipant(List<Object?>? arguments, BuildContext context) async {
// logger.i("onSendQuestionToParticipant arguments: $arguments"); // logger.i("onSendQuestionToParticipant arguments: $arguments");
// //
// if (arguments != null) { // if (arguments != null) {
// Map<dynamic, dynamic> data = arguments.first! as Map<dynamic, dynamic>; // Map<dynamic, dynamic> data = arguments.first! as Map<dynamic, dynamic>;
// var json = data["data"]; // var json = data["data"];
// QuestionModel newQuestion = QuestionModel.fromJson(json); // QuestionModel newQuestion = QuestionModel.fromJson(json);
// AppRoutes.navigatorKey.currentContext!.read<MarathonProvider>().onNewQuestionReceived(newQuestion); // AppRoutes.navigatorKey.currentContext!.read<MarathonProvider>().onNewQuestionReceived(newQuestion);
// } // }
// } // }
// //
// Future<void> onParticipantJoin(List<Object?>? arguments, BuildContext context) async { // Future<void> onParticipantJoin(List<Object?>? arguments, BuildContext context) async {
// logger.i("OnParticipantJoin arguments: $arguments"); // logger.i("OnParticipantJoin arguments: $arguments");
// context.watch<MarathonProvider>().totalMarathoners++; // context.watch<MarathonProvider>().totalMarathoners++;
// } // }
} }

@ -38,14 +38,18 @@ class Utils {
// Callers showing a value straight from an API response should pass isSuccess: response's // Callers showing a value straight from an API response should pass isSuccess: response's
// MessageStatus == 1; everywhere else (validation messages, caught errors) just defaults to // MessageStatus == 1; everywhere else (validation messages, caught errors) just defaults to
// red, and the handful of hardcoded success confirmations pass isSuccess: true explicitly. // red, and the handful of hardcoded success confirmations pass isSuccess: true explicitly.
static void showToast(String message, {bool longDuration = true, bool isSuccess = false}) { // onComplete makes this an action-toast (longer actionSeconds duration + icon shown) instead
// of a plain info toast - this is the single calling point, every caller should go through
// here instead of calling AppToast.show directly, so the color/duration/icon rules in one place.
static void showToast(String message, {bool longDuration = true, bool isSuccess = false, VoidCallback? onComplete}) {
AppToast.show( AppToast.show(
message, message,
seconds: AppToast.plainSeconds, seconds: onComplete != null ? AppToast.actionSeconds : AppToast.plainSeconds,
showIcon: false, showIcon: onComplete != null,
showCountdownText: true, showCountdownText: true,
bgColor: isSuccess ? const Color(0xFFECFDF5) : const Color(0xFFF1CECE), bgColor: isSuccess ? AppToast.successBgColor : AppToast.errorBgColor,
textColor: isSuccess ? const Color(0xFF059669) : const Color(0xFFC53030), textColor: isSuccess ? AppToast.successTextColor : AppToast.errorTextColor,
onComplete: onComplete,
); );
} }
@ -167,9 +171,8 @@ class Utils {
onErrorMessage(errorMessage); onErrorMessage(errorMessage);
} else { } else {
if (!AppState().isAuthenticated) { if (!AppState().isAuthenticated) {
AppToast.show( showToast(
errorMessage, errorMessage,
seconds: AppToast.actionSeconds,
onComplete: () { onComplete: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false); Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
}, },
@ -191,9 +194,11 @@ class Utils {
static void confirmDialog(cxt, String message, {VoidCallback? onTap}) { static void confirmDialog(cxt, String message, {VoidCallback? onTap}) {
// No onTap means there's nothing to confirm - it's a plain notice, so a self-dismissing // No onTap means there's nothing to confirm - it's a plain notice, so a self-dismissing
// toast replaces the old "OK just closes" dialog instead of requiring a tap. // toast replaces the old "OK just closes" dialog instead of requiring a tap. Every current
// caller of this path passes an error/warning message (catch blocks, location/fake-location
// warnings, session errors) - never success - so red is correct here.
if (onTap == null) { if (onTap == null) {
AppToast.show(message); showToast(message);
} else { } else {
showDialog(context: cxt, builder: (BuildContext cxt) => ConfirmDialog(message: message, onTap: onTap)); showDialog(context: cxt, builder: (BuildContext cxt) => ConfirmDialog(message: message, onTap: onTap));
} }

@ -27,7 +27,6 @@ import 'package:mohem_flutter_app/models/greetings/greeting_card_model.dart';
import 'package:mohem_flutter_app/models/itg/itg_response_model.dart'; import 'package:mohem_flutter_app/models/itg/itg_response_model.dart';
import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart'; import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.dart';
import 'package:mohem_flutter_app/models/sso_auth_model.dart'; import 'package:mohem_flutter_app/models/sso_auth_model.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
// ignore: prefer_mixin // ignore: prefer_mixin
@ -190,9 +189,8 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
Utils.handleException(ex, context, (err) { Utils.handleException(ex, context, (err) {
Utils.hideLoading(context); Utils.hideLoading(context);
AppToast.show( Utils.showToast(
err, err,
seconds: AppToast.actionSeconds,
onComplete: () { onComplete: () {
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route<dynamic> route) => false); Navigator.pushNamedAndRemoveUntil(context, AppRoutes.login, (Route<dynamic> route) => false);
}, },

@ -14,7 +14,6 @@ import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/image_picker.dart'; import 'package:mohem_flutter_app/widgets/image_picker.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class EtqanOvrCreateRequest extends StatefulWidget { class EtqanOvrCreateRequest extends StatefulWidget {
@ -88,11 +87,11 @@ class _EtqanOvrCreateRequestState extends State<EtqanOvrCreateRequest> {
DefaultButton(LocaleKeys.submit.tr(), () async { DefaultButton(LocaleKeys.submit.tr(), () async {
provider.setDescription(_descriptionController.text); provider.setDescription(_descriptionController.text);
if (provider.selectedProject == null) { if (provider.selectedProject == null) {
AppToast.show(LocaleKeys.pleaseSelectProject.tr()); Utils.showToast(LocaleKeys.pleaseSelectProject.tr());
return; return;
} }
if (!provider.isDescriptionValid()) { if (!provider.isDescriptionValid()) {
AppToast.show(LocaleKeys.pleaseEnterDescription.tr()); Utils.showToast(LocaleKeys.pleaseEnterDescription.tr());
return; return;
} }
Map<String, dynamic>? ticketInfo = await provider.submitRequest(context); Map<String, dynamic>? ticketInfo = await provider.submitRequest(context);
@ -101,9 +100,9 @@ class _EtqanOvrCreateRequestState extends State<EtqanOvrCreateRequest> {
String ticketId = ticketInfo['id'] ?? ''; String ticketId = ticketInfo['id'] ?? '';
// String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber\n${LocaleKeys.ticketId.tr()}: $ticketId'; // String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber\n${LocaleKeys.ticketId.tr()}: $ticketId';
String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber'; String successMessage = '${LocaleKeys.requestCreatedSuccessfully.tr()}\n\n${LocaleKeys.ticketNumber.tr()}: $ticketNumber';
AppToast.show( Utils.showToast(
successMessage, successMessage,
seconds: AppToast.actionSeconds, isSuccess: true,
onComplete: () { onComplete: () {
Navigator.pop(context); Navigator.pop(context);
Navigator.pop(context); Navigator.pop(context);

@ -22,7 +22,6 @@ import 'package:mohem_flutter_app/widgets/bottom_sheets/confirm_bottom_sheet.dar
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/info_chip_widget.dart'; import 'package:mohem_flutter_app/widgets/info_chip_widget.dart';
import 'package:mohem_flutter_app/widgets/location/Location.dart' as location; import 'package:mohem_flutter_app/widgets/location/Location.dart' as location;
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:shimmer/shimmer.dart'; import 'package:shimmer/shimmer.dart';
@ -439,7 +438,7 @@ class _DashboardScreenForDependetState extends State<DashboardScreenForDependet>
if (!hasPermission) { if (!hasPermission) {
bool granted = await _requestLocationPermission(); bool granted = await _requestLocationPermission();
if (!granted) { if (!granted) {
AppToast.show(LocaleKeys.locationPermissionRequiredForNearestOffers.tr()); Utils.showToast(LocaleKeys.locationPermissionRequiredForNearestOffers.tr());
return false; return false;
} }
} }

@ -20,7 +20,6 @@ import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/dialogs/otp_dialog.dart'; import 'package:mohem_flutter_app/dialogs/otp_dialog.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheets/confirm_bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheets/confirm_bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
@ -445,7 +444,7 @@ class _LoginScreenState extends State<LoginScreen> {
}, },
); );
} else { } else {
AppToast.show(msg); Utils.showToast(msg);
} }
}); });
} }
@ -610,16 +609,15 @@ class _LoginScreenState extends State<LoginScreen> {
} }
void _navigateToMazayaAccessRevoked([String? depName, String? message]) async { void _navigateToMazayaAccessRevoked([String? depName, String? message]) async {
await Utils.removeStringFromPrefs("P_DEP_IS_LOGGED_IN");
await Utils.removeStringFromPrefs("P_DEP_IS_LOGGED_IN"); await Utils.removeStringFromPrefs("P_DEP_NATIONAL_ID");
await Utils.removeStringFromPrefs("P_DEP_NATIONAL_ID"); await Utils.removeStringFromPrefs("P_DEP_BIRTH_DATE");
await Utils.removeStringFromPrefs("P_DEP_BIRTH_DATE"); await Utils.removeStringFromPrefs("P_DEP_TOKEN_ID");
await Utils.removeStringFromPrefs("P_DEP_TOKEN_ID"); await Utils.removeStringFromPrefs("P_DEP_LOGIN_TOKEN_ID");
await Utils.removeStringFromPrefs("P_DEP_LOGIN_TOKEN_ID"); await Utils.removeStringFromPrefs("P_DEP_AUTHENTICATION_TOKEN_ID");
await Utils.removeStringFromPrefs("P_DEP_AUTHENTICATION_TOKEN_ID"); await Utils.removeStringFromPrefs("P_DEP_MOBILE_NUMBER");
await Utils.removeStringFromPrefs("P_DEP_MOBILE_NUMBER"); await Utils.removeStringFromPrefs("P_DEPENDENT_NAME");
await Utils.removeStringFromPrefs("P_DEPENDENT_NAME"); await Utils.removeStringFromPrefs("P_DEP_LOGIN_TYPE");
await Utils.removeStringFromPrefs("P_DEP_LOGIN_TYPE");
ApiConsts.selectedMemberType = MemberType.employee; ApiConsts.selectedMemberType = MemberType.employee;
ApiConsts.ISDependetLogin = false; ApiConsts.ISDependetLogin = false;
AppState().setDependentName = null; AppState().setDependentName = null;

@ -17,7 +17,6 @@ import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_transactions.dart
import 'package:mohem_flutter_app/models/mowadhafhi/get_transaction_attachment_model.dart'; import 'package:mohem_flutter_app/models/mowadhafhi/get_transaction_attachment_model.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/view_transaction_attachment.dart'; import 'package:mohem_flutter_app/ui/screens/mowadhafhi/view_transaction_attachment.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:open_filex/open_filex.dart'; import 'package:open_filex/open_filex.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
@ -283,7 +282,7 @@ class _RequestDetailsState extends State<MowadhafhiRequestDetails> {
Utils.showToast("Cannot open file."); Utils.showToast("Cannot open file.");
} }
} else { } else {
AppToast.show("You need to give storage permission to view files."); Utils.showToast("You need to give storage permission to view files.");
} }
}); });
} }

@ -19,7 +19,6 @@ import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart'; import 'package:mohem_flutter_app/ui/dialogs/success_dialog.dart';
import 'package:mohem_flutter_app/widgets/bottom_sheets/confirm_bottom_sheet.dart'; import 'package:mohem_flutter_app/widgets/bottom_sheets/confirm_bottom_sheet.dart';
import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart'; import 'package:mohem_flutter_app/widgets/dialogs/dialogs.dart';
import 'package:mohem_flutter_app/widgets/toast/app_toast.dart';
import 'package:mohem_flutter_app/widgets/location/Location.dart' as location; import 'package:mohem_flutter_app/widgets/location/Location.dart' as location;
import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart'; import 'package:mohem_flutter_app/widgets/nfc/nfc_reader_sheet.dart';
import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart'; import 'package:mohem_flutter_app/widgets/qr_scanner_dialog.dart';
@ -84,7 +83,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
if (has) { if (has) {
getHuaweiCurrentLocation(attendanceType); getHuaweiCurrentLocation(attendanceType);
} else { } else {
AppToast.show(LocaleKeys.locationPermissionRequiredForAttendance.tr()); Utils.showToast(LocaleKeys.locationPermissionRequiredForAttendance.tr());
} }
} }
}); });
@ -396,7 +395,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId, isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId, isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
if (g?.messageStatus != 1) { if (g?.messageStatus != 1) {
Utils.hideLoading(context); Utils.hideLoading(context);
AppToast.show(g?.errorEndUserMessage ?? "Unexpected error occurred"); Utils.showToast(g?.errorEndUserMessage ?? "Unexpected error occurred");
} else { } else {
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3)); if (Platform.isIOS) await Future.delayed(const Duration(seconds: 3));
@ -420,7 +419,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng); GenericResponseModel? g = await DashboardApiClient().markAttendance(pointType: 2, nfcValue: nfcId ?? "", isGpsRequired: isNfcLocationEnabled, lat: lat, long: lng);
if (g?.messageStatus != 1) { if (g?.messageStatus != 1) {
Utils.hideLoading(context); Utils.hideLoading(context);
AppToast.show(g?.errorEndUserMessage ?? "Unexpected error occurred"); Utils.showToast(g?.errorEndUserMessage ?? "Unexpected error occurred");
} else { } else {
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context); Utils.hideLoading(context);
@ -482,7 +481,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
Utils.hideLoading(context); Utils.hideLoading(context);
await closeWifiRequest(); await closeWifiRequest();
if (g?.messageStatus == 2) { if (g?.messageStatus == 2) {
AppToast.show(g?.errorEndUserMessage ?? ""); Utils.showToast(g?.errorEndUserMessage ?? "");
} else { } else {
showMDialog( showMDialog(
context, context,
@ -526,7 +525,7 @@ class _MarkAttendanceWidgetState extends State<MarkAttendanceWidget> {
bool status = await model.fetchAttendanceTracking(context); bool status = await model.fetchAttendanceTracking(context);
Utils.hideLoading(context); Utils.hideLoading(context);
if (g?.messageStatus == 2) { if (g?.messageStatus == 2) {
AppToast.show(g?.errorEndUserMessage ?? ""); Utils.showToast(g?.errorEndUserMessage ?? "");
} else { } else {
showMDialog( showMDialog(
context, context,

@ -18,6 +18,15 @@ class AppToast {
// change this single value to retune it everywhere that uses it. // change this single value to retune it everywhere that uses it.
static const int plainSeconds = 3; static const int plainSeconds = 3;
// Shared success/error colors - same combo as dependent_details_screen.dart's
// "Active"/"Access Off" badges. Any direct AppToast.show(...) call (not going through
// Utils.showToast) must pass these explicitly, otherwise it silently falls back to the
// plain dark/white style below regardless of whether it's reporting success or failure.
static const Color errorBgColor = Color(0xFFF1CECE);
static const Color errorTextColor = Color(0xFFC53030);
static const Color successBgColor = Color(0xFFECFDF5);
static const Color successTextColor = Color(0xFF059669);
static void show(String message, {int seconds = 5, VoidCallback? onComplete, bool showIcon = true, bool showCountdownText = true, Color? bgColor, Color? textColor}) { static void show(String message, {int seconds = 5, VoidCallback? onComplete, bool showIcon = true, bool showCountdownText = true, Color? bgColor, Color? textColor}) {
OverlayState? overlay = AppRoutes.navigatorKey.currentState?.overlay; OverlayState? overlay = AppRoutes.navigatorKey.currentState?.overlay;
if (overlay == null) return; if (overlay == null) return;

Loading…
Cancel
Save