diff --git a/assets/images/congrats.gif b/assets/images/congrats.gif new file mode 100644 index 0000000..32818b2 Binary files /dev/null and b/assets/images/congrats.gif differ diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 59c0814..b5fd9ce 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -502,7 +502,9 @@ "favorite": "مفضلتي", "searchfromchat": "البحث من الدردشة", "yourAnswerCorrect": "إجابتك صحيحة", - "youMissedTheQuestion": "فاتك !! أنت خارج اللعبة. لكن يمكنك المتابعة.", - "wrongAnswer": "إجابة خاطئة! أنت خارج اللعبة. لكن يمكنك المتابعة." + "youMissedTheQuestion": "نفد منك الوقت. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", + "wrongAnswer": "إجابتك غير صحيحة. أنت خارج اللعبة. لكن يمكنك الاستمرار وكمشاهد.", + "oops": "أوه!!!", + "winner": "الفائز" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index b0ab50e..3ddc9f7 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -502,7 +502,10 @@ "favorite" : "My Favorites", "searchfromchat": "Search from chat", "yourAnswerCorrect": "Your answer is correct", - "youMissedTheQuestion": "You Missed !! You are out of the game. But you can follow up.", - "wrongAnswer": "Wrong Answer! You are out of the game. But you can follow up." + "youMissedTheQuestion": "You ran out of time. You are out of the game. But you can continue and as a viewer.", + "wrongAnswer": "Your answer is Incorrect. You are out of the game. But you can continue and as a viewer.", + "oops": "Ooopsss!!!!", + "winner": "WINNER" + } \ 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 1ec117d..b17683a 100644 --- a/lib/api/marathon/marathon_api_client.dart +++ b/lib/api/marathon/marathon_api_client.dart @@ -167,7 +167,7 @@ class MarathonApiClient { Map data = arguments.first! as Map; var json = data["data"]; QuestionModel newQuestion = QuestionModel.fromJson(json); - context.read().onNewQuestionReceived(newQuestion); + context.read().onNewQuestionReceived(newQuestion, context); } } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index bdeeecd..fb7079f 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -25,7 +25,18 @@ class ApiConsts { static String chatSingleUserHistoryUrl = chatServerBaseApiUrl + "UserChatHistory/"; static String chatMediaImageUploadUrl = chatServerBaseApiUrl + "shared/"; static String chatFavUser = chatServerBaseApiUrl + "FavUser/"; - static String chatUserImages = chatServerBaseUrl + "empservice/api/employee/"; + static String chatUserImages = chatServerBaseUrl + "empservice/api/employee/"; + + //Brain Marathon Constants + static String marathonBaseUrl = "https://18.188.181.12/service/"; + static String marathonParticipantLoginUrl = marathonBaseUrl + "api/auth/participantlogin"; + static String marathonProjectGetUrl = marathonBaseUrl + "api/Project/Project_Get"; + static String marathonUpcomingUrl = marathonBaseUrl + "api/marathon/upcoming/"; + static String marathonHubConnectionUrl = marathonBaseUrl + "MarathonBroadCast"; + + //DummyCards for the UI + + static CardContent dummyQuestion = const CardContent(); } class SharedPrefsConsts { diff --git a/lib/classes/lottie_consts.dart b/lib/classes/lottie_consts.dart index 24dc423..d7d38bc 100644 --- a/lib/classes/lottie_consts.dart +++ b/lib/classes/lottie_consts.dart @@ -5,5 +5,6 @@ class MyLottieConsts { static const String winnerLottie = "assets/lottie/winner3.json"; static const String allQuestions = "assets/lottie/all_questions.json"; static const String wrongAnswerGif = "assets/images/wrong_answer.gif"; + static const String congratsGif = "assets/images/congrats.gif"; } diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 3546f6b..3261149 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -118,8 +118,9 @@ extension EmailValidator on String { style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), ); - Widget toText18({Color? color, bool isBold = false}) => Text( + Widget toText18({Color? color, bool isBold = false, bool isCentered = false}) => Text( this, + textAlign: isCentered ? TextAlign.center : null, style: TextStyle(fontSize: 18, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -1.08), ); diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 2f7efcc..08f8ad4 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -490,5 +490,7 @@ abstract class LocaleKeys { static const yourAnswerCorrect = 'yourAnswerCorrect'; static const youMissedTheQuestion = 'youMissedTheQuestion'; static const wrongAnswer = 'wrongAnswer'; + static const oops = 'oops'; + static const winner = 'winner'; } diff --git a/lib/ui/marathon/marathon_intro_screen.dart b/lib/ui/marathon/marathon_intro_screen.dart index d85a82f..ef29809 100644 --- a/lib/ui/marathon/marathon_intro_screen.dart +++ b/lib/ui/marathon/marathon_intro_screen.dart @@ -1,21 +1,13 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:lottie/lottie.dart'; -import 'package:mohem_flutter_app/app_state/app_state.dart'; -import 'package:mohem_flutter_app/classes/colors.dart'; -import 'package:mohem_flutter_app/classes/date_uitl.dart'; -import 'package:mohem_flutter_app/classes/decorations_helper.dart'; -import 'package:mohem_flutter_app/classes/lottie_consts.dart'; -import 'package:mohem_flutter_app/classes/utils.dart'; -import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/extensions/int_extensions.dart'; -import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; -import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_details_card.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_footer.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_timer_card.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; -import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:provider/provider.dart'; class MarathonIntroScreen extends StatelessWidget { @@ -44,179 +36,3 @@ class MarathonIntroScreen extends StatelessWidget { } } -class MarathonDetailsCard extends StatelessWidget { - final MarathonProvider provider; - - const MarathonDetailsCard({Key? key, required this.provider}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - decoration: MyDecorations.shadowDecoration, - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.contestTopicAbout.tr().toText16(color: MyColors.grey77Color), - "${AppState().isArabic(context) ? provider.marathonDetailModel.titleAr : provider.marathonDetailModel.titleEn}".toText20(color: MyColors.textMixColor, isBold: true), - Row( - children: [ - Flexible( - child: "${AppState().isArabic(context) ? provider.marathonDetailModel.descAr : provider.marathonDetailModel.descEn}".toText14(color: MyColors.grey77Color), - ) - ], - ), - if (provider.itsMarathonTime && provider.marathonDetailModel.sponsors != null) ...[ - 5.height, - provider.marathonDetailModel.sponsors?.first.sponsorPrizes != null - ? Row( - children: [ - "${LocaleKeys.prize.tr()} ".toText16(color: MyColors.grey77Color, isBold: true), - "${AppState().isArabic(context) ? provider.marathonDetailModel.sponsors?.first.sponsorPrizes?.first.marathonPrizeAr : provider.marathonDetailModel.sponsors?.first.sponsorPrizes?.first.marathonPrizeAr}" - .toText16(color: MyColors.greenColor, isBold: true), - ], - ) - : const SizedBox(), - Row( - children: [ - "${LocaleKeys.sponsoredBy.tr()} ".toText16(color: MyColors.grey77Color), - "${AppState().isArabic(context) ? provider.marathonDetailModel.sponsors?.first.nameAr : provider.marathonDetailModel.sponsors?.first.nameEn}" - .toText16(color: MyColors.darkTextColor, isBold: true), - ], - ), - 10.height, - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.network( - provider.marathonDetailModel.sponsors!.first.image!, - height: 40, - width: 150, - fit: BoxFit.fill, - errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { - return const Center(); - }, - ) - ], - ), - ] - ], - ), - ], - ), - ); - } -} - -class MarathonTimerCard extends StatelessWidget { - final int timeToMarathon; - final MarathonProvider provider; - - const MarathonTimerCard({ - Key? key, - required this.provider, - required this.timeToMarathon, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - decoration: MyDecorations.shadowDecoration, - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14), - child: Column( - children: [ - Row( - children: [ - "${LocaleKeys.gameDate.tr()} ".toText16(color: MyColors.grey77Color), - DateUtil.getMonthDayYearDateFormatted(DateTime.parse(provider.marathonDetailModel.startTime!)).toText16(color: MyColors.darkTextColor, isBold: true), - ], - ), - Row( - children: [ - "${LocaleKeys.gameTime.tr()} ".toText16(color: MyColors.grey77Color), - DateUtil.formatDateToTimeLang(DateTime.parse(provider.marathonDetailModel.startTime!), AppState().isArabic(context)).toText16(color: MyColors.darkTextColor, isBold: true), - ], - ), - Lottie.asset(MyLottieConsts.hourGlassLottie, height: 200), - BuildCountdownTimer(timeToMarathon: timeToMarathon, provider: provider, screenFlag: 1), - ], - ), - ); - } -} - -class MarathonFooter extends StatelessWidget { - final MarathonProvider provider; - - const MarathonFooter({ - Key? key, - required this.provider, - }) : super(key: key); - - Widget buildNoteForDemo() { - return RichText( - text: TextSpan( - children: [ - 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 !provider.itsMarathonTime - ? DefaultButton( - LocaleKeys.joinMarathon.tr(), - () async { - Utils.showLoading(context); - try { - provider.resetValues(); - await provider.connectSignalrAndJoinMarathon(context); - } catch (e, s) { - Utils.confirmDialog(context, e.toString()); - print(s); - } - Utils.hideLoading(context); - Navigator.pushNamed(context, AppRoutes.marathonScreen); - }, - ).insideContainer - : Container( - color: Colors.white, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - buildNoteForDemo(), - DefaultButton( - LocaleKeys.joinDemoMarathon.tr(), - () { - provider.connectSignalrAndJoinMarathon(context); - }, - color: MyColors.yellowColorII, - ).insideContainer, - ], - ), - ); - } -} diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index b629b36..a178710 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -4,6 +4,8 @@ import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/marathon/marathon_api_client.dart'; +import 'package:mohem_flutter_app/classes/utils.dart'; +import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/models/marathon/marathon_model.dart'; import 'package:mohem_flutter_app/models/marathon/question_model.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; @@ -19,18 +21,30 @@ class MarathonProvider extends ChangeNotifier { int? selectedOptionIndex; int currentQuestionTime = 0; - - void onNewQuestionReceived(QuestionModel newQuestion) { - if (currentQuestionNumber > 0) { - swipeCardLeft(); + int totalSecondsToWaitForWinner = 30; + int totalQualifiers = 0; + + void onNewQuestionReceived(QuestionModel newQuestion, BuildContext context) { + if (currentQuestionNumber < marathonDetailModel.totalQuestions!) { + if (currentQuestionNumber == 0) { + if (Utils.isLoading) { + Utils.hideLoading(context); + } + startTimerForQuestion(context); + Navigator.pushNamed(context, AppRoutes.marathonScreen); + } + if (currentQuestionNumber > 0) { + swipeCardLeft(); + } + print("I received a new question and time is $currentQuestionTime and number is $currentQuestionNumber"); + selectedOptionIndex = null; + currentQuestionNumber++; + currentQuestion = newQuestion; + cardContentList.add(const CardContent()); + currentQuestionTime = newQuestion.questionTime!; + questionCardStatus = QuestionCardStatus.question; + notifyListeners(); } - selectedOptionIndex = null; - currentQuestionNumber++; - currentQuestion = newQuestion; - cardContentList.add(const CardContent()); - currentQuestionTime = newQuestion.questionTime!; - questionCardStatus = QuestionCardStatus.question; - notifyListeners(); } void addItemToList(CardContent value) { @@ -128,11 +142,11 @@ class MarathonProvider extends ChangeNotifier { } } - Timer timerU = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); + Timer timerForQuestion = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); - void startTimer(BuildContext context) { + void startTimerForQuestion(BuildContext context) { const Duration oneSec = Duration(seconds: 1); - timerU = Timer.periodic( + timerForQuestion = Timer.periodic( oneSec, (Timer timer) async { if (currentQuestionTime == 2) { @@ -140,19 +154,14 @@ class MarathonProvider extends ChangeNotifier { } if (currentQuestionTime == 0) { updateCardStatusToAnswer(); - // if (currentQuestionNumber == 9) { - // timer.cancel(); - // cancelTimer(); - // isMarathonCompleted = true; - // await Future.delayed(const Duration(seconds: 2)).whenComplete( - // () => Navigator.pushReplacementNamed(context, AppRoutes.marathonWinnerSelection), - // ); - // - // resetValues(); - // - // return; - // } - // timer.cancel(); + //todo: we will need to remove this -2 when API is all set + if (currentQuestionNumber == marathonDetailModel.totalQuestions! - 1) { + updateQuestionCardStatus(QuestionCardStatus.findingWinner); + timer.cancel(); + cancelTimer(); + notifyListeners(); + return; + } } else { currentQuestionTime--; } @@ -161,18 +170,39 @@ class MarathonProvider extends ChangeNotifier { ); } - void resetValues() { + Timer timerForWinnerSelection = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); + void startTimerForWinnerSelection() { + const Duration oneSec = Duration(seconds: 1); + timerForWinnerSelection = Timer.periodic( + oneSec, + (Timer timer) async { + + if (totalSecondsToWaitForWinner == 0) { + cancelTimer(); + updateQuestionCardStatus(QuestionCardStatus.winnerFound); + return; + } + totalSecondsToWaitForWinner--; + notifyListeners(); + }, + ); + } + + void resetValues() async { _currentQuestionNumber = 0; cardContentList.clear(); - timerU.cancel(); + timerForWinnerSelection.cancel(); + timerForQuestion.cancel(); _isMarathonCompleted = false; currentQuestionTime = 0; currentQuestion = QuestionModel(); + notifyListeners(); } void cancelTimer() { - timerU.cancel(); + timerForWinnerSelection.cancel(); + timerForQuestion.cancel(); notifyListeners(); } @@ -186,7 +216,15 @@ class MarathonProvider extends ChangeNotifier { }); } - Future connectSignalrAndJoinMarathon(BuildContext context) async { - await MarathonApiClient().buildHubConnection(context); + Future onJoinMarathonPressed(BuildContext context) async { + Utils.showLoading(context); + try { + resetValues(); + await MarathonApiClient().buildHubConnection(context); + } catch (e, s) { + Utils.hideLoading(context); + print("error in onJoinMarathonPressed: ${e.toString()}"); + Utils.confirmDialog(context, e.toString()); + } } } diff --git a/lib/ui/marathon/marathon_screen.dart b/lib/ui/marathon/marathon_screen.dart index 79d61fe..08ae2b2 100644 --- a/lib/ui/marathon/marathon_screen.dart +++ b/lib/ui/marathon/marathon_screen.dart @@ -2,7 +2,9 @@ import 'dart:async'; 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/decorations_helper.dart'; import 'package:mohem_flutter_app/classes/lottie_consts.dart'; @@ -10,8 +12,11 @@ import 'package:mohem_flutter_app/extensions/int_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/marathon/question_model.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_progress_container.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_qualifiers_container.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/question_card_builder.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; @@ -20,179 +25,173 @@ import 'package:provider/provider.dart'; class MarathonScreen extends StatelessWidget { const MarathonScreen({Key? key}) : super(key: key); - @override - Widget build(BuildContext context) { - MarathonProvider provider = context.watch(); - return WillPopScope( - child: Scaffold( - appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()), - body: SingleChildScrollView( - child: Column( - children: [ - 20.height, - MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21), - QuestionCardBuilder( - onQuestion: (BuildContext context) => QuestionCard(provider: provider), - onCompleted: (BuildContext context) => CustomStatusWidget( - asset: Lottie.asset(MyLottieConsts.allQuestions, height: 200), - title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), - subTitle: LocaleKeys.allQuestionsCorrect.toText18(color: MyColors.darkTextColor), - ), - onCorrectAnswer: (BuildContext context) => CustomStatusWidget( - asset: Lottie.asset(MyLottieConsts.allQuestions, height: 200), - title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), - subTitle: LocaleKeys.yourAnswerCorrect.toText18(color: MyColors.darkTextColor), - ), - onWinner: (BuildContext context) => QuestionCard(provider: provider), - onWrongAnswer: (BuildContext context) => CustomStatusWidget( - asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), - title: const Text(""), - subTitle: LocaleKeys.wrongAnswer.tr().toText18(color: MyColors.darkTextColor), - ), - onSkippedAnswer: (BuildContext context) => CustomStatusWidget( - asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), - title: const Text(""), - subTitle: LocaleKeys.youMissedTheQuestion.tr().toText18(color: MyColors.darkTextColor), - ), - questionCardStatus: provider.questionCardStatus, - onFindingWinner: (BuildContext context) => CustomStatusWidget( - asset: Lottie.asset(MyLottieConsts.winnerLottie, height: 168), - title: LocaleKeys.fingersCrossed.tr().toText22(color: MyColors.greenColor), - subTitle: LocaleKeys.winnerSelectedRandomly.tr().toText18(color: MyColors.darkTextColor), - ), - ).paddingOnly(top: 12, left: 21, right: 21), - ], - ), - ), - ), - onWillPop: () { - provider.resetValues(); - return Future.value(true); - }, - ); - } -} - -class MarathonProgressContainer extends StatefulWidget { - final MarathonProvider provider; - - const MarathonProgressContainer({Key? key, required this.provider}) : super(key: key); - - @override - State createState() => _MarathonProgressContainerState(); -} - -class _MarathonProgressContainerState extends State { - @override - void initState() { - scheduleMicrotask(() { - widget.provider.startTimer(context); - }); - super.initState(); - } - - @override - void dispose() { - super.dispose(); + Widget getSuccessWidget({required int? gapType, required String? gapImage, required String? gapText}) { + if (gapType == 1) { + if (gapText == null) { + return Image.asset(MyLottieConsts.congratsGif, height: 200); + } + return gapText.toText18(color: MyColors.darkTextColor, isCentered: true); + } + if (gapType == 2) { + if (gapImage == null) { + return Image.asset(MyLottieConsts.congratsGif, height: 200); + } + return Image.network(gapImage, height: 200); + } + return Image.asset(MyLottieConsts.congratsGif, height: 200); } - @override - Widget build(BuildContext context) { + Widget getWinnerWidget(BuildContext context, {required MarathonProvider provider}) { + provider.startTimerForWinnerSelection(); return Container( width: double.infinity, decoration: MyDecorations.shadowDecoration, - padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 13), + padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), child: Column( - mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Container( - decoration: BoxDecoration(color: MyColors.greenColor, borderRadius: BorderRadius.circular(5)), - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), - child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.marathonDetailModel.totalQuestions.toString()} ${LocaleKeys.question.tr()}" - .toText12(color: MyColors.white), - ), - "${widget.provider.totalMarathoners} ${LocaleKeys.marathoners.tr()}".toText14(), - "00:${widget.provider.currentQuestionTime < 10 ? "0${widget.provider.currentQuestionTime}" : widget.provider.currentQuestionTime}" - .toText18(color: widget.provider.currentQuestionTime < 5 ? MyColors.redColor : MyColors.black), - ], + SizedBox( + height: 200, + child: Stack( + children: [ + Lottie.asset(MyLottieConsts.celebrate1Lottie, height: 200), + Lottie.asset(MyLottieConsts.celebrate2Lottie, height: 200), + ], + ), ), - 12.height, - stepper(widget.provider.currentQuestionNumber), - 8.height, - Row( - children: [ - "${((widget.provider.currentQuestionNumber / widget.provider.marathonDetailModel.totalQuestions!) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(), - ], + 26.height, + 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.winner.tr().toText32(color: MyColors.white, isBold: true).paddingOnly(top: 07), + ) + ], + ), ), + 12.height, + "Muhammad Shrouff".toText22(color: MyColors.grey3AColor), + "837436".toText22(color: MyColors.grey57Color), + 80.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.nameEn ?? "" : provider.marathonDetailModel.sponsors!.first.nameAr ?? "").toText14( + color: MyColors.darkTextColor, + isBold: true, + ), + ], + ), + 5.height, + Image.network( + provider.marathonDetailModel.sponsors!.first.image!, + height: 40, + width: 150, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { + return const Center(); + }, + ) + ], ], ), - ); + ).paddingOnly(left: 21, right: 21); } - Widget stepper(int value) { - return SizedBox( - width: double.infinity, + Widget getNameContainer() { + return Container( + height: 50, + padding: const EdgeInsets.symmetric(horizontal: 20), + decoration: BoxDecoration( + color: MyColors.greenColor, + borderRadius: BorderRadius.circular(15), + boxShadow: [BoxShadow(color: const Color(0xff000000).withOpacity(.05), blurRadius: 26, offset: const Offset(0, -3))], + ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - for (int i = 0; i < 10; i++) - if (value <= i) roundContainer(MyColors.lightGreyDeColor, i != 0) else roundContainer(MyColors.greenColor, i != 0) + children: [ + "Muhammad Shrouff".toText17(isBold: true, color: MyColors.white), + "837436".toText17(isBold: true, color: MyColors.white), ], ), - ); + ).paddingOnly(left: 20, right: 20, top: 12, bottom: 20); } - Widget roundContainer(Color color, bool isNeedLeftBorder) { - if (isNeedLeftBorder) { - return Row( - children: [ - Divider(thickness: 6, color: color).expanded, - Container( - width: 10, - height: 10, - decoration: BoxDecoration(shape: BoxShape.circle, color: color), + @override + Widget build(BuildContext context) { + MarathonProvider provider = context.watch(); + return WillPopScope( + child: Scaffold( + appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()), + body: SingleChildScrollView( + child: Column( + children: [ + 20.height, + if (provider.questionCardStatus == QuestionCardStatus.findingWinner) ...[ + const QualifiersContainer().paddingOnly(left: 21, right: 21), + ] else if (provider.questionCardStatus == QuestionCardStatus.winnerFound) + ...[] + else ...[ + MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21), + ], + if (provider.questionCardStatus == QuestionCardStatus.findingWinner) ...[ + InkWell( + onTap: () { + provider.updateQuestionCardStatus(QuestionCardStatus.winnerFound); + }, + child: getNameContainer(), + ), + ], + if (provider.questionCardStatus == QuestionCardStatus.winnerFound) ...[ + getWinnerWidget(context, provider: provider), + ] else ...[ + QuestionCardBuilder( + onQuestion: (BuildContext context) => QuestionCard(provider: provider), + onCompleted: (BuildContext context) => CustomStatusWidget( + asset: Lottie.asset(MyLottieConsts.allQuestions, height: 200), + title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.allQuestionsCorrect.toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onCorrectAnswer: (BuildContext context) => CustomStatusWidget( + asset: getSuccessWidget(gapType: provider.currentQuestion.gapType, gapImage: provider.currentQuestion.gapImage, gapText: provider.currentQuestion.gapText), + title: LocaleKeys.congrats.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.yourAnswerCorrect.toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onWinner: (BuildContext context) => QuestionCard(provider: provider), + onWrongAnswer: (BuildContext context) => CustomStatusWidget( + asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), + title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor), + subTitle: LocaleKeys.wrongAnswer.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onSkippedAnswer: (BuildContext context) => CustomStatusWidget( + asset: Image.asset(MyLottieConsts.wrongAnswerGif, height: 200), + title: LocaleKeys.oops.tr().toText22(color: MyColors.redColor), + subTitle: LocaleKeys.youMissedTheQuestion.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + onFindingWinner: (BuildContext context) => CustomStatusWidget( + asset: Lottie.asset(MyLottieConsts.winnerLottie, height: 168), + title: LocaleKeys.fingersCrossed.tr().toText22(color: MyColors.greenColor), + subTitle: LocaleKeys.winnerSelectedRandomly.tr().toText18(color: MyColors.darkTextColor, isCentered: true), + ), + questionCardStatus: provider.questionCardStatus, + ).paddingOnly(top: 12, left: 21, right: 21), + ], + ], ), - ], - ).expanded; - } - - return Container( - width: 10, - height: 10, - decoration: BoxDecoration(shape: BoxShape.circle, color: color), + ), + ), + onWillPop: () { + provider.resetValues(); + return Future.value(true); + }, ); } } - -// InkWell( -// onTap: () { -// Navigator.pushReplacementNamed( -// context, -// AppRoutes.marathonWinnerSelection, -// ); -// }, -// child: CustomStatusWidget( -// asset: Lottie.asset( -// MyLottieConsts.allQuestions, -// height: 200, -// ), -// title: Text( -// LocaleKeys.congrats.tr(), -// style: const TextStyle( -// height: 23 / 24, -// color: MyColors.greenColor, -// fontSize: 27, -// letterSpacing: -1, -// fontWeight: FontWeight.w600, -// ), -// ), -// subTitle: Text( -// LocaleKeys.allQuestionsCorrect.tr(), -// textAlign: TextAlign.center, -// style: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -1.08), -// ), -// ).paddingOnly(top: 12, left: 21, right: 21), -// ) diff --git a/lib/ui/marathon/marathon_winner_selection.dart b/lib/ui/marathon/marathon_winner_selection.dart index 1f56801..6aeb3d2 100644 --- a/lib/ui/marathon/marathon_winner_selection.dart +++ b/lib/ui/marathon/marathon_winner_selection.dart @@ -1,10 +1,7 @@ -import 'dart:async'; - 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/int_extensions.dart'; @@ -13,6 +10,7 @@ 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/marathon/marathon_provider.dart'; import 'package:mohem_flutter_app/ui/marathon/widgets/custom_status_widget.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/marathon_qualifiers_container.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:provider/provider.dart'; @@ -28,7 +26,7 @@ class MarathonWinnerSelection extends StatelessWidget { child: Column( children: [ 20.height, - QualifiersContainer(provider: provider).paddingOnly(left: 21, right: 21), + const QualifiersContainer().paddingOnly(left: 21, right: 21), 12.height, InkWell( onTap: () { @@ -90,60 +88,3 @@ class MarathonWinnerSelection extends StatelessWidget { ); } } - -class QualifiersContainer extends StatefulWidget { - final MarathonProvider provider; - - const QualifiersContainer({Key? key, required this.provider}) : super(key: key); - - @override - State createState() => _QualifiersContainerState(); -} - -class _QualifiersContainerState extends State { - final int totalQuestions = 10; - - final int currentQuestion = 04; - - @override - void initState() { - scheduleMicrotask(() { - // widget.provider.startTimer(context); - }); - super.initState(); - } - - @override - void dispose() { - // widget.provider.cancelTimer(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - decoration: MyDecorations.shadowDecoration, - padding: const EdgeInsets.only(top: 14,left: 18,right: 14,bottom: 18), - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - LocaleKeys.winnerSelection.tr().toText21(color: MyColors.grey3AColor), - // "00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(color: MyColors.redColor), - ], - ), - 10.height, - Row( - children: [ - "18".toText30(color: MyColors.greenColor, isBold: true),2.width, - LocaleKeys.qualifiers.tr().toText16(color: MyColors.greenColor), - ], - ), - ], - ), - ); - } -} diff --git a/lib/ui/marathon/widgets/custom_status_widget.dart b/lib/ui/marathon/widgets/custom_status_widget.dart index 8287bb4..44b44aa 100644 --- a/lib/ui/marathon/widgets/custom_status_widget.dart +++ b/lib/ui/marathon/widgets/custom_status_widget.dart @@ -22,6 +22,7 @@ class CustomStatusWidget extends StatelessWidget { decoration: MyDecorations.shadowDecoration, padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 20), child: Column( + mainAxisAlignment: MainAxisAlignment.center, children: [ asset, 50.height, diff --git a/lib/ui/marathon/widgets/marathon_details_card.dart b/lib/ui/marathon/widgets/marathon_details_card.dart new file mode 100644 index 0000000..b74b78b --- /dev/null +++ b/lib/ui/marathon/widgets/marathon_details_card.dart @@ -0,0 +1,82 @@ + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; + + + +class MarathonDetailsCard extends StatelessWidget { + final MarathonProvider provider; + + const MarathonDetailsCard({Key? key, required this.provider}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.contestTopicAbout.tr().toText16(color: MyColors.grey77Color), + "${AppState().isArabic(context) ? provider.marathonDetailModel.titleAr : provider.marathonDetailModel.titleEn}".toText20(color: MyColors.textMixColor, isBold: true), + Row( + children: [ + Flexible( + child: "${AppState().isArabic(context) ? provider.marathonDetailModel.descAr : provider.marathonDetailModel.descEn}".toText14(color: MyColors.grey77Color), + ) + ], + ), + if (provider.itsMarathonTime && provider.marathonDetailModel.sponsors != null) ...[ + 5.height, + provider.marathonDetailModel.sponsors?.first.sponsorPrizes != null + ? Row( + children: [ + "${LocaleKeys.prize.tr()} ".toText16(color: MyColors.grey77Color, isBold: true), + "${AppState().isArabic(context) ? provider.marathonDetailModel.sponsors?.first.sponsorPrizes?.first.marathonPrizeAr : provider.marathonDetailModel.sponsors?.first.sponsorPrizes?.first.marathonPrizeAr}" + .toText16(color: MyColors.greenColor, isBold: true), + ], + ) + : const SizedBox(), + Row( + children: [ + "${LocaleKeys.sponsoredBy.tr()} ".toText16(color: MyColors.grey77Color), + "${AppState().isArabic(context) ? provider.marathonDetailModel.sponsors?.first.nameAr : provider.marathonDetailModel.sponsors?.first.nameEn}" + .toText16(color: MyColors.darkTextColor, isBold: true), + ], + ), + 10.height, + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.network( + provider.marathonDetailModel.sponsors!.first.image!, + height: 40, + width: 150, + fit: BoxFit.fill, + errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) { + return const Center(); + }, + ) + ], + ), + ] + ], + ), + ], + ), + ); + } +} + diff --git a/lib/ui/marathon/widgets/marathon_footer.dart b/lib/ui/marathon/widgets/marathon_footer.dart new file mode 100644 index 0000000..b5083c0 --- /dev/null +++ b/lib/ui/marathon/widgets/marathon_footer.dart @@ -0,0 +1,66 @@ +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/marathon/marathon_provider.dart'; +import 'package:mohem_flutter_app/widgets/button/default_button.dart'; + +class MarathonFooter extends StatelessWidget { + final MarathonProvider provider; + + const MarathonFooter({ + Key? key, + required this.provider, + }) : super(key: key); + + Widget buildNoteForDemo() { + return RichText( + text: TextSpan( + children: [ + 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.joinMarathon.tr(), + !provider.itsMarathonTime ? () => provider.onJoinMarathonPressed(context) : null, + ).insideContainer; + } +} + +//Container( +// color: Colors.white, +// child: Column( +// mainAxisSize: MainAxisSize.min, +// children: [ +// buildNoteForDemo(), +// DefaultButton( +// LocaleKeys.joinDemoMarathon.tr(), +// () { +// provider.connectSignalrAndJoinMarathon(context); +// }, +// color: MyColors.yellowColorII, +// ).insideContainer, +// ], +// ), +// ); diff --git a/lib/ui/marathon/widgets/marathon_progress_container.dart b/lib/ui/marathon/widgets/marathon_progress_container.dart new file mode 100644 index 0000000..fbf0428 --- /dev/null +++ b/lib/ui/marathon/widgets/marathon_progress_container.dart @@ -0,0 +1,98 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/models/marathon/question_model.dart'; +import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; + +class MarathonProgressContainer extends StatefulWidget { + final MarathonProvider provider; + + const MarathonProgressContainer({Key? key, required this.provider}) : super(key: key); + + @override + State createState() => _MarathonProgressContainerState(); +} + +class _MarathonProgressContainerState extends State { + @override + void initState() { + widget.provider.startTimerForQuestion(context); + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 13), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + decoration: BoxDecoration(color: MyColors.greenColor, borderRadius: BorderRadius.circular(5)), + padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), + child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.marathonDetailModel.totalQuestions.toString()} ${LocaleKeys.question.tr()}" + .toText12(color: MyColors.white), + ), + "${widget.provider.totalMarathoners} ${LocaleKeys.marathoners.tr()}".toText14(), + "00:${widget.provider.currentQuestionTime < 10 ? "0${widget.provider.currentQuestionTime}" : widget.provider.currentQuestionTime}" + .toText18(color: widget.provider.currentQuestionTime < 5 ? MyColors.redColor : MyColors.black), + ], + ), + 12.height, + stepper(widget.provider.currentQuestionNumber, widget.provider.questionCardStatus), + 8.height, + Row( + children: [ + "${((widget.provider.currentQuestionNumber / widget.provider.marathonDetailModel.totalQuestions!) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(), + ], + ), + ], + ), + ); + } + + Widget stepper(int value, QuestionCardStatus status) { + print("Here Status: $status"); + return SizedBox( + width: double.infinity, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + for (int i = 0; i < 10; i++) + if (value <= i) roundContainer(MyColors.lightGreyDeColor, i != 0) else roundContainer(status == QuestionCardStatus.correctAnswer ? MyColors.greenColor : MyColors.redColor, i != 0) + ], + ), + ); + } + + Widget roundContainer(Color color, bool isNeedLeftBorder) { + if (isNeedLeftBorder) { + return Row( + children: [ + Divider(thickness: 6, color: color).expanded, + Container( + width: 10, + height: 10, + decoration: BoxDecoration(shape: BoxShape.circle, color: color), + ), + ], + ).expanded; + } + + return Container( + width: 10, + height: 10, + decoration: BoxDecoration(shape: BoxShape.circle, color: color), + ); + } +} diff --git a/lib/ui/marathon/widgets/marathon_qualifiers_container.dart b/lib/ui/marathon/widgets/marathon_qualifiers_container.dart new file mode 100644 index 0000000..50a7e6d --- /dev/null +++ b/lib/ui/marathon/widgets/marathon_qualifiers_container.dart @@ -0,0 +1,47 @@ +import 'dart:async'; + +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/extensions/int_extensions.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; +import 'package:provider/provider.dart'; + +class QualifiersContainer extends StatelessWidget { + + const QualifiersContainer({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + MarathonProvider provider = context.watch(); + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.only(top: 14, left: 18, right: 14, bottom: 18), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.winnerSelection.tr().toText21(color: MyColors.grey3AColor), + "00:${provider.totalSecondsToWaitForWinner < 10 ? "0${provider.totalSecondsToWaitForWinner}" : provider.totalSecondsToWaitForWinner}" + .toText18(color: MyColors.redColor), + ], + ), + 10.height, + Row( + children: [ + provider.totalQualifiers.toString().toText30(color: MyColors.greenColor, isBold: true), + 2.width, + LocaleKeys.qualifiers.tr().toText16(color: MyColors.greenColor), + ], + ), + ], + ), + ); + } +} diff --git a/lib/ui/marathon/widgets/marathon_timer_card.dart b/lib/ui/marathon/widgets/marathon_timer_card.dart new file mode 100644 index 0000000..e831738 --- /dev/null +++ b/lib/ui/marathon/widgets/marathon_timer_card.dart @@ -0,0 +1,51 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; +import 'package:mohem_flutter_app/app_state/app_state.dart'; +import 'package:mohem_flutter_app/classes/colors.dart'; +import 'package:mohem_flutter_app/classes/date_uitl.dart'; +import 'package:mohem_flutter_app/classes/decorations_helper.dart'; +import 'package:mohem_flutter_app/classes/lottie_consts.dart'; +import 'package:mohem_flutter_app/extensions/string_extensions.dart'; +import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; +import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/countdown_timer.dart'; + + +class MarathonTimerCard extends StatelessWidget { + final int timeToMarathon; + final MarathonProvider provider; + + const MarathonTimerCard({ + Key? key, + required this.provider, + required this.timeToMarathon, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + decoration: MyDecorations.shadowDecoration, + padding: const EdgeInsets.symmetric(vertical: 18, horizontal: 14), + child: Column( + children: [ + Row( + children: [ + "${LocaleKeys.gameDate.tr()} ".toText16(color: MyColors.grey77Color), + DateUtil.getMonthDayYearDateFormatted(DateTime.parse(provider.marathonDetailModel.startTime!)).toText16(color: MyColors.darkTextColor, isBold: true), + ], + ), + Row( + children: [ + "${LocaleKeys.gameTime.tr()} ".toText16(color: MyColors.grey77Color), + DateUtil.formatDateToTimeLang(DateTime.parse(provider.marathonDetailModel.startTime!), AppState().isArabic(context)).toText16(color: MyColors.darkTextColor, isBold: true), + ], + ), + Lottie.asset(MyLottieConsts.hourGlassLottie, height: 200), + BuildCountdownTimer(timeToMarathon: timeToMarathon, provider: provider, screenFlag: 1), + ], + ), + ); + } +}