diff --git a/assets/lottie/loading_lottie.json b/assets/lottie/loading_lottie.json new file mode 100644 index 0000000..8babb66 --- /dev/null +++ b/assets/lottie/loading_lottie.json @@ -0,0 +1 @@ +{"nm":"Comp 1","mn":"","layers":[{"ty":4,"nm":"Shape Layer 1","mn":"","sr":1,"st":0,"op":300.00001221925,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[128.594,127.969,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[128.594,88,0],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[128.594,128,0],"t":40.0000016292334}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100},"r":{"a":0,"k":0}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[33.75,34.5]}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2,0.7529,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-70.125,-0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":0},{"ty":4,"nm":"Shape Layer 2","mn":"","sr":1,"st":0,"op":300.00001221925,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[168.6,128,0],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[168.6,88,0],"t":40},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[168.6,128,0],"t":50.0000020365418}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100},"r":{"a":0,"k":0}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[33.75,34.5]}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2,0.7529,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-70.125,-0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Shape Layer 3","mn":"","sr":1,"st":0,"op":300.00001221925,"ip":0,"hd":true,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[208.6,127.969,0],"t":40},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[208.6,88,0],"t":50},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[208.6,128,0],"t":60.0000024438501}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100},"r":{"a":0,"k":0}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[33.75,34.5]}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2,0.7529,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-70.125,-0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Shape Layer 4","mn":"","sr":1,"st":0,"op":300.00001221925,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[88.6,127.969,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[88.6,88,0],"t":20},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[88.6,128,0],"t":30.0000012219251}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100},"r":{"a":0,"k":0}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[33.75,34.5]}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2,0.7529,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-70.125,-0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Shape Layer 5","mn":"","sr":1,"st":0,"op":300.00001221925,"ip":0,"hd":false,"cl":"","ln":"","ddd":0,"bm":0,"tt":0,"hasMask":false,"td":0,"ao":0,"ks":{"a":{"a":0,"k":[-70,-0.5,0]},"s":{"a":0,"k":[75,75,100]},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[48.6,127.969,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[48.6,88,0],"t":10},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[48.6,128,0],"t":20.0000008146167}]},"sa":{"a":0,"k":0},"o":{"a":0,"k":100},"r":{"a":0,"k":0}},"ef":[],"shapes":[{"ty":"gr","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[33.75,34.5]}},{"ty":"fl","bm":0,"cl":"","ln":"","hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.2,0.7529,0.6471]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-70.125,-0.5],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}],"ddd":0,"h":150,"w":200,"meta":{"a":"","k":"","d":"","g":"@lottiefiles/toolkit-js 0.21.1","tc":"#ffffff"},"v":"4.6.8","fr":60,"op":60.0000024438501,"ip":0,"assets":[]} \ No newline at end of file diff --git a/lib/api/marathon/marathon_api_client.dart b/lib/api/marathon/marathon_api_client.dart index 859b23d..a2d684f 100644 --- a/lib/api/marathon/marathon_api_client.dart +++ b/lib/api/marathon/marathon_api_client.dart @@ -23,57 +23,28 @@ class MarathonApiClient { Future getMarathonToken() async { String employeeUserName = AppState().getUserName ?? ""; String employeeSession = AppState().postParamsObject?.pSessionId.toString() ?? ""; - Map jsonObject = {"userName": employeeUserName, "password": employeeSession}; - Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonParticipantLoginUrl, jsonObject); - - var json = jsonDecode(response.body); - - MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); - - if (marathonModel.statusCode == 200) { - if (marathonModel.data != null && marathonModel.isSuccessful == true) { - AppState().setMarathonToken = marathonModel.data["token"] ?? ""; + return await ApiClient().postJsonForObject( + (json) { + MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); return marathonModel.data["token"] ?? ""; - } else { - //TODO : DO ERROR HANDLING HERE - return ""; - } - } else { - //TODO : DO ERROR HANDLING HERE - return ""; - } + }, + ApiConsts.marathonParticipantLoginUrl, + jsonObject, + ); } - - // Future getGetMenuEntries() async { - // String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES"; - // Map postParams = {"P_SELECTED_RESP_ID": -999, "P_MENU_TYPE": "E"}; - // postParams.addAll(AppState().postParamsJson); - // return await ApiClient().postJsonForObject((json) { - // GenericResponseModel responseData = GenericResponseModel.fromJson(json); - // return responseData; - // }, url, postParams); - // } - Future getProjectId() async { - Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonProjectGetUrl, {}, token: AppState().getMarathonToken ?? await getMarathonToken()); - - var json = jsonDecode(response.body); - MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); - - if (marathonModel.statusCode == 200) { - if (marathonModel.data != null && marathonModel.isSuccessful == true) { - logger.i("message: ${marathonModel.data[0]["id"]}"); - AppState().setMarathonProjectId = marathonModel.data[0]["id"] ?? ""; - return marathonModel.data[0]["id"] ?? ""; - } else { - return ""; - } - } else { - return ""; - } + return await ApiClient().postJsonForObject( + (json) { + MarathonGenericModel responseData = MarathonGenericModel.fromJson(json); + return responseData.data[0]["id"] ?? ""; + }, + ApiConsts.marathonProjectGetUrl, + {}, + token: AppState().getMarathonToken ?? await getMarathonToken(), + ); } Future getMarathonDetails() async { @@ -105,108 +76,60 @@ class MarathonApiClient { "marathonId": AppState().getMarathonProjectId!, }; - Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonJoinParticipantUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); - - var json = jsonDecode(response.body); - - MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); - - if (marathonModel.statusCode == 208) { - // means participant is already in the marathon i.e already joined - //TODO: NEED TO LOOK UPON THIS - return marathonModel.data["remainingTime"]; - } - - if (marathonModel.statusCode == 200) { - if (marathonModel.data != null && marathonModel.isSuccessful == true) { - logger.i("joinMarathonAsParticipant: ${marathonModel.data}"); + return await ApiClient().postJsonForObject( + (json) { + MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); return marathonModel.data["remainingTime"]; - } else { - return null; - } - } else { - return null; - } + }, + ApiConsts.marathonJoinParticipantUrl, + jsonObject, + token: AppState().getMarathonToken ?? await getMarathonToken(), + ); } - Future getNextQuestion({required String? questionId, required String marathonId}) async { + Future getNextQuestion({required String? questionId, required String marathonId}) async { Map jsonObject = { "previousQuestionId": questionId, "marathonId": marathonId, }; - Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonNextQuestionUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); - - var json = jsonDecode(response.body); - - logger.i("json in NextQuestion: $json"); - MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); - - if (marathonModel.statusCode == 404) { - Utils.confirmDialog( - AppRoutes.navigatorKey.currentContext, - marathonModel.message!, - onTap: () { - AppRoutes.navigatorKey.currentContext!.read().resetValues(); - Navigator.of( - AppRoutes.navigatorKey.currentContext!, - ).popUntil(ModalRoute.withName(AppRoutes.dashboard)); - }, - ); - return null; - } - - if (marathonModel.statusCode == 208) { - Utils.confirmDialog( - AppRoutes.navigatorKey.currentContext, - marathonModel.message!, - onTap: () { - AppRoutes.navigatorKey.currentContext!.read().resetValues(); - Navigator.of( - AppRoutes.navigatorKey.currentContext!, - ).popUntil(ModalRoute.withName(AppRoutes.dashboard)); - }, - ); - return null; - } - - if (marathonModel.statusCode == 204) { - Utils.confirmDialog( - AppRoutes.navigatorKey.currentContext, - marathonModel.message!, - onTap: () { - AppRoutes.navigatorKey.currentContext!.read().resetValues(); - Navigator.of( - AppRoutes.navigatorKey.currentContext!, - ).popUntil(ModalRoute.withName(AppRoutes.dashboard)); - }, - ); - return null; - } - - if (marathonModel.data != null && marathonModel.isSuccessful == true) { - QuestionModel newQuestion = QuestionModel.fromJson(marathonModel.data); - return newQuestion; - } else { - return null; - } + return await ApiClient().postJsonForObject( + (json) { + MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); + + if (marathonModel.statusCode == 404 || marathonModel.statusCode == 208 || marathonModel.statusCode == 204 || marathonModel.statusCode == 500) { + Utils.confirmDialog( + AppRoutes.navigatorKey.currentContext, + marathonModel.message!, + onTap: () { + AppRoutes.navigatorKey.currentContext!.read().resetValues(); + Navigator.of( + AppRoutes.navigatorKey.currentContext!, + ).popUntil(ModalRoute.withName(AppRoutes.dashboard)); + }, + ); + } + QuestionModel newQuestion = QuestionModel.fromJson(marathonModel.data); + return newQuestion; + }, + ApiConsts.marathonNextQuestionUrl, + jsonObject, + token: AppState().getMarathonToken ?? await getMarathonToken(), + ); } Future submitSelectedOption({required String marathonId, required String? questionId, required String? selectedAnswerId}) async { Map jsonObject = {"marathonId": marathonId, "questionId": questionId, "selectedOptionId": selectedAnswerId}; - Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonSubmitAnswerUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); - - var json = jsonDecode(response.body); - logger.i("json in submitSelectedOption : $json"); - - MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); - - if (marathonModel.isSuccessful == null) { - return false; - } - - return marathonModel.isSuccessful!; + return await ApiClient().postJsonForObject( + (json) { + MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); + return marathonModel.isSuccessful ?? false; + }, + ApiConsts.marathonSubmitAnswerUrl, + jsonObject, + token: AppState().getMarathonToken ?? await getMarathonToken(), + ); } Future getQualifiers({required String marathonId}) async { diff --git a/lib/classes/date_uitl.dart b/lib/classes/date_uitl.dart index a1e52d9..bb31c56 100644 --- a/lib/classes/date_uitl.dart +++ b/lib/classes/date_uitl.dart @@ -437,7 +437,7 @@ class DateUtil { /// get data formatted like 10:30 according to lang static String formatDateToTimeLang(DateTime date, bool isArabic) { - return DateFormat('HH:mm a', isArabic ? "ar_SA" : "en_US").format(date); + return DateFormat('hh:mm a', isArabic ? "ar_SA" : "en_US").format(date); } /// get data formatted like 26/4/2020 10:30 diff --git a/lib/classes/lottie_consts.dart b/lib/classes/lottie_consts.dart index 7846f6c..58b8a32 100644 --- a/lib/classes/lottie_consts.dart +++ b/lib/classes/lottie_consts.dart @@ -7,4 +7,5 @@ class MyLottieConsts { static const String marathonWaiting = "assets/lottie/marathon_waiting.json"; static const String wrongAnswerGif = "assets/images/wrong_answer.gif"; static const String congratsGif = "assets/images/congrats.gif"; + static const String loadingLottie = "assets/lottie/loading_lottie.json"; } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index e9e7e93..dbea17a 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -131,8 +131,9 @@ extension EmailValidator on String { style: TextStyle(fontSize: 19, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.14), ); - Widget toText20({Color? color, bool isBold = false}) => Text( + Widget toText20({Color? color, bool isBold = false, bool isCentered = false}) => Text( this, + textAlign: isCentered ? TextAlign.center : null, style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), ); diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index a0ab3c9..acf9b1e 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -163,6 +163,9 @@ class _LoginScreenState extends State { // username.text = "206535"; // Hashim User // password.text = "Namira786"; + + // 13777 + // Ab12345cd } if (isAppOpenBySystem!) checkFirebaseToken(); } diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index f87696d..a8dde7b 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/marathon/marathon_api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -36,6 +35,7 @@ class MarathonProvider extends ChangeNotifier { int? gapTimeType; bool iAmWinner = false; + bool isGettingQualifiers = false; bool isPrivilegedWithMarathon = false; bool _isLoading = false; @@ -172,6 +172,7 @@ class MarathonProvider extends ChangeNotifier { timerForQuestion = Timer.periodic( oneSec, (Timer timer) async { + print("here is the timer: $totalCurrentQuestionTime"); // This 2 is just to show the color of answer tile for 1 and then update card status if (totalCurrentQuestionTime - currentGapTime == 1) { getCorrectAnswerAndUpdateAnswerColor(); @@ -183,11 +184,15 @@ class MarathonProvider extends ChangeNotifier { updateCardStatusToAnswer(); scheduleMicrotask(() async { - await callSubmitOptionApi().then((bool value) async { - if (value) { - await callNextQuestionApi(); - } - }); + if (isUserOutOfGame) { + await callNextQuestionApi(); + } else { + await callSubmitOptionApi().then((bool value) async { + if (value) { + await callNextQuestionApi(); + } + }); + } }); } @@ -197,7 +202,7 @@ class MarathonProvider extends ChangeNotifier { gapTimeType = currentQuestion.gapType; updateCardData(); if (currentQuestionNumber - 1 == marathonDetailModel.totalQuestions!) { - callGetQualifiersApi(); + isGettingQualifiers = true; updateQuestionCardStatus(QuestionCardStatus.findingWinner); timer.cancel(); cancelTimer(); @@ -223,10 +228,14 @@ class MarathonProvider extends ChangeNotifier { timerForWinnerSelection = Timer.periodic( oneSec, (Timer timer) async { - if (totalSecondsToWaitForWinner == 0) { + if (totalSecondsToWaitForWinner == 1) { timer.cancel(); + callGetSelectedWinnersApi(); updateQuestionCardStatus(QuestionCardStatus.winnerFound); return; + } else if (totalSecondsToWaitForWinner == 15) { + totalSecondsToWaitForWinner--; + await callGetQualifiersApi(); } else { totalSecondsToWaitForWinner--; } @@ -244,6 +253,7 @@ class MarathonProvider extends ChangeNotifier { Future callGetQualifiersApi() async { totalQualifiers = await MarathonApiClient().getQualifiers(marathonId: marathonDetailModel.id!); + isGettingQualifiers = false; notifyListeners(); } @@ -264,10 +274,12 @@ class MarathonProvider extends ChangeNotifier { } Future callNextQuestionApi() async { + print("Called callNextQuestionApi!!"); + if (currentQuestionNumber < marathonDetailModel.totalQuestions!) { if (currentQuestionNumber == 0) { Utils.showLoading(AppRoutes.navigatorKey.currentContext!); - currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: null, marathonId: marathonDetailModel.id!))!; + currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: null, marathonId: marathonDetailModel.id!)); gapTimeImage = currentQuestion.gapImage; gapTimeText = currentQuestion.gapText; gapTimeType = currentQuestion.gapType; @@ -279,13 +291,14 @@ class MarathonProvider extends ChangeNotifier { Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); } else { - currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: currentQuestion.id, marathonId: marathonDetailModel.id!))!; + currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: currentQuestion.id, marathonId: marathonDetailModel.id!)); } notifyListeners(); } } void updateCardData() { + print("Called updateCardData!!"); if (currentQuestionNumber > 0) { swiperController.swipeLeft(); } diff --git a/lib/ui/marathon/marathon_screen.dart b/lib/ui/marathon/marathon_screen.dart index a64b97a..3a257c7 100644 --- a/lib/ui/marathon/marathon_screen.dart +++ b/lib/ui/marathon/marathon_screen.dart @@ -50,88 +50,96 @@ class MarathonScreen extends StatelessWidget { width: double.infinity, decoration: MyDecorations.shadowDecoration, padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), - child: Stack( - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - height: 50, - child: Stack( - children: [ - Align( - alignment: Alignment.center, - child: SvgPicture.asset("assets/images/winner_ribbon.svg", height: 50), - ), - Align( - alignment: Alignment.center, - child: LocaleKeys.winners.tr().toText32(color: MyColors.white, isBold: true, isCentered: true).paddingOnly(top: 07), - ) - ], - ), + child: provider.selectedWinners == null || provider.selectedWinners!.isEmpty + //TODO: WE WILL UPDATE THE DESIGN WHEN THERE IS NO WINNER!! + ? Center( + child: "Sad! No one won Today. What you guys are doing?".toText20( + color: MyColors.grey3AColor, + isCentered: true, ), - 16.height, - provider.iAmWinner - ? Column( - children: [ - (AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn)!.toText22( - color: MyColors.grey3AColor, - isCentered: true, - ), - 8.height, - AppState().memberInformationList!.eMPLOYEENUMBER!.toText22(color: MyColors.grey57Color), - ], - ) - : const SizedBox(), - 36.height, - if (provider.selectedWinners != null) ...[ - ListView.separated( - shrinkWrap: true, - itemCount: provider.selectedWinners!.length, - separatorBuilder: (BuildContext context, int index) { - return const Divider(); - }, - itemBuilder: (BuildContext context, int index) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - (AppState().isArabic(context) ? provider.selectedWinners![index].nameEn : provider.selectedWinners![index].nameEn)!.toText16( - color: MyColors.grey3AColor, - ), - provider.selectedWinners!.first.employeeId!.toText16(color: MyColors.grey57Color), - ], - ); - }, - ), - ], - 60.height, - if (provider.marathonDetailModel.sponsors != null && provider.marathonDetailModel.sponsors!.isNotEmpty) ...[ - Row( + ) + : Stack( + children: [ + Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - "${LocaleKeys.sponsoredBy.tr()} ".toText14(color: MyColors.grey77Color), - (AppState().isArabic(context) ? provider.marathonDetailModel.sponsors!.first.nameAr ?? "" : provider.marathonDetailModel.sponsors!.first.nameEn ?? "").toText14( - color: MyColors.darkTextColor, - isBold: true, + SizedBox( + height: 50, + child: Stack( + children: [ + Align( + alignment: Alignment.center, + child: SvgPicture.asset("assets/images/winner_ribbon.svg", height: 50), + ), + Align( + alignment: Alignment.center, + child: LocaleKeys.winners.tr().toText32(color: MyColors.white, isBold: true, isCentered: true).paddingOnly(top: 07), + ) + ], + ), ), + 16.height, + provider.iAmWinner + ? Column( + children: [ + (AppState().isArabic(context) ? AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEAr : AppState().memberInformationList!.eMPLOYEEDISPLAYNAMEEn)!.toText22( + color: MyColors.grey3AColor, + isCentered: true, + ), + 8.height, + AppState().memberInformationList!.eMPLOYEENUMBER!.toText22(color: MyColors.grey57Color), + ], + ) + : const SizedBox(), + 36.height, + if (provider.selectedWinners != null) ...[ + ListView.separated( + shrinkWrap: true, + itemCount: provider.selectedWinners!.length, + separatorBuilder: (BuildContext context, int index) { + return const Divider(); + }, + itemBuilder: (BuildContext context, int index) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + (AppState().isArabic(context) ? provider.selectedWinners![index].nameEn : provider.selectedWinners![index].nameEn)!.toText16( + color: MyColors.grey3AColor, + ), + provider.selectedWinners!.first.employeeId!.toText16(color: MyColors.grey57Color), + ], + ); + }, + ), + ], + 60.height, + if (provider.marathonDetailModel.sponsors != null && provider.marathonDetailModel.sponsors!.isNotEmpty) ...[ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "${LocaleKeys.sponsoredBy.tr()} ".toText14(color: MyColors.grey77Color), + (AppState().isArabic(context) ? provider.marathonDetailModel.sponsors!.first.nameAr ?? "" : provider.marathonDetailModel.sponsors!.first.nameEn ?? "").toText14( + color: MyColors.darkTextColor, + isBold: true, + ), + ], + ), + 5.height, + Image.network( + ApiConsts.marathonBaseUrlServices + provider.marathonDetailModel.sponsors!.first.image!, + 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); + }, + ) + ], ], ), - 5.height, - Image.network( - ApiConsts.marathonBaseUrlServices + provider.marathonDetailModel.sponsors!.first.image!, - 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), ], - ], - ), - Lottie.asset(MyLottieConsts.celebrate1Lottie), - ], - ), + ), ); } @@ -202,7 +210,7 @@ class MarathonScreen extends StatelessWidget { children: [ ListView( children: [ - 20.height, + 10.height, if (provider.questionCardStatus == QuestionCardStatus.findingWinner) ...[ QualifiersContainer(provider: provider).paddingOnly(left: 21, right: 21), ] else if (provider.questionCardStatus == QuestionCardStatus.winnerFound) diff --git a/lib/ui/marathon/widgets/marathon_footer.dart b/lib/ui/marathon/widgets/marathon_footer.dart index fea076e..cd23ce1 100644 --- a/lib/ui/marathon/widgets/marathon_footer.dart +++ b/lib/ui/marathon/widgets/marathon_footer.dart @@ -43,7 +43,7 @@ class MarathonFooter extends StatelessWidget { Widget build(BuildContext context) { return DefaultButton( LocaleKeys.joinMarathon.tr(), - !provider.itsMarathonTime ? () => provider.onJoinMarathonPressed(context) : null, + provider.itsMarathonTime ? () => provider.onJoinMarathonPressed(context) : null, ).insideContainer; } } diff --git a/lib/ui/marathon/widgets/marathon_qualifiers_container.dart b/lib/ui/marathon/widgets/marathon_qualifiers_container.dart index 7463f37..ed5132e 100644 --- a/lib/ui/marathon/widgets/marathon_qualifiers_container.dart +++ b/lib/ui/marathon/widgets/marathon_qualifiers_container.dart @@ -1,7 +1,9 @@ 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/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; @@ -20,7 +22,6 @@ class _QualifiersContainerState extends State { @override void initState() { widget.provider.startTimerForWinnerSelection(); - widget.provider.callGetSelectedWinnersApi(); super.initState(); } @@ -42,14 +43,23 @@ class _QualifiersContainerState extends State { ], ), 10.height, - Row( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(), - 2.width, - LocaleKeys.qualifiers.tr().toText16(color: MyColors.greenColor), - ], - ), + widget.provider.isGettingQualifiers + ? Container( + alignment: Alignment.centerLeft, + child: Lottie.asset( + MyLottieConsts.loadingLottie, + width: 60, + fit: BoxFit.fill, + ), + ) + : Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(), + 2.width, + LocaleKeys.qualifiers.tr().toText16(color: MyColors.greenColor), + ], + ), ], ), ); diff --git a/lib/ui/marathon/widgets/question_card.dart b/lib/ui/marathon/widgets/question_card.dart index 6fcb5db..5246426 100644 --- a/lib/ui/marathon/widgets/question_card.dart +++ b/lib/ui/marathon/widgets/question_card.dart @@ -65,7 +65,6 @@ class CardContent extends StatelessWidget { child: Column( children: [ Container( - height: 78, width: double.infinity, decoration: const BoxDecoration( gradient: LinearGradient( @@ -84,9 +83,9 @@ class CardContent extends StatelessWidget { ), child: Center( child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 13), + padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 15), child: Text( - AppState().isArabic(context) ? provider.currentQuestion.titleAr ?? "" : provider.currentQuestion.titleEn ?? "", + AppState().isArabic(context) ? "${provider.currentQuestion.titleAr}" ?? "" : provider.currentQuestion.titleEn ?? "", style: const TextStyle( color: MyColors.white, fontSize: 16, @@ -110,7 +109,7 @@ class AnswerContent extends StatelessWidget { Widget build(BuildContext context) { MarathonProvider provider = context.watch(); return Container( - padding: const EdgeInsets.symmetric(vertical: 31, horizontal: 13), + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 13), decoration: const BoxDecoration( color: MyColors.kWhiteColor, borderRadius: BorderRadius.only( @@ -173,7 +172,7 @@ class AnswerTileForText extends StatelessWidget { child: Center( child: (AppState().isArabic(context) ? provider.currentQuestion.questionOptions![index].titleAr! : provider.currentQuestion.questionOptions![index].titleEn!) .toText16(color: provider.isUserOutOfGame ? MyColors.darkTextColor : getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!)) - .paddingOnly(top: 17, bottom: 17), + .paddingOnly(top: 13, bottom: 13), ), ), );