Merge branch 'master_mohemm_flutter'

# Conflicts:
#	lib/app_state/app_state.dart
#	lib/ui/landing/dashboard_screen.dart
#	pubspec.yaml
mohemm_HMG_flutter_upgrade
haroon amjad 1 year ago
commit db6b0ad1b0

@ -610,5 +610,7 @@
"manageGroup": "إدارة المجموعة", "manageGroup": "إدارة المجموعة",
"members": "الأعضاء", "members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم", "searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة" "shareScreen": "مشاركة الشاشة",
"start":"يبدأ",
"about":"عن"
} }

@ -610,5 +610,7 @@
"qtyOrdered": "Qty. Ordered", "qtyOrdered": "Qty. Ordered",
"qtyReceived": "Qty. Received", "qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.", "bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty." "balQty": "Bal. Qty.",
"start":"Start",
"about":"About"
} }

@ -105,6 +105,16 @@ class DashboardApiClient {
}, url, postParams); }, url, postParams);
} }
Future<GenericResponseModel?> getEventActivity() async {
String url = "${ApiConsts.erpRest}Get_EventActivity";
Map<String, dynamic> postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData;
}, url, postParams);
}
//Mark Attendance //Mark Attendance
Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = "", String payrollCode = ""}) async { Future<GenericResponseModel?> markAttendance({String lat = "0", String? long = "0", required int pointType, String nfcValue = "", bool isGpsRequired = false, String QRValue = "", String payrollCode = ""}) async {
String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC"; String url = "${ApiConsts.swpRest}AuthenticateAndSwipeUserSupportNFC";

@ -143,7 +143,7 @@ class MyAttendanceApiClient {
if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID; if (empID != null) postParams["P_SELECTED_EMPLOYEE_NUMBER"] = empID;
return await ApiClient().postJsonForObject((json) { return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json); GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.submitEITTransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson()); return responseData.submitCEITransactionList!; //ESERVICESDV.fromJson(responseData.getDefaultValueList!.toJson());
}, url, postParams); }, url, postParams);
} }

@ -534,6 +534,20 @@ class WorkListApiClient {
}, url, postParams); }, url, postParams);
} }
Future<List<GetEitCollectionNotificationBodyList>?> GetCeiNotificationBody(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_CEI_NOTIFICATION_BODY";
Map<String, dynamic> postParams = {
"P_NOTIFICATION_ID": notificationId,
"P_PAGE_LIMIT": 100,
"P_PAGE_NUM": 1,
};
postParams.addAll(AppState().postParamsJson);
return await ApiClient().postJsonForObject((json) {
GenericResponseModel responseData = GenericResponseModel.fromJson(json);
return responseData.getCEICollectionNotificationBodyList;
}, url, postParams);
}
Future<List<GetPhonesNotificationBodyList>?> getPhonesNotificationBodyList(int? notificationId) async { Future<List<GetPhonesNotificationBodyList>?> getPhonesNotificationBodyList(int? notificationId) async {
String url = "${ApiConsts.erpRest}GET_PHONES_NOTIFICATION_BODY"; String url = "${ApiConsts.erpRest}GET_PHONES_NOTIFICATION_BODY";
Map<String, dynamic> postParams = { Map<String, dynamic> postParams = {

@ -9,9 +9,9 @@ class ApiConsts {
// static String baseUrl = "https://webservices.hmg.com"; // PreProd // static String baseUrl = "https://webservices.hmg.com"; // PreProd
// static String baseUrl = "https://hmgwebservices.com"; // Live server // static String baseUrl = "https://hmgwebservices.com"; // Live server
// static String baseUrl = "https://mohemm.hmg.com"; // New Live server static String baseUrl = "https://mohemm.hmg.com"; // New Live server
//
static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver // static String baseUrl = "https://uat.hmgwebservices.com"; // UAT ser343622ver
// static String baseUrl = "http://10.20.200.111:1010/"; // static String baseUrl = "http://10.20.200.111:1010/";
// static String baseUrl = "https://webservices.hmg.com"; // PreProd // static String baseUrl = "https://webservices.hmg.com"; // PreProd

@ -7,7 +7,7 @@ class DateUtil {
/// ///
static DateTime convertStringToDateMarathon(String date) { static DateTime convertStringToDateMarathon(String date) {
// /Date(1585774800000+0300)/ // return DateTime(2025, 2, 5);
if (date != null) { if (date != null) {
const start = "/Date("; const start = "/Date(";
const end = "+0300)"; const end = "+0300)";

@ -56,6 +56,7 @@ import 'package:mohem_flutter_app/ui/screens/announcements/announcements.dart';
import 'package:mohem_flutter_app/ui/screens/child_education/child_education_assistance.dart'; import 'package:mohem_flutter_app/ui/screens/child_education/child_education_assistance.dart';
// import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart'; // import 'package:mohem_flutter_app/ui/my_attendance/work_from_home_screen.dart';
import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart'; import 'package:mohem_flutter_app/ui/screens/eit/add_eit.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/event_activity.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/add_new_item_for_sale.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/add_new_item_for_sale.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/item_for_sale_detail.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/item_for_sale_detail.dart';
import 'package:mohem_flutter_app/ui/screens/items_for_sale/items_for_sale_home.dart'; import 'package:mohem_flutter_app/ui/screens/items_for_sale/items_for_sale_home.dart';
@ -208,6 +209,8 @@ class AppRoutes {
static const String appUpdateScreen = "/appUpdateScreen"; static const String appUpdateScreen = "/appUpdateScreen";
static const String childEducation = "/childEducation"; static const String childEducation = "/childEducation";
static const String activityScreen = "/activityScreen";
static final Map<String, WidgetBuilder> routes = { static final Map<String, WidgetBuilder> routes = {
login: (BuildContext context) => LoginScreen(), login: (BuildContext context) => LoginScreen(),
verifyLogin: (BuildContext context) => VerifyLoginScreen(), verifyLogin: (BuildContext context) => VerifyLoginScreen(),
@ -325,5 +328,6 @@ class AppRoutes {
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(), unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
appUpdateScreen: (BuildContext context) => const AppUpdateScreen(), appUpdateScreen: (BuildContext context) => const AppUpdateScreen(),
childEducation: (BuildContext context) => ChildEducationAssistance(), childEducation: (BuildContext context) => ChildEducationAssistance(),
activityScreen:(BuildContext context) => const EventActivityScreen()
}; };
} }

@ -626,7 +626,9 @@ class CodegenLoader extends AssetLoader{
"manageGroup": "إدارة المجموعة", "manageGroup": "إدارة المجموعة",
"members": "الأعضاء", "members": "الأعضاء",
"searchByUserName": "البحث بواسطة اسم المستخدم", "searchByUserName": "البحث بواسطة اسم المستخدم",
"shareScreen": "مشاركة الشاشة" "shareScreen": "مشاركة الشاشة",
"start":"يبدأ",
"about":"عن"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
@ -1240,7 +1242,9 @@ static const Map<String,dynamic> en_US = {
"qtyOrdered": "Qty. Ordered", "qtyOrdered": "Qty. Ordered",
"qtyReceived": "Qty. Received", "qtyReceived": "Qty. Received",
"bonusQty": "Bonus Qty.", "bonusQty": "Bonus Qty.",
"balQty": "Bal. Qty." "balQty": "Bal. Qty.",
"start":"Start",
"about":"About"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -597,5 +597,6 @@ abstract class LocaleKeys {
static const members = 'members'; static const members = 'members';
static const searchByUserName = 'searchByUserName'; static const searchByUserName = 'searchByUserName';
static const shareScreen = 'shareScreen'; static const shareScreen = 'shareScreen';
static const start = 'start';
static const about ='about';
} }

@ -0,0 +1,84 @@
class EventActivityList {
EventActivityList({
required this.id,
required this.titleEn,
required this.titleAr,
required this.shortDescEn,
required this.shortDescAr,
required this.longDescEn,
required this.longDescAr,
required this.url,
required this.startOn,
required this.endOn,
required this.channel,
required this.isActive,
required this.createdBy,
required this.createdOn,
required this.modifiedBy,
required this.modifiedOn,
required this.shortImageURL,
required this.detailImageURL
});
final int? id;
final String? titleEn;
final String? titleAr;
final String? shortDescEn;
final String? shortDescAr;
final String? longDescEn;
final String? longDescAr;
final String? url;
final String? startOn;
final String? endOn;
final int? channel;
final bool? isActive;
final int? createdBy;
final String? createdOn;
final String? modifiedBy;
final String? modifiedOn;
final String? shortImageURL;
final String? detailImageURL;
factory EventActivityList.fromJson(Map<String, dynamic> json) {
return EventActivityList(
id: json["ID"],
titleEn: json["TitleEn"],
titleAr: json["TitleAr"],
shortDescEn: json["ShortDescEn"],
shortDescAr: json["ShortDescAr"],
longDescEn: json["LongDescEn"],
longDescAr: json["LongDescAr"],
url: json["URL"],
startOn: json["StartOn"],
endOn: json["EndOn"],
channel: json["Channel"],
isActive: json["IsActive"],
createdBy: json["CreatedBy"],
createdOn: json["CreatedOn"],
modifiedBy: json["ModifiedBy"],
modifiedOn: json["ModifiedOn"],
shortImageURL: json["ShortImageURL"],
detailImageURL: json["DetailImageURL"]
);
}
Map<String, dynamic> toJson() => {
"ID": id,
"TitleEn": titleEn,
"TitleAr": titleAr,
"ShortDescEn": shortDescEn,
"ShortDescAr": shortDescAr,
"LongDescEn": longDescEn,
"LongDescAr": longDescAr,
"URL": url,
"StartOn": startOn,
"EndOn": endOn,
"Channel": channel,
"IsActive": isActive,
"CreatedBy": createdBy,
"CreatedOn": createdOn,
"ModifiedBy": modifiedBy,
"ModifiedOn": modifiedOn,
"DetailImageURL": detailImageURL,
"ShortImageURL" : shortImageURL
};
}

@ -1,6 +1,7 @@
import 'package:mohem_flutter_app/models/add_att_success_list_model.dart'; import 'package:mohem_flutter_app/models/add_att_success_list_model.dart';
import 'package:mohem_flutter_app/models/add_attachment_list_model.dart'; import 'package:mohem_flutter_app/models/add_attachment_list_model.dart';
import 'package:mohem_flutter_app/models/basic_member_information_model.dart'; import 'package:mohem_flutter_app/models/basic_member_information_model.dart';
import 'package:mohem_flutter_app/models/dashboard/event_activity.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_open_missing_swipes_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_open_missing_swipes_list_model.dart';
@ -184,7 +185,7 @@ class GenericResponseModel {
List<GetBasicDetColsStructureList>? getBasicDetColsStructureList; List<GetBasicDetColsStructureList>? getBasicDetColsStructureList;
List<GetBasicDetDffStructureList>? getBasicDetDffStructureList; List<GetBasicDetDffStructureList>? getBasicDetDffStructureList;
List<GetBasicDetNtfBodyList>? getBasicDetNtfBodyList; List<GetBasicDetNtfBodyList>? getBasicDetNtfBodyList;
List<String>? getCEICollectionNotificationBodyList; List<GetEitCollectionNotificationBodyList>? getCEICollectionNotificationBodyList;
List<GetEITDFFStructureList>? getCEIDFFStructureList; List<GetEITDFFStructureList>? getCEIDFFStructureList;
List<GetCEITransactionList>? getCEITransactionList; List<GetCEITransactionList>? getCEITransactionList;
List<String>? getCcpTransactionsList; List<String>? getCcpTransactionsList;
@ -214,6 +215,7 @@ class GenericResponseModel {
List<String>? getItemTypesList; List<String>? getItemTypesList;
List<String>? getLookupValuesList; List<String>? getLookupValuesList;
List<GetMenuEntriesList>? getMenuEntriesList; List<GetMenuEntriesList>? getMenuEntriesList;
List<EventActivityList>? getEventActivityList;
List<GetMoItemHistoryList>? getMoItemHistoryList; List<GetMoItemHistoryList>? getMoItemHistoryList;
List<GetMoNotificationBodyList>? getMoNotificationBodyList; List<GetMoNotificationBodyList>? getMoNotificationBodyList;
List<GetNotificationButtonsList>? getNotificationButtonsList; List<GetNotificationButtonsList>? getNotificationButtonsList;
@ -356,7 +358,7 @@ class GenericResponseModel {
StartTermApprovalProcessList? startTermApprovalProcessList; StartTermApprovalProcessList? startTermApprovalProcessList;
SubmitAddressTransaction? submitAddressTransactionList; SubmitAddressTransaction? submitAddressTransactionList;
SubmitBasicDetailsTransactionList? submitBasicDetTransactionList; SubmitBasicDetailsTransactionList? submitBasicDetTransactionList;
String? submitCEITransactionList; SubmitEITTransactionList? submitCEITransactionList;
SubmitCcpTransactionList? submitCcpTransactionList; SubmitCcpTransactionList? submitCcpTransactionList;
SubmitContactTransactionList? submitContactTransactionList; SubmitContactTransactionList? submitContactTransactionList;
SubmitEITTransactionList? submitEITTransactionList; SubmitEITTransactionList? submitEITTransactionList;
@ -487,6 +489,7 @@ class GenericResponseModel {
this.getItemTypesList, this.getItemTypesList,
this.getLookupValuesList, this.getLookupValuesList,
this.getMenuEntriesList, this.getMenuEntriesList,
this.getEventActivityList,
this.getMoItemHistoryList, this.getMoItemHistoryList,
this.getMoNotificationBodyList, this.getMoNotificationBodyList,
this.getNotificationButtonsList, this.getNotificationButtonsList,
@ -845,7 +848,9 @@ class GenericResponseModel {
}); });
} }
getCEICollectionNotificationBodyList = json['GetCEICollectionNotificationBodyList']; getCEICollectionNotificationBodyList = json["GetCEICollectionNotificationBodyList"] == null
? null
: List<GetEitCollectionNotificationBodyList>.from(json["GetCEICollectionNotificationBodyList"].map((x) => GetEitCollectionNotificationBodyList.fromJson(x)));
if (json['GetCEIDFFStructureList'] != null) { if (json['GetCEIDFFStructureList'] != null) {
getCEIDFFStructureList = <GetEITDFFStructureList>[]; getCEIDFFStructureList = <GetEITDFFStructureList>[];
@ -972,6 +977,7 @@ class GenericResponseModel {
getItemTypesList = json['GetItemTypesList']; getItemTypesList = json['GetItemTypesList'];
getLookupValuesList = json['GetLookupValuesList']; getLookupValuesList = json['GetLookupValuesList'];
getMenuEntriesList = json["GetMenuEntriesList"] == null ? null : List<GetMenuEntriesList>.from(json["GetMenuEntriesList"].map((x) => GetMenuEntriesList.fromJson(x))); getMenuEntriesList = json["GetMenuEntriesList"] == null ? null : List<GetMenuEntriesList>.from(json["GetMenuEntriesList"].map((x) => GetMenuEntriesList.fromJson(x)));
getEventActivityList = json["EventActivityList"] == null ? null : List<EventActivityList>.from(json["EventActivityList"].map((x) => EventActivityList.fromJson(x)));
if (json['GetMoItemHistoryList'] != null) { if (json['GetMoItemHistoryList'] != null) {
getMoItemHistoryList = <GetMoItemHistoryList>[]; getMoItemHistoryList = <GetMoItemHistoryList>[];
json['GetMoItemHistoryList'].forEach((v) { json['GetMoItemHistoryList'].forEach((v) {
@ -1378,7 +1384,7 @@ class GenericResponseModel {
submitAddressTransactionList = json['SubmitAddressTransactionList'] != null ? SubmitAddressTransaction.fromJson(json['SubmitAddressTransactionList']) : null; submitAddressTransactionList = json['SubmitAddressTransactionList'] != null ? SubmitAddressTransaction.fromJson(json['SubmitAddressTransactionList']) : null;
submitBasicDetTransactionList = json['SubmitBasicDetTransactionList'] != null ? SubmitBasicDetailsTransactionList.fromJson(json['SubmitBasicDetTransactionList']) : null; submitBasicDetTransactionList = json['SubmitBasicDetTransactionList'] != null ? SubmitBasicDetailsTransactionList.fromJson(json['SubmitBasicDetTransactionList']) : null;
submitCEITransactionList = json['SubmitCEITransactionList']; submitCEITransactionList = json['SubmitCEITransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitCEITransactionList']) : null;
submitCcpTransactionList = json['SubmitCcpTransactionList'] != null ? new SubmitCcpTransactionList.fromJson(json['SubmitCcpTransactionList']) : null; submitCcpTransactionList = json['SubmitCcpTransactionList'] != null ? new SubmitCcpTransactionList.fromJson(json['SubmitCcpTransactionList']) : null;
submitContactTransactionList = json['SubmitContactTransactionList'] != null ? SubmitContactTransactionList.fromJson(json['SubmitContactTransactionList']) : null; submitContactTransactionList = json['SubmitContactTransactionList'] != null ? SubmitContactTransactionList.fromJson(json['SubmitContactTransactionList']) : null;
submitEITTransactionList = json['SubmitEITTransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null; submitEITTransactionList = json['SubmitEITTransactionList'] != null ? SubmitEITTransactionList.fromJson(json['SubmitEITTransactionList']) : null;
@ -1553,10 +1559,8 @@ class GenericResponseModel {
if (this.getBasicDetNtfBodyList != null) { if (this.getBasicDetNtfBodyList != null) {
data['GetBasicDetNtfBodyList'] = this.getBasicDetNtfBodyList!.map((v) => v.toJson()).toList(); data['GetBasicDetNtfBodyList'] = this.getBasicDetNtfBodyList!.map((v) => v.toJson()).toList();
} }
data['GetCEICollectionNotificationBodyList'] = this.getCEICollectionNotificationBodyList; data['GetCEICollectionNotificationBodyList'] = this.getCEICollectionNotificationBodyList;
if (this.getCEIDFFStructureList != null) { if (this.getCEIDFFStructureList != null) {
data['GetCEIDFFStructureList'] = this.getCEIDFFStructureList!.map((v) => v.toJson()).toList(); data['GetCEIDFFStructureList'] = this.getCEIDFFStructureList!.map((v) => v.toJson()).toList();
} }
@ -1630,6 +1634,7 @@ class GenericResponseModel {
data['GetItemTypesList'] = this.getItemTypesList; data['GetItemTypesList'] = this.getItemTypesList;
data['GetLookupValuesList'] = this.getLookupValuesList; data['GetLookupValuesList'] = this.getLookupValuesList;
data['GetMenuEntriesList'] = this.getMenuEntriesList; data['GetMenuEntriesList'] = this.getMenuEntriesList;
data['EventActivityList'] = this.getEventActivityList;
if (this.getMoItemHistoryList != null) { if (this.getMoItemHistoryList != null) {
data['GetMoItemHistoryList'] = this.getMoItemHistoryList!.map((v) => v.toJson()).toList(); data['GetMoItemHistoryList'] = this.getMoItemHistoryList!.map((v) => v.toJson()).toList();
} }
@ -1855,6 +1860,10 @@ class GenericResponseModel {
} }
data['SubmitCEITransactionList'] = this.submitCEITransactionList; data['SubmitCEITransactionList'] = this.submitCEITransactionList;
if (this.submitCEITransactionList != null) {
data['SubmitCEITransactionList'] = this.submitCEITransactionList!.toJson();
}
if (this.submitCcpTransactionList != null) { if (this.submitCcpTransactionList != null) {
data['SubmitCcpTransactionList'] = this.submitCcpTransactionList!.toJson(); data['SubmitCcpTransactionList'] = this.submitCcpTransactionList!.toJson();
} }

@ -9,6 +9,7 @@ import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart'; import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/dashboard/drawer_menu_item_model.dart'; import 'package:mohem_flutter_app/models/dashboard/drawer_menu_item_model.dart';
import 'package:mohem_flutter_app/models/dashboard/event_activity.dart';
import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_accrual_balances_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart'; import 'package:mohem_flutter_app/models/dashboard/get_attendance_tracking_list_model.dart';
import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart'; import 'package:mohem_flutter_app/models/dashboard/get_open_notifications_list.dart';
@ -20,7 +21,6 @@ import 'package:mohem_flutter_app/models/dashboard/mohemm_itg_pending_task_respo
import 'package:mohem_flutter_app/models/generic_response_model.dart'; import 'package:mohem_flutter_app/models/generic_response_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/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
/// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool /// Mix-in [DiagnosticableTreeMixin] to have access to [debugFillProperties] for the devtool
@ -50,9 +50,12 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
//Menu Entries //Menu Entries
bool isServicesMenusLoading = true; bool isServicesMenusLoading = true;
bool isEventLoadingLoading = true;
List<Menus>? homeMenus; List<Menus>? homeMenus;
List<GetMenuEntriesList>? getMenuEntriesList; List<GetMenuEntriesList>? getMenuEntriesList;
EventActivityList? eventActivity;
//Offers And Discounts //Offers And Discounts
bool isOffersLoading = true; bool isOffersLoading = true;
List<OffersListModel> getOffersList = []; List<OffersListModel> getOffersList = [];
@ -99,6 +102,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
ticketBalance = 0; ticketBalance = 0;
isServicesMenusLoading = true; isServicesMenusLoading = true;
isEventLoadingLoading = true;
homeMenus = null; homeMenus = null;
getMenuEntriesList = null; getMenuEntriesList = null;
isOffersLoading = true; isOffersLoading = true;
@ -253,8 +257,28 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
notifyListeners(); notifyListeners();
} catch (ex) { } catch (ex) {
// Utils.hideLoading(context); // Utils.hideLoading(context);
getOffersList = [];
isOffersLoading = false;
notifyListeners(); notifyListeners();
Utils.handleException(ex, context, null); // Utils.handleException(ex, context, null);
}
}
void fetchEventActivity() async {
try {
GenericResponseModel? genericResponseModel = await DashboardApiClient().getEventActivity();
List<EventActivityList> eventList = (genericResponseModel!.getEventActivityList ?? []);
if (eventList.isNotEmpty) {
eventActivity = eventList.first;
}
isEventLoadingLoading = false;
notifyListeners();
} catch (ex) {
logger.wtf(ex);
isEventLoadingLoading = false;
notifyListeners();
Utils.handleException(ex, null, null);
} }
} }

@ -3,7 +3,6 @@ import 'dart:io';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart'; import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
@ -22,6 +21,7 @@ import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.da
import 'package:mohem_flutter_app/models/privilege_list_model.dart'; import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/landing/event_activity_banner.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
@ -150,6 +150,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMissingSwipe(context); data.fetchMissingSwipe(context);
data.fetchLeaveTicketBalance(context, DateTime.now()); data.fetchLeaveTicketBalance(context, DateTime.now());
data.fetchMenuEntries(); data.fetchMenuEntries();
data.fetchEventActivity();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
marathonProvider.getMarathonTutorial(); marathonProvider.getMarathonTutorial();
@ -421,7 +422,12 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
), ),
], ],
).paddingOnly(left: 21, right: 21, top: 7, bottom: 21), ).paddingOnly(left: 21, right: 21, top: 7, bottom: 21),
Column( eventActivityWidget(context),
Consumer<DashboardProviderModel>(builder: (BuildContext context, DashboardProviderModel model, Widget? child) {
if (!model.isOffersLoading && model.getOffersList.isEmpty) {
return const SizedBox();
}
return Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@ -517,7 +523,8 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
}, },
), ),
], ],
), );
}),
Container( Container(
width: double.infinity, width: double.infinity,
padding: const EdgeInsets.only(top: 31), padding: const EdgeInsets.only(top: 31),
@ -709,6 +716,14 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
return false; return false;
} }
Widget eventActivityWidget(BuildContext context) {
return (context.watch<DashboardProviderModel>().isEventLoadingLoading)
? const MarathonBannerShimmer().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: (context.watch<DashboardProviderModel>().eventActivity != null && context.watch<DashboardProviderModel>().eventActivity!.isActive ==true)
? const EventActivityBanner().paddingOnly(left: 21, right: 21, bottom: 21, top: 0)
: const SizedBox();
}
void navigateToDetails(OffersListModel offersListModelObj) { void navigateToDetails(OffersListModel offersListModelObj) {
List<OffersListModel> getOffersDetailList = []; List<OffersListModel> getOffersDetailList = [];
getOffersDetailList.clear(); getOffersDetailList.clear();

@ -0,0 +1,367 @@
import 'dart:math' as math;
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/config/routes.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/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer_main_screen.dart';
import 'package:mohem_flutter_app/widgets/glowy_borders/glowy_borders.dart';
import 'package:provider/provider.dart';
int dummyTime = DateTime.now().millisecondsSinceEpoch + 8690;
class EventActivityBanner extends StatelessWidget {
const EventActivityBanner({Key? key}) : super(key: key);
Widget getNoUpcomingMarathonWidget(BuildContext context) {
;
return Container(
decoration: MyDecorations.shadowDecoration,
height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
clipBehavior: Clip.antiAlias,
child: Stack(
children: <Widget>[
Transform(
alignment: Alignment.center,
transform: Matrix4.rotationY(
AppState().isArabic(context) ? math.pi : 0,
),
child: SvgPicture.asset(
"assets/images/marathon_banner_bg.svg",
fit: BoxFit.fill,
width: double.infinity,
),
),
AppState().isArabic(context)
? Positioned(
right: -15,
top: -10,
child: Transform.rotate(
angle: 10,
child: Container(
width: isTablet ? 70 : 65,
height: isTablet ? 40 : 32,
color: MyColors.darkDigitColor,
),
),
)
: Positioned(
left: -20,
top: -10,
child: Transform.rotate(
angle: 15,
child: Container(
width: isTablet ? 70 : 65,
height: isTablet ? 40 : 32,
color: MyColors.darkDigitColor,
),
),
),
SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
children: <Widget>[
const Expanded(
flex: 3,
child: SizedBox(
width: double.infinity,
height: double.infinity,
),
),
Expanded(
flex: AppState().isArabic(context) ? 4 : 5,
child: SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
Text(
LocaleKeys.noUpcoming.tr(),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white.withOpacity(0.83),
letterSpacing: -0.4,
),
),
Text(
LocaleKeys.brainMarathon.tr(),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 30 : 19,
fontWeight: FontWeight.bold,
color: MyColors.white.withOpacity(0.83),
height: 32 / 22,
),
),
Text(
LocaleKeys.youCanPlayDemo.tr(),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white.withOpacity(0.83),
letterSpacing: -0.4,
),
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 3,
right: AppState().isArabic(context) ? 3 : 12,
)
],
),
),
),
],
),
),
AppState().isArabic(context)
? Align(
alignment: Alignment.topRight,
child: SizedBox(
height: isTablet ? 30 : 20,
width: isTablet ? 45 : 35,
child: Transform.rotate(
angle: math.pi / 4.5,
child: Text(
LocaleKeys.brainMarathon.tr(),
textAlign: TextAlign.center,
maxLines: 2,
style: TextStyle(
color: MyColors.white,
fontWeight: FontWeight.bold,
fontSize: isTablet ? 8 : 6,
height: 1.2,
),
),
),
),
).paddingOnly(top: 5)
: Align(
alignment: Alignment.topLeft,
child: SizedBox(
height: isTablet ? 30 : 20,
width: isTablet ? 45 : 35,
child: Transform.rotate(
angle: -math.pi / 4.5,
child: Text(
LocaleKeys.brainMarathon.tr(),
textAlign: TextAlign.center,
maxLines: 2,
style: TextStyle(
color: MyColors.kWhiteColor,
fontWeight: FontWeight.bold,
fontSize: isTablet ? 8 : 6,
height: 1.2,
),
),
),
),
).paddingOnly(top: 5),
],
),
).onPress(() {
Navigator.pushNamed(context, AppRoutes.marathonIntroScreen);
});
}
@override
Widget build(BuildContext context) {
DashboardProviderModel dashboardProvider = context.read<DashboardProviderModel>();
return SizedBox(
// decoration: BoxDecoration(
// color: MyColors.kWhiteColor,
// borderRadius: BorderRadius.circular(8),
// boxShadow: [
// BoxShadow(
// color: const Color(0xff000000).withOpacity(.05),
// blurRadius: 26,
// offset: const Offset(0, -3),
// ),
// ],
// ),
height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
child: AnimatedGradientBorder(
borderSize: 3,
stretchAlongAxis: true,
animationTime: 2,
stretchAxis: Axis.vertical,
gradientColors: const [
Color(0xff0E5A64),
Color(0xff0E5A64),
Color(0xff0E5A64),
Color(0xff91C481),
],
borderRadius: BorderRadius.circular(10),
child: Container(
decoration: BoxDecoration(
color: const Color(0xff0E5A64),
borderRadius: BorderRadius.circular(8),
),
// height: isTablet ? MediaQuery.of(context).size.height * 0.17 : MediaQuery.of(context).size.height * 0.11,
child: Stack(
children: <Widget>[
// Transform(
// alignment: Alignment.center,
// // transform: Matrix4.rotationY(
// // AppState().isArabic(context) ? math.pi : 0,
// // ),
// child:
//
AppState().isArabic(context)
? Positioned(
left: -15,
top: -10,
child: Transform.rotate(
angle: 10,
child: SizedBox(
child: SvgPicture.asset(
"assets/images/light_bulb.svg"),
),
),
)
: Positioned(
right: 0,
top: 10,
child: Opacity(
opacity: .5,
child: SvgPicture.asset(
"assets/images/light_bulb.svg",
),
)),
SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
children: <Widget>[
Expanded(
flex: 3,
child: Image.network(
dashboardProvider.eventActivity?.shortImageURL ??
"",
fit: BoxFit.cover,
key: UniqueKey()
).paddingAll(5)),
Expanded(
flex: AppState().isArabic(context) ? 4 : 5,
child: SizedBox(
width: double.infinity,
height: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
AppState().isArabic(context) ? 0.height : 5.height,
Flexible(
child: Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: dashboardProvider.eventActivity?.titleEn ?? "",
arabicContent: dashboardProvider.eventActivity?.titleAr ?? "",
),
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 25 : 16,
fontWeight: FontWeight.bold,
color: MyColors.white,
height: 32 / 24,
),
),
), Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: dashboardProvider.eventActivity?.shortDescEn ?? "",
arabicContent: dashboardProvider.eventActivity?.shortDescAr ?? "",
),
style: TextStyle(
fontSize: isTablet ? 20 : 11,
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w600,
color: MyColors.white,
letterSpacing: -0.5,
),
),
isTablet ? 15.height : 10.height,
CountdownTimerForMainScreen(
timeToMarathon: DateUtil.convertStringToDateMarathon(dashboardProvider.eventActivity!.startOn!).millisecondsSinceEpoch,
provider: context.read<MarathonProvider>(),
isEvent: true,
),
],
).paddingOnly(
left: AppState().isArabic(context) ? 12 : 3,
right: AppState().isArabic(context) ? 3 : 12,
)
],
),
),
),
],
),
),
!AppState().isArabic(context)
? Positioned(
right: 0,
bottom: 0,
child: RotatedBox(
quarterTurns: 4,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor),
).paddingAll(isTablet ? 20 : 15),
)
: Positioned(
bottom: 0,
left: 0,
child: RotatedBox(
quarterTurns: 2,
child: SvgPicture.asset("assets/images/arrow_next.svg", color: MyColors.whiteColor),
).paddingAll(isTablet ? 20 : 15),
),
],
).onPress(() async {
// int remainingTimeInMinutes = DateUtil.convertStringToDateMarathon(dashboardProvider.eventActivity!.startOn!).difference(DateTime.now()).inMinutes;
// if (remainingTimeInMinutes < 0) {
Navigator.pushNamed(context, AppRoutes.activityScreen);
//}
// provider.updateLanguageAsPerMarathon(context, provider.isUpComingMarathon ? provider.marathonDetailModel : provider.demoMarathonDetailModel);
})),
),
);
}
}

@ -64,7 +64,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
context, context,
title: LocaleKeys.leaveBalance.tr(), title: LocaleKeys.leaveBalance.tr(),
), ),
body: Column( body:SingleChildScrollView(child:Column(
children: [ children: [
Padding( Padding(
padding: const EdgeInsets.all(21.0), padding: const EdgeInsets.all(21.0),
@ -76,8 +76,10 @@ class _LeaveBalanceState extends State<LeaveBalance> {
: (absenceTransList!.isEmpty : (absenceTransList!.isEmpty
? Utils.getNoDataWidget(context).paddingOnly(top: 50) ? Utils.getNoDataWidget(context).paddingOnly(top: 50)
: ListView( : ListView(
physics: const BouncingScrollPhysics(), shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
padding: const EdgeInsets.all(21), padding: const EdgeInsets.all(21),
children: [ children: [
// BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId, showLoading: false), // BalancesDashboardWidget(LocaleKeys.currentLeaveBalance.tr(), true, selectedEmp: employeeId, showLoading: false),
// 12.height, // 12.height,
@ -113,7 +115,7 @@ class _LeaveBalanceState extends State<LeaveBalance> {
], ],
)), )),
], ],
), )),
floatingActionButton: Container( floatingActionButton: Container(
height: 54, height: 54,
width: 54, width: 54,

@ -88,9 +88,9 @@ class _LoginScreenState extends State<LoginScreen> {
if (Platform.isAndroid) { if (Platform.isAndroid) {
// isOnExternalStorage = await SafeDevice.isOnExternalStorage; // isOnExternalStorage = await SafeDevice.isOnExternalStorage;
SafeDevice.isDevelopmentModeEnable.then((value) { // SafeDevice.isDevelopmentModeEnable.then((value) {
isDevelopmentModeEnable = value; // isDevelopmentModeEnable = value;
}); // });
} }
} catch (error) { } catch (error) {
print(error); print(error);
@ -127,7 +127,7 @@ class _LoginScreenState extends State<LoginScreen> {
} }
AppNotifications().init(firebaseToken, context); AppNotifications().init(firebaseToken, context);
if (isJailBroken || !isRealDevice || isDevelopmentModeEnable) { if (isJailBroken || !isRealDevice) {
Utils.hideLoading(context); Utils.hideLoading(context);
Navigator.pushNamedAndRemoveUntil(context, AppRoutes.unsafeDeviceScreen, (_) => false); Navigator.pushNamedAndRemoveUntil(context, AppRoutes.unsafeDeviceScreen, (_) => false);
} else { } else {

@ -13,19 +13,15 @@ import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
class CountdownTimerForMainScreen extends StatelessWidget { class CountdownTimerForMainScreen extends StatelessWidget {
final int timeToMarathon; final int timeToMarathon;
final MarathonProvider provider; final MarathonProvider provider;
final bool isEvent;
CountdownTimerForMainScreen({ CountdownTimerForMainScreen({
Key? key, Key? key,
required this.provider, required this.provider,
required this.timeToMarathon, required this.timeToMarathon,
this.isEvent =false,
}) : super(key: key); }) : super(key: key);
final TextStyle styleTextHome = TextStyle(
color: MyColors.white.withOpacity(0.45),
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w800,
letterSpacing: -0.4,
);
final TextStyle styleDigitHome = TextStyle( final TextStyle styleDigitHome = TextStyle(
height: 22 / 27, height: 22 / 27,
@ -75,7 +71,13 @@ class CountdownTimerForMainScreen extends StatelessWidget {
text, text,
minFontSize: 7, minFontSize: 7,
maxFontSize: 8, maxFontSize: 8,
style: styleTextHome, style: TextStyle(
color: isEvent ? MyColors.white : MyColors.white.withOpacity(0.45),
fontStyle: FontStyle.italic,
fontWeight: FontWeight.w800,
letterSpacing: -0.4,
),
); );
} }

@ -0,0 +1,115 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/consts.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.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/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/marathon/marathon_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:provider/provider.dart';
import 'package:shimmer/shimmer.dart';
class ActivityEventDetailsCard extends StatelessWidget {
final DashboardProviderModel model;
const ActivityEventDetailsCard({Key? key, required this.model}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
CachedNetworkImage(
imageUrl: model.eventActivity!.detailImageURL!,
height: 200,
placeholder: (BuildContext context, String url) => const LinearProgressIndicator(
value: 0.7,
minHeight: 200,
valueColor: AlwaysStoppedAnimation<Color>(Colors.white),
backgroundColor: Color(0xff196D73),
).toShimmer(),
fit: BoxFit.contain,width: double.infinity ,
cacheKey: UniqueKey().toString(),
),
],
),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 20,),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.titleEn ?? "",
arabicContent: model.eventActivity?.titleAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 30 : 20,
fontWeight: FontWeight.bold,
color:const Color(0xff3C3838),
// height: 42 / 30,
),
).paddingOnly(left: 10, right: 10, bottom: 2),
Row(children:[
SvgPicture.asset("assets/images/highlight.svg"),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.shortDescEn ?? "",
arabicContent: model.eventActivity?.shortDescAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 20 : 14,
fontWeight: FontWeight.bold,
color:const Color(0xff2BB8A8),
// height: 32 / 24,
),
).paddingOnly(left: 10, right: 10)
]).paddingOnly(bottom: 25),
LocaleKeys.about.tr().toText16(color: const Color(0xff3C3838)).paddingOnly(bottom: 5),
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: 3,
englishContent: model.eventActivity?.longDescEn ?? "",
arabicContent: model.eventActivity?.longDescAr ?? "",
),
style: TextStyle(
fontStyle: FontStyle.italic,
fontSize: isTablet ? 18 : 12,
fontWeight: FontWeight.bold,
color:const Color(0xff3C3838),
// height: 32 / 24,
),
).paddingOnly(bottom: 10)
],
)
]);
}
}

@ -0,0 +1,94 @@
// ignore_for_file: always_specify_types
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/date_uitl.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/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer_main_screen.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart';
class ActivityEventFooter extends StatelessWidget {
final DashboardProviderModel provider;
const ActivityEventFooter({
Key? key,
required this.provider,
}) : super(key: key);
@override
Widget build(BuildContext context) {
int remainingTime = DateTime.now().millisecondsSinceEpoch + DateUtil.convertStringToDateMarathon(provider.eventActivity!.startOn!).difference(DateTime.now()).inMilliseconds;
return Column(children: [
CountdownTimer(
endTime: remainingTime,
widgetBuilder: (context, time) {
if (time == null) {
return DefaultButton(
LocaleKeys.start.tr(),
() => launchUrl(Uri.parse(provider.eventActivity!.url!)),
color: MyColors.greenColor,
).insideContainer;
}
return Container(
height: 58,
padding: const EdgeInsets.only(
top: 15, bottom: 15, right: 30, left: 30),
margin: const EdgeInsets.only(top: 5, bottom: 5),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
gradient:
const LinearGradient(
transform: GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: <Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor
],
),
),
child: CountdownTimerForMainScreen(
timeToMarathon: DateUtil
.convertStringToDateMarathon(provider.eventActivity!.startOn!)
.millisecondsSinceEpoch,
provider: context.read<MarathonProvider>(),
isEvent: true,
));
},
onEnd: (){
},
endWidget: DefaultButton(
LocaleKeys.start.tr(),
() => launchUrl(Uri.parse(provider.eventActivity!.url!)),
color: MyColors.greenColor,
).insideContainer,
)
// if (remainingTimeInMinutes < 0)
//
// else
//
//
// ,
]);
}
}

@ -0,0 +1,49 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_details_card.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_footer.dart';
import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_timer_card.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/activity_event_card.dart';
import 'package:mohem_flutter_app/ui/screens/event_activity/activity_footer.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:provider/provider.dart';
class EventActivityScreen extends StatelessWidget {
const EventActivityScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DashboardProviderModel provider = context.read<DashboardProviderModel>();
return Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.details.tr(),
onHomeTapped: () {
Navigator.pop(context);
},
onBackTapped: () {
Navigator.pop(context);
},
),
body: Column(
children: <Widget>[
ListView(
padding: const EdgeInsets.all(21),
children: <Widget>[
ActivityEventDetailsCard(model: provider),
20.height,
],
).expanded,
1.divider,
ActivityEventFooter(provider: provider),
],
),
);
}
}

@ -37,10 +37,10 @@ class _UnsafeDeviceScreenState extends State<UnsafeDeviceScreen> {
.paddingOnly(left: 20.0, right: 20.0), .paddingOnly(left: 20.0, right: 20.0),
48.height, 48.height,
passwordConstraintsUI("The device is not jailbroken or rooted.", true).paddingOnly(left: 24.0, right: 5.0), passwordConstraintsUI("The device is not jailbroken or rooted.", true).paddingOnly(left: 24.0, right: 5.0),
8.height, // 8.height,
passwordConstraintsUI("The app is not installed on external storage.", true).paddingOnly(left: 24.0, right: 5.0), // passwordConstraintsUI("The app is not installed on external storage.", true).paddingOnly(left: 24.0, right: 5.0),
8.height, // 8.height,
passwordConstraintsUI("Development mode is disabled.", true).paddingOnly(left: 24.0, right: 5.0), // passwordConstraintsUI("Development mode is disabled.", true).paddingOnly(left: 24.0, right: 5.0),
21.height, 21.height,
DefaultButton(LocaleKeys.ok.tr(), () async { DefaultButton(LocaleKeys.ok.tr(), () async {
if (Platform.isAndroid) { if (Platform.isAndroid) {

@ -69,13 +69,34 @@ class RequestDetailFragment extends StatelessWidget {
); );
} }
Widget detailView(List<Fields> fields) { Widget detailView(List<Fields> fieldsF) {
List<Fields> fields = List.from(fieldsF);
bool isOdd = false; bool isOdd = false;
if (fields.length % 2 != 0) { if (fields.length % 2 != 0) {
isOdd = true; isOdd = true;
fields.add(new Fields()); fields.add(new Fields());
} }
return GridView.builder(
int descriptionFormatIndex = fields.indexWhere((element) => element.title == "Description Format" || element.title == "Description Format"); // todo add arabic in future
Widget? descriptionFormatView;
if (descriptionFormatIndex >= 0) {
Fields descriptionFormat = fields[descriptionFormatIndex];
fields.removeAt(descriptionFormatIndex);
descriptionFormatView = ItemDetailViewGridItem(
2,
descriptionFormat.title,
descriptionFormat.value == null ? (descriptionFormat.multipleValue?.join(", ") ?? "") : descriptionFormat.value ?? "",
type: descriptionFormat.type,
maxLine: 0,
);
}
return Column(
mainAxisSize: MainAxisSize.min,
children: [
GridView.builder(
itemCount: fields.length, itemCount: fields.length,
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
@ -109,6 +130,9 @@ class RequestDetailFragment extends StatelessWidget {
crossAxisCount: 2, crossAxisCount: 2,
childAspectRatio: (itemWidth / itemHeight), childAspectRatio: (itemWidth / itemHeight),
), ),
),
if (descriptionFormatView != null) descriptionFormatView,
],
).objectContainerView(); ).objectContainerView();
return ListView.separated( return ListView.separated(
shrinkWrap: true, shrinkWrap: true,

@ -142,6 +142,8 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
if (workListData!.iTEMTYPE == "HRSSA") { if (workListData!.iTEMTYPE == "HRSSA") {
if (workListData!.rEQUESTTYPE == "EIT") { if (workListData!.rEQUESTTYPE == "EIT") {
getEitNotificationBody(); getEitNotificationBody();
} else if (workListData!.rEQUESTTYPE == "CEI") {
getCEINotificationBody();
}else if (workListData!.rEQUESTTYPE == "PHONE_NUMBERS") { }else if (workListData!.rEQUESTTYPE == "PHONE_NUMBERS") {
getPhonesNotificationBody(); getPhonesNotificationBody();
} else if (workListData!.rEQUESTTYPE == "BASIC_DETAILS") { } else if (workListData!.rEQUESTTYPE == "BASIC_DETAILS") {
@ -760,6 +762,24 @@ class _WorkListDetailScreenState extends State<WorkListDetailScreen> {
} }
} }
void getCEINotificationBody() async {
try {
if (apiCallCount == 0) Utils.showLoading(context);
apiCallCount++;
getEitCollectionNotificationBodyList!.clear();
getEitCollectionNotificationBodyList = await WorkListApiClient().GetCeiNotificationBody(workListData!.nOTIFICATIONID);
apiCallCount--;
if (apiCallCount == 0) {
Utils.hideLoading(context);
setState(() {});
}
} catch (ex) {
apiCallCount--;
Utils.hideLoading(context);
Utils.handleException(ex, context, null);
}
}
void getEitNotificationBody() async { void getEitNotificationBody() async {
try { try {
if (apiCallCount == 0) Utils.showLoading(context); if (apiCallCount == 0) Utils.showLoading(context);

@ -0,0 +1,150 @@
library glowy_borderspertino.dart;
import 'dart:math' as math;
import 'package:flutter/cupertino.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
class AnimatedGradientBorder extends StatefulWidget {
const AnimatedGradientBorder(
{Key? key,
required this.child,
required this.gradientColors,
required this.borderRadius,
this.animationTime,
this.borderSize,
this.animationProgress,
this.stretchAlongAxis = false,
this.stretchAxis = Axis.horizontal});
final Widget child;
final double? borderSize;
final List<Color> gradientColors;
final BorderRadiusGeometry borderRadius;
final int? animationTime;
final double? animationProgress;
final bool stretchAlongAxis;
final Axis stretchAxis;
@override
State<StatefulWidget> createState() => AnimatedGradientState();
}
class AnimatedGradientState extends State<AnimatedGradientBorder> with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation _angleAnimation;
@override
void initState() {
super.initState();
_controller = AnimationController(vsync: this, duration: Duration(seconds: widget.animationTime ?? 2));
_controller.addListener(() => setState(() {}));
_angleAnimation = Tween<double>(begin: 0.1, end: 2 * math.pi).animate(_controller);
if (widget.animationProgress != null) {
_controller.forward();
} else {
_controller.repeat();
}
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
void didUpdateWidget(covariant AnimatedGradientBorder oldWidget) {
super.didUpdateWidget(oldWidget);
double? animateTo = widget.animationProgress;
if (animateTo != null) {
_controller.animateTo(animateTo);
} else {
_controller.repeat();
}
}
@override
Widget build(BuildContext context) {
double? negativeMargin = -1.0 * (widget.borderSize ?? 0);
return Container(
padding: EdgeInsets.all(widget.borderSize ?? 0),
clipBehavior: Clip.hardEdge,
decoration: BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.circular(10),
boxShadow: [
BoxShadow(
color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
),
child: Stack(alignment: Alignment.center, clipBehavior: Clip.none, children: [
Positioned(
top: negativeMargin,
left: negativeMargin,
right: negativeMargin,
bottom: negativeMargin,
child: AnimatedGradientContainer(
gradientColors: widget.gradientColors,
borderRadius: widget.borderRadius,
gradientAngle: _angleAnimation.value,
)),
widget.child,
// BackdropFilter(
// filter: ImageFilter.blur(sigmaX: widget.glowSize ?? 0, sigmaY: widget.glowSize ?? 0),
// child: Stack(
// alignment: Alignment.center,
// clipBehavior: Clip.none,
// children: [
// Positioned(
// top: negativeMargin,
// right: negativeMargin,
// left: negativeMargin,
// bottom: negativeMargin,
// child: AnimatedGradientContainer(
// gradientColors: widget.gradientColors,
// borderRadius: widget.borderRadius,
// gradientAngle: _angleAnimation.value,
// )),
// if (widget.stretchAlongAxis)
// SizedBox(
// width: widget.stretchAxis == Axis.horizontal ? double.infinity : null,
// height: widget.stretchAxis == Axis.vertical ? double.infinity : null,
// child: widget.child,
// )
// else
// widget.child,
// ],
// ),
// ),
]),
);
}
}
class AnimatedGradientContainer extends StatelessWidget {
const AnimatedGradientContainer({Key? key, required this.gradientColors, required this.gradientAngle, required this.borderRadius});
final List<Color> gradientColors;
final double gradientAngle;
final BorderRadiusGeometry borderRadius;
@override
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
borderRadius: borderRadius,
gradient: SweepGradient(
colors: [...gradientColors, ...gradientColors.reversed], stops: _generateColorStops([...gradientColors, ...gradientColors.reversed]), transform: GradientRotation(gradientAngle))));
}
List<double> _generateColorStops(List<dynamic> colors) {
return colors.asMap().entries.map((entry) {
double percentageStop = entry.key / colors.length;
return percentageStop;
}).toList();
}
}

@ -52,8 +52,9 @@ class ItemDetailViewGridItem extends StatelessWidget {
final String? value; final String? value;
final String? type; final String? type;
final bool isNeedToShowEmptyDivider; final bool isNeedToShowEmptyDivider;
final int maxLine;
ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false, this.type = ""}) : super(key: key); ItemDetailViewGridItem(this.index, this.title, this.value, {Key? key, this.isNeedToShowEmptyDivider = false, this.type = "", this.maxLine = 6}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -76,10 +77,11 @@ class ItemDetailViewGridItem extends StatelessWidget {
), ),
), ),
child: isNeedToShowEmptyDivider child: isNeedToShowEmptyDivider
? Container() ? SizedBox()
: Column( : Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [ children: [
title != null ? Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))) : Container(), title != null ? Flexible(child: "$title:".toText12Auto(isBold: true, color: const Color(0xff2BB8A6))) : Container(),
4.width, 4.width,
@ -87,7 +89,7 @@ class ItemDetailViewGridItem extends StatelessWidget {
? type!.toLowerCase() == "table" ? type!.toLowerCase() == "table"
? getStringFromJSON(value!) ? getStringFromJSON(value!)
// : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: 5)) // : Flexible(child: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: 5))
: (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: 6) : (value!.isEmpty ? "--" : value).toString().toText12Auto(color: MyColors.normalTextColor, maxLine: maxLine)
: Container(), : Container(),
], ],
), ),

Loading…
Cancel
Save