Completed Disclosure Flow

faiz_disclosure
faizatflutter 1 year ago
parent 8efab84515
commit cbc6219755

@ -39,7 +39,7 @@
],
"questions": null,
"isEmailSent": false,
"totalQuestions": 10,
"totalQuestions": 8,
"cancelReason": null,
"marathonBufferTime": 30,
"currentTime": "2022-12-28T08:03:24.3671803Z",

@ -38,7 +38,10 @@ class MyDecorations {
}
}
static Decoration getAnswersContainerColorForDisclosure(DisclosureQuestionsOptionStatus questionsOptionStatus) {
static Decoration getAnswersContainerColorForDisclosure(DisclosureQuestionsOptionStatus questionsOptionStatus, {bool isLastQuestion = false, bool isAgreeSelected = false}) {
if (isLastQuestion && questionsOptionStatus == DisclosureQuestionsOptionStatus.selected && isAgreeSelected) {
return getContainersDecoration(MyColors.greenColor);
}
switch (questionsOptionStatus) {
case DisclosureQuestionsOptionStatus.correct:
return getContainersDecoration(MyColors.greenColor);

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

@ -5,8 +5,8 @@ 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:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:provider/provider.dart';
class DisclosureIntroScreen extends StatelessWidget {
@ -34,17 +34,10 @@ class DisclosureIntroScreen extends StatelessWidget {
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),
DefaultButton("Start", () => provider.onStartDisclosurePressed(context)).insideContainer,
],
),
);

@ -6,12 +6,10 @@ 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 {
@ -20,7 +18,7 @@ class DisclosureProvider extends ChangeNotifier {
final AppinioSwiperController swiperController = AppinioSwiperController();
DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected;
DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel();
List<DisclosureCardContent> cardContentList = <DisclosureCardContent>[];
List<DisclosureCardContent> cardContentList = <DisclosureCardContent>[const DisclosureCardContent()];
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel();
List<DisclosureQuestionCardStatus> answerStatusesList = <DisclosureQuestionCardStatus>[];
DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question;
@ -28,9 +26,6 @@ class DisclosureProvider extends ChangeNotifier {
String? selectedOptionId;
int? totalQualifiers;
Locale savedLocale = const Locale("en", "US");
String? gapTimeImage;
String? gapTimeText;
int? gapTimeType;
bool iAmWinner = false;
bool isGettingQualifiers = false;
@ -54,31 +49,6 @@ class DisclosureProvider extends ChangeNotifier {
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;
@ -88,91 +58,18 @@ class DisclosureProvider extends ChangeNotifier {
notifyListeners();
}
void updateCurrentQuestionSelectionStatus(DisclosureQuestionsOptionStatus value) {
void updateCurrentSelectionYesNo(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 {
log("currentQuestionNumber: $currentQuestionNumber");
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!);
@ -180,6 +77,7 @@ class DisclosureProvider extends ChangeNotifier {
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.disclosureScreen);
} else {
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
updateCardData();
}
notifyListeners();
}
@ -187,13 +85,14 @@ class DisclosureProvider extends ChangeNotifier {
void updateCardData() {
if (currentQuestionNumber > 0) {
// swiperController.swipeLeft();
swiperController.swipeRight();
}
selectedOptionIndex = null;
currentQuestionNumber++;
cardContentList.add(const DisclosureCardContent());
totalMarathoners = currentQuestion.remainingParticipantCount!;
if (currentQuestionNumber < disclosureDetailsModel.totalQuestions!) {
cardContentList.add(const DisclosureCardContent());
cardContentList.add(const DisclosureCardContent());
}
questionCardStatus = DisclosureQuestionCardStatus.question;
notifyListeners();
}
@ -208,13 +107,12 @@ class DisclosureProvider extends ChangeNotifier {
}
}
void updateAnswerStatusesList(DisclosureQuestionCardStatus status) {
answerStatusesList[currentQuestionNumber - 1] = status;
notifyListeners();
}
void updateCurrentQuestionOptionStatus({required DisclosureQuestionsOptionStatus status, required int selectedOptIndex, required int correctOptionIndex}) {
if (selectedOptionIndex == 0) {}
if (selectedOptIndex == 0) {
updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.correct);
} else if (selectedOptIndex == 1) {
updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.wrong);
}
for (int i = 0; i < currentQuestion.questionOptions!.length; i++) {
currentQuestion.questionOptions![i].optionStatus = DisclosureQuestionsOptionStatus.unSelected;
}
@ -228,83 +126,20 @@ class DisclosureProvider extends ChangeNotifier {
}
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 updateAnswerStatusesList(DisclosureQuestionCardStatus status) {
answerStatusesList[currentQuestionNumber - 1] = status;
notifyListeners();
}
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++) {
@ -315,29 +150,16 @@ class DisclosureProvider extends ChangeNotifier {
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;
Future<void> onStartDisclosurePressed(BuildContext context) async {
await callNextQuestionApi();
}
}

@ -1,11 +1,8 @@
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';
@ -14,6 +11,7 @@ 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/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';
@ -44,91 +42,11 @@ class DisclosureScreen extends StatelessWidget {
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>();
bool isButtonDisabled = provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct || provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.wrong;
bool isLastQuestion = provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!;
return WillPopScope(
child: Scaffold(
appBar: AppBarWidget(
@ -192,11 +110,7 @@ class DisclosureScreen extends StatelessWidget {
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),
),
onCorrectAnswer: (BuildContext context) => const SizedBox(),
onWinner: (BuildContext context) => const SizedBox(),
onWrongAnswer: (BuildContext context) => DisclosureCustomStatusWidget(
asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200),
@ -219,8 +133,22 @@ class DisclosureScreen extends StatelessWidget {
],
).expanded,
DefaultButton(
LocaleKeys.next.tr(),
() {},
isLastQuestion ? LocaleKeys.submit.tr() : LocaleKeys.next.tr(),
isButtonDisabled
? () async {
if (isLastQuestion) {
provider.resetValues();
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
return;
}
provider.updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.unSelected);
provider.updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer);
await provider.callNextQuestionApi();
}
: null,
textColor: isButtonDisabled ? MyColors.whiteColor : MyColors.greyACColor,
color: isLastQuestion ? MyColors.greenColor : null,
).insideContainer,
],
),

@ -1,109 +0,0 @@
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,
],
),
),
);
}
}

@ -6,11 +6,8 @@ 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;
@ -26,17 +23,6 @@ class DisclosureDetailsCard extends StatelessWidget {
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,
@ -58,36 +44,6 @@ class DisclosureDetailsCard extends StatelessWidget {
],
),
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),

@ -1,51 +0,0 @@
// 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;
}
}
}

@ -39,14 +39,13 @@ class DisclosureProgressContainer extends StatelessWidget {
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(),
"${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}"
.toText14(),
],
),
],
@ -54,14 +53,14 @@ class DisclosureProgressContainer extends StatelessWidget {
);
}
Color getStepColor(DisclosureQuestionCardStatus status, bool isOutOfGame) {
Color getStepColor(DisclosureQuestionCardStatus status) {
switch (status) {
case DisclosureQuestionCardStatus.question:
return MyColors.yellowColorII;
case DisclosureQuestionCardStatus.wrongAnswer:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.correctAnswer:
return MyColors.lightGreyDeColor;
return MyColors.greenColor;
case DisclosureQuestionCardStatus.skippedAnswer:
return MyColors.lightGreyDeColor;
case DisclosureQuestionCardStatus.completed:
@ -73,20 +72,14 @@ class DisclosureProgressContainer extends StatelessWidget {
}
}
Widget stepper(int value, List<DisclosureQuestionCardStatus> statusesList, int totalQuestions, bool isOutOfGame) {
Widget stepper(int value, List<DisclosureQuestionCardStatus> statusesList, int totalQuestions) {
return SizedBox(
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
for (int i = 0; i < totalQuestions; i++)
if (value <= i)
roundContainer(MyColors.lightGreyDeColor, i != 0)
else
roundContainer(
getStepColor(statusesList[i], isOutOfGame),
i != 0,
)
if (value <= i) roundContainer(MyColors.lightGreyDeColor, i != 0) else roundContainer(getStepColor(statusesList[i]), i != 0)
],
),
);

@ -1,5 +1,4 @@
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';
@ -7,10 +6,8 @@ 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';
@ -106,27 +103,28 @@ class DisclosureAnswerContent extends StatelessWidget {
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),
),
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),
),
),
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());
),
)
: const SizedBox(),
);
}
}
@ -153,19 +151,21 @@ class DisclosureAnswerTileForText extends StatelessWidget {
Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>();
return InkWell(
onTap: () {
provider.isUserOutOfGame ? Utils.showToast(LocaleKeys.youAreOutOfContest.tr()) : onAnswerTapped();
},
onTap: () => onAnswerTapped(),
child: Container(
alignment: Alignment.centerLeft,
decoration: MyDecorations.getAnswersContainerColorForDisclosure(provider.currentQuestion.questionOptions![index].optionStatus!),
decoration: MyDecorations.getAnswersContainerColorForDisclosure(
provider.currentQuestion.questionOptions![index].optionStatus!,
isLastQuestion: provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!,
isAgreeSelected: provider.selectedOptionIndex == 0,
),
child: Center(
child: displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
englishContent: provider.currentQuestion.questionOptions![index].titleEn ?? "",
arabicContent: provider.currentQuestion.questionOptions![index].titleAr ?? "",
).toText16(color: provider.isUserOutOfGame ? MyColors.darkTextColor : getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)).paddingOnly(top: 13, bottom: 13),
).toText16(color: getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)).paddingOnly(top: 13, bottom: 13),
),
),
);

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

Loading…
Cancel
Save