Pushing while testing!

merge-requests/119/head
Faiz Hashmi 3 years ago
parent 3f7e1cd0be
commit 4cb7bbee5d

File diff suppressed because one or more lines are too long

@ -23,57 +23,28 @@ class MarathonApiClient {
Future<String> getMarathonToken() async { Future<String> getMarathonToken() async {
String employeeUserName = AppState().getUserName ?? ""; String employeeUserName = AppState().getUserName ?? "";
String employeeSession = AppState().postParamsObject?.pSessionId.toString() ?? ""; String employeeSession = AppState().postParamsObject?.pSessionId.toString() ?? "";
Map<String, String> jsonObject = <String, String>{"userName": employeeUserName, "password": employeeSession}; Map<String, String> jsonObject = <String, String>{"userName": employeeUserName, "password": employeeSession};
Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonParticipantLoginUrl, jsonObject); return await ApiClient().postJsonForObject(
(json) {
var json = jsonDecode(response.body);
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
if (marathonModel.statusCode == 200) {
if (marathonModel.data != null && marathonModel.isSuccessful == true) {
AppState().setMarathonToken = marathonModel.data["token"] ?? "";
return marathonModel.data["token"] ?? ""; return marathonModel.data["token"] ?? "";
} else { },
//TODO : DO ERROR HANDLING HERE ApiConsts.marathonParticipantLoginUrl,
return ""; jsonObject,
} );
} else {
//TODO : DO ERROR HANDLING HERE
return "";
}
} }
// Future<GenericResponseModel?> getGetMenuEntries() async {
// String url = "${ApiConsts.erpRest}GET_MENU_ENTRIES";
// Map<String, dynamic> 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<String> getProjectId() async { Future<String> getProjectId() async {
Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonProjectGetUrl, <String, dynamic>{}, token: AppState().getMarathonToken ?? await getMarathonToken()); return await ApiClient().postJsonForObject(
(json) {
var json = jsonDecode(response.body); MarathonGenericModel responseData = MarathonGenericModel.fromJson(json);
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); return responseData.data[0]["id"] ?? "";
},
if (marathonModel.statusCode == 200) { ApiConsts.marathonProjectGetUrl,
if (marathonModel.data != null && marathonModel.isSuccessful == true) { <String, dynamic>{},
logger.i("message: ${marathonModel.data[0]["id"]}"); token: AppState().getMarathonToken ?? await getMarathonToken(),
AppState().setMarathonProjectId = marathonModel.data[0]["id"] ?? ""; );
return marathonModel.data[0]["id"] ?? "";
} else {
return "";
}
} else {
return "";
}
} }
Future<MarathonDetailModel> getMarathonDetails() async { Future<MarathonDetailModel> getMarathonDetails() async {
@ -105,72 +76,28 @@ class MarathonApiClient {
"marathonId": AppState().getMarathonProjectId!, "marathonId": AppState().getMarathonProjectId!,
}; };
Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonJoinParticipantUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); return await ApiClient().postJsonForObject(
(json) {
var json = jsonDecode(response.body);
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); 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"]; return marathonModel.data["remainingTime"];
},
ApiConsts.marathonJoinParticipantUrl,
jsonObject,
token: AppState().getMarathonToken ?? await getMarathonToken(),
);
} }
if (marathonModel.statusCode == 200) { Future<QuestionModel> getNextQuestion({required String? questionId, required String marathonId}) async {
if (marathonModel.data != null && marathonModel.isSuccessful == true) {
logger.i("joinMarathonAsParticipant: ${marathonModel.data}");
return marathonModel.data["remainingTime"];
} else {
return null;
}
} else {
return null;
}
}
Future<QuestionModel?> getNextQuestion({required String? questionId, required String marathonId}) async {
Map<String, String?> jsonObject = <String, String?>{ Map<String, String?> jsonObject = <String, String?>{
"previousQuestionId": questionId, "previousQuestionId": questionId,
"marathonId": marathonId, "marathonId": marathonId,
}; };
Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonNextQuestionUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); return await ApiClient().postJsonForObject(
(json) {
var json = jsonDecode(response.body);
logger.i("json in NextQuestion: $json");
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
if (marathonModel.statusCode == 404) { 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<MarathonProvider>().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<MarathonProvider>().resetValues();
Navigator.of(
AppRoutes.navigatorKey.currentContext!,
).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
);
return null;
}
if (marathonModel.statusCode == 204) {
Utils.confirmDialog( Utils.confirmDialog(
AppRoutes.navigatorKey.currentContext, AppRoutes.navigatorKey.currentContext,
marathonModel.message!, marathonModel.message!,
@ -181,32 +108,28 @@ class MarathonApiClient {
).popUntil(ModalRoute.withName(AppRoutes.dashboard)); ).popUntil(ModalRoute.withName(AppRoutes.dashboard));
}, },
); );
return null;
} }
if (marathonModel.data != null && marathonModel.isSuccessful == true) {
QuestionModel newQuestion = QuestionModel.fromJson(marathonModel.data); QuestionModel newQuestion = QuestionModel.fromJson(marathonModel.data);
return newQuestion; return newQuestion;
} else { },
return null; ApiConsts.marathonNextQuestionUrl,
} jsonObject,
token: AppState().getMarathonToken ?? await getMarathonToken(),
);
} }
Future<bool> submitSelectedOption({required String marathonId, required String? questionId, required String? selectedAnswerId}) async { Future<bool> submitSelectedOption({required String marathonId, required String? questionId, required String? selectedAnswerId}) async {
Map<String, String?> jsonObject = <String, String?>{"marathonId": marathonId, "questionId": questionId, "selectedOptionId": selectedAnswerId}; Map<String, String?> jsonObject = <String, String?>{"marathonId": marathonId, "questionId": questionId, "selectedOptionId": selectedAnswerId};
Response response = await ApiClient().postJsonForResponse(ApiConsts.marathonSubmitAnswerUrl, jsonObject, token: AppState().getMarathonToken ?? await getMarathonToken()); return await ApiClient().postJsonForObject(
(json) {
var json = jsonDecode(response.body);
logger.i("json in submitSelectedOption : $json");
MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json); MarathonGenericModel marathonModel = MarathonGenericModel.fromJson(json);
return marathonModel.isSuccessful ?? false;
if (marathonModel.isSuccessful == null) { },
return false; ApiConsts.marathonSubmitAnswerUrl,
} jsonObject,
token: AppState().getMarathonToken ?? await getMarathonToken(),
return marathonModel.isSuccessful!; );
} }
Future<int?> getQualifiers({required String marathonId}) async { Future<int?> getQualifiers({required String marathonId}) async {

@ -437,7 +437,7 @@ class DateUtil {
/// get data formatted like 10:30 according to lang /// get data formatted like 10:30 according to lang
static String formatDateToTimeLang(DateTime date, bool isArabic) { 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 /// get data formatted like 26/4/2020 10:30

@ -7,4 +7,5 @@ class MyLottieConsts {
static const String marathonWaiting = "assets/lottie/marathon_waiting.json"; static const String marathonWaiting = "assets/lottie/marathon_waiting.json";
static const String wrongAnswerGif = "assets/images/wrong_answer.gif"; static const String wrongAnswerGif = "assets/images/wrong_answer.gif";
static const String congratsGif = "assets/images/congrats.gif"; static const String congratsGif = "assets/images/congrats.gif";
static const String loadingLottie = "assets/lottie/loading_lottie.json";
} }

@ -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), 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, this,
textAlign: isCentered ? TextAlign.center : null,
style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4), style: TextStyle(fontSize: 20, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.4),
); );

@ -163,6 +163,9 @@ class _LoginScreenState extends State<LoginScreen> {
// username.text = "206535"; // Hashim User // username.text = "206535"; // Hashim User
// password.text = "Namira786"; // password.text = "Namira786";
// 13777
// Ab12345cd
} }
if (isAppOpenBySystem!) checkFirebaseToken(); if (isAppOpenBySystem!) checkFirebaseToken();
} }

@ -2,7 +2,6 @@ import 'dart:async';
import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/marathon/marathon_api_client.dart'; import 'package:mohem_flutter_app/api/marathon/marathon_api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -36,6 +35,7 @@ class MarathonProvider extends ChangeNotifier {
int? gapTimeType; int? gapTimeType;
bool iAmWinner = false; bool iAmWinner = false;
bool isGettingQualifiers = false;
bool isPrivilegedWithMarathon = false; bool isPrivilegedWithMarathon = false;
bool _isLoading = false; bool _isLoading = false;
@ -172,6 +172,7 @@ class MarathonProvider extends ChangeNotifier {
timerForQuestion = Timer.periodic( timerForQuestion = Timer.periodic(
oneSec, oneSec,
(Timer timer) async { (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 // This 2 is just to show the color of answer tile for 1 and then update card status
if (totalCurrentQuestionTime - currentGapTime == 1) { if (totalCurrentQuestionTime - currentGapTime == 1) {
getCorrectAnswerAndUpdateAnswerColor(); getCorrectAnswerAndUpdateAnswerColor();
@ -183,11 +184,15 @@ class MarathonProvider extends ChangeNotifier {
updateCardStatusToAnswer(); updateCardStatusToAnswer();
scheduleMicrotask(() async { scheduleMicrotask(() async {
if (isUserOutOfGame) {
await callNextQuestionApi();
} else {
await callSubmitOptionApi().then((bool value) async { await callSubmitOptionApi().then((bool value) async {
if (value) { if (value) {
await callNextQuestionApi(); await callNextQuestionApi();
} }
}); });
}
}); });
} }
@ -197,7 +202,7 @@ class MarathonProvider extends ChangeNotifier {
gapTimeType = currentQuestion.gapType; gapTimeType = currentQuestion.gapType;
updateCardData(); updateCardData();
if (currentQuestionNumber - 1 == marathonDetailModel.totalQuestions!) { if (currentQuestionNumber - 1 == marathonDetailModel.totalQuestions!) {
callGetQualifiersApi(); isGettingQualifiers = true;
updateQuestionCardStatus(QuestionCardStatus.findingWinner); updateQuestionCardStatus(QuestionCardStatus.findingWinner);
timer.cancel(); timer.cancel();
cancelTimer(); cancelTimer();
@ -223,10 +228,14 @@ class MarathonProvider extends ChangeNotifier {
timerForWinnerSelection = Timer.periodic( timerForWinnerSelection = Timer.periodic(
oneSec, oneSec,
(Timer timer) async { (Timer timer) async {
if (totalSecondsToWaitForWinner == 0) { if (totalSecondsToWaitForWinner == 1) {
timer.cancel(); timer.cancel();
callGetSelectedWinnersApi();
updateQuestionCardStatus(QuestionCardStatus.winnerFound); updateQuestionCardStatus(QuestionCardStatus.winnerFound);
return; return;
} else if (totalSecondsToWaitForWinner == 15) {
totalSecondsToWaitForWinner--;
await callGetQualifiersApi();
} else { } else {
totalSecondsToWaitForWinner--; totalSecondsToWaitForWinner--;
} }
@ -244,6 +253,7 @@ class MarathonProvider extends ChangeNotifier {
Future<void> callGetQualifiersApi() async { Future<void> callGetQualifiersApi() async {
totalQualifiers = await MarathonApiClient().getQualifiers(marathonId: marathonDetailModel.id!); totalQualifiers = await MarathonApiClient().getQualifiers(marathonId: marathonDetailModel.id!);
isGettingQualifiers = false;
notifyListeners(); notifyListeners();
} }
@ -264,10 +274,12 @@ class MarathonProvider extends ChangeNotifier {
} }
Future<void> callNextQuestionApi() async { Future<void> callNextQuestionApi() async {
print("Called callNextQuestionApi!!");
if (currentQuestionNumber < marathonDetailModel.totalQuestions!) { if (currentQuestionNumber < marathonDetailModel.totalQuestions!) {
if (currentQuestionNumber == 0) { if (currentQuestionNumber == 0) {
Utils.showLoading(AppRoutes.navigatorKey.currentContext!); 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; gapTimeImage = currentQuestion.gapImage;
gapTimeText = currentQuestion.gapText; gapTimeText = currentQuestion.gapText;
gapTimeType = currentQuestion.gapType; gapTimeType = currentQuestion.gapType;
@ -279,13 +291,14 @@ class MarathonProvider extends ChangeNotifier {
Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen); Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.marathonScreen);
} else { } else {
currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: currentQuestion.id, marathonId: marathonDetailModel.id!))!; currentQuestion = (await MarathonApiClient().getNextQuestion(questionId: currentQuestion.id, marathonId: marathonDetailModel.id!));
} }
notifyListeners(); notifyListeners();
} }
} }
void updateCardData() { void updateCardData() {
print("Called updateCardData!!");
if (currentQuestionNumber > 0) { if (currentQuestionNumber > 0) {
swiperController.swipeLeft(); swiperController.swipeLeft();
} }

@ -50,7 +50,15 @@ class MarathonScreen extends StatelessWidget {
width: double.infinity, width: double.infinity,
decoration: MyDecorations.shadowDecoration, decoration: MyDecorations.shadowDecoration,
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20),
child: Stack( 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,
),
)
: Stack(
children: <Widget>[ children: <Widget>[
Column( Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -202,7 +210,7 @@ class MarathonScreen extends StatelessWidget {
children: <Widget>[ children: <Widget>[
ListView( ListView(
children: [ children: [
20.height, 10.height,
if (provider.questionCardStatus == QuestionCardStatus.findingWinner) ...<Widget>[ if (provider.questionCardStatus == QuestionCardStatus.findingWinner) ...<Widget>[
QualifiersContainer(provider: provider).paddingOnly(left: 21, right: 21), QualifiersContainer(provider: provider).paddingOnly(left: 21, right: 21),
] else if (provider.questionCardStatus == QuestionCardStatus.winnerFound) ] else if (provider.questionCardStatus == QuestionCardStatus.winnerFound)

@ -43,7 +43,7 @@ class MarathonFooter extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DefaultButton( return DefaultButton(
LocaleKeys.joinMarathon.tr(), LocaleKeys.joinMarathon.tr(),
!provider.itsMarathonTime ? () => provider.onJoinMarathonPressed(context) : null, provider.itsMarathonTime ? () => provider.onJoinMarathonPressed(context) : null,
).insideContainer; ).insideContainer;
} }
} }

@ -1,7 +1,9 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.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/colors.dart';
import 'package:mohem_flutter_app/classes/decorations_helper.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/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
@ -20,7 +22,6 @@ class _QualifiersContainerState extends State<QualifiersContainer> {
@override @override
void initState() { void initState() {
widget.provider.startTimerForWinnerSelection(); widget.provider.startTimerForWinnerSelection();
widget.provider.callGetSelectedWinnersApi();
super.initState(); super.initState();
} }
@ -42,7 +43,16 @@ class _QualifiersContainerState extends State<QualifiersContainer> {
], ],
), ),
10.height, 10.height,
Row( widget.provider.isGettingQualifiers
? Container(
alignment: Alignment.centerLeft,
child: Lottie.asset(
MyLottieConsts.loadingLottie,
width: 60,
fit: BoxFit.fill,
),
)
: Row(
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[ children: <Widget>[
widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(), widget.provider.totalQualifiers != null ? widget.provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true) : const SizedBox(),

@ -65,7 +65,6 @@ class CardContent extends StatelessWidget {
child: Column( child: Column(
children: <Widget>[ children: <Widget>[
Container( Container(
height: 78,
width: double.infinity, width: double.infinity,
decoration: const BoxDecoration( decoration: const BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
@ -84,9 +83,9 @@ class CardContent extends StatelessWidget {
), ),
child: Center( child: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 13), padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 15),
child: Text( child: Text(
AppState().isArabic(context) ? provider.currentQuestion.titleAr ?? "" : provider.currentQuestion.titleEn ?? "", AppState().isArabic(context) ? "${provider.currentQuestion.titleAr}" ?? "" : provider.currentQuestion.titleEn ?? "",
style: const TextStyle( style: const TextStyle(
color: MyColors.white, color: MyColors.white,
fontSize: 16, fontSize: 16,
@ -110,7 +109,7 @@ class AnswerContent extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
MarathonProvider provider = context.watch<MarathonProvider>(); MarathonProvider provider = context.watch<MarathonProvider>();
return Container( return Container(
padding: const EdgeInsets.symmetric(vertical: 31, horizontal: 13), padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 13),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: MyColors.kWhiteColor, color: MyColors.kWhiteColor,
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(
@ -173,7 +172,7 @@ class AnswerTileForText extends StatelessWidget {
child: Center( child: Center(
child: (AppState().isArabic(context) ? provider.currentQuestion.questionOptions![index].titleAr! : provider.currentQuestion.questionOptions![index].titleEn!) 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!)) .toText16(color: provider.isUserOutOfGame ? MyColors.darkTextColor : getAnswerTextColor(provider.currentQuestion.questionOptions![index].optionStatus!))
.paddingOnly(top: 17, bottom: 17), .paddingOnly(top: 13, bottom: 13),
), ),
), ),
); );

Loading…
Cancel
Save