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": "حزين! لم يفز أحد اليوم.", "noWinner": "حزين! لم يفز أحد اليوم.",
"myTeam": "فريقي", "myTeam": "فريقي",
"youCanPlayDemo": "لكن يمكنك لعب العرض", "youCanPlayDemo": "لكن يمكنك لعب العرض",
"group" : "مجموعة", "group": "مجموعة",
"searchGroup": "مجموعة البحث", "searchGroup": "مجموعة البحث",
"connectHmgWifi": "قم بتوصيل HMG WIFI", "connectHmgWifi": "قم بتوصيل HMG WIFI",
"connectedHmgWifi": "اتصال HMG WIFI", "connectedHmgWifi": "اتصال HMG WIFI",
@ -544,5 +544,45 @@
"addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.", "addAtLeastOneAttachment": "الرجاء إضافة مرفق واحد على الأقل.",
"pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون", "pleaseClickButtonToJoinMarathon": "الرجاء الضغط على الزر أدناه للانضمام إلى الماراثون",
"youCannotJoinTheMarathon": "لا يمكنك الانضمام إلى الماراثون لأنك تجاوزت الحد الزمني", "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", "open": "open",
"addAtLeastOneAttachment": "Please add at least one attachment.", "addAtLeastOneAttachment": "Please add at least one attachment.",
"pleaseClickButtonToJoinMarathon": "Press the button below to join the Marathon.", "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:convert';
import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:logger/logger.dart' as L; 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/marathon_model.dart';
import 'package:mohem_flutter_app/models/marathon/question_model.dart'; import 'package:mohem_flutter_app/models/marathon/question_model.dart';
@ -23,3 +26,23 @@ class DemoMarathonRepo {
return currentQuestion; 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"); final PostParamsModel _postParamsInitConfig = PostParamsModel(channel: 31, versionID: 8.2, mobileType: Platform.isAndroid ? "android" : "ios");
void setPostParamsInitConfig() { void setPostParamsInitConfig() {
isAuthenticated = false; isAuthenticated = false;
isLogged = false; isLogged = false;
@ -194,4 +193,8 @@ class AppState {
} }
bool cancelRequestTrancsection = true; bool cancelRequestTrancsection = true;
bool isDisclosureEnabled = true;
set setIsDisclosureEnabled(v) => isDisclosureEnabled = v;
} }

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

File diff suppressed because it is too large Load Diff

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

@ -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/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/provider/eit_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/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:mohem_flutter_app/ui/marathon/marathon_provider.dart';
import 'package:month_year_picker/month_year_picker.dart'; import 'package:month_year_picker/month_year_picker.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart'; import 'package:provider/single_child_widget.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
bool isDisclosureModuleEnabled = true;
// test uat account // test uat account
// username 199067 // username 199067
@ -74,6 +76,9 @@ Future<void> main() async {
ChangeNotifierProvider<MarathonProvider>( ChangeNotifierProvider<MarathonProvider>(
create: (_) => MarathonProvider(), create: (_) => MarathonProvider(),
), ),
ChangeNotifierProvider<DisclosureProvider>(
create: (_) => DisclosureProvider(),
),
// ChangeNotifierProvider<ChatCallProvider>( // ChangeNotifierProvider<ChatCallProvider>(
// create: (_) => 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/drawer_marathon.svg", LocaleKeys.brainMarathon.tr(), AppRoutes.marathonIntroScreen),
DrawerMenuItem("assets/images/drawer/change_password.svg", LocaleKeys.changePassword.tr(), AppRoutes.changePassword), 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(); notifyListeners();
} }
@ -158,11 +161,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
logger.wtf(ex); logger.wtf(ex);
if (showLoading) Utils.hideLoading(context); if (showLoading) Utils.hideLoading(context);
notifyListeners(); notifyListeners();
Utils.handleException(ex, context, (err) { Utils.handleException(ex, context, (String err) {
Utils.hideLoading(context); Utils.hideLoading(context);
showDialog( showDialog(
context: context, context: context,
builder: (cxt) => ConfirmDialog( builder: (BuildContext cxt) => ConfirmDialog(
message: err, message: err,
onTap: () { onTap: () {
Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false); Navigator.pushNamedAndRemoveUntil(cxt, AppRoutes.login, (Route<dynamic> route) => false);
@ -211,11 +214,11 @@ class DashboardProviderModel with ChangeNotifier, DiagnosticableTreeMixin {
void fetchListMenu() async { void fetchListMenu() async {
try { try {
List<ListMenu> menuList = await DashboardApiClient().getListMenu(); 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) { if (findMyRequest.isNotEmpty) {
drawerMenuItemList.insert(3, DrawerMenuItem("assets/images/drawer/my_requests.svg", LocaleKeys.myRequest.tr(), AppRoutes.myRequests)); 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) { if (findMyTeam.isNotEmpty) {
AppState().setempStatusIsManager = true; AppState().setempStatusIsManager = true;
drawerMenuItemList.insert(2, DrawerMenuItem("assets/images/drawer/my_team.svg", LocaleKeys.myTeamMembers.tr(), AppRoutes.myTeam)); 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++) { for (int i = 0; i < getMenuEntriesList.length; i++) {
if (getMenuEntriesList[i].parentMenuName!.isEmpty) { if (getMenuEntriesList[i].parentMenuName!.isEmpty) {
GetMenuEntriesList abc = GetMenuEntriesList(requestType: "itg_forms", prompt: LocaleKeys.itgForms.tr()); 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") { if (getMenuEntriesList[i].menuName == "MBL_E_PROFESSIONALS_01") {
// hard coding this check to add change password for Active Directory // 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/main.dart';
import 'package:mohem_flutter_app/models/chat/create_group_request.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_search_user_chat_model.dart';
import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart' import 'package:mohem_flutter_app/models/chat/get_user_groups_by_id.dart' as groups;
as groups;
import 'package:mohem_flutter_app/models/get_action_history_list_model.dart'; 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/get_favorite_replacements_model.dart';
import 'package:mohem_flutter_app/models/worklist/replacement_list_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 : "", userId: _selectedSearchIndex == 1 ? searchText : "",
email: _selectedSearchIndex == 2 ? searchText : "", email: _selectedSearchIndex == 2 ? searchText : "",
); );
favouriteUserList = replacementList favouriteUserList = replacementList?.where((ReplacementList element) => element.isFavorite ?? false).toList();
?.where((ReplacementList element) => element.isFavorite ?? false) nonFavouriteUserList = replacementList?.where((ReplacementList element) => !(element.isFavorite ?? false)).toList();
.toList();
nonFavouriteUserList = replacementList
?.where((ReplacementList element) => !(element.isFavorite ?? false))
.toList();
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (e) { } catch (e) {
@ -108,10 +103,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
if (provider.pageNo == 1) provider.chatUsersList!.clear(); if (provider.pageNo == 1) provider.chatUsersList!.clear();
try { try {
Utils.showLoading(context); Utils.showLoading(context);
await ChatApiClient() await ChatApiClient().getChatMemberFromSearch(searchText, AppState().chatDetails!.response!.id!, provider.pageNo).then((ChatUserModel value) {
.getChatMemberFromSearch(searchText,
AppState().chatDetails!.response!.id!, provider.pageNo)
.then((ChatUserModel value) {
if (value.response != null) { if (value.response != null) {
if (provider.pageNo == 1) { if (provider.pageNo == 1) {
provider.chatUsersList = value.response; provider.chatUsersList = value.response;
@ -121,8 +113,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
} }
} }
}); });
provider.chatUsersList!.removeWhere((ChatUser element) => provider.chatUsersList!.removeWhere((ChatUser element) => element.id == AppState().chatDetails!.response!.id);
element.id == AppState().chatDetails!.response!.id);
Utils.hideLoading(context); Utils.hideLoading(context);
setState(() {}); setState(() {});
} catch (e) { } catch (e) {
@ -148,7 +139,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
super.initState(); super.initState();
sc.addListener(scrollListener); sc.addListener(scrollListener);
provider = Provider.of<ChatProviderModel>(context, listen: false); provider = Provider.of<ChatProviderModel>(context, listen: false);
if (widget.groupDetails.groupName !=null) { if (widget.groupDetails.groupName != null) {
setState(() { setState(() {
groupName = widget.groupDetails.groupName!; groupName = widget.groupDetails.groupName!;
isAudioCall = widget.groupDetails.canAudioC!; isAudioCall = widget.groupDetails.canAudioC!;
@ -186,7 +177,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Row( Row(
children: [ children: [
DynamicTextFieldWidget( DynamicTextFieldWidget(
LocaleKeys.groupName.tr(), LocaleKeys.groupName.tr(),
groupName.isEmpty ? LocaleKeys.enterGroupNamePlease.tr() : groupName, groupName.isEmpty ? LocaleKeys.enterGroupNamePlease.tr() : groupName,
inputAction: TextInputAction.done, inputAction: TextInputAction.done,
onChange: (String text) { onChange: (String text) {
@ -206,11 +197,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: LocaleKeys.audioCall.tr().toText10(), title: LocaleKeys.audioCall.tr().toText10(),
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
borderRadius: BorderRadius.circular(10)), side: BorderSide(width: 1.5, color: Theme.of(context).unselectedWidgetColor),
side: BorderSide(
width: 1.5,
color: Theme.of(context).unselectedWidgetColor),
value: isAudioCall, value: isAudioCall,
onChanged: (bool? newValue) { onChanged: (bool? newValue) {
@ -218,24 +206,21 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
isAudioCall = newValue!; isAudioCall = newValue!;
}); });
}, },
controlAffinity: ListTileControlAffinity controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
.leading, // <-- leading Checkbox
)).expanded, )).expanded,
SizedBox( SizedBox(
height: 35, height: 35,
child: CheckboxListTile( child: CheckboxListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title: LocaleKeys.videoCall.tr().toText10(), title: LocaleKeys.videoCall.tr().toText10(),
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
borderRadius: BorderRadius.circular(10)),
value: isVideoCall, value: isVideoCall,
onChanged: (bool? newValue) { onChanged: (bool? newValue) {
setState(() { setState(() {
isVideoCall = newValue!; isVideoCall = newValue!;
}); });
}, },
controlAffinity: ListTileControlAffinity controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
.leading, // <-- leading Checkbox
)).expanded )).expanded
], ],
), ),
@ -245,33 +230,29 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
height: 35, height: 35,
child: CheckboxListTile( child: CheckboxListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
title:LocaleKeys.attachments.tr().toText10(), title: LocaleKeys.attachments.tr().toText10(),
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
borderRadius: BorderRadius.circular(10)),
value: isAttachments, value: isAttachments,
onChanged: (bool? newValue) { onChanged: (bool? newValue) {
setState(() { setState(() {
isAttachments = newValue!; isAttachments = newValue!;
}); });
}, },
controlAffinity: ListTileControlAffinity controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
.leading, // <-- leading Checkbox
)).expanded, )).expanded,
SizedBox( SizedBox(
height: 35, height: 35,
child: CheckboxListTile( child: CheckboxListTile(
contentPadding: EdgeInsets.zero, contentPadding: EdgeInsets.zero,
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10)),
borderRadius: BorderRadius.circular(10)), title: LocaleKeys.shareScreen.tr().toText10(),
title:LocaleKeys.shareScreen.tr().toText10(),
value: isShareScreen, value: isShareScreen,
onChanged: (bool? newValue) { onChanged: (bool? newValue) {
setState(() { setState(() {
isShareScreen = newValue!; isShareScreen = newValue!;
}); });
}, },
controlAffinity: ListTileControlAffinity controlAffinity: ListTileControlAffinity.leading, // <-- leading Checkbox
.leading, // <-- leading Checkbox
)).expanded )).expanded
], ],
), ),
@ -280,8 +261,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
11.height, 11.height,
Row( Row(
children: [ children: [
radioOption(widget.fromChat ? LocaleKeys.userId.tr() : LocaleKeys.name.tr(), 0, radioOption(widget.fromChat ? LocaleKeys.userId.tr() : LocaleKeys.name.tr(), 0, _selectedSearchIndex),
_selectedSearchIndex),
radioOption(LocaleKeys.userName.tr(), 1, _selectedSearchIndex), radioOption(LocaleKeys.userName.tr(), 1, _selectedSearchIndex),
radioOption(LocaleKeys.email.tr(), 2, _selectedSearchIndex), radioOption(LocaleKeys.email.tr(), 2, _selectedSearchIndex),
], ],
@ -303,9 +283,8 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
constraints: const BoxConstraints(), constraints: const BoxConstraints(),
onPressed: () async { onPressed: () async {
provider.chatUsersList!.clear(); provider.chatUsersList!.clear();
provider.pageNo =1; provider.pageNo = 1;
await SystemChannels.textInput await SystemChannels.textInput.invokeMethod('TextInput.hide');
.invokeMethod('TextInput.hide');
widget.fromChat ? fetchChatUser() : fetchUserByInput(); widget.fromChat ? fetchChatUser() : fetchUserByInput();
}, },
icon: const Icon(Icons.search), icon: const Icon(Icons.search),
@ -325,13 +304,11 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
ListView.separated( ListView.separated(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (BuildContext cxt, int index) => itemBuilder: (BuildContext cxt, int index) => employeeItemView(favouriteUserList![index]),
employeeItemView(favouriteUserList![index]), separatorBuilder: (BuildContext cxt, int index) => Container(
separatorBuilder: height: 1,
(BuildContext cxt, int index) => Container( color: MyColors.borderE3Color,
height: 1, ),
color: MyColors.borderE3Color,
),
itemCount: favouriteUserList?.length ?? 0), itemCount: favouriteUserList?.length ?? 0),
12.height, 12.height,
], ],
@ -341,14 +318,11 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
ListView.separated( ListView.separated(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemBuilder: (BuildContext cxt, int index) => itemBuilder: (BuildContext cxt, int index) => employeeItemView(nonFavouriteUserList![index]),
employeeItemView( separatorBuilder: (BuildContext cxt, int index) => Container(
nonFavouriteUserList![index]), height: 1,
separatorBuilder: color: MyColors.borderE3Color,
(BuildContext cxt, int index) => Container( ),
height: 1,
color: MyColors.borderE3Color,
),
itemCount: nonFavouriteUserList?.length ?? 0), itemCount: nonFavouriteUserList?.length ?? 0),
], ],
], ],
@ -365,51 +339,36 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Column( Column(
children: [ children: [
12.height, 12.height,
Stack(children: [ Stack(
Container( children: [
padding:const EdgeInsets.all(5), Container(
child: SvgPicture.asset( padding: const EdgeInsets.all(5),
"assets/images/user.svg", child: SvgPicture.asset(
height: 48, "assets/images/user.svg",
width: 48, height: 48,
)), width: 48,
Positioned( )),
right: 0, Positioned(
top: 0, right: 0,
child: InkWell( top: 0,
child: SvgPicture.asset( child: InkWell(
'assets/icons/close.svg', child: SvgPicture.asset('assets/icons/close.svg', height: 15, width: 15),
height:15, onTap: () {
width:15 setState(() {
), // provider.chatUsersList![index]
onTap: () { // .isChecked = false;
setState(() {
// provider.chatUsersList![index]
// .isChecked = false;
List<ChatUser> user = provider List<ChatUser> user = provider.chatUsersList!.where((ChatUser value) => value.userName == selectedUsers[index2].userName).toList();
.chatUsersList! if (user.isNotEmpty) {
.where((ChatUser value) => user.first.isChecked = false;
value.userName == }
selectedUsers[index2] selectedUsers.remove(selectedUsers[index2]);
.userName) });
.toList(); },
if (user.isNotEmpty) { ))
user.first.isChecked = false; ],
} ),
selectedUsers.remove( (selectedUsers![index2].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText12(color: MyColors.darkTextColor).paddingOnly(left: 5, top: 5),
selectedUsers[index2]);
});
},
))
],),
(selectedUsers![index2]
.userName!
.replaceFirst(".", " ")
.capitalizeFirstofEach ??
"")
.toText12(color: MyColors.darkTextColor)
.paddingOnly(left: 5, top: 5),
selectedUsers![index2].isTyping! selectedUsers![index2].isTyping!
? 'Typing...' ? 'Typing...'
.toText10( .toText10(
@ -420,10 +379,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
], ],
), ),
// IconButton(onPressed: (){}, icon: const Icon(Icons.close_outlined, color: Colors.red, size: 20)),
// IconButton(onPressed: (){}, icon: const Icon(Icons.close_outlined, color: Colors.red, size: 20)),
]); ]);
})) }))
: 0.height, : 0.height,
@ -462,12 +418,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
width: 10, width: 10,
height: 10, height: 10,
decoration: BoxDecoration( decoration: BoxDecoration(
color: provider color: provider.chatUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
.chatUsersList![index]
.userStatus ==
1
? MyColors.green2DColor
: Colors.red,
), ),
).circle(10), ).circle(10),
) )
@ -475,16 +426,9 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
), ),
Column( Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.start,
CrossAxisAlignment.start,
children: [ children: [
(provider.chatUsersList![index].userName! (provider.chatUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor).paddingOnly(left: 11, top: 13),
.replaceFirst(".", " ")
.capitalizeFirstofEach ??
"")
.toText14(
color: MyColors.darkTextColor)
.paddingOnly(left: 11, top: 13),
provider.chatUsersList![index].isTyping! provider.chatUsersList![index].isTyping!
? 'Typing...' ? 'Typing...'
.toText10( .toText10(
@ -497,14 +441,11 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
SizedBox( SizedBox(
width: 60, width: 60,
child: Row( child: Row(
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.center,
CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
children: <Widget>[ children: <Widget>[
if (provider.chatUsersList![index] if (provider.chatUsersList![index].unreadMessageCount! > 0)
.unreadMessageCount! >
0)
Container( Container(
alignment: Alignment.center, alignment: Alignment.center,
width: 18, width: 18,
@ -515,31 +456,22 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Radius.circular(20), Radius.circular(20),
), ),
), ),
child: (provider child: (provider.chatUsersList![index].unreadMessageCount!.toString())
.chatUsersList![index]
.unreadMessageCount!
.toString())
.toText10( .toText10(
color: MyColors.white, color: MyColors.white,
) )
.center, .center,
).paddingOnly(right: 10).center, ).paddingOnly(right: 10).center,
Checkbox( Checkbox(
value: provider value: provider.chatUsersList![index].isChecked,
.chatUsersList![index].isChecked,
shape: CircleBorder(), shape: CircleBorder(),
onChanged: (bool? value) { onChanged: (bool? value) {
setState(() { setState(() {
provider.chatUsersList![index] provider.chatUsersList![index].isChecked = value;
.isChecked = value; if (provider.chatUsersList![index].isChecked == true) {
if (provider.chatUsersList![index] selectedUsers.add(provider.chatUsersList![index]);
.isChecked ==
true) {
selectedUsers.add(provider
.chatUsersList![index]);
} else { } else {
selectedUsers.remove(provider selectedUsers.remove(provider.chatUsersList![index]);
.chatUsersList![index]);
} }
}); });
}, },
@ -551,9 +483,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
), ),
); );
}, },
separatorBuilder: (BuildContext context, int index) => separatorBuilder: (BuildContext context, int index) => const Divider(color: MyColors.lightGreyE5Color).paddingOnly(left: 59),
const Divider(color: MyColors.lightGreyE5Color)
.paddingOnly(left: 59),
).expanded, ).expanded,
], ],
).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded, ).paddingOnly(left: 21, right: 21, bottom: 0, top: 21).expanded,
@ -614,11 +544,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
Expanded( Expanded(
child: (replacement.employeeDisplayName ?? "").toText12(), child: (replacement.employeeDisplayName ?? "").toText12(),
), ),
Icon(Icons.star, Icon(Icons.star, size: 16, color: replacement.isFavorite! ? MyColors.yellowFavColor : MyColors.borderCEColor),
size: 16,
color: replacement.isFavorite!
? MyColors.yellowFavColor
: MyColors.borderCEColor),
], ],
), ),
), ),
@ -643,9 +569,7 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
decoration: BoxDecoration( decoration: BoxDecoration(
color: value == groupValue color: value == groupValue ? MyColors.grey3AColor : Colors.transparent,
? MyColors.grey3AColor
: Colors.transparent,
borderRadius: const BorderRadius.all( borderRadius: const BorderRadius.all(
Radius.circular(100), Radius.circular(100),
), ),
@ -664,13 +588,13 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
void createGroup() async { void createGroup() async {
RegExp validCharacters = RegExp(r'^[a-zA-Z0-9_\-=@,\.;]+$'); RegExp validCharacters = RegExp(r'^[a-zA-Z0-9_\-=@,\.;]+$');
if (!validCharacters.hasMatch(groupName)) { if (!validCharacters.hasMatch(groupName)) {
// Utils.showToast(LocaleKeys.enterGroupName.tr());
Utils.showToast(LocaleKeys.enterGroupName.tr()); Utils.showToast(LocaleKeys.enterGroupName.tr());
} else if (groupName.length < 10) { } else if (groupName.length < 10) {
Utils.showToast(LocaleKeys.groupNameshouldbe.tr()); Utils.showToast(LocaleKeys.groupNameshouldbe.tr());
} else { } else {
List<ChatUser>? mainUsers = []; List<ChatUser>? mainUsers = [];
ChatUser admin = ChatUser admin = ChatUser.fromJson(AppState().chatDetails!.response!.toJson());
ChatUser.fromJson(AppState().chatDetails!.response!.toJson());
admin.isAdmin = true; admin.isAdmin = true;
admin.userStatus = 2; admin.userStatus = 2;
admin.unreadMessageCount = 0; admin.unreadMessageCount = 0;
@ -687,10 +611,10 @@ class _CreateGroupBottomSheetState extends State<CreateGroupBottomSheet> {
groupName: groupName, groupName: groupName,
adminUserId: AppState().chatDetails!.response!.id); adminUserId: AppState().chatDetails!.response!.id);
if(widget.groupDetails!.groupId !=null){ if (widget.groupDetails!.groupId != null) {
request.groupId =widget.groupDetails!.groupId; request.groupId = widget.groupDetails!.groupId;
await provider.updateGroupAndUsers(request); await provider.updateGroupAndUsers(request);
}else { } else {
await provider.addGroupAndUsers(request); await provider.addGroupAndUsers(request);
} }
Navigator.pop(context); 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/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart'; import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart'; import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart'; import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
@ -49,6 +50,7 @@ class DashboardScreen extends StatefulWidget {
class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingObserver { class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingObserver {
late DashboardProviderModel data; late DashboardProviderModel data;
late MarathonProvider marathonProvider; late MarathonProvider marathonProvider;
late DisclosureProvider disclosureProvider;
late ChatProviderModel cProvider; late ChatProviderModel cProvider;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey(); final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
@ -63,6 +65,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
scheduleMicrotask(() { scheduleMicrotask(() {
data = Provider.of<DashboardProviderModel>(context, listen: false); data = Provider.of<DashboardProviderModel>(context, listen: false);
marathonProvider = Provider.of<MarathonProvider>(context, listen: false); marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
disclosureProvider = Provider.of<DisclosureProvider>(context, listen: false);
cProvider = Provider.of<ChatProviderModel>(context, listen: false); cProvider = Provider.of<ChatProviderModel>(context, listen: false);
if (checkIfPrivilegedForChat()) { if (checkIfPrivilegedForChat()) {
_bHubCon(); _bHubCon();
@ -152,6 +155,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMenuEntries(); data.fetchMenuEntries();
data.getCategoryOffersListAPI(context); data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi(); marathonProvider.getMarathonDetailsFromApi();
disclosureProvider.getDisclosureDetails();
marathonProvider.getMarathonTutorial(); marathonProvider.getMarathonTutorial();
if (isFromInit) { if (isFromInit) {
checkERMChannel(); checkERMChannel();
@ -370,9 +374,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white), LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn) (model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(color: Colors.white, isBold: true),
.toString()
.toText14(color: Colors.white, isBold: true),
4.height, 4.height,
], ],
).paddingOnly(left: 12, right: 12), ).paddingOnly(left: 12, right: 12),
@ -469,6 +471,8 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
? const OffersShimmerWidget() ? const OffersShimmerWidget()
: InkWell( : InkWell(
onTap: () { onTap: () {
if (AppState().isDisclosureEnabled) return;
navigateToDetails(data.getOffersList[index]); navigateToDetails(data.getOffersList[index]);
}, },
child: SizedBox( child: SizedBox(
@ -486,25 +490,38 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
), ),
border: Border.all(color: MyColors.lightGreyE3Color, width: 1), border: Border.all(color: MyColors.lightGreyE3Color, width: 1),
), ),
child: ClipRRect( child: Stack(
borderRadius: const BorderRadius.all( fit: StackFit.expand,
Radius.circular(50), children: [
), ClipRRect(
child: Hero( borderRadius: const BorderRadius.all(Radius.circular(50)),
tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!, child: Hero(
transitionOnUserGestures: true, tag: "ItemImage" + data.getOffersList[index].offersDiscountId.toString()!,
child: Image.network( transitionOnUserGestures: true,
data.getOffersList[index].logo ?? "", child: Image.network(
fit: BoxFit.contain, data.getOffersList[index].logo ?? "",
fit: BoxFit.contain,
),
),
), ),
), 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, 4.height,
Expanded( Expanded(
child: AppState().isArabic(context) child: AppState().isArabic(context) ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
? 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( BottomNavigationBarItem(
icon: SvgPicture.asset( icon: SvgPicture.asset(
"assets/icons/create_req.svg", "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), ).paddingAll(4),
label: LocaleKeys.mowadhafhiRequest.tr(), label: LocaleKeys.mowadhafhiRequest.tr(),
), ),
@ -611,7 +628,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/icons/work_list.svg", "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), ).paddingAll(4),
Consumer<DashboardProviderModel>( Consumer<DashboardProviderModel>(
builder: (BuildContext cxt, DashboardProviderModel data, Widget? child) { builder: (BuildContext cxt, DashboardProviderModel data, Widget? child) {
@ -637,7 +654,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
BottomNavigationBarItem( BottomNavigationBarItem(
icon: SvgPicture.asset( icon: SvgPicture.asset(
"assets/icons/item_for_sale.svg", "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), ).paddingAll(4),
label: LocaleKeys.itemsForSale.tr(), label: LocaleKeys.itemsForSale.tr(),
), ),
@ -647,13 +664,15 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
children: [ children: [
SvgPicture.asset( SvgPicture.asset(
"assets/icons/chat/chat.svg", "assets/icons/chat/chat.svg",
color: !checkIfPrivilegedForChat() color: AppState().isDisclosureEnabled
? MyColors.lightGreyE3Color ? MyColors.greyC4Color
: currentIndex == 4 : (!checkIfPrivilegedForChat()
? MyColors.grey3AColor ? MyColors.lightGreyE3Color
: cProvider.disbaleChatForThisUser : currentIndex == 4
? MyColors.lightGreyE3Color ? MyColors.grey3AColor
: MyColors.grey98Color, : cProvider.disbaleChatForThisUser
? MyColors.lightGreyE3Color
: MyColors.grey98Color),
).paddingAll(4), ).paddingAll(4),
Consumer<ChatProviderModel>( Consumer<ChatProviderModel>(
builder: (BuildContext cxt, ChatProviderModel data, Widget? child) { 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), unselectedLabelStyle: const TextStyle(fontSize: 10, color: MyColors.grey98Color, fontWeight: FontWeight.w600),
type: BottomNavigationBarType.fixed, type: BottomNavigationBarType.fixed,
selectedItemColor: MyColors.grey3AColor, selectedItemColor: MyColors.grey3AColor,
unselectedItemColor: AppState().isDisclosureEnabled ? MyColors.greyC4Color : null,
backgroundColor: MyColors.backgroundColor, backgroundColor: MyColors.backgroundColor,
selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28), selectedIconTheme: const IconThemeData(color: MyColors.grey3AColor, size: 28),
unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28), unselectedIconTheme: const IconThemeData(color: MyColors.grey98Color, size: 28),
onTap: (int index) { onTap: (int index) {
if (AppState().isDisclosureEnabled) {
return;
}
if (index == 1) { if (index == 1) {
Navigator.pushNamed(context, AppRoutes.mowadhafhi); Navigator.pushNamed(context, AppRoutes.mowadhafhi);
} else if (index == 2) { } else if (index == 2) {

@ -2,6 +2,7 @@ import 'package:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
@ -14,6 +15,16 @@ import 'package:provider/provider.dart';
class MenusWidget extends StatelessWidget { class MenusWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { 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]; List<int> namesColor = [0xff125765, 0xff239D8F, 0xff2BB8A8, 0xff1D92AA];
return Consumer<DashboardProviderModel>( return Consumer<DashboardProviderModel>(
@ -29,109 +40,141 @@ class MenusWidget extends StatelessWidget {
? MenuShimmer().onPress(() { ? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context, showLoading: true); data.fetchWorkListCounter(context, showLoading: true);
}) })
: Container( : Stack(
decoration: BoxDecoration( children: [
color: Color(namesColor[0]), Container(
borderRadius: BorderRadius.circular(10), decoration: BoxDecoration(
), color: Color(namesColor[0]),
child: Column( borderRadius: BorderRadius.circular(10),
mainAxisAlignment: MainAxisAlignment.spaceBetween, ),
crossAxisAlignment: CrossAxisAlignment.start, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
LocaleKeys.workList.tr().toText12(color: Colors.white), crossAxisAlignment: CrossAxisAlignment.start,
Row(
children: [ children: [
Expanded( LocaleKeys.workList.tr().toText12(color: Colors.white),
child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), Row(
), children: [
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)), Expanded(
child: data.workListCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
),
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)),
],
)
], ],
) ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
], ),
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() { ).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.workList); Navigator.pushNamed(context, AppRoutes.workList);
}), }),
data.isMissingSwipeLoading data.isMissingSwipeLoading
? MenuShimmer().onPress(() { ? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context); data.fetchWorkListCounter(context);
}) })
: Container( : Stack(
decoration: BoxDecoration( children: [
color: Color(namesColor[1]), Container(
borderRadius: BorderRadius.circular(10), decoration: BoxDecoration(
), color: Color(namesColor[1]),
child: Column( borderRadius: BorderRadius.circular(10),
mainAxisAlignment: MainAxisAlignment.spaceBetween, ),
crossAxisAlignment: CrossAxisAlignment.start, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
LocaleKeys.missingSwipes.tr().toText12(color: Colors.white), crossAxisAlignment: CrossAxisAlignment.start,
Row(
children: [ children: [
Expanded( LocaleKeys.missingSwipes.tr().toText12(color: Colors.white),
child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1), Row(
), children: [
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)), Expanded(
child: data.missingSwipeCounter.toString().toText16(color: Colors.white, isBold: true, maxlines: 1),
),
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)),
],
)
], ],
) ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
], ),
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() { ).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS")); Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.missingSwipes.tr(), "HMG_OTL_MISSING_SWIPE_EIT_SS"));
}), }),
data.isLeaveTicketBalanceLoading data.isLeaveTicketBalanceLoading
? MenuShimmer().onPress(() { ? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context); data.fetchWorkListCounter(context);
}) })
: Container( : Stack(
decoration: BoxDecoration( children: [
color: Color(namesColor[2]), Container(
borderRadius: BorderRadius.circular(10), decoration: BoxDecoration(
), color: Color(namesColor[2]),
child: Column( borderRadius: BorderRadius.circular(10),
mainAxisAlignment: MainAxisAlignment.spaceBetween, ),
crossAxisAlignment: CrossAxisAlignment.start, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
LocaleKeys.leaveBalance.tr().toText12(color: Colors.white), crossAxisAlignment: CrossAxisAlignment.start,
Row(
children: [ children: [
Expanded( LocaleKeys.leaveBalance.tr().toText12(color: Colors.white),
child: data.leaveBalance.toStringAsFixed(2).toText16(color: Colors.white, isBold: true, maxlines: 1), Row(
), children: [
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)), Expanded(
child: data.leaveBalance.toStringAsFixed(2).toText16(color: Colors.white, isBold: true, maxlines: 1),
),
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)),
],
)
], ],
) ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
], ),
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress(() { ).onPress(() {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.leaveBalance); Navigator.pushNamed(context, AppRoutes.leaveBalance);
}), }),
data.isLeaveTicketBalanceLoading data.isLeaveTicketBalanceLoading
? MenuShimmer().onPress(() { ? MenuShimmer().onPress(() {
data.fetchWorkListCounter(context); data.fetchWorkListCounter(context);
}) })
: Container( : Stack(
decoration: BoxDecoration( children: [
color: Color(namesColor[3]), Container(
borderRadius: BorderRadius.circular(10), decoration: BoxDecoration(
), color: Color(namesColor[3]),
child: Column( borderRadius: BorderRadius.circular(10),
mainAxisAlignment: MainAxisAlignment.spaceBetween, ),
crossAxisAlignment: CrossAxisAlignment.start, child: Column(
children: [ mainAxisAlignment: MainAxisAlignment.spaceBetween,
LocaleKeys.ticketBalance.tr().toText12(color: Colors.white), crossAxisAlignment: CrossAxisAlignment.start,
Row(
children: [ children: [
Expanded( LocaleKeys.ticketBalance.tr().toText12(color: Colors.white),
child: data.ticketBalance.toStringAsFixed(2).toText16(color: Colors.white, isBold: true, maxlines: 1), Row(
), children: [
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)), Expanded(
child: data.ticketBalance.toStringAsFixed(2).toText16(color: Colors.white, isBold: true, maxlines: 1),
),
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg", color: Colors.white)),
],
)
], ],
) ).paddingOnly(left: 10, right: 10, bottom: 6, top: 6),
], ),
).paddingOnly(left: 10, right: 10, bottom: 6, top: 6), if (AppState().isDisclosureEnabled) ...[disabledWidget]
],
).onPress( ).onPress(
() { () {
if (AppState().isDisclosureEnabled) {
return;
}
Navigator.pushNamed(context, AppRoutes.dynamicScreen, arguments: DynamicListViewParams(LocaleKeys.ticketBalance.tr(), "HMG_TKT_NEW_EIT_SS")); 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:easy_localization/src/public_ext.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
@ -49,41 +52,59 @@ class ServicesWidget extends StatelessWidget {
padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13), padding: const EdgeInsets.only(left: 21, right: 21, top: 13, bottom: 13),
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
itemBuilder: (cxt, index) { itemBuilder: (cxt, index) {
log("data.homeMenus![parentIndex].menuEntiesList[index].prompt: ${data.homeMenus![parentIndex].menuEntiesList[index].prompt}");
return AspectRatio( return AspectRatio(
aspectRatio: 105 / 105, aspectRatio: 105 / 105,
child: data.isServicesMenusLoading child: data.isServicesMenusLoading
? ServicesMenuShimmer() ? ServicesMenuShimmer()
: Container( : Stack(
decoration: BoxDecoration( children: [
color: Colors.white, Container(
borderRadius: BorderRadius.circular(15), decoration: BoxDecoration(
boxShadow: [ color: Colors.white,
BoxShadow( borderRadius: BorderRadius.circular(15),
color: const Color(0xff000000).withOpacity(.05), boxShadow: [
blurRadius: 26, BoxShadow(
offset: const Offset(0, -3), color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26,
offset: const Offset(0, -3),
),
],
), ),
], child: Column(
), mainAxisAlignment: MainAxisAlignment.spaceBetween,
child: Column( crossAxisAlignment: CrossAxisAlignment.start,
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!)),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
Expanded( SvgPicture.asset(AppState().isArabic(context) ? getMenuIconAr(data.homeMenus![parentIndex].menuEntiesList[index].prompt!) : getMenuIconEn(data.homeMenus![parentIndex].menuEntiesList[index].prompt!)),
child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText11(isBold: true), Row(
), crossAxisAlignment: CrossAxisAlignment.end,
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4)), children: [
Expanded(
child: data.homeMenus![parentIndex].menuEntiesList[index].prompt!.toText11(isBold: true),
),
RotatedBox(quarterTurns: AppState().isArabic(context) ? 2 : 4, child: SvgPicture.asset("assets/images/arrow_next.svg").paddingOnly(bottom: 4)),
],
)
], ],
) ).paddingOnly(left: 10, right: 10, bottom: 10, top: 12),
], ),
).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(() { ).onPress(() {
if (AppState().isDisclosureEnabled && (parentIndex == 0 && index != 0) || (parentIndex > 0)) {
return;
}
handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]); handleOnPress(context, data.homeMenus![parentIndex].menuEntiesList[index]);
}), }),
); );
@ -220,8 +241,7 @@ class ServicesWidget extends StatelessWidget {
Navigator.pushNamed(context, AppRoutes.monthlyPaySlip); Navigator.pushNamed(context, AppRoutes.monthlyPaySlip);
} }
} else { } else {
List<GetMenuEntriesList> _menuList = List<GetMenuEntriesList> _menuList = pro.getMenuEntriesList?.where((element) => element.parentMenuName == menuEntry.menuName && (element.menuEntryType == "FUNCTION" || element.menuEntryType == "MENU")).toList() ?? [];
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)); Navigator.pushNamed(context, AppRoutes.servicesMenuListScreen, arguments: ServicesMenuListScreenParams(menuEntry.prompt!, _menuList.isEmpty ? menuList : _menuList));
} }
return; return;

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

@ -60,16 +60,23 @@ class DefaultButton extends StatelessWidget {
MyColors.yellowColorII, MyColors.yellowColorII,
], ],
) )
: LinearGradient( : color == MyColors.greenColor
transform: const GradientRotation(.83), ? const LinearGradient(
begin: Alignment.topRight, colors: <Color>[
end: Alignment.bottomLeft, MyColors.greenColor,
colors: colors ?? MyColors.greenColor,
<Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
], ],
), )
: LinearGradient(
transform: const GradientRotation(.83),
begin: Alignment.topRight,
end: Alignment.bottomLeft,
colors: colors ??
<Color>[
MyColors.gradiantEndColor,
MyColors.gradiantStartColor,
],
),
), ),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,

Loading…
Cancel
Save