Compare commits

...

5 Commits

Author SHA1 Message Date
Faiz Hashmi 5921f60825 Reeverted LocaleKeys 1 year ago
Faiz Hashmi b821026063 Added checks for isDisclosureEnabled 1 year ago
Faiz Hashmi d77ace678d Final Tweaks in Disclosure 1 year ago
faizatflutter cbc6219755 Completed Disclosure Flow 1 year ago
Faiz Hashmi 8efab84515 Added Disclosure 1 year ago

@ -0,0 +1,290 @@
[
{
"id": "b8f10b10-221c-495d-b99b-6a8094892549",
"titleEn": "Do you (or any of your Relatives) have a relationship or an interest (direct or indirect) with any vendor, contractor, or business entity with which Dr. Sulaiman Al Habib Medical Services Group Company, its affiliates and business (the “Company”) does business or is likely to do business, for which you have an opportunity to influence a related business decision?",
"titleAr": "Do you (or any of your Relatives) have a relationship or an interest (direct or indirect) with any vendor, contractor, or business entity with which Dr. Sulaiman Al Habib Medical Services Group Company, its affiliates and business (the “Company”) does business or is likely to do business, for which you have an opportunity to influence a related business decision?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/51b598b6-c837-45be-8734-1374978bd426_congratulations-gif.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 1,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "772e6062-543c-4ddc-e516-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "b8f10b10-221c-495d-b99b-6a8094892549",
"sequence": 1,
"image": "null",
"isCorrectOption": false
},
{
"id": "ea3c673e-78c7-41dd-e517-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "b8f10b10-221c-495d-b99b-6a8094892549",
"sequence": 3,
"image": "null",
"isCorrectOption": true
}
]
},
{
"id": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0",
"titleEn": "Do you (or any of your Relatives) have an outside job (employment, position on a board of directors or committee, or other position) that may create a conflict of interest with your employment at the Company inside or outside of the Kingdom of Saudi Arabia?",
"titleAr": "Do you (or any of your Relatives) have an outside job (employment, position on a board of directors or committee, or other position) that may create a conflict of interest with your employment at the Company inside or outside of the Kingdom of Saudi Arabia?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "dd0ba127-26ed-4308-e50e-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0",
"sequence": 1,
"image": "null",
"isCorrectOption": false
},
{
"id": "4748df31-95f0-4fee-e50f-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "0d60d55f-4067-48f9-9ace-b6309c6a7cf0",
"sequence": 4,
"image": "null",
"isCorrectOption": true
}
]
},
{
"id": "489659b0-0400-4b64-8ce2-e6fe48db61db",
"titleEn": "Do you engage in a business that would compete with the Company? Or do you conduct businesses in any of the Companys activities? Or do you have an interest (ownership, affiliation, employment or position) with an entity that competes with the Company?",
"titleAr": "Do you engage in a business that would compete with the Company? Or do you conduct businesses in any of the Companys activities? Or do you have an interest (ownership, affiliation, employment or position) with an entity that competes with the Company?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/a9ffa364-231c-4877-824f-84febac51086_thumbs-up-simon-cowell.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "7f63cd45-ce2c-417f-e502-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "489659b0-0400-4b64-8ce2-e6fe48db61db",
"sequence": 1,
"image": "null",
"isCorrectOption": true
},
{
"id": "34690bfa-0ffd-453f-e503-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "489659b0-0400-4b64-8ce2-e6fe48db61db",
"sequence": 2,
"image": "null",
"isCorrectOption": false
}
]
},
{
"id": "253fc396-dab9-41ca-82bd-511f98c5dee8",
"titleEn": "Do you have any direct or indirect interest in the businesses and contracts executed for the Companys account?",
"titleAr": "Do you have any direct or indirect interest in the businesses and contracts executed for the Companys account?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/012d6493-3612-42c9-8f6f-84417d4736d4_good-job-well-done.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "dce4999c-5629-45f4-e4f6-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "253fc396-dab9-41ca-82bd-511f98c5dee8",
"sequence": 1,
"image": "null",
"isCorrectOption": false
},
{
"id": "00913ba1-5ccc-4d7c-e4f7-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "253fc396-dab9-41ca-82bd-511f98c5dee8",
"sequence": 2,
"image": "null",
"isCorrectOption": false
}
]
},
{
"id": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c",
"titleEn": "Do you hold 5% or more of the shares of the Company or any other company within its group? Or are you a Relative of who owns such percentage?",
"titleAr": "Do you hold 5% or more of the shares of the Company or any other company within its group? Or are you a Relative of who owns such percentage?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/ca3f32a1-ed9f-45df-b2fb-3d1df78d5651_congrats-14.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "597c308e-3f09-4a05-e506-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c",
"sequence": 1,
"image": "null",
"isCorrectOption": true
},
{
"id": "2face927-7c8e-4945-e507-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "669c4fe2-a3e6-4e29-8c56-ae09efa9ba6c",
"sequence": 2,
"image": "null",
"isCorrectOption": false
}
]
},
{
"id": "f91774ce-14f0-4af0-9a77-e649bc013b44",
"titleEn": "Are you a Relative of any of the Board members, or a Relative of any Senior Executive of the Company or any other company within its group?",
"titleAr": "Are you a Relative of any of the Board members, or a Relative of any Senior Executive of the Company or any other company within its group?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/6484c5bc-09fd-4586-8036-67868afbe27b_good-job-well-done.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "2f968964-ce91-4478-e512-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "f91774ce-14f0-4af0-9a77-e649bc013b44",
"sequence": 1,
"image": "null",
"isCorrectOption": true
},
{
"id": "4fed9355-2c9f-458d-e513-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "f91774ce-14f0-4af0-9a77-e649bc013b44",
"sequence": 2,
"image": "null",
"isCorrectOption": false
}
]
},
{
"id": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3",
"titleEn": "Do you have any other conflict of interests with your employment in the Company?",
"titleAr": "Do you have any other conflict of interests with your employment in the Company?",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "9d0743e0-9f3f-48d0-e4fa-08dae8b36b35",
"titleEn": "Yes",
"titleAr": "Yes",
"questionId": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3",
"sequence": 1,
"image": "null",
"isCorrectOption": false
},
{
"id": "a81eda99-d9ad-49e0-e4fb-08dae8b36b35",
"titleEn": "No",
"titleAr": "No",
"questionId": "fd3a90e6-5b35-4035-bc1c-4483facaf6d3",
"sequence": 2,
"image": "null",
"isCorrectOption": true
}
]
},
{
"id": "3a35855d-3ed7-4d45-8864-9135d71378de",
"titleEn": "I have completed the above Conflict of Interests Disclosure Form truthfully and as required by the Company policy.",
"titleAr": "I have completed the above Conflict of Interests Disclosure Form truthfully and as required by the Company policy.",
"marathonId": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"questionTypeId": 1,
"questionTime": 10,
"nextQuestGap": 5,
"gapType": 0,
"gapText": null,
"gapImage": "Questions/24dddc50-7583-48b4-9fec-8a490d246191_great-thumbs.gif",
"questOptionsLimit": 0,
"remainingParticipantCount": 0,
"desEn": "If Yes, please provide all related information with required documentation",
"desAr": "If Yes, please provide all related information with required documentation",
"questionOptions": [
{
"id": "f0766816-837f-47e6-e51a-08dae8b36b35",
"titleEn": "Agree",
"titleAr": "Agree",
"questionId": "3a35855d-3ed7-4d45-8864-9135d71378de",
"sequence": 1,
"image": "null",
"isCorrectOption": false
},
{
"id": "dc9c68de-afa4-4b63-e51b-08dae8b36b35",
"titleEn": "Disagree",
"titleAr": "Disagree",
"questionId": "3a35855d-3ed7-4d45-8864-9135d71378de",
"sequence": 2,
"image": "null",
"isCorrectOption": false
}
]
}
]

@ -0,0 +1,47 @@
{
"id": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"titleEn": "Disclosure Title",
"titleAr": "undefined",
"descEn": "Submit disclosure using mobile app",
"descAr": "undefined",
"questionTime": 10,
"winDeciderTime": 30,
"winnersCount": 1,
"questGapTime": 5,
"startTime": "2022-12-28T10:44:41",
"endTime": null,
"marathoneStatusId": 4,
"scheduleTime": "2022-12-28T10:14:41",
"selectedLanguage": 0,
"projects": {
"id": "b1cd3fa3-bb27-422e-a4c1-08dac09254df",
"nameEn": "Cloud Solutions",
"nameAr": "شركة حلول السحابة للاتصالات وتقنية المعلومات",
"projectCode": "CS"
},
"sponsors": [
{
"id": "3272b127-b388-4f09-425b-08dac2eb788e",
"nameEn": "Cloud Solutions",
"nameAr": "حل السحابة",
"image": "SponsorImage/b9aed4a8-42b2-45fc-b6f1-47ee0c7b4138_sponsor.jpeg",
"video": "SponsorVideo/9ab678ab-1b4c-4ea4-aaf2-32ce1353d3fe_sample-10s.mp4",
"logo": "SponsorLogo/eb029f0d-bce1-4a61-b0c0-abaa484912a0_sponsor.jpeg",
"videoDuration": null,
"sponsorPrizes": [
{
"id": "e657a18c-6fb2-4099-07c8-08dae89efcd3",
"marathonPrizeEn": "SAR 500",
"marathonPrizeAr": "SAR 500"
}
]
}
],
"questions": null,
"isEmailSent": false,
"totalQuestions": 8,
"cancelReason": null,
"marathonBufferTime": 30,
"currentTime": "2022-12-28T08:03:24.3671803Z",
"displayCorrectAnswer": true
}

@ -528,7 +528,7 @@
"noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض",
"group" : "مجموعة",
"group": "مجموعة",
"searchGroup": "مجموعة البحث",
"connectHmgWifi": "قم بتوصيل HMG WIFI",
"connectedHmgWifi": "اتصال HMG WIFI",
@ -544,5 +544,45 @@
"addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.",
"pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
"open": "يفتح"
"open": "يفتح",
"disclosure": "الإفصاح",
"groupName": "اسم المجموعة",
"enterGroupNamePlease": "يرجى إدخال اسم المجموعة",
"audioCall": "مكالمة صوتية",
"userSearch": "البحث عن مستخدم",
"shareScreen": "مشاركة الشاشة",
"searchByUserName": "البحث حسب اسم المستخدم",
"manage": "إدارة",
"members": "الأعضاء",
"addUsers": "إضافة مستخدمين",
"areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟",
"editGroups": "تحرير المجموعات",
"groupMembers": "أعضاء المجموعة",
"manageGroup": "إدارة المجموعة",
"admin": "مسؤول",
"paymentDetails": "تفاصيل الدفع",
"requesterEmpNum": "رقم الموظف الطالب",
"requesterEmpName": "اسم الموظف الطالب",
"prepareEmpName": "اسم الموظف المحضر",
"requesterPositionName": "اسم وظيفة الموظف الطالب",
"preparePositionName": "اسم وظيفة الموظف المحضر",
"requesterPayrollName": "اسم كشف رواتب الموظف الطالب",
"general": "عام",
"payingORGName": "اسم الجهة الدافعة",
"requestAmount": "مبلغ الطلب",
"typeofPayment": "نوع الدفع",
"beneficiaryDetails": "تفاصيل المستفيد",
"beneficiaryName": "اسم المستفيد",
"idIqama": "الهوية/الإقامة",
"beneficiaryBankName": "اسم بنك المستفيد",
"sadadNumber": "رقم سداد",
"beneficiaryIBAN": "رقم الآيبان للمستفيد",
"purchaseOrders": "أوامر الشراء",
"approvalDate": "تاريخ الموافقة",
"versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد",
"paymentRequest": "طلب الدفع",
"pleaseWriteHere": "يرجى الكتابة هنا",
"disclosures": "الإفصاحات",
"areYouSureYouWantToGoBack": "هل أنت متأكد أنك تريد الرجوع؟"
}

@ -563,5 +563,33 @@
"open": "open",
"addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.",
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit."
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.",
"disclosure": "Disclosure",
"requesterEmpNum": "Requester Employee Number",
"requesterEmpName": "Requester Employee Name",
"prepareEmpName": "Prepare Employee Name",
"requesterPositionName": "Requester Position Name",
"preparePositionName": "Prepare Position Name",
"requesterPayrollName": "Requester Payroll Name",
"general": "General",
"payingORGName": "Paying Organization Name",
"requestAmount": "Request Amount",
"typeofPayment": "Type of Payment",
"paymentDetails": "Payment Details",
"beneficiaryDetails": "Beneficiary Details",
"beneficiaryName": "Beneficiary Name",
"idIqama": "ID/Iqama",
"beneficiaryBankName": "Beneficiary Bank Name",
"sadadNumber": "SADAD Number",
"beneficiaryIBAN": "Beneficiary IBAN",
"purchaseOrders": "Purchase Orders",
"approvalDate": "Approval Date",
"versionStatus": "Version Status",
"supplierNo": "Supplier Number",
"paymentRequest": "Payment Request",
"pOAmount": "PO Amount",
"pleaseWriteHere": "Please Write Here",
"disclosures": "Disclosures",
"areYouSureYouWantToGoBack": "Are you sure you want to go back?"
}

@ -1,7 +1,10 @@
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/services.dart';
import 'package:logger/logger.dart' as L;
import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/models/marathon/marathon_model.dart';
import 'package:mohem_flutter_app/models/marathon/question_model.dart';
@ -23,3 +26,23 @@ class DemoMarathonRepo {
return currentQuestion;
}
}
class DisclosureRepo {
L.Logger logger = L.Logger();
Future<DisclosureDetailsModel> getDisclosureDetails() async {
String response = await rootBundle.loadString('assets/json/disclosure_upcoming.json');
var json = jsonDecode(response);
DisclosureDetailsModel marathonDetailModel = DisclosureDetailsModel.fromJson(json);
return marathonDetailModel;
}
Future<DisclosureQuestionModel> getDisclosureNextQuestion({required int currentQuestionNumber}) async {
log("getQuestion At Index: $currentQuestionNumber ");
String response = await rootBundle.loadString('assets/json/disclosure_questions.json');
List json = jsonDecode(response);
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel.fromJson(json.elementAt(currentQuestionNumber));
return currentQuestion;
}
}

@ -92,7 +92,6 @@ class AppState {
final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 8.2, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() {
isAuthenticated = false;
isLogged = false;
@ -194,4 +193,8 @@ class AppState {
}
bool cancelRequestTrancsection = true;
bool isDisclosureEnabled = true;
set setIsDisclosureEnabled(v) => isDisclosureEnabled = v;
}

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/models/marathon/question_model.dart';
class MyDecorations {
@ -36,4 +37,20 @@ class MyDecorations {
return getContainersDecoration(MyColors.greyF7Color);
}
}
static Decoration getAnswersContainerColorForDisclosure(DisclosureQuestionsOptionStatus questionsOptionStatus, {bool isLastQuestion = false, bool isAgreeSelected = false}) {
if (isLastQuestion && questionsOptionStatus == DisclosureQuestionsOptionStatus.selected && isAgreeSelected) {
return getContainersDecoration(MyColors.greenColor);
}
switch (questionsOptionStatus) {
case DisclosureQuestionsOptionStatus.correct:
return getContainersDecoration(MyColors.greenColor);
case DisclosureQuestionsOptionStatus.wrong:
return getContainersDecoration(MyColors.redColor);
case DisclosureQuestionsOptionStatus.selected:
return getContainersDecoration(MyColors.blackColor);
case DisclosureQuestionsOptionStatus.unSelected:
return getContainersDecoration(MyColors.greyF7Color);
}
}
}

@ -1,5 +1,4 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/models/my_documents/employee_documents_list_model.dart';
import 'package:mohem_flutter_app/ui/app_update_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/add_vacation_rule_screen.dart';
import 'package:mohem_flutter_app/ui/attendance/monthly_attendance_screen.dart';
@ -11,6 +10,8 @@ import 'package:mohem_flutter_app/ui/chat/favorite_users_screen.dart';
import 'package:mohem_flutter_app/ui/chat/group_chat_detaied_screen.dart';
import 'package:mohem_flutter_app/ui/chat/group_members.dart';
import 'package:mohem_flutter_app/ui/chat/manage_group.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_intro_screen.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_screen.dart';
import 'package:mohem_flutter_app/ui/landing/dashboard_screen.dart';
import 'package:mohem_flutter_app/ui/landing/itg/change_itg_ad_password_screen.dart';
import 'package:mohem_flutter_app/ui/landing/itg/its_add_screen_video_image.dart';
@ -64,7 +65,6 @@ import 'package:mohem_flutter_app/ui/screens/items_for_sale/items_for_sale_home.
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_home.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/mowadhafhi_hr_request.dart';
import 'package:mohem_flutter_app/ui/screens/mowadhafhi/request_details.dart';
import 'package:mohem_flutter_app/ui/screens/my_documents/my_document_detail_screen.dart';
import 'package:mohem_flutter_app/ui/screens/my_documents/my_documents_screen.dart';
import 'package:mohem_flutter_app/ui/screens/my_requests/my_requests.dart';
import 'package:mohem_flutter_app/ui/screens/my_requests/new_request.dart';
@ -198,6 +198,7 @@ class AppRoutes {
static const String manageGroup = "/manageGroup";
static const String groupMembers = "/groupmembers";
static const String groupChatDetailed = "/groupChatDetailed";
//Marathon
static const String marathonIntroScreen = "/marathonIntroScreen";
static const String marathonScreen = "/marathonScreen";
@ -206,6 +207,13 @@ class AppRoutes {
static const String marathonWaitingScreen = "/marathonWaitingScreen";
static const String marathonTutorialScreen = "/marathonTutorialScreen";
//Disclosure
static const String disclosureIntroScreen = "/disclosureIntroScreen";
static const String disclosureScreen = "/disclosureScreen";
static const String disclosureWinnerScreen = "/disclosureWinnerScreen";
static const String disclosureWaitingScreen = "/disclosureWaitingScreen";
static const String disclosureTutorialScreen = "/disclosureTutorialScreen";
static const String unsafeDeviceScreen = "/unsafeDeviceScreen";
static const String appUpdateScreen = "/appUpdateScreen";
@ -214,8 +222,8 @@ class AppRoutes {
verifyLogin: (BuildContext context) => VerifyLoginScreen(),
verifyLastLogin: (BuildContext context) => VerifyLastLoginScreen(),
dashboard: (BuildContext context) => DashboardScreen(),
survey: (BuildContext context) => SurveyScreen(),
advertisement: (BuildContext context) => ITGAdsScreen(),
survey: (BuildContext context) => const SurveyScreen(),
advertisement: (BuildContext context) => const ITGAdsScreen(),
subMenuScreen: (BuildContext context) => SubMenuScreen(),
newPassword: (BuildContext context) => NewPasswordScreen(),
@ -230,7 +238,7 @@ class AppRoutes {
workListDetail: (BuildContext context) => WorkListDetailScreen(),
itgDetail: (BuildContext context) => ItgDetailScreen(),
itemHistory: (BuildContext context) => ItemHistoryScreen(),
worklistSettings: (BuildContext context) => WorklistSettings(),
worklistSettings: (BuildContext context) => const WorklistSettings(),
// Leave Balance
@ -240,7 +248,7 @@ class AppRoutes {
servicesMenuListScreen: (BuildContext context) => ServicesMenuListScreen(),
// workFromHome: (BuildContext context) => WorkFromHomeScreen(),
// addWorkFromHome: (BuildContext context) => AddWorkFromHomeScreen(),
profile: (BuildContext context) => ProfileScreen(),
profile: (BuildContext context) => const ProfileScreen(),
//Attendance
monthlyAttendance: (BuildContext context) => MonthlyAttendanceScreen(),
vacationRule: (BuildContext context) => VacationRuleScreen(),
@ -253,9 +261,9 @@ class AppRoutes {
//profile: (BuildContext context) => Profile(),
//profile: (BuildContext context) => Profile(),
personalInfo: (BuildContext context) => PersonalInfo(),
basicDetails: (BuildContext context) => BasicDetails(),
contactDetails: (BuildContext context) => ContactDetails(),
familyMembers: (BuildContext context) => FamilyMembers(),
basicDetails: (BuildContext context) => const BasicDetails(),
contactDetails: (BuildContext context) => const ContactDetails(),
familyMembers: (BuildContext context) => const FamilyMembers(),
dynamicScreen: (BuildContext context) => DynamicListViewScreen(),
addDynamicInput: (BuildContext context) => DynamicInputScreen(),
addDynamicInputProfile: (BuildContext context) => DynamicInputScreenProfile(),
@ -263,31 +271,31 @@ class AppRoutes {
deleteFamilyMember: (BuildContext context) => DeleteFamilyMember(ModalRoute.of(context)!.settings.arguments as int),
requestSubmitScreen: (BuildContext context) => RequestSubmitScreen(),
addUpdateFamilyMember: (BuildContext context) => AddUpdateFamilyMember(),
addUpdateFamilyMember: (BuildContext context) => const AddUpdateFamilyMember(),
//mowadhafhi
mowadhafhi: (BuildContext context) => MowadhafhiHome(),
mowadhafhiDetails: (BuildContext context) => MowadhafhiRequestDetails(),
mowadhafhiHRRequest: (BuildContext context) => MowadhafhiHRRequest(),
mowadhafhi: (BuildContext context) => const MowadhafhiHome(),
mowadhafhiDetails: (BuildContext context) => const MowadhafhiRequestDetails(),
mowadhafhiHRRequest: (BuildContext context) => const MowadhafhiHRRequest(),
pendingTransactions: (BuildContext context) => PendingTransactions(),
pendingTransactionsDetails: (BuildContext context) => PendingTransactionsDetails(),
pendingTransactions: (BuildContext context) => const PendingTransactions(),
pendingTransactionsDetails: (BuildContext context) => const PendingTransactionsDetails(),
announcements: (BuildContext context) => Announcements(),
announcementsDetails: (BuildContext context) => AnnouncementDetails(),
announcements: (BuildContext context) => const Announcements(),
announcementsDetails: (BuildContext context) => const AnnouncementDetails(),
//My Requests
myRequests: (BuildContext context) => MyRequests(),
newRequest: (BuildContext context) => NewRequest(),
myRequests: (BuildContext context) => const MyRequests(),
newRequest: (BuildContext context) => const NewRequest(),
myDocuments: (BuildContext context) => MyDocumentsScreen(),
// Items for sale
itemsForSale: (BuildContext context) => ItemsForSale(),
itemsForSaleDetail: (BuildContext context) => ItemForSaleDetailPage(),
itemsForSale: (BuildContext context) => const ItemsForSale(),
itemsForSaleDetail: (BuildContext context) => const ItemForSaleDetailPage(),
addNewItemForSale: (BuildContext context) => AddNewItemForSale(),
// Offers & Discounts
offersAndDiscounts: (BuildContext context) => OffersAndDiscountsHome(),
offersAndDiscountsDetails: (BuildContext context) => OffersAndDiscountsDetails(),
offersAndDiscounts: (BuildContext context) => const OffersAndDiscountsHome(),
offersAndDiscountsDetails: (BuildContext context) => const OffersAndDiscountsDetails(),
//pay slip
monthlyPaySlip: (BuildContext context) => MonthlyPaySlipScreen(),
@ -296,32 +304,35 @@ class AppRoutes {
endEmploymentScreen: (BuildContext context) => EndEmploymentScreen(),
//My Team
myTeam: (BuildContext context) => MyTeam(),
myTeam: (BuildContext context) => const MyTeam(),
employeeDetails: (BuildContext context) => EmployeeDetails(),
profileDetails: (BuildContext context) => ProfileDetails(),
viewAttendance: (BuildContext context) => ViewAttendance(),
teamMembers: (BuildContext context) => TeamMembers(),
createRequest: (BuildContext context) => CreateRequest(),
subordinateLeave: (BuildContext context) => SubordinateLeave(),
profileDetails: (BuildContext context) => const ProfileDetails(),
viewAttendance: (BuildContext context) => const ViewAttendance(),
teamMembers: (BuildContext context) => const TeamMembers(),
createRequest: (BuildContext context) => const CreateRequest(),
subordinateLeave: (BuildContext context) => const SubordinateLeave(),
changePassword: (BuildContext context) => ChangePasswordScreen(),
changeItgAdPasswordScreen: (BuildContext context) => ChangeItgAdPasswordScreen(),
//Chat
chat: (BuildContext context) => ChatHome(),
chatDetailed: (BuildContext context) => ChatDetailScreen(),
chatFavoriteUsers: (BuildContext context) => ChatFavoriteUsersScreen(),
chat: (BuildContext context) => const ChatHome(),
chatDetailed: (BuildContext context) => const ChatDetailScreen(),
chatFavoriteUsers: (BuildContext context) => const ChatFavoriteUsersScreen(),
//Group Chat
manageGroup: (BuildContext context) => ManageGroupScreen(),
groupMembers: (BuildContext context) => GroupMembersScreen(),
groupChatDetailed: (BuildContext context) => GroupChatDetailScreen(),
manageGroup: (BuildContext context) => const ManageGroupScreen(),
groupMembers: (BuildContext context) => const GroupMembersScreen(),
groupChatDetailed: (BuildContext context) => const GroupChatDetailScreen(),
// Marathon
marathonIntroScreen: (BuildContext context) => MarathonIntroScreen(),
marathonScreen: (BuildContext context) => MarathonScreen(),
marathonIntroScreen: (BuildContext context) => const MarathonIntroScreen(),
marathonScreen: (BuildContext context) => const MarathonScreen(),
marathonSponsorVideoScreen: (BuildContext context) => const SponsorVideoScreen(),
marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(),
marathonTutorialScreen: (BuildContext context) => const MarathonTutorialViewerScreen(),
// Disclosure
disclosureIntroScreen: (BuildContext context) => const DisclosureIntroScreen(),
disclosureScreen: (BuildContext context) => const DisclosureScreen(),
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
appUpdateScreen: (BuildContext context) => const AppUpdateScreen(),

@ -1,20 +1,20 @@
// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart
// ignore_for_file: prefer_single_quotes
// ignore_for_file: prefer_single_quotes, avoid_renaming_method_parameters
import 'dart:ui';
import 'package:easy_localization/easy_localization.dart' show AssetLoader;
class CodegenLoader extends AssetLoader {
class CodegenLoader extends AssetLoader{
const CodegenLoader();
@override
Future<Map<String, dynamic>> load(String fullPath, Locale locale) {
Future<Map<String, dynamic>?> load(String path, Locale locale) {
return Future.value(mapLocales[locale.toString()]);
}
static const Map<String, dynamic> ar_SA = {
static const Map<String,dynamic> ar_SA = {
"mohemm": "Mohemm",
"english": "English",
"arabic": "عربي",
@ -113,6 +113,7 @@ class CodegenLoader extends AssetLoader {
"reject": "يرفض",
"approve": "يوافق",
"cancel": "إلغاء",
"generate": "يولد",
"requestedItems": "العناصر المطلوبة",
"request": "طلب",
"myRequest": "طلبي",
@ -446,7 +447,11 @@ class CodegenLoader extends AssetLoader {
"CorrectAddress": "تصحيح أو تعديل هذا العنوان",
"SelectChangeWantToMake": " حدد نوع التغيير الذي تريد القيام به.",
"profile": {
"reset_password": {"label": "Reset Password", "username": "Username", "password": "password"},
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
},
"profileCompletionPer": "استكمال الملف الشخصي",
"completeProfile": "الملف الشخصي الكامل",
"personalInformation": "معلومات شخصية",
@ -468,7 +473,10 @@ class CodegenLoader extends AssetLoader {
"gender": {
"male": "Hi man ;) ",
"female": "Hello girl :)",
"with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"}
"with_arg": {
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
},
"reset_locale": "إعادة ضبط اللغة",
"chat": "دردشة",
@ -549,35 +557,52 @@ class CodegenLoader extends AssetLoader {
"expiredDocuments": "المستندات منتهية الصلاحية",
"missingDocuments": "مستندات مفقودة",
"uploadedDocuments": "المستندات التي تم تحميلها",
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
"addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.",
"pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
"generate": "يولد",
"paymentRequest":"طلب الدفع",
"paymentDetails":"تفاصيل الدفع",
"requestNo":"رقم الطلب",
"requesterEmpNum":"رقم الموظف الذي قدم الطلب",
"requesterEmpName":"اسم الموظف مقدم الطلب",
"prepareEmpName":"إعداد اسم الموظف",
"requesterPositionName":"اسم الوظيفة لمقدم الطلب",
"preparePositionName":"إعداد اسم الوظيفة",
"requesterPayrollName":"اسم مقدم الطلب",
"payingORGName":"اسم المنظمة الدافعة",
"requestAmount":"مبلغ الطلب",
"typeofPayment":"نوع الدفع",
"beneficiaryDetails":"تفاصيل المستفيد",
"beneficiaryName":"اسم المستفيد",
"idIqama":"الهوية السعودية / الإقامة",
"beneficiaryBankName":"اسم البنك المستفيد",
"sadadNumber":"رقم سداد",
"beneficiaryIBAN":"رقم IBAN للمستفيد",
"purchaseOrders":"طلبات الشراء",
"approvalDate":"تاريخ الموافقة",
"pOAmount":"مبلغ الطلب",
"versionStatus":"حالة الإصدار",
"supplierNo":"رقم المورد",
"general":"عام"
};
static const Map<String, dynamic> en_US = {
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني",
"open": "يفتح",
"disclosure": "الإفصاح",
"groupName": "اسم المجموعة",
"enterGroupNamePlease": "يرجى إدخال اسم المجموعة",
"audioCall": "مكالمة صوتية",
"userSearch": "البحث عن مستخدم",
"shareScreen": "مشاركة الشاشة",
"searchByUserName": "البحث حسب اسم المستخدم",
"manage": "إدارة",
"members": "الأعضاء",
"addUsers": "إضافة مستخدمين",
"areYouSureWantTodelete": "هل أنت متأكد أنك تريد الحذف؟",
"editGroups": "تحرير المجموعات",
"groupMembers": "أعضاء المجموعة",
"manageGroup": "إدارة المجموعة",
"admin": "مسؤول",
"paymentDetails": "تفاصيل الدفع",
"requesterEmpNum": "رقم الموظف الطالب",
"requesterEmpName": "اسم الموظف الطالب",
"prepareEmpName": "اسم الموظف المحضر",
"requesterPositionName": "اسم وظيفة الموظف الطالب",
"preparePositionName": "اسم وظيفة الموظف المحضر",
"requesterPayrollName": "اسم كشف رواتب الموظف الطالب",
"general": "عام",
"payingORGName": "اسم الجهة الدافعة",
"requestAmount": "مبلغ الطلب",
"typeofPayment": "نوع الدفع",
"beneficiaryDetails": "تفاصيل المستفيد",
"beneficiaryName": "اسم المستفيد",
"idIqama": "الهوية/الإقامة",
"beneficiaryBankName": "اسم بنك المستفيد",
"sadadNumber": "رقم سداد",
"beneficiaryIBAN": "رقم الآيبان للمستفيد",
"purchaseOrders": "أوامر الشراء",
"approvalDate": "تاريخ الموافقة",
"versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد",
"paymentRequest": "طلب الدفع",
"pleaseWriteHere": "يرجى الكتابة هنا",
"disclosures": "الإفصاحات",
"areYouSureYouWantToGoBack": "هل أنت متأكد أنك تريد الرجوع؟"
};
static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm",
"english": "English",
"arabic": "عربي",
@ -664,7 +689,7 @@ class CodegenLoader extends AssetLoader {
"atLeastOneNumeric": "At least one numeric",
"minimum8Characters": "Minimum 8 characters",
"doNotAddRepeatingLetters": "Do not add repeating letters",
"itShouldContainSpecialCharacter": "It should not contain special character",
"itShouldContainSpecialCharacter": "It should not contain special characters",
"confirmPasswordMustMatch": "Confirm password must match",
"sms": "SMS",
"fingerPrint": "Fingerprint",
@ -672,6 +697,7 @@ class CodegenLoader extends AssetLoader {
"whatsapp": "Whatsapp",
"reject": "Reject",
"approve": "Approve",
"generate": "Generate",
"cancel": "Cancel",
"requestedItems": "Requested Items",
"request": "Request",
@ -1009,7 +1035,11 @@ class CodegenLoader extends AssetLoader {
"CorrectAddress": "Correct or amend this address",
"SelectChangeWantToMake": "Select the type of change you want to make",
"profile": {
"reset_password": {"label": "Reset Password", "username": "Username", "password": "password"},
"reset_password": {
"label": "Reset Password",
"username": "Username",
"password": "password"
},
"profileCompletionPer": "Profile Completion",
"completeProfile": "Complete Profile",
"personalInformation": "Personal Information",
@ -1031,7 +1061,10 @@ class CodegenLoader extends AssetLoader {
"gender": {
"male": "Hi man ;) ",
"female": "Hello girl :)",
"with_arg": {"male": "Hi man ;) {}", "female": "Hello girl :) {}"}
"with_arg": {
"male": "Hi man ;) {}",
"female": "Hello girl :) {}"
}
},
"reset_locale": "Reset Language",
"chat": "Chat",
@ -1131,33 +1164,37 @@ class CodegenLoader extends AssetLoader {
"userSearch": "User Search",
"userName": "User Name",
"userId": "UserID",
"open": "open",
"addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.",
"youCannotJoinTheMarathon": "You cannot join the Marathon because you have exceeded the time limit.",
"generate": "Generate",
"paymentRequest":"Pay Request",
"paymentDetails":"Payment Details",
"requestNo":"Request No",
"requesterEmpNum":"Requester Employee Num",
"requesterEmpName":"Requester Employee Name",
"prepareEmpName":"Prepare Employee Name",
"requesterPositionName":"Requester Position Name",
"preparePositionName":"Prepare Position Name",
"requesterPayrollName":"Requester Payroll Name",
"payingORGName":"Paying Organization Name",
"requestAmount":"Request Amount",
"typeofPayment":"Type of Payment",
"beneficiaryDetails":"Beneficiary Details",
"beneficiaryName":"Beneficiary Name",
"idIqama":"Saudi ID / Iqama",
"beneficiaryBankName":"Beneficiary Bank Name",
"sadadNumber":"Sadad Number",
"beneficiaryIBAN":"Beneficiary IBAN",
"purchaseOrders":"Purchase Orders",
"approvalDate":"Approval Date",
"pOAmount":"PO Amount",
"versionStatus":"Version Status",
"supplierNo":"Supplier No",
"general":"General"
};
static const Map<String, Map<String, dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
"disclosure": "Disclosure",
"requesterEmpNum": "Requester Employee Number",
"requesterEmpName": "Requester Employee Name",
"prepareEmpName": "Prepare Employee Name",
"requesterPositionName": "Requester Position Name",
"preparePositionName": "Prepare Position Name",
"requesterPayrollName": "Requester Payroll Name",
"general": "General",
"payingORGName": "Paying Organization Name",
"requestAmount": "Request Amount",
"typeofPayment": "Type of Payment",
"paymentDetails": "Payment Details",
"beneficiaryDetails": "Beneficiary Details",
"beneficiaryName": "Beneficiary Name",
"idIqama": "ID/Iqama",
"beneficiaryBankName": "Beneficiary Bank Name",
"sadadNumber": "SADAD Number",
"beneficiaryIBAN": "Beneficiary IBAN",
"purchaseOrders": "Purchase Orders",
"approvalDate": "Approval Date",
"versionStatus": "Version Status",
"supplierNo": "Supplier Number",
"paymentRequest": "Payment Request",
"pOAmount": "PO Amount",
"pleaseWriteHere": "Please Write Here",
"disclosures": "Disclosures",
"areYouSureYouWantToGoBack": "Are you sure you want to go back?"
};
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
}

@ -98,6 +98,7 @@ abstract class LocaleKeys {
static const reject = 'reject';
static const approve = 'approve';
static const cancel = 'cancel';
static const generate = 'generate';
static const requestedItems = 'requestedItems';
static const request = 'request';
static const myRequest = 'myRequest';
@ -403,7 +404,6 @@ abstract class LocaleKeys {
static const purchaseOrder = 'purchaseOrder';
static const ITGForms = 'ITGForms';
static const itemCreation = 'itemCreation';
static const paymentRequest = 'paymentRequest';
static const stamp = 'stamp';
static const addFavoriteList = 'addFavoriteList';
static const feedbackUserExperience = 'feedbackUserExperience';
@ -527,53 +527,49 @@ abstract class LocaleKeys {
static const expiredDocuments = 'expiredDocuments';
static const missingDocuments = 'missingDocuments';
static const uploadedDocuments = 'uploadedDocuments';
static const addAtLeastOneAttachment = 'addAtLeastOneAttachment';
static const pleaseClickButtonToJoinMarathon = 'pleaseClickButtonToJoinMarathon';
static const youCannotJoinTheMarathon = 'youCannotJoinTheMarathon';
static const open = 'open';
static const disclosure = 'disclosure';
static const groupName = 'groupName';
static const enterGroupNamePlease = 'enterGroupNamePlease';
static const audioCall = 'audioCall';
static const userSearch = 'userSearch';
static const shareScreen = 'shareScreen';
static const searchByUserName = 'searchByUserName';
static const manage = 'manage';
static const members = 'members';
static const addUsers = 'addUsers';
static const areYouSureWantTodelete = 'areYouSureWantTodelete';
static const groupMembers = "groupMembers";
static const manageGroup = "manageGroup";
static const admin = "admin";
static const addUsers ="addUsers";
static const editGroups ="editGroups";
static const groupNameshouldbe ="groupNameshouldbe";
static const enterGroupName ="enterGroupName";
static const groupName ="groupName";
static const enterGroupNamePlease ="enterGroupNamePlease";
static const audioCall = 'audioCall';
static const videoCall ='videoCall';
static const shareScreen ='shareScreen';
static const searchByUserName ='searchByUserName';
static const userSearch ='userSearch';
static const userName ='userName';
static const userId ='userId';
static const addAtLeastOneAttachment ='addAtLeastOneAttachment';
static const pleaseClickButtonToJoinMarathon ='pleaseClickButtonToJoinMarathon';
static const youCannotJoinTheMarathon ='youCannotJoinTheMarathon';
static const open ='open';
static const generate = 'generate';
static const paymentDetails ='paymentDetails';
static const requestNo ='requestNo';
static const requesterEmpNum ='requesterEmpNum';
static const requesterEmpName ='requesterEmpName';
static const prepareEmpName ='prepareEmpName';
static const requesterPositionName ='requesterPositionName';
static const preparePositionName ='preparePositionName';
static const requesterPayrollName ='requesterPayrollName';
static const payingORGName ='payingORGName';
static const requestAmount ='requestAmount';
static const typeofPayment ='typeofPayment';
static const beneficiaryDetails ='beneficiaryDetails';
static const beneficiaryName ='beneficiaryName';
static const idIqama ='idIqama';
static const beneficiaryBankName ='beneficiaryBankName';
static const sadadNumber ='sadadNumber';
static const beneficiaryIBAN ='beneficiaryIBAN';
static const purchaseOrders ='purchaseOrders';
static const pOAmount ='pOAmount';
static const approvalDate ='approvalDate';
static const versionStatus ='versionStatus';
static const supplierNo ='supplierNo';
static const general ="general";
static const editGroups = 'editGroups';
static const groupMembers = 'groupMembers';
static const manageGroup = 'manageGroup';
static const admin = 'admin';
static const paymentDetails = 'paymentDetails';
static const requesterEmpNum = 'requesterEmpNum';
static const requesterEmpName = 'requesterEmpName';
static const prepareEmpName = 'prepareEmpName';
static const requesterPositionName = 'requesterPositionName';
static const preparePositionName = 'preparePositionName';
static const requesterPayrollName = 'requesterPayrollName';
static const general = 'general';
static const payingORGName = 'payingORGName';
static const requestAmount = 'requestAmount';
static const typeofPayment = 'typeofPayment';
static const beneficiaryDetails = 'beneficiaryDetails';
static const beneficiaryName = 'beneficiaryName';
static const idIqama = 'idIqama';
static const beneficiaryBankName = 'beneficiaryBankName';
static const sadadNumber = 'sadadNumber';
static const beneficiaryIBAN = 'beneficiaryIBAN';
static const purchaseOrders = 'purchaseOrders';
static const approvalDate = 'approvalDate';
static const versionStatus = 'versionStatus';
static const supplierNo = 'supplierNo';
static const paymentRequest = 'paymentRequest';
static const pleaseWriteHere = 'pleaseWriteHere';
static const disclosures = 'disclosures';
static const areYouSureYouWantToGoBack = 'areYouSureYouWantToGoBack';
}

@ -13,12 +13,14 @@ 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/eit_provider_model.dart';
import 'package:mohem_flutter_app/theme/app_theme.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:month_year_picker/month_year_picker.dart';
import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart';
import 'package:sizer/sizer.dart';
bool isDisclosureModuleEnabled = true;
// test uat account
// username 199067
@ -74,6 +76,9 @@ Future<void> main() async {
ChangeNotifierProvider<MarathonProvider>(
create: (_) => MarathonProvider(),
),
ChangeNotifierProvider<DisclosureProvider>(
create: (_) => DisclosureProvider(),
),
// ChangeNotifierProvider<ChatCallProvider>(
// create: (_) => ChatCallProvider(),
// ),

@ -0,0 +1,242 @@
class DisclosureDetailsModel {
String? id;
String? titleEn;
String? titleAr;
String? descEn;
String? descAr;
int? winDeciderTime;
int? winnersCount;
int? questGapTime;
String? startTime;
String? endTime;
int? marathoneStatusId;
String? scheduleTime;
int? selectedLanguage;
Projects? projects;
List<Sponsors>? sponsors;
List<Questions>? questions;
int? totalQuestions;
int? marathonBufferTime;
bool? displayCorrectAnswer;
DisclosureDetailsModel({
id,
titleEn,
titleAr,
descEn,
descAr,
winDeciderTime,
winnersCount,
questGapTime,
startTime,
endTime,
marathoneStatusId,
scheduleTime,
selectedLanguage,
projects,
sponsors,
questions,
totalQuestions,
marathonBufferTime,
displayCorrectAnswer,
});
DisclosureDetailsModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
titleEn = json['titleEn'];
titleAr = json['titleAr'];
descEn = json['descEn'];
descAr = json['descAr'];
winDeciderTime = json['winDeciderTime'];
winnersCount = json['winnersCount'];
questGapTime = json['questGapTime'];
startTime = json['startTime'];
endTime = json['endTime'];
marathoneStatusId = json['marathoneStatusId'];
scheduleTime = json['scheduleTime'];
selectedLanguage = json['selectedLanguage'];
projects = json['projects'] != null ? Projects.fromJson(json['projects']) : null;
if (json['sponsors'] != null) {
sponsors = <Sponsors>[];
json['sponsors'].forEach((v) {
sponsors!.add(Sponsors.fromJson(v));
});
}
if (json['questions'] != null) {
questions = <Questions>[];
json['questions'].forEach((v) {
questions!.add(Questions.fromJson(v));
});
}
totalQuestions = json["totalQuestions"];
marathonBufferTime = json["marathonBufferTime"];
displayCorrectAnswer = json["displayCorrectAnswer"];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['titleEn'] = titleEn;
data['titleAr'] = titleAr;
data['descEn'] = descEn;
data['descAr'] = descAr;
data['winDeciderTime'] = winDeciderTime;
data['winnersCount'] = winnersCount;
data['questGapTime'] = questGapTime;
data['startTime'] = startTime;
data['endTime'] = endTime;
data['marathoneStatusId'] = marathoneStatusId;
data['scheduleTime'] = scheduleTime;
data['selectedLanguage'] = selectedLanguage;
if (projects != null) {
data['projects'] = projects!.toJson();
}
if (sponsors != null) {
data['sponsors'] = sponsors!.map((v) => v.toJson()).toList();
}
if (questions != null) {
data['questions'] = questions!.map((v) => v.toJson()).toList();
}
data['totalQuestions'] = totalQuestions;
data['marathonBufferTime'] = marathonBufferTime;
return data;
}
}
class Projects {
String? id;
String? nameEn;
String? nameAr;
String? projectCode;
Projects({id, nameEn, nameAr, projectCode});
Projects.fromJson(Map<String, dynamic> json) {
id = json['id'];
nameEn = json['nameEn'];
nameAr = json['nameAr'];
projectCode = json['projectCode'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['nameEn'] = nameEn;
data['nameAr'] = nameAr;
data['projectCode'] = projectCode;
return data;
}
}
class Sponsors {
String? id;
String? nameEn;
String? nameAr;
String? image;
String? video;
String? logo;
List<SponsorPrizes>? sponsorPrizes;
Sponsors({id, nameEn, nameAr, image, video, logo, sponsorPrizes});
Sponsors.fromJson(Map<String, dynamic> json) {
id = json['id'];
nameEn = json['nameEn'];
nameAr = json['nameAr'];
image = json['image'];
video = json['video'];
logo = json['logo'];
if (json['sponsorPrizes'] != null) {
sponsorPrizes = <SponsorPrizes>[];
json['sponsorPrizes'].forEach((v) {
sponsorPrizes!.add(SponsorPrizes.fromJson(v));
});
}
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['nameEn'] = nameEn;
data['nameAr'] = nameAr;
data['image'] = image;
data['video'] = video;
data['logo'] = logo;
if (sponsorPrizes != null) {
data['sponsorPrizes'] = sponsorPrizes!.map((v) => v.toJson()).toList();
}
return data;
}
}
class SponsorPrizes {
String? id;
String? marathonPrizeEn;
String? marathonPrizeAr;
SponsorPrizes({id, marathonPrizeEn, marathonPrizeAr});
SponsorPrizes.fromJson(Map<String, dynamic> json) {
id = json['id'];
marathonPrizeEn = json['marathonPrizeEn'];
marathonPrizeAr = json['marathonPrizeAr'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['marathonPrizeEn'] = marathonPrizeEn;
data['marathonPrizeAr'] = marathonPrizeAr;
return data;
}
}
class Questions {
String? id;
String? titleEn;
String? titleAr;
String? marathonId;
int? questionTypeId;
int? questionTime;
int? nextQuestGap;
int? gapType;
String? gapValue;
String? gapImage;
int? questOptionsLimit;
List? questionOptions;
Questions({id, titleEn, titleAr, marathonId, questionTypeId, questionTime, nextQuestGap, gapType, gapValue, gapImage, questOptionsLimit, questionOptions});
Questions.fromJson(Map<String, dynamic> json) {
id = json['id'];
titleEn = json['titleEn'];
titleAr = json['titleAr'];
marathonId = json['marathonId'];
questionTypeId = json['questionTypeId'];
questionTime = json['questionTime'];
nextQuestGap = json['nextQuestGap'];
gapType = json['gapType'];
gapValue = json['gapValue'];
gapImage = json['gapImage'];
questOptionsLimit = json['questOptionsLimit'];
questionOptions = json['questionOptions'];
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['titleEn'] = titleEn;
data['titleAr'] = titleAr;
data['marathonId'] = marathonId;
data['questionTypeId'] = questionTypeId;
data['questionTime'] = questionTime;
data['nextQuestGap'] = nextQuestGap;
data['gapType'] = gapType;
data['gapValue'] = gapValue;
data['gapImage'] = gapImage;
data['questOptionsLimit'] = questOptionsLimit;
data['questionOptions'] = questionOptions;
return data;
}
}

@ -0,0 +1,31 @@
class DisclosureGenericModel {
DisclosureGenericModel({
this.data,
this.isSuccessful,
this.message,
this.statusCode,
this.errors,
});
dynamic data;
bool? isSuccessful;
String? message;
int? statusCode;
dynamic errors;
factory DisclosureGenericModel.fromJson(Map<String, dynamic> json) => DisclosureGenericModel(
data: json["data"],
isSuccessful: json["isSuccessful"],
message: json["message"],
statusCode: json["statusCode"],
errors: json["errors"],
);
Map<String, dynamic> toJson() => {
"data": data,
"isSuccessful": isSuccessful,
"message": message,
"statusCode": statusCode,
"errors": errors,
};
}

@ -0,0 +1,108 @@
enum DisclosureQuestionsOptionStatus { correct, wrong, selected, unSelected }
enum DisclosureQuestionCardStatus { question, wrongAnswer, correctAnswer, skippedAnswer, completed, findingWinner, winnerFound }
class DisclosureQuestionModel {
String? id;
String? titleEn;
String? titleAr;
String? descEn;
String? descAr;
String? marathonId;
int? questionTypeId;
int? questionTime;
int? nextQuestGap;
int? gapType;
String? gapText;
String? gapImage;
int? questOptionsLimit;
int? remainingParticipantCount;
List<QuestionOptions>? questionOptions;
DisclosureQuestionModel({
String? id,
String? titleEn,
String? titleAr,
String? descEn,
String? descAr,
String? marathonId,
int? questionTypeId,
int? questionTime,
int? nextQuestGap,
int? gapType,
String? gapText,
String? gapImage,
int? questOptionsLimit,
int? remainingParticipantCount,
List<QuestionOptions>? questionOptions,
});
DisclosureQuestionModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
titleEn = json['titleEn'];
titleAr = json['titleAr'];
descEn = json['desEn'];
descAr = json['desAr'];
marathonId = json['marathonId'];
questionTypeId = json['questionTypeId'];
questionTime = json['questionTime'];
nextQuestGap = json['nextQuestGap'];
gapType = json['gapType'];
gapText = json['gapText'];
gapImage = json['gapImage'];
questOptionsLimit = json['questOptionsLimit'];
remainingParticipantCount = json['remainingParticipantCount'];
if (json['questionOptions'] != null) {
questionOptions = <QuestionOptions>[];
json['questionOptions'].forEach((v) {
questionOptions!.add(QuestionOptions.fromJson(v));
});
questionOptions!.sort((QuestionOptions a, QuestionOptions b) => a.sequence!.compareTo(b.sequence!));
}
}
}
class QuestionOptions {
String? id;
String? titleEn;
String? titleAr;
String? questionId;
int? sequence;
String? image;
bool? isCorrectOption;
DisclosureQuestionsOptionStatus? optionStatus;
QuestionOptions({
String? id,
String? titleEn,
String? titleAr,
String? questionId,
int? sequence,
String? image,
bool? isCorrectOption,
DisclosureQuestionsOptionStatus? optionStatus,
});
QuestionOptions.fromJson(Map<String, dynamic> json) {
id = json['id'];
titleEn = json['titleEn'];
titleAr = json['titleAr'];
questionId = json['questionId'];
sequence = json['sequence'];
image = json['image'];
isCorrectOption = json['isCorrectOption'];
optionStatus = DisclosureQuestionsOptionStatus.unSelected;
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['titleEn'] = titleEn;
data['titleAr'] = titleAr;
data['questionId'] = questionId;
data['sequence'] = sequence;
data['image'] = image;
data['isCorrectOption'] = isCorrectOption;
return data;
}
}

@ -112,6 +112,9 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
// DrawerMenuItem("assets/images/drawer/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword),
];
if (isDisclosureModuleEnabled) {
drawerMenuItemList.add(DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.disclosure.tr(), AppRoutes.disclosureIntroScreen));
}
notifyListeners();
}
@ -158,11 +161,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
logger.wtf(ex);
if (showLoading) Utils.hideLoading(context);
notifyListeners();
Utils.handleException(ex, context, (err) {
Utils.handleException(ex, context, (String err) {
Utils.hideLoading(context);
showDialog(
context: context,
builder: (cxt) => ConfirmDialog(
builder: (BuildContext cxt) => ConfirmDialog(
message: err,
onTap: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
@ -211,11 +214,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void fetchListMenu() async {
try {
List<ListMenu> menuList = await DashboardApiClient().getListMenu();
List findMyRequest = menuList.where((element) => element.menuType == "E").toList();
List findMyRequest = menuList.where((ListMenu element) => element.menuType == "E").toList();
if (findMyRequest.isNotEmpty) {
drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests));
}
List findMyTeam = menuList.where((element) => element.menuType == "M").toList();
List findMyTeam = menuList.where((ListMenu element) => element.menuType == "M").toList();
if (findMyTeam.isNotEmpty) {
AppState().setempStatusIsManager = true;
drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam));
@ -263,7 +266,7 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
for (int i = 0; i < getMenuEntriesList.length; i++) {
if (getMenuEntriesList[i].parentMenuName!.isEmpty) {
GetMenuEntriesList abc = GetMenuEntriesList(requestType: "itg_forms", prompt: LocaleKeys.itgForms.tr());
List<GetMenuEntriesList> list = getMenuEntriesList.where((element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList();
List<GetMenuEntriesList> list = getMenuEntriesList.where((GetMenuEntriesList element) => getMenuEntriesList[i].menuName == element.parentMenuName).toList();
if (getMenuEntriesList[i].menuName == "MBL_E_PROFESSIONALS_01") {
// hard coding this check to add change password for Active Directory

@ -17,8 +17,7 @@ import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/models/chat/create_group_request.dart';
import 'package:mohem_flutter_app/models/chat/get_search_user_chat_model.dart';
import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart'
as groups;
import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart' as groups;
import 'package:mohem_flutter_app/models/get_action_history_list_model.dart';
import 'package:mohem_flutter_app/models/worklist/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_model.dart';
@ -86,12 +85,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
userId: _selectedSearchIndex == 1 ? searchText : "",
email: _selectedSearchIndex == 2 ? searchText : "",
);
favouriteUserList = replacementList
?.where((ReplacementList element) => element.isFavorite ?? false)
.toList();
nonFavouriteUserList = replacementList
?.where((ReplacementList element) => !(element.isFavorite ?? false))
.toList();
favouriteUserList = replacementList?.where((ReplacementList element) => element.isFavorite ?? false).toList();
nonFavouriteUserList = replacementList?.where((ReplacementList element) => !(element.isFavorite ?? false)).toList();
Utils.hideLoading(context);
setState(() {});
} catch (e) {
@ -108,10 +103,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
if (provider.pageNo == 1) provider.chatUsersList!.clear();
try {
Utils.showLoading(context);
await ChatApiClient()
.getChatMemberFromSearch(searchText,
AppState().chatDetails!.response!.id!, provider.pageNo)
.then((ChatUserModel value) {
await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, provider.pageNo).then((ChatUserModel value) {
if (value.response != null) {
if (provider.pageNo == 1) {
provider.chatUsersList = value.response;
@ -121,8 +113,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
}
}
});
provider.chatUsersList!.removeWhere((ChatUser element) =>
element.id == AppState().chatDetails!.response!.id);
provider.chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id);
Utils.hideLoading(context);
setState(() {});
} catch (e) {
@ -148,7 +139,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
super.initState();
sc.addListener(scrollListener);
provider = Provider.of<ChatProviderModel>(context, listen: false);
if (widget.groupDetails.groupName !=null) {
if (widget.groupDetails.groupName != null) {
setState(() {
groupName = widget.groupDetails.groupName!;
isAudioCall = widget.groupDetails.canAudioC!;
@ -206,11 +197,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
contentPadding: EdgeInsets.zero,
title: LocaleKeys.audioCall.tr().toText10(),
checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
side: BorderSide(
width: 1.5,
color: Theme.of(context).unselectedWidgetColor),
checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
side: BorderSide(width: 1.5, color: Theme.of(context).unselectedWidgetColor),
value: isAudioCall,
onChanged: (bool? newValue) {
@ -218,24 +206,21 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
isAudioCall = newValue!;
});
},
controlAffinity: ListTileControlAffinity
.leading, // <-- leading Checkbox
controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
)).expanded,
SizedBox(
height: 35,
child: CheckboxListTile(
contentPadding: EdgeInsets.zero,
title: LocaleKeys.videoCall.tr().toText10(),
checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
value: isVideoCall,
onChanged: (bool? newValue) {
setState(() {
isVideoCall = newValue!;
});
},
controlAffinity: ListTileControlAffinity
.leading, // <-- leading Checkbox
controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
)).expanded
],
),
@ -245,33 +230,29 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
height: 35,
child: CheckboxListTile(
contentPadding: EdgeInsets.zero,
title:LocaleKeys.attachments.tr().toText10(),
checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
title: LocaleKeys.attachments.tr().toText10(),
checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
value: isAttachments,
onChanged: (bool? newValue) {
setState(() {
isAttachments = newValue!;
});
},
controlAffinity: ListTileControlAffinity
.leading, // <-- leading Checkbox
controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
)).expanded,
SizedBox(
height: 35,
child: CheckboxListTile(
contentPadding: EdgeInsets.zero,
checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10)),
title:LocaleKeys.shareScreen.tr().toText10(),
checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
title: LocaleKeys.shareScreen.tr().toText10(),
value: isShareScreen,
onChanged: (bool? newValue) {
setState(() {
isShareScreen = newValue!;
});
},
controlAffinity: ListTileControlAffinity
.leading, // <-- leading Checkbox
controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
)).expanded
],
),
@ -280,8 +261,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
11.height,
Row(
children: [
radioOption(widget.fromChat ? LocaleKeys.userId.tr() : LocaleKeys.name.tr(), 0,
_selectedSearchIndex),
radioOption(widget.fromChat ? LocaleKeys.userId.tr() : LocaleKeys.name.tr(), 0, _selectedSearchIndex),
radioOption(LocaleKeys.userName.tr(), 1, _selectedSearchIndex),
radioOption(LocaleKeys.email.tr(), 2, _selectedSearchIndex),
],
@ -303,9 +283,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
constraints: const BoxConstraints(),
onPressed: () async {
provider.chatUsersList!.clear();
provider.pageNo =1;
await SystemChannels.textInput
.invokeMethod('TextInput.hide');
provider.pageNo = 1;
await SystemChannels.textInput.invokeMethod('TextInput.hide');
widget.fromChat ? fetchChatUser() : fetchUserByInput();
},
icon: const Icon(Icons.search),
@ -325,10 +304,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext cxt, int index) =>
employeeItemView(favouriteUserList![index]),
separatorBuilder:
(BuildContext cxt, int index) => Container(
itemBuilder: (BuildContext cxt, int index) => employeeItemView(favouriteUserList![index]),
separatorBuilder: (BuildContext cxt, int index) => Container(
height: 1,
color: MyColors.borderE3Color,
),
@ -341,11 +318,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemBuilder: (BuildContext cxt, int index) =>
employeeItemView(
nonFavouriteUserList![index]),
separatorBuilder:
(BuildContext cxt, int index) => Container(
itemBuilder: (BuildContext cxt, int index) => employeeItemView(nonFavouriteUserList![index]),
separatorBuilder: (BuildContext cxt, int index) => Container(
height: 1,
color: MyColors.borderE3Color,
),
@ -365,9 +339,10 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Column(
children: [
12.height,
Stack(children: [
Stack(
children: [
Container(
padding:const EdgeInsets.all(5),
padding: const EdgeInsets.all(5),
child: SvgPicture.asset(
"assets/images/user.svg",
height: 48,
@ -377,39 +352,23 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
right: 0,
top: 0,
child: InkWell(
child: SvgPicture.asset(
'assets/icons/close.svg',
height:15,
width:15
),
child: SvgPicture.asset('assets/icons/close.svg', height: 15, width: 15),
onTap: () {
setState(() {
// provider.chatUsersList![index]
// .isChecked = false;
List<ChatUser> user = provider
.chatUsersList!
.where((ChatUser value) =>
value.userName ==
selectedUsers[index2]
.userName)
.toList();
List<ChatUser> user = provider.chatUsersList!.where((ChatUser value) => value.userName == selectedUsers[index2].userName).toList();
if (user.isNotEmpty) {
user.first.isChecked = false;
}
selectedUsers.remove(
selectedUsers[index2]);
selectedUsers.remove(selectedUsers[index2]);
});
},
))
],),
(selectedUsers![index2]
.userName!
.replaceFirst(".", " ")
.capitalizeFirstofEach ??
"")
.toText12(color: MyColors.darkTextColor)
.paddingOnly(left: 5, top: 5),
],
),
(selectedUsers![index2].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText12(color: MyColors.darkTextColor).paddingOnly(left: 5, top: 5),
selectedUsers![index2].isTyping!
? 'Typing...'
.toText10(
@ -420,10 +379,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
],
),
// IconButton(onPressed: (){}, icon: const Icon(Icons.close_outlined, color: Colors.red, size: 20)),
]);
}))
: 0.height,
@ -462,12 +418,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
width: 10,
height: 10,
decoration: BoxDecoration(
color: provider
.chatUsersList![index]
.userStatus ==
1
? MyColors.green2DColor
: Colors.red,
color: provider.chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
),
).circle(10),
)
@ -475,16 +426,9 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
),
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment:
CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
(provider.chatUsersList![index].userName!
.replaceFirst(".", " ")
.capitalizeFirstofEach ??
"")
.toText14(
color: MyColors.darkTextColor)
.paddingOnly(left: 11, top: 13),
(provider.chatUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor).paddingOnly(left: 11, top: 13),
provider.chatUsersList![index].isTyping!
? 'Typing...'
.toText10(
@ -497,14 +441,11 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
SizedBox(
width: 60,
child: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
if (provider.chatUsersList![index]
.unreadMessageCount! >
0)
if (provider.chatUsersList![index].unreadMessageCount! > 0)
Container(
alignment: Alignment.center,
width: 18,
@ -515,31 +456,22 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Radius.circular(20),
),
),
child: (provider
.chatUsersList![index]
.unreadMessageCount!
.toString())
child: (provider.chatUsersList![index].unreadMessageCount!.toString())
.toText10(
color: MyColors.white,
)
.center,
).paddingOnly(right: 10).center,
Checkbox(
value: provider
.chatUsersList![index].isChecked,
value: provider.chatUsersList![index].isChecked,
shape: CircleBorder(),
onChanged: (bool? value) {
setState(() {
provider.chatUsersList![index]
.isChecked = value;
if (provider.chatUsersList![index]
.isChecked ==
true) {
selectedUsers.add(provider
.chatUsersList![index]);
provider.chatUsersList![index].isChecked = value;
if (provider.chatUsersList![index].isChecked == true) {
selectedUsers.add(provider.chatUsersList![index]);
} else {
selectedUsers.remove(provider
.chatUsersList![index]);
selectedUsers.remove(provider.chatUsersList![index]);
}
});
},
@ -551,9 +483,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
),
);
},
separatorBuilder: (BuildContext context, int index) =>
const Divider(color: MyColors.lightGreyE5Color)
.paddingOnly(left: 59),
separatorBuilder: (BuildContext context, int index) => const Divider(color: MyColors.lightGreyE5Color).paddingOnly(left: 59),
).expanded,
],
).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded,
@ -614,11 +544,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Expanded(
child: (replacement.employeeDisplayName ?? "").toText12(),
),
Icon(Icons.star,
size: 16,
color: replacement.isFavorite!
? MyColors.yellowFavColor
: MyColors.borderCEColor),
Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
],
),
),
@ -643,9 +569,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(
color: value == groupValue
? MyColors.grey3AColor
: Colors.transparent,
color: value == groupValue ? MyColors.grey3AColor : Colors.transparent,
borderRadius: const BorderRadius.all(
Radius.circular(100),
),
@ -664,13 +588,13 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
void createGroup() async {
RegExp validCharacters = RegExp(r'^[a-zA-Z0-9_\-=@,\.;]+$');
if (!validCharacters.hasMatch(groupName)) {
// Utils.showToast(LocaleKeys.enterGroupName.tr());
Utils.showToast(LocaleKeys.enterGroupName.tr());
} else if (groupName.length < 10) {
Utils.showToast(LocaleKeys.groupNameshouldbe.tr());
} else {
List<ChatUser>? mainUsers = [];
ChatUser admin =
ChatUser.fromJson(AppState().chatDetails!.response!.toJson());
ChatUser admin = ChatUser.fromJson(AppState().chatDetails!.response!.toJson());
admin.isAdmin = true;
admin.userStatus = 2;
admin.unreadMessageCount = 0;
@ -687,10 +611,10 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
groupName: groupName,
adminUserId: AppState().chatDetails!.response!.id);
if(widget.groupDetails!.groupId !=null){
request.groupId =widget.groupDetails!.groupId;
if (widget.groupDetails!.groupId != null) {
request.groupId = widget.groupDetails!.groupId;
await provider.updateGroupAndUsers(request);
}else {
} else {
await provider.addGroupAndUsers(request);
}
Navigator.pop(context);

@ -0,0 +1,45 @@
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/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_details_card.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart';
class DisclosureIntroScreen extends StatelessWidget {
const DisclosureIntroScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.disclosure.tr(),
onHomeTapped: () {
Navigator.pop(context);
context.setLocale(provider.savedLocale);
},
onBackTapped: () {
Navigator.pop(context);
context.setLocale(provider.savedLocale);
},
),
body: Column(
children: <Widget>[
ListView(
padding: const EdgeInsets.all(21),
children: <Widget>[
DisclosureDetailsCard(disclosureDetailsCard: provider.disclosureDetailsModel),
],
).expanded,
1.divider,
DefaultButton("Start", () => provider.onStartDisclosurePressed(context)).insideContainer,
],
),
);
}
}

@ -0,0 +1,189 @@
import 'dart:async';
import 'dart:developer';
import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/marathon/demo_marathon_repo.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart';
class DisclosureProvider extends ChangeNotifier {
//************************************************ VARIABLES **********************************************************
final AppinioSwiperController swiperController = AppinioSwiperController();
DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected;
DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel();
List<DisclosureCardContent> cardContentList = <DisclosureCardContent>[];
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel();
List<DisclosureQuestionCardStatus> answerStatusesList = <DisclosureQuestionCardStatus>[];
DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question;
int? selectedOptionIndex;
String? selectedOptionId;
int? totalQualifiers;
Locale savedLocale = const Locale("en", "US");
bool iAmWinner = false;
bool isGettingQualifiers = false;
bool isPrivilegedWithMarathon = false;
bool _isLoading = false;
bool get isLoading => _isLoading;
set isLoading(bool value) {
_isLoading = value;
notifyListeners();
}
bool _isButtonEnabled = false;
bool get isButtonEnabled => _isButtonEnabled;
set isButtonEnabled(bool value) {
_isButtonEnabled = value;
notifyListeners();
}
int _currentQuestionNumber = 0;
int get currentQuestionNumber => _currentQuestionNumber;
set currentQuestionNumber(int value) {
_currentQuestionNumber = value;
notifyListeners();
}
String currentAdditionalText = "";
void updateCurrentAdditionalText(String value) {
currentAdditionalText = value;
notifyListeners();
}
void updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus value) {
currentQuestionSelectionStatus = value;
notifyListeners();
}
//************************************************ FUNCTIONS **********************************************************
Future<void> callNextQuestionApi() async {
if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) {
if (currentQuestionNumber == 0) {
for (int i = 1; i <= disclosureDetailsModel.totalQuestions!; i++) {
cardContentList.add(const DisclosureCardContent());
}
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
updateCardData();
if (Utils.isLoading) {
Utils.hideLoading(AppRoutes.navigatorKey.currentContext!);
}
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.disclosureScreen);
} else {
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
updateCardData();
}
notifyListeners();
}
}
Future<void> callPreviousQuestionApi() async {
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber - 2);
updateCardData(isForPrevious: true);
notifyListeners();
}
void updateCardData({bool isForPrevious = false}) {
if (isForPrevious) {
selectedOptionIndex = null;
currentQuestionNumber--;
cardContentList.add(const DisclosureCardContent());
cardContentList.add(const DisclosureCardContent());
swiperController.swipeLeft();
questionCardStatus = DisclosureQuestionCardStatus.question;
notifyListeners();
return;
}
if (currentQuestionNumber > 0) {
swiperController.swipeRight();
}
selectedOptionIndex = null;
currentQuestionNumber++;
questionCardStatus = DisclosureQuestionCardStatus.question;
notifyListeners();
}
void populateQuestionStatusesList() {
answerStatusesList.clear();
if (disclosureDetailsModel.totalQuestions != null) {
for (int i = 0; i < disclosureDetailsModel.totalQuestions!; i++) {
answerStatusesList.add(DisclosureQuestionCardStatus.question);
}
notifyListeners();
}
}
void updateCurrentQuestionOptionStatus({required DisclosureQuestionsOptionStatus status, required int selectedOptIndex, required int correctOptionIndex}) {
if (selectedOptIndex == 0) {
updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.correct);
} else if (selectedOptIndex == 1) {
updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.wrong);
}
for (int i = 0; i < currentQuestion.questionOptions!.length; i++) {
currentQuestion.questionOptions![i].optionStatus = DisclosureQuestionsOptionStatus.unSelected;
}
if (status == DisclosureQuestionsOptionStatus.wrong) {
currentQuestion.questionOptions![correctOptionIndex].optionStatus = DisclosureQuestionsOptionStatus.correct; // if person's answer is wrong we have to show him the actual right answer
}
currentQuestion.questionOptions![selectedOptIndex].optionStatus = status;
selectedOptionId = currentQuestion.questionOptions![selectedOptIndex].id;
selectedOptionIndex = selectedOptIndex;
notifyListeners();
}
void updateQuestionCardStatus(DisclosureQuestionCardStatus status) {
questionCardStatus = status;
notifyListeners();
}
void updateAnswerStatusesList(DisclosureQuestionCardStatus status) {
answerStatusesList[currentQuestionNumber - 1] = status;
notifyListeners();
}
void resetValues() async {
_currentQuestionNumber = 0;
iAmWinner = false;
cardContentList.clear();
isButtonEnabled = false;
currentQuestion = DisclosureQuestionModel();
if (answerStatusesList.isNotEmpty) {
for (int i = 0; i < answerStatusesList.length; i++) {
answerStatusesList[i] = DisclosureQuestionCardStatus.question;
}
}
currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected;
AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale);
notifyListeners();
}
Future<void> getDisclosureDetails() async {
isLoading = true;
notifyListeners();
disclosureDetailsModel = await DisclosureRepo().getDisclosureDetails();
populateQuestionStatusesList();
isLoading = false;
notifyListeners();
}
Future<void> onStartDisclosurePressed(BuildContext context) async {
await callNextQuestionApi();
}
}

@ -0,0 +1,115 @@
import 'dart:async';
import 'dart:developer';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.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/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_progress_container.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
import 'package:provider/provider.dart';
class DisclosureScreen extends StatelessWidget {
const DisclosureScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
bool isLastQuestion = provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!;
bool isButtonDisabled = (provider.currentQuestionSelectionStatus != DisclosureQuestionsOptionStatus.correct && provider.currentQuestionSelectionStatus != DisclosureQuestionsOptionStatus.wrong) ||
(provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentAdditionalText.isEmpty) && !isLastQuestion ||
(isLastQuestion && provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.wrong);
return WillPopScope(
child: Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.disclosure.tr(),
onHomeTapped: () {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
onTap: () {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
},
onBackTapped: () async {
if (provider.currentQuestionNumber > 1) {
await provider.callPreviousQuestionApi();
return;
}
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
},
),
body: Column(
children: <Widget>[
ListView(
shrinkWrap: true,
children: <Widget>[
10.height,
DisclosureProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
const DisclosureQuestionCard().paddingOnly(top: 12, left: 21, right: 21),
],
).expanded,
DefaultButton(
isLastQuestion ? LocaleKeys.submit.tr() : LocaleKeys.next.tr(),
isButtonDisabled
? null
: () async {
if (isLastQuestion) {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
return;
}
provider.updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.unSelected);
provider.updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer);
await provider.callNextQuestionApi();
},
textColor: !isButtonDisabled ? MyColors.whiteColor : MyColors.greyACColor,
color: isLastQuestion ? MyColors.greenColor : null,
).insideContainer,
],
),
),
onWillPop: () async {
if (provider.currentQuestionNumber > 1) {
await provider.callPreviousQuestionApi();
return Future<bool>.value(false);
}
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
return Future<bool>.value(false);
},
);
}
}

@ -0,0 +1,176 @@
import 'dart:ui' as ui;
import 'package:auto_size_text/auto_size_text.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/current_remaining_time.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/main.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
class DisclosureCountdownTimerForMainScreen extends StatelessWidget {
final int timeToMarathon;
final DisclosureProvider provider;
DisclosureCountdownTimerForMainScreen({
Key? key,
required this.provider,
required this.timeToMarathon,
}) : 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(
height: 22 / 27,
color: MyColors.white,
fontSize: isTablet ? 30 : 15,
fontStyle: FontStyle.italic,
letterSpacing: -1.44,
fontWeight: FontWeight.bold,
);
final TextStyle styleTextMarathon = const TextStyle(
fontSize: 10,
fontStyle: FontStyle.normal,
fontWeight: FontWeight.w600,
color: MyColors.grey57Color,
letterSpacing: -0.4,
);
final TextStyle styleDigitMarathon = const TextStyle(
height: 23 / 24,
color: MyColors.darkTextColor,
fontSize: 34,
letterSpacing: -1.44,
fontWeight: FontWeight.bold,
);
Widget buildSeparator() {
return AutoSizeText(
" : ",
maxFontSize: 24,
minFontSize: 20,
style: styleDigitHome,
);
}
Widget getTimeDigit(String text) {
return AutoSizeText(
text,
maxFontSize: 24,
minFontSize: 20,
style: styleDigitHome,
);
}
Widget getTimeText(String text) {
return AutoSizeText(
text,
minFontSize: 7,
maxFontSize: 8,
style: styleTextHome,
);
}
Widget buildEmptyWidget() {
return Directionality(
textDirection: ui.TextDirection.ltr,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
children: <Widget>[
getTimeDigit("00"),
getTimeText(LocaleKeys.days.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
getTimeDigit("00"),
getTimeText(LocaleKeys.hours.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
getTimeDigit("00"),
getTimeText(LocaleKeys.minutes.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
getTimeDigit("00"),
getTimeText(LocaleKeys.seconds.tr()),
],
),
],
),
);
}
Widget buildCountdownTimer(CurrentRemainingTime? time) {
if (time == null) {
return buildEmptyWidget();
}
return Directionality(
textDirection: ui.TextDirection.ltr,
child: Row(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Column(
children: <Widget>[
time.days == null ? getTimeDigit("00") : getTimeDigit(time.days! < 10 ? "0${time.days.toString()}" : time.days.toString()),
getTimeText(LocaleKeys.days.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.hours == null ? getTimeDigit("00") : getTimeDigit(time.hours! < 10 ? "0${time.hours.toString()}" : time.hours.toString()),
getTimeText(LocaleKeys.hours.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.min == null ? getTimeDigit("00") : getTimeDigit(time.min! < 10 ? "0${time.min.toString()}" : time.min.toString()),
getTimeText(LocaleKeys.minutes.tr()),
],
),
buildSeparator(),
Column(
children: <Widget>[
time.sec == null ? getTimeDigit("00") : getTimeDigit(time.sec! < 10 ? "0${time.sec.toString()}" : time.sec.toString()),
getTimeText(LocaleKeys.seconds.tr()),
],
),
],
),
);
}
@override
Widget build(BuildContext context) {
return CountdownTimer(
endTime: timeToMarathon,
onEnd: null,
widgetBuilder: (BuildContext context, CurrentRemainingTime? time) {
return buildCountdownTimer(time);
},
);
}
}

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
class DisclosureCustomStatusWidget extends StatelessWidget {
final Widget asset;
final Widget title;
final Widget subTitle;
const DisclosureCustomStatusWidget({
Key? key,
required this.asset,
required this.title,
required this.subTitle,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
height: 440,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
asset,
50.height,
title,
10.height,
subTitle,
],
),
);
}
}

@ -0,0 +1,556 @@
// import 'dart:developer';
// import 'dart:math' as math;
//
// import 'package:easy_localization/easy_localization.dart';
// import 'package:flutter/foundation.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/decorations_helper.dart';
// import 'package:mohem_flutter_app/classes/utils.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/ui/disclosure/disclosure_provider.dart';
// import 'package:mohem_flutter_app/ui/disclosure/widgets/countdown_timer_main_screen.dart';
// import 'package:provider/provider.dart';
//
// // It is used to pass a dummy time to test Marathon
// int dummyTime = DateTime.now().millisecondsSinceEpoch + 8690;
//
// class DisclosureBanner extends StatelessWidget {
// const DisclosureBanner({Key? key}) : super(key: key);
//
// Widget getUnPrivilegedMarathon(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.getReadyForContest.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,
// ),
// ),
// ],
// ).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),
// Container(
// height: double.infinity,
// width: double.infinity,
// color: Colors.black.withOpacity(0.6),
// child: const Icon(
// Icons.lock_rounded,
// color: MyColors.lightGreyIconColor,
// ),
// ),
// ],
// ),
// );
// }
//
// 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) {
// DisclosureProvider provider = context.read<DisclosureProvider>();
// // if(provider.isUserWaiting) {
// // provider.isUserWaiting = false;
// // provider.getMarathonDetailsFromApi();
// // }
// return !provider.isPrivilegedWithMarathon
// ? getUnPrivilegedMarathon(context)
// : provider.isUpComingMarathon
// ? 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.getReadyForContest.tr(),
// style: TextStyle(
// fontSize: isTablet ? 20 : 11,
// fontStyle: FontStyle.italic,
// fontWeight: FontWeight.w600,
// color: MyColors.white.withOpacity(0.83),
// letterSpacing: -0.4,
// ),
// ),
// Flexible(
// child: Text(
// displayLocalizedContent(
// isPhoneLangArabic: AppState().isArabic(context),
// selectedLanguage: provider.marathonDetailModel.selectedLanguage ?? 0,
// englishContent: provider.marathonDetailModel.titleEn ?? "",
// arabicContent: provider.marathonDetailModel.titleAr ?? "",
// ),
// overflow: TextOverflow.ellipsis,
// style: TextStyle(
// fontStyle: FontStyle.italic,
// fontSize: isTablet ? 30 : 19,
// fontWeight: FontWeight.bold,
// color: MyColors.white.withOpacity(0.83),
// height: 32 / 22,
// ),
// ),
// ),
// isTablet ? 10.height : 3.height,
// DisclosureCountdownTimerForMainScreen(
// timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch,
// provider: provider,
// ),
// ],
// ).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),
// !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 = DateTime.parse(provider.marathonDetailModel.startTime!).difference(DateTime.now()).inMinutes;
// if (remainingTimeInMinutes > 5 && provider.marathonDetailModel.sponsors != null && provider.marathonDetailModel.sponsors!.isNotEmpty) {
// Utils.showLoading(context);
// // try {
// // await provider.initializeVideoPlayer().then((_) {
// // Utils.hideLoading(context);
// // provider.startTimerForSponsorVideo();
// // Navigator.pushNamed(context, AppRoutes.marathonSponsorVideoScreen);
// // });
// // } catch (e) {
// // if (kDebugMode) {
// // log("Error in VideoPlayer: ${e.toString()}");
// // }
// // Utils.hideLoading(context);
// // Navigator.pushNamed(context, AppRoutes.marathonIntroScreen);
// // }
// } else {
// Navigator.pushNamed(context, AppRoutes.marathonIntroScreen);
// }
// provider.updateLanguageAsPerMarathon(context, provider.isUpComingMarathon ? provider.marathonDetailModel : provider.demoMarathonDetailModel);
// }),
// )
// : getNoUpcomingMarathonWidget(context);
// }
// }

@ -0,0 +1,76 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart';
class DisclosureDetailsCard extends StatelessWidget {
final DisclosureDetailsModel disclosureDetailsCard;
const DisclosureDetailsCard({Key? key, required this.disclosureDetailsCard}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 14),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0,
englishContent: disclosureDetailsCard.titleEn ?? "",
arabicContent: disclosureDetailsCard.titleAr ?? "",
).toText20(color: MyColors.textMixColor, isBold: true),
Row(
children: <Widget>[
Flexible(
child: displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0,
englishContent: disclosureDetailsCard.descEn ?? "",
arabicContent: disclosureDetailsCard.descAr ?? "",
).toText14(color: MyColors.grey77Color),
)
],
),
if (disclosureDetailsCard.sponsors != null && disclosureDetailsCard.sponsors!.isNotEmpty) ...<Widget>[
Row(
children: <Widget>[
"${LocaleKeys.sponsoredBy.tr()} ".toText16(color: MyColors.grey77Color),
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0,
englishContent: disclosureDetailsCard.sponsors?.first.nameEn ?? "",
arabicContent: disclosureDetailsCard.sponsors?.first.nameAr ?? "",
).toText16(color: MyColors.darkTextColor, isBold: true),
],
),
10.height,
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Image.network(
ApiConsts.marathonBaseUrlServices + disclosureDetailsCard.sponsors!.first.logo!,
height: 50,
width: 150,
fit: BoxFit.contain,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return Image.asset("assets/images/logos/main_mohemm_logo.png", height: 50, width: 150);
},
)
],
),
]
],
),
);
}
}

@ -0,0 +1,37 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
class DisclosureHeader extends StatelessWidget {
const DisclosureHeader({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
color: MyColors.kWhiteColor,
width: double.infinity,
height: 65,
padding: const EdgeInsets.symmetric(horizontal: 25, vertical: 15),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
LocaleKeys.brainMarathon.tr().toText24(isBold: true),
IconButton(
padding: EdgeInsets.zero,
icon: const Icon(Icons.close, size: 28),
color: MyColors.black,
constraints: const BoxConstraints(),
onPressed: () {
Navigator.pop(context);
},
)
],
),
),
);
}
}

@ -0,0 +1,117 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.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/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
class DisclosureProgressContainer extends StatelessWidget {
final DisclosureProvider provider;
const DisclosureProgressContainer({Key? key, required this.provider}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
width: double.infinity,
decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.fromLTRB(13, 5, 13, 18),
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
5.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
decoration: BoxDecoration(color: MyColors.greenColor, borderRadius: BorderRadius.circular(5)),
padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8),
child: "${provider.currentQuestionNumber.toString()} / ${provider.disclosureDetailsModel.totalQuestions.toString()} ${LocaleKeys.disclosure.tr()}".toText12(color: MyColors.white),
),
],
),
12.height,
stepper(
provider.currentQuestionNumber,
provider.answerStatusesList,
provider.disclosureDetailsModel.totalQuestions!,
),
8.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
"${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(),
],
),
],
),
);
}
Color getStepColor(DisclosureQuestionCardStatus status) {
switch (status) {
case DisclosureQuestionCardStatus.question:
return MyColors.yellowColorII;
case DisclosureQuestionCardStatus.wrongAnswer:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.correctAnswer:
return MyColors.greenColor;
case DisclosureQuestionCardStatus.skippedAnswer:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.completed:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.findingWinner:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.winnerFound:
return MyColors.lightGreyDeColor;
}
}
Widget stepper(int value, List<DisclosureQuestionCardStatus> statusesList, int totalQuestions) {
return SizedBox(
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
for (int i = 0; i < totalQuestions; i++)
if (value <= i) roundContainer(MyColors.lightGreyDeColor, i != 0) else roundContainer(getStepColor(statusesList[i]), i != 0)
],
),
);
}
Widget roundContainer(Color color, bool isNeedLeftBorder) {
if (isNeedLeftBorder) {
return Row(
children: <Widget>[
Expanded(
child: AnimatedContainer(
duration: const Duration(milliseconds: 800), // Set animation duration
height: 6, // Change thickness if needed
color: color,
),
),
Container(
margin: EdgeInsets.zero,
padding: EdgeInsets.zero,
width: 10,
height: 10,
decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)),
),
],
).expanded;
}
return Container(
margin: EdgeInsets.zero,
padding: EdgeInsets.zero,
width: 10,
height: 10,
decoration: BoxDecoration(shape: BoxShape.circle, color: color, border: Border.all(color: color, width: 2)),
);
}
}

@ -0,0 +1,216 @@
import 'dart:developer';
import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.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/decorations_helper.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:provider/provider.dart';
class DisclosureQuestionCard extends StatelessWidget {
const DisclosureQuestionCard({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.read<DisclosureProvider>();
return CupertinoPageScaffold(
child: provider.cardContentList.isEmpty
? Lottie.asset(MyLottieConsts.hourGlassLottie, height: 250).paddingOnly(top: 50)
: Consumer<DisclosureProvider>(
builder: (BuildContext context, DisclosureProvider provider, Widget? child) {
return Container(
constraints: BoxConstraints(minHeight: MediaQuery.of(context).size.height * .43),
height: (provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentQuestionNumber != provider.disclosureDetailsModel.totalQuestions!)
? MediaQuery.of(context).size.height * .6
: MediaQuery.of(context).size.height * .43,
width: double.infinity,
child: AppinioSwiper(
duration: const Duration(milliseconds: 400),
padding: EdgeInsets.zero,
isDisabled: true,
controller: provider.swiperController,
unswipe: (int index, AppinioSwiperDirection direction) {},
onSwipe: (int index, AppinioSwiperDirection direction) {},
cards: provider.cardContentList,
),
);
},
),
);
}
}
class DisclosureCardContent extends StatelessWidget {
const DisclosureCardContent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: CupertinoColors.white,
boxShadow: <BoxShadow>[
BoxShadow(
color: CupertinoColors.systemGrey.withOpacity(0.2),
spreadRadius: 3,
blurRadius: 7,
offset: const Offset(0, 3),
)
],
),
alignment: Alignment.center,
child: Column(
children: <Widget>[
Flexible(
child: Container(
width: double.infinity,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
),
constraints: BoxConstraints(minHeight: MediaQuery.of(context).size.height * .23),
child: Padding(
padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
child: SingleChildScrollView(
child: Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
englishContent: provider.currentQuestion.titleEn ?? "",
arabicContent: provider.currentQuestion.titleAr ?? "",
),
style: const TextStyle(
color: MyColors.darkTextColor,
fontSize: 15,
height: 21 / 14,
fontWeight: FontWeight.w500,
),
),
),
),
),
),
24.height,
const DisclosureAnswerContent(),
],
),
);
}
}
class DisclosureAnswerContent extends StatelessWidget {
const DisclosureAnswerContent({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return Container(
padding: const EdgeInsets.only(bottom: 20, left: 8, right: 8),
decoration: const BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
),
child: provider.currentQuestion.questionOptions != null
? Column(
children: [
Row(
children: List<Widget>.generate(
provider.currentQuestion.questionOptions!.length,
(int index) => Expanded(
child: DisclosureAnswerTileForText(
index: index,
onAnswerTapped: () => provider.updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.selected, selectedOptIndex: index, correctOptionIndex: -1), //
).paddingAll(8),
),
),
),
if (provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentQuestionNumber != provider.disclosureDetailsModel.totalQuestions!) ...[
15.height,
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
englishContent: provider.currentQuestion.descEn ?? "",
arabicContent: provider.currentQuestion.descAr ?? "",
),
style: const TextStyle(
color: MyColors.darkTextColor,
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w500,
),
).paddingOnly(left: 8, right: 8),
8.height,
DynamicTextFieldWidget(
LocaleKeys.pleaseWriteHere.tr(),
provider.currentAdditionalText,
lines: 3,
onChange: (value) {
provider.updateCurrentAdditionalText(value);
},
).paddingOnly(left: 8, right: 8),
],
],
)
: const SizedBox(),
);
}
}
class DisclosureAnswerTileForText extends StatelessWidget {
final int index;
final Function() onAnswerTapped;
const DisclosureAnswerTileForText({Key? key, required this.index, required this.onAnswerTapped}) : super(key: key);
Color getAnswerTextColor(DisclosureQuestionsOptionStatus status) {
switch (status) {
case DisclosureQuestionsOptionStatus.correct:
return MyColors.white;
case DisclosureQuestionsOptionStatus.wrong:
return MyColors.white;
case DisclosureQuestionsOptionStatus.selected:
return MyColors.white;
case DisclosureQuestionsOptionStatus.unSelected:
return MyColors.darkTextColor;
}
}
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return InkWell(
onTap: () => onAnswerTapped(),
child: Container(
alignment: Alignment.centerLeft,
decoration: MyDecorations.getAnswersContainerColorForDisclosure(
provider.currentQuestion.questionOptions![index].optionStatus!,
isLastQuestion: provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!,
isAgreeSelected: provider.selectedOptionIndex == 0,
),
child: Center(
child: displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
englishContent: provider.currentQuestion.questionOptions![index].titleEn ?? "",
arabicContent: provider.currentQuestion.questionOptions![index].titleAr ?? "",
).toText16(color: getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)).paddingOnly(top: 13, bottom: 13),
),
),
);
}
}

@ -0,0 +1,51 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
class DisclosureQuestionCardBuilder extends StatelessWidget {
final WidgetBuilder onQuestion;
final WidgetBuilder onCompleted;
final WidgetBuilder onWrongAnswer;
final WidgetBuilder onCorrectAnswer;
final WidgetBuilder onWinner;
final WidgetBuilder onSkippedAnswer;
final WidgetBuilder onFindingWinner;
final DisclosureQuestionCardStatus questionCardStatus;
const DisclosureQuestionCardBuilder({
Key? key,
required this.onQuestion,
required this.onCompleted,
required this.onCorrectAnswer,
required this.onWinner,
required this.onSkippedAnswer,
required this.onWrongAnswer,
required this.onFindingWinner,
required this.questionCardStatus,
}) : super(key: key);
@override
Widget build(BuildContext context) {
switch (questionCardStatus) {
case DisclosureQuestionCardStatus.question:
return onQuestion(context);
case DisclosureQuestionCardStatus.wrongAnswer:
return onWrongAnswer(context);
case DisclosureQuestionCardStatus.correctAnswer:
return onCorrectAnswer(context);
case DisclosureQuestionCardStatus.completed:
return onCompleted(context);
case DisclosureQuestionCardStatus.winnerFound:
return onWinner(context);
case DisclosureQuestionCardStatus.findingWinner:
return onFindingWinner(context);
case DisclosureQuestionCardStatus.skippedAnswer:
return onSkippedAnswer(context);
}
}
}

@ -0,0 +1,55 @@
// import 'package:easy_localization/easy_localization.dart';
// import 'package:flutter/material.dart';
// import 'package:lottie/lottie.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/classes/lottie_consts.dart';
// import 'package:mohem_flutter_app/extensions/string_extensions.dart';
// import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
// import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
// import 'package:mohem_flutter_app/ui/disclosure/widgets/countdown_timer_detail_screen.dart';
//
//
// class DisclosureTimerCard extends StatelessWidget {
// final int timeToMarathon;
// final DisclosureProvider provider;
//
// const DisclosureTimerCard({
// Key? key,
// required this.provider,
// required this.timeToMarathon,
// }) : super(key: key);
//
// @override
// Widget build(BuildContext context) {
// return Container(
// width: double.infinity,
// decoration: MyDecorations.shadowDecoration,
// padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14),
// child: Column(
// children: <Widget>[
// Row(
// children: <Widget>[
// "${LocaleKeys.gameDate.tr()} ".toText16(color: MyColors.grey77Color),
// DateUtil.getMonthDayYearDateFormatted(DateTime.parse(provider.marathonDetailModel.startTime!)).toText16(color: MyColors.darkTextColor, isBold: true),
// ],
// ),
// Row(
// children: <Widget>[
// "${LocaleKeys.gameTime.tr()} ".toText16(color: MyColors.grey77Color),
// DateUtil.formatDateToTimeLang(DateTime.parse(provider.marathonDetailModel.startTime!), AppState().isArabic(context)).toText16(color: MyColors.darkTextColor, isBold: true),
// ],
// ),
// Lottie.asset(MyLottieConsts.hourGlassLottie, height: 200),
// DisclosureCountdownTimerForDetailScreen(
// // timeToMarathon: dummyTime,
// timeToMarathon: timeToMarathon,
// provider: provider,
// ),
// ],
// ),
// );
// }
// }

@ -22,6 +22,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/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.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/services_widget.dart';
@ -49,6 +50,7 @@ class DashboardScreen extends StatefulWidget {
class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingObserver {
late DashboardProviderModel data;
late MarathonProvider marathonProvider;
late DisclosureProvider disclosureProvider;
late ChatProviderModel cProvider;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
@ -63,6 +65,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
scheduleMicrotask(() {
data = Provider.of<DashboardProviderModel>(context, listen: false);
marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
disclosureProvider = Provider.of<DisclosureProvider>(context, listen: false);
cProvider = Provider.of<ChatProviderModel>(context, listen: false);
if (checkIfPrivilegedForChat()) {
_bHubCon();
@ -152,6 +155,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMenuEntries();
data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi();
disclosureProvider.getDisclosureDetails();
marathonProvider.getMarathonTutorial();
if (isFromInit) {
checkERMChannel();
@ -370,9 +374,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12, right: 12),
@ -469,6 +471,8 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
? const OffersShimmerWidget()
: InkWell(
onTap: () {
if (AppState().isDisclosureEnabled) return;
navigateToDetails(data.getOffersList[index]);
},
child: SizedBox(
@ -486,10 +490,11 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
),
child: ClipRRect(
borderRadius: const BorderRadius.all(
Radius.circular(50),
),
child: Stack(
fit: StackFit.expand,
children: [
ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(50)),
child: Hero(
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
transitionOnUserGestures: true,
@ -499,12 +504,24 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
),
),
),
if (AppState().isDisclosureEnabled) ...[
Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(100), color: Colors.grey.withOpacity(0.6)),
child: const Icon(
Icons.lock_outline,
color: MyColors.grey57Color,
size: 40,
),
),
]
],
),
),
4.height,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
child: AppState().isArabic(context) ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
),
],
),
@ -601,7 +618,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
BottomNavigationBarItem(
icon: SvgPicture.asset(
"assets/icons/create_req.svg",
color: currentIndex == 1 ? MyColors.grey3AColor : MyColors.grey98Color,
color: AppState().isDisclosureEnabled ? MyColors.greyC4Color : (currentIndex == 1 ? MyColors.grey3AColor : MyColors.grey98Color),
).paddingAll(4),
label: LocaleKeys.mowadhafhiRequest.tr(),
),
@ -611,7 +628,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [
SvgPicture.asset(
"assets/icons/work_list.svg",
color: currentIndex == 2 ? MyColors.grey3AColor : MyColors.grey98Color,
color: AppState().isDisclosureEnabled ? MyColors.greyC4Color : (currentIndex == 2 ? MyColors.grey3AColor : MyColors.grey98Color),
).paddingAll(4),
Consumer<DashboardProviderModel>(
builder: (BuildContext cxt, DashboardProviderModel data, Widget? child) {
@ -637,7 +654,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
BottomNavigationBarItem(
icon: SvgPicture.asset(
"assets/icons/item_for_sale.svg",
color: currentIndex == 3 ? MyColors.grey3AColor : MyColors.grey98Color,
color: AppState().isDisclosureEnabled ? MyColors.greyC4Color : (currentIndex == 3 ? MyColors.grey3AColor : MyColors.grey98Color),
).paddingAll(4),
label: LocaleKeys.itemsForSale.tr(),
),
@ -647,13 +664,15 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [
SvgPicture.asset(
"assets/icons/chat/chat.svg",
color: !checkIfPrivilegedForChat()
color: AppState().isDisclosureEnabled
? MyColors.greyC4Color
: (!checkIfPrivilegedForChat()
? MyColors.lightGreyE3Color
: currentIndex == 4
? MyColors.grey3AColor
: cProvider.disbaleChatForThisUser
? MyColors.lightGreyE3Color
: MyColors.grey98Color,
: MyColors.grey98Color),
).paddingAll(4),
Consumer<ChatProviderModel>(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) {
@ -681,10 +700,14 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
unselectedLabelStyle: const TextStyle(fontSize: 10, color: MyColors.grey98Color, fontWeight: FontWeight.w600),
type: BottomNavigationBarType.fixed,
selectedItemColor: MyColors.grey3AColor,
unselectedItemColor: AppState().isDisclosureEnabled ? MyColors.greyC4Color : null,
backgroundColor: MyColors.backgroundColor,
selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28),
unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28),
onTap: (int index) {
if (AppState().isDisclosureEnabled) {
return;
}
if (index == 1) {
Navigator.pushNamed(context, AppRoutes.mowadhafhi);
} else if (index == 2) {

@ -2,6 +2,7 @@ import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/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/config/routes.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
@ -14,6 +15,16 @@ import 'package:provider/provider.dart';
class MenusWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget disabledWidget = Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(10), color: Colors.grey.withOpacity(0.6)),
child: const Icon(
Icons.lock_outline,
color: MyColors.grey57Color,
size: 40,
),
);
List<int> namesColor = [0xff125765, 0xff239D8F, 0xff2BB8A8, 0xff1D92AA];
return Consumer<DashboardProviderModel>(
@ -29,7 +40,9 @@ class MenusWidget extends StatelessWidget {
? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context, showLoading: true);
})
: Container(
: Stack(
children: [
Container(
decoration: BoxDecoration(
color: Color(namesColor[0]),
borderRadius: BorderRadius.circular(10),
@ -49,14 +62,22 @@ class MenusWidget extends StatelessWidget {
)
],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
),
if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.workList);
}),
data.isMissingSwipeLoading
? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context);
})
: Container(
: Stack(
children: [
Container(
decoration: BoxDecoration(
color: Color(namesColor[1]),
borderRadius: BorderRadius.circular(10),
@ -76,14 +97,22 @@ class MenusWidget extends StatelessWidget {
)
],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
),
if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS"));
}),
data.isLeaveTicketBalanceLoading
? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context);
})
: Container(
: Stack(
children: [
Container(
decoration: BoxDecoration(
color: Color(namesColor[2]),
borderRadius: BorderRadius.circular(10),
@ -103,14 +132,22 @@ class MenusWidget extends StatelessWidget {
)
],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
),
if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.leaveBalance);
}),
data.isLeaveTicketBalanceLoading
? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context);
})
: Container(
: Stack(
children: [
Container(
decoration: BoxDecoration(
color: Color(namesColor[3]),
borderRadius: BorderRadius.circular(10),
@ -130,8 +167,14 @@ class MenusWidget extends StatelessWidget {
)
],
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
),
if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(
() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS"));
},
)

@ -1,7 +1,10 @@
import 'dart:developer';
import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/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/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -49,11 +52,14 @@ class ServicesWidget extends StatelessWidget {
padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13),
scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) {
log("data.homeMenus![parentIndex].menuEntiesList[index].prompt: ${data.homeMenus![parentIndex].menuEntiesList[index].prompt}");
return AspectRatio(
aspectRatio: 105 / 105,
child: data.isServicesMenusLoading
? ServicesMenuShimmer()
: Container(
: Stack(
children: [
Container(
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(15),
@ -69,9 +75,7 @@ class ServicesWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(AppState().isArabic(context)
? getMenuIconAr(data.homeMenus![parentIndex].menuEntiesList[index].prompt!)
: getMenuIconEn(data.homeMenus![parentIndex].menuEntiesList[index].prompt!)),
SvgPicture.asset(AppState().isArabic(context) ? getMenuIconAr(data.homeMenus![parentIndex].menuEntiesList[index].prompt!) : getMenuIconEn(data.homeMenus![parentIndex].menuEntiesList[index].prompt!)),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
@ -83,7 +87,24 @@ class ServicesWidget extends StatelessWidget {
)
],
).paddingOnly(left: 10, right: 10, bottom: 10, top: 12),
),
if (AppState().isDisclosureEnabled && (parentIndex == 0 && index != 0) || (parentIndex > 0)) ...[
Container(
width: double.infinity,
height: double.infinity,
decoration: BoxDecoration(borderRadius: BorderRadius.circular(15), color: Colors.grey.withOpacity(0.6)),
child: const Icon(
Icons.lock_outline,
color: MyColors.grey57Color,
size: 40,
),
),
]
],
).onPress(() {
if (AppState().isDisclosureEnabled && (parentIndex == 0 && index != 0) || (parentIndex > 0)) {
return;
}
handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]);
}),
);
@ -220,8 +241,7 @@ class ServicesWidget extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.monthlyPaySlip);
}
} else {
List<GetMenuEntriesList> _menuList =
pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && (element.menuEntryType == "FUNCTION" || element.menuEntryType == "MENU")).toList() ?? [];
List<GetMenuEntriesList> _menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && (element.menuEntryType == "FUNCTION" || element.menuEntryType == "MENU")).toList() ?? [];
Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(menuEntry.prompt!, _menuList.isEmpty ? menuList : _menuList));
}
return;

@ -76,7 +76,7 @@ class _OffersAndDiscountsDetailsState extends State<OffersAndDiscountsDetails> {
: getOffersList[0].titleEn!.toText22(isBold: true, color: const Color(0xff2B353E)).center,
Html(
data: AppState().isArabic(context) ? getOffersList[0].descriptionAr! : getOffersList[0].descriptionEn ?? "",
onLinkTap: (String? url, RenderContext context, Map<String, String> attributes, _) {
onLinkTap: (String? url, Map<String, String> attributes, _) {
launchUrl(Uri.parse(url!));
},
),

@ -60,6 +60,13 @@ class DefaultButton extends StatelessWidget {
MyColors.yellowColorII,
],
)
: color == MyColors.greenColor
? const LinearGradient(
colors: <Color>[
MyColors.greenColor,
MyColors.greenColor,
],
)
: LinearGradient(
transform: const GradientRotation(.83),
begin: Alignment.topRight,

Loading…
Cancel
Save