Added Disclosure

faiz_disclosure
Faiz Hashmi 1 year ago
parent 368d109d9f
commit 8efab84515

@ -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": "Upcoming Disclosure",
"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": 10,
"cancelReason": null,
"marathonBufferTime": 30,
"currentTime": "2022-12-28T08:03:24.3671803Z",
"displayCorrectAnswer": true
}

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

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

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

@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/models/marathon/question_model.dart';
class MyDecorations {
@ -36,4 +37,17 @@ class MyDecorations {
return getContainersDecoration(MyColors.greyF7Color);
}
}
static Decoration getAnswersContainerColorForDisclosure(DisclosureQuestionsOptionStatus questionsOptionStatus) {
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);
}
}
}

@ -24,6 +24,9 @@ import 'package:mohem_flutter_app/ui/login/login_screen.dart';
import 'package:mohem_flutter_app/ui/login/new_password_screen.dart';
import 'package:mohem_flutter_app/ui/login/verify_last_login_screen.dart';
import 'package:mohem_flutter_app/ui/login/verify_login_screen.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/disclosure/disclosure_waiting_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_intro_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_screen.dart';
import 'package:mohem_flutter_app/ui/marathon/marathon_sponsor_video_screen.dart';
@ -198,6 +201,7 @@ class AppRoutes {
static const String manageGroup = "/manageGroup";
static const String groupMembers = "/groupmembers";
static const String groupChatDetailed = "/groupChatDetailed";
//Marathon
static const String marathonIntroScreen = "/marathonIntroScreen";
static const String marathonScreen = "/marathonScreen";
@ -206,6 +210,13 @@ class AppRoutes {
static const String marathonWaitingScreen = "/marathonWaitingScreen";
static const String marathonTutorialScreen = "/marathonTutorialScreen";
//Disclosure
static const String disclosureIntroScreen = "/disclosureIntroScreen";
static const String disclosureScreen = "/disclosureScreen";
static const String disclosureWinnerScreen = "/disclosureWinnerScreen";
static const String disclosureWaitingScreen = "/disclosureWaitingScreen";
static const String disclosureTutorialScreen = "/disclosureTutorialScreen";
static const String unsafeDeviceScreen = "/unsafeDeviceScreen";
static const String appUpdateScreen = "/appUpdateScreen";
@ -322,6 +333,10 @@ class AppRoutes {
marathonSponsorVideoScreen: (BuildContext context) => const SponsorVideoScreen(),
marathonWaitingScreen: (BuildContext context) => const MarathonWaitingScreen(),
marathonTutorialScreen: (BuildContext context) => const MarathonTutorialViewerScreen(),
// Disclosure
disclosureIntroScreen: (BuildContext context) => DisclosureIntroScreen(),
disclosureScreen: (BuildContext context) => DisclosureScreen(),
disclosureWaitingScreen: (BuildContext context) => const DisclosureWaitingScreen(),
unsafeDeviceScreen: (BuildContext context) => const UnsafeDeviceScreen(),
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 approve = 'approve';
static const cancel = 'cancel';
static const generate = 'generate';
static const requestedItems = 'requestedItems';
static const request = 'request';
static const myRequest = 'myRequest';
@ -403,7 +404,6 @@ abstract class LocaleKeys {
static const purchaseOrder = 'purchaseOrder';
static const ITGForms = 'ITGForms';
static const itemCreation = 'itemCreation';
static const paymentRequest = 'paymentRequest';
static const stamp = 'stamp';
static const addFavoriteList = 'addFavoriteList';
static const feedbackUserExperience = 'feedbackUserExperience';
@ -527,53 +527,46 @@ abstract class LocaleKeys {
static const expiredDocuments = 'expiredDocuments';
static const missingDocuments = 'missingDocuments';
static const uploadedDocuments = 'uploadedDocuments';
static const addAtLeastOneAttachment = 'addAtLeastOneAttachment';
static const pleaseClickButtonToJoinMarathon = 'pleaseClickButtonToJoinMarathon';
static const youCannotJoinTheMarathon = 'youCannotJoinTheMarathon';
static const open = 'open';
static const disclosure = 'disclosure';
static const groupName = 'groupName';
static const enterGroupNamePlease = 'enterGroupNamePlease';
static const audioCall = 'audioCall';
static const userSearch = 'userSearch';
static const shareScreen = 'shareScreen';
static const searchByUserName = 'searchByUserName';
static const manage = 'manage';
static const members = 'members';
static const addUsers = 'addUsers';
static const areYouSureWantTodelete = 'areYouSureWantTodelete';
static const groupMembers = "groupMembers";
static const manageGroup = "manageGroup";
static const admin = "admin";
static const addUsers ="addUsers";
static const editGroups ="editGroups";
static const groupNameshouldbe ="groupNameshouldbe";
static const enterGroupName ="enterGroupName";
static const groupName ="groupName";
static const enterGroupNamePlease ="enterGroupNamePlease";
static const audioCall = 'audioCall';
static const videoCall ='videoCall';
static const shareScreen ='shareScreen';
static const searchByUserName ='searchByUserName';
static const userSearch ='userSearch';
static const userName ='userName';
static const userId ='userId';
static const addAtLeastOneAttachment ='addAtLeastOneAttachment';
static const pleaseClickButtonToJoinMarathon ='pleaseClickButtonToJoinMarathon';
static const youCannotJoinTheMarathon ='youCannotJoinTheMarathon';
static const open ='open';
static const generate = 'generate';
static const paymentDetails ='paymentDetails';
static const requestNo ='requestNo';
static const requesterEmpNum ='requesterEmpNum';
static const requesterEmpName ='requesterEmpName';
static const prepareEmpName ='prepareEmpName';
static const requesterPositionName ='requesterPositionName';
static const preparePositionName ='preparePositionName';
static const requesterPayrollName ='requesterPayrollName';
static const payingORGName ='payingORGName';
static const requestAmount ='requestAmount';
static const typeofPayment ='typeofPayment';
static const beneficiaryDetails ='beneficiaryDetails';
static const beneficiaryName ='beneficiaryName';
static const idIqama ='idIqama';
static const beneficiaryBankName ='beneficiaryBankName';
static const sadadNumber ='sadadNumber';
static const beneficiaryIBAN ='beneficiaryIBAN';
static const purchaseOrders ='purchaseOrders';
static const pOAmount ='pOAmount';
static const approvalDate ='approvalDate';
static const versionStatus ='versionStatus';
static const supplierNo ='supplierNo';
static const general ="general";
static const editGroups = 'editGroups';
static const groupMembers = 'groupMembers';
static const manageGroup = 'manageGroup';
static const admin = 'admin';
static const paymentDetails = 'paymentDetails';
static const requesterEmpNum = 'requesterEmpNum';
static const requesterEmpName = 'requesterEmpName';
static const prepareEmpName = 'prepareEmpName';
static const requesterPositionName = 'requesterPositionName';
static const preparePositionName = 'preparePositionName';
static const requesterPayrollName = 'requesterPayrollName';
static const general = 'general';
static const payingORGName = 'payingORGName';
static const requestAmount = 'requestAmount';
static const typeofPayment = 'typeofPayment';
static const beneficiaryDetails = 'beneficiaryDetails';
static const beneficiaryName = 'beneficiaryName';
static const idIqama = 'idIqama';
static const beneficiaryBankName = 'beneficiaryBankName';
static const sadadNumber = 'sadadNumber';
static const beneficiaryIBAN = 'beneficiaryIBAN';
static const purchaseOrders = 'purchaseOrders';
static const approvalDate = 'approvalDate';
static const versionStatus = 'versionStatus';
static const supplierNo = 'supplierNo';
static const paymentRequest = 'paymentRequest';
}

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

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

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

@ -0,0 +1,122 @@
enum DisclosureQuestionsOptionStatus { correct, wrong, selected, unSelected }
enum DisclosureQuestionCardStatus { question, wrongAnswer, correctAnswer, skippedAnswer, completed, findingWinner, winnerFound }
class DisclosureQuestionModel {
String? id;
String? titleEn;
String? titleAr;
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? 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'];
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!));
}
}
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['gapText'] = gapText;
data['gapImage'] = gapImage;
data['questOptionsLimit'] = questOptionsLimit;
data['remainingParticipantCount'] = remainingParticipantCount;
if (questionOptions != null) {
data['questionOptions'] = questionOptions!.map((v) => v.toJson()).toList();
}
return data;
}
}
class QuestionOptions {
String? id;
String? titleEn;
String? titleAr;
String? questionId;
int? sequence;
String? image;
bool? isCorrectOption;
DisclosureQuestionsOptionStatus? optionStatus;
QuestionOptions({
String? id,
String? titleEn,
String? titleAr,
String? questionId,
int? sequence,
String? image,
bool? isCorrectOption,
DisclosureQuestionsOptionStatus? optionStatus,
});
QuestionOptions.fromJson(Map<String, dynamic> json) {
id = json['id'];
titleEn = json['titleEn'];
titleAr = json['titleAr'];
questionId = json['questionId'];
sequence = json['sequence'];
image = json['image'];
isCorrectOption = json['isCorrectOption'];
optionStatus = DisclosureQuestionsOptionStatus.unSelected;
}
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['titleEn'] = titleEn;
data['titleAr'] = titleAr;
data['questionId'] = questionId;
data['sequence'] = sequence;
data['image'] = image;
data['isCorrectOption'] = isCorrectOption;
return data;
}
}

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

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

@ -0,0 +1,52 @@
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/ui/disclosure/widgets/disclosure_footer.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.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),
20.height,
// provider.isUpComingMarathon
// ? DisclosureTimerCard(
// provider: provider,
// timeToMarathon: DateTime.parse(provider.marathonDetailModel.startTime!).millisecondsSinceEpoch,
// )
// : const SizedBox(),
],
).expanded,
1.divider,
DisclosureFooter(provider: provider),
],
),
);
}
}

@ -0,0 +1,343 @@
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/app_state/app_state.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/models/privilege_list_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");
String? gapTimeImage;
String? gapTimeText;
int? gapTimeType;
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();
}
bool _isUserWaiting = false;
bool get isUserWaiting => _isUserWaiting;
set isUserWaiting(bool value) {
_isUserWaiting = value;
notifyListeners();
}
bool _isMarathonCompleted = false;
bool get isMarathonCompleted => _isMarathonCompleted;
set isMarathonCompleted(bool value) {
_isMarathonCompleted = value;
notifyListeners();
}
bool isUserOutOfGame = false;
set updateIsUserOutOfGame(bool value) {
isUserOutOfGame = value;
notifyListeners();
}
int _currentQuestionNumber = 0;
int get currentQuestionNumber => _currentQuestionNumber;
set currentQuestionNumber(int value) {
_currentQuestionNumber = value;
notifyListeners();
}
void updateCurrentQuestionSelectionStatus(DisclosureQuestionsOptionStatus value) {
currentQuestionSelectionStatus = value;
notifyListeners();
}
int _totalMarathoners = 0;
int get totalMarathoners => _totalMarathoners;
set totalMarathoners(int value) {
_totalMarathoners = value;
notifyListeners();
}
//****************SPONSOR VIDEO PLAYER**********
// 9c47d281-c5b5-4b5d-a90a-08dacb8cbdb6
// MarathonI
//************************************************ TIMERS **********************************************************
int sponsorsSecondsCounter = 0;
int totalSponsorVideoSeconds = 0;
Timer timerForSponsorVideo = Timer.periodic(const Duration(seconds: 1), (Timer timer) {});
void startTimerForSponsorVideo() {
const Duration oneSec = Duration(seconds: 1);
timerForSponsorVideo = Timer.periodic(
oneSec,
(Timer timer) async {
sponsorsSecondsCounter++;
if (totalSponsorVideoSeconds == 0) {
timer.cancel();
notifyListeners();
return;
} else {
totalSponsorVideoSeconds--;
}
notifyListeners();
},
);
}
int totalSecondsToWaitForMarathon = 30;
set updateTotalSecondsToWaitForMarathon(int value) {
totalSecondsToWaitForMarathon = value;
notifyListeners();
}
//************************************************ FUNCTIONS **********************************************************
void updateLanguageAsPerMarathon(BuildContext context, DisclosureDetailsModel detailModel) {
savedLocale = context.locale;
if (detailModel.selectedLanguage == 1) {
context.setLocale(const Locale("en", "US"));
} else if (detailModel.selectedLanguage == 2) {
context.setLocale(const Locale("ar", "SA"));
} else if (detailModel.selectedLanguage == 3) {
} else {
context.setLocale(const Locale("en", "US"));
}
}
Future<void> callGetQualifiersApi() async {
if (AppState().getIsDemoMarathon) {
totalQualifiers = isUserOutOfGame ? 0 : 1;
}
isGettingQualifiers = false;
notifyListeners();
}
Future<void> callGetSelectedWinnersApi() async {
if (AppState().getIsDemoMarathon) {
return;
}
}
Future<void> callNextQuestionApi() async {
if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) {
if (currentQuestionNumber == 0) {
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
gapTimeImage = currentQuestion.gapImage;
gapTimeText = currentQuestion.gapText;
gapTimeType = currentQuestion.gapType;
updateCardData();
if (Utils.isLoading) {
Utils.hideLoading(AppRoutes.navigatorKey.currentContext!);
}
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.disclosureScreen);
} else {
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
}
notifyListeners();
}
}
void updateCardData() {
if (currentQuestionNumber > 0) {
// swiperController.swipeLeft();
}
selectedOptionIndex = null;
currentQuestionNumber++;
cardContentList.add(const DisclosureCardContent());
totalMarathoners = currentQuestion.remainingParticipantCount!;
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 updateAnswerStatusesList(DisclosureQuestionCardStatus status) {
answerStatusesList[currentQuestionNumber - 1] = status;
notifyListeners();
}
void updateCurrentQuestionOptionStatus({required DisclosureQuestionsOptionStatus status, required int selectedOptIndex, required int correctOptionIndex}) {
if (selectedOptionIndex == 0) {}
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) {
if (status == DisclosureQuestionCardStatus.wrongAnswer || status == DisclosureQuestionCardStatus.skippedAnswer) {
if (AppState().getIsDemoMarathon) {
updateIsUserOutOfGame = true;
}
}
questionCardStatus = status;
notifyListeners();
}
void getCorrectAnswerAndUpdateAnswerColor() {
log("correctOptionIndex");
int correctOptionIndex = -1;
if (disclosureDetailsModel.displayCorrectAnswer ?? false) {
correctOptionIndex = currentQuestion.questionOptions!.indexWhere((QuestionOptions element) => element.isCorrectOption ?? false);
log("correctOptionIndex: $correctOptionIndex");
}
if (selectedOptionIndex != null) {
scheduleMicrotask(() async {
if (AppState().getIsDemoMarathon) {
if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) {
updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.correct, selectedOptIndex: selectedOptionIndex!, correctOptionIndex: correctOptionIndex);
} else {
updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.wrong, selectedOptIndex: selectedOptionIndex!, correctOptionIndex: correctOptionIndex);
}
}
});
} else {
if (!AppState().getIsDemoMarathon) {}
}
}
void updateCardStatusToAnswer() {
if (currentQuestionNumber == 0) {
return;
}
scheduleMicrotask(() async {
await callNextQuestionApi();
});
if (selectedOptionIndex == null) {
updateQuestionCardStatus(DisclosureQuestionCardStatus.skippedAnswer);
updateAnswerStatusesList(DisclosureQuestionCardStatus.skippedAnswer);
return;
}
if (AppState().getIsDemoMarathon) {
if (currentQuestion.questionOptions![selectedOptionIndex!].isCorrectOption!) {
updateQuestionCardStatus(DisclosureQuestionCardStatus.correctAnswer);
updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer);
} else {
updateQuestionCardStatus(DisclosureQuestionCardStatus.wrongAnswer);
updateAnswerStatusesList(DisclosureQuestionCardStatus.wrongAnswer);
}
return;
}
if (!isUserOutOfGame) {
updateQuestionCardStatus(DisclosureQuestionCardStatus.correctAnswer);
updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer);
return;
}
updateQuestionCardStatus(DisclosureQuestionCardStatus.wrongAnswer);
updateAnswerStatusesList(DisclosureQuestionCardStatus.wrongAnswer);
}
void resetValues() async {
_currentQuestionNumber = 0;
iAmWinner = false;
cardContentList.clear();
timerForSponsorVideo.cancel();
_isMarathonCompleted = false;
isUserOutOfGame = false;
isButtonEnabled = false;
isUserWaiting = false;
sponsorsSecondsCounter = 0;
totalSponsorVideoSeconds = 0;
totalSecondsToWaitForMarathon = 30;
AppState().setIsDemoMarathon = false;
currentQuestion = DisclosureQuestionModel();
if (answerStatusesList.isNotEmpty) {
for (int i = 0; i < answerStatusesList.length; i++) {
answerStatusesList[i] = DisclosureQuestionCardStatus.question;
}
}
AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale);
notifyListeners();
}
bool checkIfPrivilegedForMarathon() {
for (PrivilegeListModel element in AppState().privilegeListModel!) {
if (element.serviceName == "Marathon") {
if (element.previlege != null) {
return element.previlege!;
}
}
}
return false;
}
Future<void> getDisclosureDetails() async {
isLoading = true;
notifyListeners();
disclosureDetailsModel = await DisclosureRepo().getDisclosureDetails();
log("here: ${disclosureDetailsModel.descEn}");
populateQuestionStatusesList();
isLoading = false;
notifyListeners();
}
Future<void> onJoinDemoMarathonPressed(BuildContext context) async {
AppState().setIsDemoMarathon = true;
await callNextQuestionApi();
}
}

@ -0,0 +1,243 @@
import 'dart:async';
import 'dart:developer';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.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/consts.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.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/models/marathon/question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/custom_status_widget.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/ui/disclosure/widgets/disclosure_question_card_builder.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);
Widget getSuccessWidget({required int? gapType, required String? gapImage, required String? gapText}) {
if (gapType == 1) {
if (gapText == null) {
return Image.asset(MyLottieConsts.congratsGif, height: 200);
}
return gapText.toText18(color: MyColors.darkTextColor, isCentered: true);
}
if (gapType == 0) {
if (gapImage == null) {
return Image.asset(MyLottieConsts.congratsGif, height: 200);
}
return Image.network(ApiConsts.marathonBaseUrlServices + gapImage, height: 200);
}
return Image.asset(MyLottieConsts.congratsGif, height: 200);
}
Widget getDemoWinnerWidget(BuildContext context, {required DisclosureProvider provider}) {
return provider.isUserOutOfGame
? Column(
children: <Widget>[
Lottie.asset(MyLottieConsts.noWinnerLottie),
Center(
child: LocaleKeys.noWinner.tr().toText18(color: MyColors.grey3AColor, isCentered: true),
),
],
)
: Stack(
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
SizedBox(
height: 50,
child: Stack(
children: <Widget>[
Align(
alignment: Alignment.center,
child: SvgPicture.asset("assets/images/winner_ribbon.svg", height: 50),
),
Align(
alignment: Alignment.center,
child: LocaleKeys.winner.tr().toText32(color: MyColors.white, isBold: true, isCentered: true).paddingOnly(top: 07),
)
],
),
),
16.height,
Column(
children: <Widget>[
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: provider.disclosureDetailsModel.selectedLanguage!,
arabicContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr ?? "",
englishContent: AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn ?? "",
).toText22(
color: MyColors.grey3AColor,
isCentered: true,
),
8.height,
AppState().memberInformationList!.eMPLOYEENUMBER!.toText22(color: MyColors.grey57Color),
],
),
60.height,
if (provider.disclosureDetailsModel.sponsors != null && provider.disclosureDetailsModel.sponsors!.isNotEmpty) ...<Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
"${LocaleKeys.sponsoredBy.tr()} ".toText14(color: MyColors.grey77Color),
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: provider.disclosureDetailsModel.selectedLanguage!,
englishContent: provider.disclosureDetailsModel.sponsors!.first.nameEn!,
arabicContent: provider.disclosureDetailsModel.sponsors!.first.nameAr!,
).toText14(
color: MyColors.darkTextColor,
isBold: true,
),
],
),
5.height,
Image.network(
ApiConsts.marathonBaseUrlServices + provider.disclosureDetailsModel.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);
},
)
],
],
),
Lottie.asset(MyLottieConsts.celebrate1Lottie),
],
);
}
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return WillPopScope(
child: Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.disclosure.tr(),
onHomeTapped: () {
if (provider.questionCardStatus == QuestionCardStatus.winnerFound) {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
} else {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
}
},
onBackTapped: () {
if (provider.questionCardStatus == QuestionCardStatus.winnerFound) {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
} else {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
}
},
),
body: Column(
children: <Widget>[
ListView(
shrinkWrap: true,
children: <Widget>[
10.height,
if (provider.questionCardStatus == QuestionCardStatus.findingWinner)
...<Widget>[]
else if (provider.questionCardStatus == QuestionCardStatus.winnerFound)
...<Widget>[]
else ...<Widget>[
DisclosureProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
],
DisclosureQuestionCardBuilder(
onQuestion: (BuildContext context) => const DisclosureQuestionCard(),
onCompleted: (BuildContext context) => DisclosureCustomStatusWidget(
asset: Lottie.asset(MyLottieConsts.allQuestions, height: 200),
title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor),
subTitle: LocaleKeys.allQuestionsCorrect.toText18(color: MyColors.darkTextColor, isCentered: true),
),
onCorrectAnswer: (BuildContext context) => DisclosureCustomStatusWidget(
asset: getSuccessWidget(gapType: provider.gapTimeType, gapImage: provider.gapTimeImage, gapText: provider.gapTimeText),
title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor),
subTitle: LocaleKeys.yourAnswerCorrect.tr().toText18(color: MyColors.darkTextColor, isCentered: true),
),
onWinner: (BuildContext context) => const SizedBox(),
onWrongAnswer: (BuildContext context) => DisclosureCustomStatusWidget(
asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200),
title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor),
subTitle: LocaleKeys.wrongAnswer.tr().toText18(color: MyColors.darkTextColor, isCentered: true),
),
onSkippedAnswer: (BuildContext context) => DisclosureCustomStatusWidget(
asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200),
title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor),
subTitle: LocaleKeys.youMissedTheQuestion.tr().toText18(color: MyColors.darkTextColor, isCentered: true),
),
onFindingWinner: (BuildContext context) => DisclosureCustomStatusWidget(
asset: Lottie.asset(MyLottieConsts.winnerLottie, height: 168, reverse: false, repeat: true),
title: LocaleKeys.fingersCrossed.tr().toText22(color: MyColors.greenColor),
subTitle: LocaleKeys.winnerSelectedRandomly.tr().toText18(color: MyColors.darkTextColor, isCentered: true),
),
questionCardStatus: provider.questionCardStatus,
).paddingOnly(top: 12, left: 21, right: 21),
// 50.height,
],
).expanded,
DefaultButton(
LocaleKeys.next.tr(),
() {},
).insideContainer,
],
),
),
onWillPop: () {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
return Future<bool>.value(false);
},
);
}
}

@ -0,0 +1,109 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:lottie/lottie.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/config/routes.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/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
import 'package:provider/provider.dart';
class DisclosureWaitingScreen extends StatelessWidget {
const DisclosureWaitingScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return WillPopScope(
onWillPop: () {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
return Future<bool>.value(false);
},
child: Scaffold(
appBar: AppBarWidget(
context,
title: LocaleKeys.brainMarathon.tr(),
onHomeTapped: () {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
},
onBackTapped: () {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
},
),
body: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Container(
width: double.infinity,
margin: const EdgeInsets.all(21),
decoration: MyDecorations.shadowDecoration,
child: Stack(
children: <Widget>[
Align(
child: Lottie.asset(MyLottieConsts.marathonWaiting, height: 200),
),
Align(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
LocaleKeys.startingIn.tr().toText16(),
(provider.totalSecondsToWaitForMarathon < 10 ? "0${provider.totalSecondsToWaitForMarathon.toString()}" : provider.totalSecondsToWaitForMarathon.toString()).toText18(color: provider.totalSecondsToWaitForMarathon < 5 ? MyColors.redColor : MyColors.black),
],
),
),
// Align(
// child: Column(
// mainAxisAlignment: MainAxisAlignment.end,
// children: <Widget>[
// InkWell(
// onTap: () {
// provider.callNextQuestionApi();
// provider.timerToWaitForMarathon.cancel();
// },
// child: "Join Now".toText16(),
// ).paddingOnly(bottom: 20),
// ],
// ),
// ),
],
),
).expanded,
],
),
),
);
}
}

@ -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,122 @@
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/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:provider/provider.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>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Container(
decoration: BoxDecoration(color: MyColors.yellowColorII, borderRadius: BorderRadius.circular(100)),
child: LocaleKeys.demo.tr().toText10(color: MyColors.white).paddingAll(4),
),
],
),
7.height,
LocaleKeys.contestTopicAbout.tr().toText16(color: MyColors.grey77Color),
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>[
5.height,
disclosureDetailsCard.sponsors!.first.sponsorPrizes != null
? Row(
children: <Widget>[
"${LocaleKeys.prize.tr()} ".toText16(color: MyColors.grey77Color),
Expanded(
child: SizedBox(
height: 30,
child: ListView.builder(
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: disclosureDetailsCard.sponsors!.first.sponsorPrizes!.length,
itemBuilder: (BuildContext context, int index) {
SponsorPrizes prizes = disclosureDetailsCard.sponsors!.first.sponsorPrizes![index];
return Container(
decoration: BoxDecoration(color: MyColors.backgroundColor, borderRadius: BorderRadius.circular(100), border: Border.all(color: MyColors.grey57Color.withOpacity(0.1))),
child: displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0,
englishContent: prizes.marathonPrizeEn ?? "",
arabicContent: prizes.marathonPrizeAr ?? "",
).toText16(color: MyColors.greenColor, isBold: true).paddingOnly(left: 5, right: 5),
).paddingOnly(left: 5);
},
),
),
)
],
)
: const SizedBox(),
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,51 @@
// ignore_for_file: always_specify_types
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/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/widgets/button/default_button.dart';
class DisclosureFooter extends StatelessWidget {
final DisclosureProvider provider;
const DisclosureFooter({Key? key, required this.provider}) : super(key: key);
Widget buildNoteForDemo() {
return RichText(
text: TextSpan(
children: <InlineSpan>[
TextSpan(
text: LocaleKeys.note.tr(),
style: const TextStyle(color: MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.bold),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP1.tr(),
style: const TextStyle(color: MyColors.grey77Color, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.w500),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP2.tr(),
style: const TextStyle(color: MyColors.darkTextColor, fontSize: 17, fontWeight: FontWeight.bold),
),
TextSpan(
text: " " + LocaleKeys.demoMarathonNoteP3.tr(),
style: const TextStyle(color: MyColors.grey77Color, fontSize: 17, letterSpacing: -0.64, fontWeight: FontWeight.w500),
)
],
),
).paddingOnly(right: 21, left: 21, top: 11, bottom: 0);
}
@override
Widget build(BuildContext context) {
{
return DefaultButton(
LocaleKeys.joinDemoMarathon.tr(),
() => provider.onJoinDemoMarathonPressed(context),
color: MyColors.yellowColorII,
).insideContainer;
}
}
}

@ -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,122 @@
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!,
provider.isUserOutOfGame,
),
8.height,
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
"${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(),
provider.isUserOutOfGame ? LocaleKeys.youAreOutOfContest.tr().toText13(color: MyColors.redColor) : const SizedBox(),
],
),
],
),
);
}
Color getStepColor(DisclosureQuestionCardStatus status, bool isOutOfGame) {
switch (status) {
case DisclosureQuestionCardStatus.question:
return MyColors.yellowColorII;
case DisclosureQuestionCardStatus.wrongAnswer:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.correctAnswer:
return MyColors.lightGreyDeColor;
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, bool isOutOfGame) {
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], isOutOfGame),
i != 0,
)
],
),
);
}
Widget roundContainer(Color color, bool isNeedLeftBorder) {
if (isNeedLeftBorder) {
return Row(
children: <Widget>[
Divider(
thickness: 6,
color: color,
).expanded,
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,173 @@
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/classes/utils.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: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)
: SizedBox(
height: MediaQuery.of(context).size.height * .45,
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(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Container(
width: double.infinity,
decoration: const BoxDecoration(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
),
child: Center(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 15),
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,
),
),
),
),
),
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.symmetric(vertical: 20, horizontal: 13),
decoration: const BoxDecoration(
color: MyColors.kWhiteColor,
borderRadius: BorderRadius.only(
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10),
),
),
child: provider.currentQuestion.questionOptions != null
? 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),
),
),
)
: 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: () {
provider.isUserOutOfGame ? Utils.showToast(LocaleKeys.youAreOutOfContest.tr()) : onAnswerTapped();
},
child: Container(
alignment: Alignment.centerLeft,
decoration: MyDecorations.getAnswersContainerColorForDisclosure(provider.currentQuestion.questionOptions![index].optionStatus!),
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: provider.isUserOutOfGame ? MyColors.darkTextColor : getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)).paddingOnly(top: 13, bottom: 13),
),
),
);
}
}

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

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

@ -22,6 +22,7 @@ import 'package:mohem_flutter_app/models/offers_and_discounts/get_offers_list.da
import 'package:mohem_flutter_app/models/privilege_list_model.dart';
import 'package:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:mohem_flutter_app/provider/dashboard_provider_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/landing/widget/app_drawer.dart';
import 'package:mohem_flutter_app/ui/landing/widget/menus_widget.dart';
import 'package:mohem_flutter_app/ui/landing/widget/services_widget.dart';
@ -49,6 +50,7 @@ class DashboardScreen extends StatefulWidget {
class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingObserver {
late DashboardProviderModel data;
late MarathonProvider marathonProvider;
late DisclosureProvider disclosureProvider;
late ChatProviderModel cProvider;
final GlobalKey<ScaffoldState> _scaffoldState = GlobalKey();
@ -63,6 +65,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
scheduleMicrotask(() {
data = Provider.of<DashboardProviderModel>(context, listen: false);
marathonProvider = Provider.of<MarathonProvider>(context, listen: false);
disclosureProvider = Provider.of<DisclosureProvider>(context, listen: false);
cProvider = Provider.of<ChatProviderModel>(context, listen: false);
if (checkIfPrivilegedForChat()) {
_bHubCon();
@ -152,6 +155,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
data.fetchMenuEntries();
data.getCategoryOffersListAPI(context);
marathonProvider.getMarathonDetailsFromApi();
disclosureProvider.getDisclosureDetails();
marathonProvider.getMarathonTutorial();
if (isFromInit) {
checkERMChannel();
@ -370,9 +374,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
crossAxisAlignment: CrossAxisAlignment.start,
children: [
LocaleKeys.checkIn.tr().toText12(color: Colors.white),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn)
.toString()
.toText14(color: Colors.white, isBold: true),
(model.attendanceTracking!.pSwipeIn == null ? "--:--" : model.attendanceTracking!.pSwipeIn).toString().toText14(color: Colors.white, isBold: true),
4.height,
],
).paddingOnly(left: 12, right: 12),
@ -502,9 +504,7 @@ class _DashboardScreenState extends State<DashboardScreen> with WidgetsBindingOb
),
4.height,
Expanded(
child: AppState().isArabic(context)
? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1)
: data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
child: AppState().isArabic(context) ? data.getOffersList[index].titleAr!.toText12(isCenter: true, maxLine: 1) : data.getOffersList[index].titleEn!.toText12(isCenter: true, maxLine: 1),
),
],
),

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

@ -820,7 +820,7 @@ class InfoFragment extends StatelessWidget {
ItemDetailGrid(
ItemDetailViewCol(
LocaleKeys.poNumber.tr(), data.purchaseOrdersList![0].poNumber ?? ""),
ItemDetailViewCol(LocaleKeys.pOAmount.tr(),
ItemDetailViewCol("LocaleKeys.pOAmount.tr()",
data.purchaseOrdersList![0].poAmount.toString() ?? ""),
),
ItemDetailGrid(

Loading…
Cancel
Save