From 904e4df424aa81f314aa3a6170720f3fda9123f9 Mon Sep 17 00:00:00 2001 From: Faiz Hashmi Date: Sun, 27 Nov 2022 17:58:35 +0300 Subject: [PATCH] Questions Fetching process in Progress --- lib/api/marathon/marathon_api_client.dart | 34 +- lib/classes/consts.dart | 42 +- lib/models/marathon/marathon_model.dart | 7 +- lib/models/marathon/question_model.dart | 51 +-- lib/ui/login/login_screen.dart | 2 +- lib/ui/marathon/marathon_intro_screen.dart | 23 +- lib/ui/marathon/marathon_provider.dart | 108 ++--- lib/ui/marathon/marathon_screen.dart | 99 ++--- .../marathon/marathon_winner_selection.dart | 6 +- lib/ui/marathon/widgets/marathon_header.dart | 2 - lib/ui/marathon/widgets/question_card.dart | 389 +++++++++--------- 11 files changed, 437 insertions(+), 326 deletions(-) diff --git a/lib/api/marathon/marathon_api_client.dart b/lib/api/marathon/marathon_api_client.dart index 52895ce..6aae0ca 100644 --- a/lib/api/marathon/marathon_api_client.dart +++ b/lib/api/marathon/marathon_api_client.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:logger/logger.dart' as L; import 'package:logging/logging.dart'; @@ -8,6 +9,9 @@ import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/consts.dart'; import 'package:mohem_flutter_app/models/marathon/marathon_generic_model.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/marathon_provider.dart'; +import 'package:provider/provider.dart'; import 'package:signalr_netcore/http_connection_options.dart'; import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/hub_connection_builder.dart'; @@ -79,7 +83,7 @@ class MarathonApiClient { late HubConnection hubConnection; L.Logger logger = L.Logger(); - Future buildHubConnection() async { + Future buildHubConnection(BuildContext context) async { HttpConnectionOptions httpOptions = HttpConnectionOptions(skipNegotiation: false, logMessageContent: true); hubConnection = HubConnectionBuilder() .withUrl( @@ -125,7 +129,6 @@ class MarathonApiClient { logger.i("Error in AddParticipant: $e"); }); - logger.i("MarathonId: ${AppState().getMarathonProjectId}"); await hubConnection.invoke( "SendQuestionToParticipant", args: [ @@ -138,16 +141,33 @@ class MarathonApiClient { }); try { - hubConnection.on("OnSendQuestionToParticipant", onSendQuestionToParticipant); + hubConnection.on("OnSendQuestionToParticipant", (List? arguments) { + onSendQuestionToParticipant(arguments, context); + }); } catch (e, s) { - logger.i("s"); + logger.i("Error in OnSendQuestionToParticipant"); + } + + try { + hubConnection.on("OnParticipantJoin", onParticipantJoin); + } catch (e, s) { + logger.i("Error in OnParticipantJoin"); } } } - Future onSendQuestionToParticipant(List? arguments) async { - print("arguments: $arguments"); + Future onSendQuestionToParticipant(List? arguments, BuildContext context) async { + logger.i("onSendQuestionToParticipant arguments: $arguments"); + + if (arguments != null) { + Map data = arguments.first! as Map; + var json = data["data"]; + QuestionModel newQuestion = QuestionModel.fromJson(json); + context.read().addNewQuestionsToTheList(newQuestion, 0); + } + } - logger.i(arguments); + Future onParticipantJoin(List? arguments) async { + logger.i("OnParticipantJoin arguments: $arguments"); } } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 9c9045a..ecc8af9 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,3 +1,6 @@ +import 'package:mohem_flutter_app/models/marathon/question_model.dart'; +import 'package:mohem_flutter_app/ui/marathon/widgets/question_card.dart'; + class ApiConsts { //static String baseUrl = "http://10.200.204.20:2801/"; // Local server static String baseUrl = "https://uat.hmgwebservices.com"; // UAT server @@ -23,13 +26,48 @@ class ApiConsts { // 42062 is CurrentUserID and 36745 is targetUserID and 0 is For Pagination // static String chatSearchMember = "https://apiderichat.hmg.com/api/user/getUserWithStatusAndFavAsync/aamir.muhammad/36239"; -//Brain Marathon Constants - + //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 List questionOptions = [ + QuestionOptions( + id: "id", + image: "image", + isCorrectOption: true, + questionId: "questionId", + sequence: 0, + titleAr: "titleAr", + titleEn: "titleEn", + ), + ]; + + static QuestionModel dummyQuestion = QuestionModel( + id: "id", + titleEn: "titleEn", + titleAr: "titleAr", + marathonId: "marathonId", + questionTypeId: 0, + questionTime: 0, + nextQuestGap: 5, + gapType: 0, + gapText: "gapText", + gapImage: "gapImage", + questOptionsLimit: 4, + questionOptions: questionOptions, + ); + + static List dummyQuestions = [ + CardContent(question: dummyQuestion), + CardContent(question: dummyQuestion), + CardContent(question: dummyQuestion), + CardContent(question: dummyQuestion), + CardContent(question: dummyQuestion), + ]; } class SharedPrefsConsts { diff --git a/lib/models/marathon/marathon_model.dart b/lib/models/marathon/marathon_model.dart index 3fb60b9..b32530c 100644 --- a/lib/models/marathon/marathon_model.dart +++ b/lib/models/marathon/marathon_model.dart @@ -15,6 +15,7 @@ class MarathonDetailModel { Projects? projects; List? sponsors; List? questions; + int? totalQuestions; MarathonDetailModel( {id, @@ -32,7 +33,8 @@ class MarathonDetailModel { selectedLanguage, projects, sponsors, - questions}); + questions, + totalQuestions}); MarathonDetailModel.fromJson(Map json) { id = json['id']; @@ -63,6 +65,7 @@ class MarathonDetailModel { questions!.add( Questions.fromJson(v)); }); } + totalQuestions = json["totalQuestions"]; } Map toJson() { @@ -89,6 +92,8 @@ class MarathonDetailModel { if (questions != null) { data['questions'] = questions!.map((v) => v.toJson()).toList(); } + data['totalQuestions'] = totalQuestions; + return data; } } diff --git a/lib/models/marathon/question_model.dart b/lib/models/marathon/question_model.dart index 90d030d..98ff830 100644 --- a/lib/models/marathon/question_model.dart +++ b/lib/models/marathon/question_model.dart @@ -12,19 +12,20 @@ class QuestionModel { int? questOptionsLimit; List? questionOptions; - QuestionModel( - {id, - titleEn, - titleAr, - marathonId, - questionTypeId, - questionTime, - nextQuestGap, - gapType, - gapText, - gapImage, - questOptionsLimit, - questionOptions}); + QuestionModel({ + String? id, + String? titleEn, + String? titleAr, + String? marathonId, + int? questionTypeId, + int? questionTime, + int? nextQuestGap, + int? gapType, + String? gapText, + String? gapImage, + int? questOptionsLimit, + List? questionOptions, + }); QuestionModel.fromJson(Map json) { id = json['id']; @@ -41,13 +42,13 @@ class QuestionModel { if (json['questionOptions'] != null) { questionOptions = []; json['questionOptions'].forEach((v) { - questionOptions!.add( QuestionOptions.fromJson(v)); + questionOptions!.add(QuestionOptions.fromJson(v)); }); } } Map toJson() { - Map data = {}; + Map data = {}; data['id'] = id; data['titleEn'] = titleEn; data['titleAr'] = titleAr; @@ -60,8 +61,7 @@ class QuestionModel { data['gapImage'] = gapImage; data['questOptionsLimit'] = questOptionsLimit; if (questionOptions != null) { - data['questionOptions'] = - questionOptions!.map((v) => v.toJson()).toList(); + data['questionOptions'] = questionOptions!.map((v) => v.toJson()).toList(); } return data; } @@ -76,14 +76,15 @@ class QuestionOptions { String? image; bool? isCorrectOption; - QuestionOptions( - {id, - titleEn, - titleAr, - questionId, - sequence, - image, - isCorrectOption}); + QuestionOptions({ + String? id, + String? titleEn, + String? titleAr, + String? questionId, + int? sequence, + String? image, + bool? isCorrectOption, + }); QuestionOptions.fromJson(Map json) { id = json['id']; diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index 97282d3..803660b 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -143,7 +143,7 @@ class _LoginScreenState extends State { if (!kReleaseMode) { // username.text = "15444"; // Maha User username.text = "15153"; // Tamer User - password.text = "Abcd@12345"; + password.text = "Abcd@1234"; // username.text = "206535"; // Hashim User // password.text = "Namira786"; diff --git a/lib/ui/marathon/marathon_intro_screen.dart b/lib/ui/marathon/marathon_intro_screen.dart index edb0f77..a0ce912 100644 --- a/lib/ui/marathon/marathon_intro_screen.dart +++ b/lib/ui/marathon/marathon_intro_screen.dart @@ -6,6 +6,8 @@ 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'; @@ -219,10 +221,21 @@ class MarathonFooter extends StatelessWidget { @override Widget build(BuildContext context) { return provider.itsMarathonTime - ? DefaultButton(LocaleKeys.joinMarathon.tr(), () { - provider.connectSignalrAndJoinMarathon(); - // Navigator.pushNamed(context, AppRoutes.marathonScreen); - }, ).insideContainer + ? DefaultButton( + LocaleKeys.joinMarathon.tr(), + () async { + Utils.showLoading(context); + try { + provider.resetValues(); + await provider.connectSignalrAndJoinMarathon(context); + } catch (e, s) { + Utils.hideLoading(context); + print(s); + } + Utils.hideLoading(context); + Navigator.pushNamed(context, AppRoutes.marathonScreen); + }, + ).insideContainer : Container( color: Colors.white, child: Column( @@ -232,7 +245,7 @@ class MarathonFooter extends StatelessWidget { DefaultButton( LocaleKeys.joinDemoMarathon.tr(), () { - provider.connectSignalrAndJoinMarathon(); + provider.connectSignalrAndJoinMarathon(context); }, color: MyColors.yellowColorII, ).insideContainer, diff --git a/lib/ui/marathon/marathon_provider.dart b/lib/ui/marathon/marathon_provider.dart index 50bd38b..0f82581 100644 --- a/lib/ui/marathon/marathon_provider.dart +++ b/lib/ui/marathon/marathon_provider.dart @@ -4,11 +4,39 @@ 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/config/routes.dart'; +import 'package:mohem_flutter_app/classes/consts.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'; class MarathonProvider extends ChangeNotifier { + final AppinioSwiperController swiperController = AppinioSwiperController(); + + MarathonDetailModel marathonDetailModel = MarathonDetailModel(); + List cardContentList = [ + CardContent(question: ApiConsts.dummyQuestion), + CardContent(question: ApiConsts.dummyQuestion), + CardContent(question: ApiConsts.dummyQuestion), + CardContent(question: ApiConsts.dummyQuestion), + CardContent(question: ApiConsts.dummyQuestion), + ]; + + int currentGapTime = 0; + + void addNewQuestionsToTheList(QuestionModel newQuestion, int index) { + + //TODO: THIS SHOULD NOT SWIPE THE CARD ON THE FIRST TRIGGER + swipeCardLeft(); + cardContentList.add(CardContent(question: newQuestion)); + currentGapTime = newQuestion.nextQuestGap!; + notifyListeners(); + } + + void removeQuestionFromTheList(int index) { + cardContentList.removeAt(index); + notifyListeners(); + } + bool _isLoading = false; bool get isLoading => _isLoading; @@ -18,10 +46,6 @@ class MarathonProvider extends ChangeNotifier { notifyListeners(); } - MarathonDetailModel marathonDetailModel = MarathonDetailModel(); - - final AppinioSwiperController swiperController = AppinioSwiperController(); - bool _itsMarathonTime = false; bool get itsMarathonTime => _itsMarathonTime; @@ -40,14 +64,7 @@ class MarathonProvider extends ChangeNotifier { notifyListeners(); } - void swipeCardLeft() { - currentQuestionNumber = currentQuestionNumber + 1; - swiperController.swipeLeft(); - notifyListeners(); - } - - int _currentQuestionNumber = 1; - final int totalQuestions = 10; + int _currentQuestionNumber = 0; int get currentQuestionNumber => _currentQuestionNumber; @@ -56,44 +73,44 @@ class MarathonProvider extends ChangeNotifier { notifyListeners(); } - void resetAll() { - isSelectedOptions[0] = false; - isSelectedOptions[1] = false; - isSelectedOptions[2] = false; - isSelectedOptions[3] = false; + int _totalMarathoners = 23; + + int get totalMarathoners => _totalMarathoners; + + set totalMarathoners(int value) { + _totalMarathoners = value; + notifyListeners(); + } + + void swipeCardLeft() { + swiperController.swipeLeft(); + currentQuestionNumber++; + notifyListeners(); } Timer timerU = Timer.periodic(const Duration(seconds: 1), (Timer timer) {}); - int start = 8; void startTimer(BuildContext context) { - start = 8; const Duration oneSec = Duration(seconds: 1); timerU = Timer.periodic( oneSec, (Timer timer) async { - if (start == 0) { - if (currentQuestionNumber == 9) { - timer.cancel(); - cancelTimer(); - isMarathonCompleted = true; - await Future.delayed(const Duration(seconds: 3)).whenComplete( - () => Navigator.pushReplacementNamed( - context, - AppRoutes.marathonWinnerSelection, - ), - ); - - resetValues(); - - return; - } - resetAll(); - timer.cancel(); - cancelTimer(); - swipeCardLeft(); + if (currentGapTime == 0) { + // if (currentQuestionNumber == 9) { + // timer.cancel(); + // cancelTimer(); + // isMarathonCompleted = true; + // await Future.delayed(const Duration(seconds: 3)).whenComplete( + // () => Navigator.pushReplacementNamed(context, AppRoutes.marathonWinnerSelection), + // ); + // + // resetValues(); + // + // return; + // } + // timer.cancel(); } else { - start--; + currentGapTime--; } notifyListeners(); }, @@ -101,9 +118,10 @@ class MarathonProvider extends ChangeNotifier { } void resetValues() { + _currentQuestionNumber = 0; + cardContentList.clear(); timerU.cancel(); _isMarathonCompleted = false; - _currentQuestionNumber = 1; notifyListeners(); } @@ -122,9 +140,7 @@ class MarathonProvider extends ChangeNotifier { }); } - Future connectSignalrAndJoinMarathon() async { - await MarathonApiClient().buildHubConnection(); - + Future connectSignalrAndJoinMarathon(BuildContext context) async { + await MarathonApiClient().buildHubConnection(context); } - } diff --git a/lib/ui/marathon/marathon_screen.dart b/lib/ui/marathon/marathon_screen.dart index a02733f..90df75f 100644 --- a/lib/ui/marathon/marathon_screen.dart +++ b/lib/ui/marathon/marathon_screen.dart @@ -25,49 +25,54 @@ class MarathonScreen extends StatelessWidget { @override Widget build(BuildContext context) { MarathonProvider provider = context.watch(); - return Scaffold( - appBar: AppBarWidget(context, title: LocaleKeys.brainMarathon.tr()), - body: SingleChildScrollView( - child: Column( - children: [ - 20.height, - MarathonProgressContainer(provider: provider).paddingOnly(left: 21, right: 21), - if (provider.isMarathonCompleted) - 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), - ) - else - QuestionCard(provider: provider).paddingOnly(top: 12, left: 21, right: 21), - ], + 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), + if (provider.isMarathonCompleted) + 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), + ) + else + QuestionCard(provider: provider).paddingOnly(top: 12, left: 21, right: 21), + ], + ), + ), ), - ), - ); + onWillPop: () { + provider.resetValues(); + return Future.value(true); + }); } } @@ -91,7 +96,6 @@ class _MarathonProgressContainerState extends State { @override void dispose() { - widget.provider.cancelTimer(); super.dispose(); } @@ -113,10 +117,11 @@ class _MarathonProgressContainerState extends State { borderRadius: BorderRadius.circular(5), ), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 8), - child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.totalQuestions.toString()} ${LocaleKeys.question.tr()}".toText12(color: MyColors.white), + child: "${widget.provider.currentQuestionNumber.toString()} / ${widget.provider.marathonDetailModel.totalQuestions.toString()} ${LocaleKeys.question.tr()}" + .toText12(color: MyColors.white), ), - "23 ${LocaleKeys.marathoners.tr()}".toText14(), - "00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(), + "${widget.provider.totalMarathoners} ${LocaleKeys.marathoners.tr()}".toText14(), + "00:${widget.provider.currentGapTime < 10 ? "0${widget.provider.currentGapTime}" : widget.provider.currentGapTime}".toText18(), ], ), 15.height, @@ -144,7 +149,7 @@ class _MarathonProgressContainerState extends State { 12.height, Row( children: [ - "${widget.provider.currentQuestionNumber * 10}% ${LocaleKeys.completed.tr()}".toText14(isBold: true), + "${((widget.provider.currentQuestionNumber / widget.provider.marathonDetailModel.totalQuestions!) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(isBold: true), ], ), ], diff --git a/lib/ui/marathon/marathon_winner_selection.dart b/lib/ui/marathon/marathon_winner_selection.dart index 8462ab4..5dcac2b 100644 --- a/lib/ui/marathon/marathon_winner_selection.dart +++ b/lib/ui/marathon/marathon_winner_selection.dart @@ -108,14 +108,14 @@ class _QualifiersContainerState extends State { @override void initState() { scheduleMicrotask(() { - widget.provider.startTimer(context); + // widget.provider.startTimer(context); }); super.initState(); } @override void dispose() { - widget.provider.cancelTimer(); + // widget.provider.cancelTimer(); super.dispose(); } @@ -132,7 +132,7 @@ class _QualifiersContainerState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ LocaleKeys.winnerSelection.tr().toText18(isBold: true, color: MyColors.grey3AColor), - "00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(isBold: true, color: MyColors.redColor), + // "00:${widget.provider.start < 10 ? "0${widget.provider.start}" : widget.provider.start}".toText18(isBold: true, color: MyColors.redColor), ], ), 10.height, diff --git a/lib/ui/marathon/widgets/marathon_header.dart b/lib/ui/marathon/widgets/marathon_header.dart index 0cc863b..fed6caa 100644 --- a/lib/ui/marathon/widgets/marathon_header.dart +++ b/lib/ui/marathon/widgets/marathon_header.dart @@ -28,8 +28,6 @@ class MarathonHeader extends StatelessWidget { color: MyColors.black, constraints: const BoxConstraints(), onPressed: () { - Provider.of(context, listen: false) - .resetValues(); Navigator.pop(context); }, ) diff --git a/lib/ui/marathon/widgets/question_card.dart b/lib/ui/marathon/widgets/question_card.dart index a3fe720..cc92d85 100644 --- a/lib/ui/marathon/widgets/question_card.dart +++ b/lib/ui/marathon/widgets/question_card.dart @@ -1,11 +1,11 @@ import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:flutter/cupertino.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/config/routes.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; -import 'package:mohem_flutter_app/models/marathon_question_model.dart'; +import 'package:mohem_flutter_app/models/marathon/question_model.dart'; import 'package:mohem_flutter_app/ui/marathon/marathon_provider.dart'; import 'package:provider/provider.dart'; @@ -16,35 +16,11 @@ List isSelectedOptions = [ false, ]; -class QuestionCard extends StatefulWidget { +class QuestionCard extends StatelessWidget { final MarathonProvider provider; const QuestionCard({Key? key, required this.provider}) : super(key: key); - @override - State createState() => _QuestionCardState(); -} - -class _QuestionCardState extends State { - final List questionCards = []; - - @override - void initState() { - _loadCards(); - super.initState(); - } - - void _loadCards() { - for (DummyQuestionModel question in questions) { - questionCards.add( - CardContent( - question: question, - provider: widget.provider, - ), - ); - } - } - @override Widget build(BuildContext context) { return CupertinoPageScaffold( @@ -58,12 +34,11 @@ class _QuestionCardState extends State { isDisabled: true, controller: provider.swiperController, unswipe: (int index, AppinioSwiperDirection direction) {}, - cards: questionCards, onSwipe: (int index, AppinioSwiperDirection direction) { - if (direction == AppinioSwiperDirection.left) { - provider.startTimer(context); - } + print("here is the length: ${provider.cardContentList.length} and index : $index"); }, + + cards: provider.cardContentList, ); }, ), @@ -73,14 +48,9 @@ class _QuestionCardState extends State { } class CardContent extends StatelessWidget { - final DummyQuestionModel question; - final MarathonProvider provider; + final QuestionModel question; - const CardContent({ - Key? key, - required this.question, - required this.provider, - }) : super(key: key); + const CardContent({Key? key, required this.question}) : super(key: key); @override Widget build(BuildContext context) { @@ -118,12 +88,12 @@ class CardContent extends StatelessWidget { topRight: Radius.circular(10), ), ), - child: const Center( + child: Center( child: Padding( - padding: EdgeInsets.symmetric(horizontal: 13), + padding: const EdgeInsets.symmetric(horizontal: 13), child: Text( - "What is the capital of Saudi Arabia?", - style: TextStyle( + AppState().isArabic(context) ? question.titleAr ?? "" : question.titleEn ?? "", + style: const TextStyle( color: MyColors.white, fontSize: 16, fontWeight: FontWeight.w600, @@ -132,7 +102,7 @@ class CardContent extends StatelessWidget { ), ), ), - AnswerContent(question: question, provider: provider), + AnswerContent(question: question), ], ), ); @@ -140,36 +110,37 @@ class CardContent extends StatelessWidget { } class AnswerContent extends StatefulWidget { - final DummyQuestionModel question; - final MarathonProvider provider; + final QuestionModel question; - const AnswerContent({Key? key, required this.question, required this.provider}) : super(key: key); + const AnswerContent({Key? key, required this.question}) : super(key: key); @override State createState() => _AnswerContentState(); } class _AnswerContentState extends State { - void updateOption(int index, bool value) { - isSelectedOptions[0] = false; - isSelectedOptions[1] = false; - isSelectedOptions[2] = false; - isSelectedOptions[3] = false; - isSelectedOptions[index] = value; - setState(() {}); - } - - Decoration getContainerColor(int index) { - if (!isSelectedOptions[index]) { - return MyDecorations.getContainersDecoration(MyColors.greyF7Color); - } - if (isSelectedOptions[index] && context.watch().start > 0) { - return MyDecorations.getContainersDecoration(MyColors.yellowColorII); - } - return MyDecorations.getContainersDecoration( - isSelectedOptions[index] ? MyColors.greenColor : MyColors.greyF7Color, - ); - } + // void updateOption(int index, bool value) { + // isSelectedOptions[0] = false; + // isSelectedOptions[1] = false; + // isSelectedOptions[2] = false; + // isSelectedOptions[3] = false; + // isSelectedOptions[index] = value; + // setState(() {}); + // } + // + // Decoration getContainerColor(int index) { + // if (!isSelectedOptions[index]) { + // return MyDecorations.getContainersDecoration(MyColors.greyF7Color); + // } + // if (isSelectedOptions[index] && context + // .watch() + // .currentGapTime > 0) { + // return MyDecorations.getContainersDecoration(MyColors.yellowColorII); + // } + // return MyDecorations.getContainersDecoration( + // isSelectedOptions[index] ? MyColors.greenColor : MyColors.greyF7Color, + // ); + // } @override Widget build(BuildContext context) { @@ -182,128 +153,172 @@ class _AnswerContentState extends State { bottomRight: Radius.circular(10), ), ), - child: Column( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - InkWell( - onTap: () { - if (widget.provider.currentQuestionNumber == 9) { - widget.provider.cancelTimer(); - widget.provider.resetValues(); - Navigator.pushReplacementNamed( - context, - AppRoutes.marathonWinnerSelection, - ); - return; - } - updateOption(0, true); - }, - child: Container( - alignment: Alignment.centerLeft, - decoration: getContainerColor(0), - child: Center( - child: Text( - widget.question.opt1!, - style: TextStyle( - color: isSelectedOptions[0] ? MyColors.white : MyColors.darkTextColor, - fontWeight: FontWeight.w600, - fontSize: 16, - ), - ).paddingOnly(top: 17, bottom: 17), - ), - ), - ), - const SizedBox(height: 15), - InkWell( - onTap: () { - if (widget.provider.currentQuestionNumber == 9) { - widget.provider.cancelTimer(); - widget.provider.resetValues(); - Navigator.pushReplacementNamed( - context, - AppRoutes.marathonWinnerSelection, - ); - return; - } - updateOption(1, true); - }, - child: Container( - alignment: Alignment.centerLeft, - decoration: getContainerColor(1), - child: Center( - child: Text( - widget.question.opt2!, - style: TextStyle( - color: isSelectedOptions[1] ? MyColors.white : MyColors.darkTextColor, - fontWeight: FontWeight.w600, - fontSize: 16, - ), - ).paddingOnly(top: 17, bottom: 17), - ), - ), - ), - const SizedBox(height: 15), - InkWell( - onTap: () { - if (widget.provider.currentQuestionNumber == 9) { - widget.provider.cancelTimer(); - widget.provider.resetValues(); - Navigator.pushReplacementNamed( - context, - AppRoutes.marathonWinnerSelection, - ); - return; - } - updateOption(2, true); - }, - child: Container( - alignment: Alignment.centerLeft, - decoration: getContainerColor(2), - child: Center( - child: Text( - widget.question.opt3!, - style: TextStyle( - color: isSelectedOptions[2] ? MyColors.white : MyColors.darkTextColor, - fontWeight: FontWeight.w600, - fontSize: 16, - ), - ).paddingOnly(top: 17, bottom: 17), - ), - ), - ), - const SizedBox(height: 15), - InkWell( - onTap: () { - if (widget.provider.currentQuestionNumber == 9) { - widget.provider.cancelTimer(); - widget.provider.resetValues(); - Navigator.pushReplacementNamed( - context, - AppRoutes.marathonWinnerSelection, - ); - return; - } - updateOption(3, true); - }, - child: Container( - alignment: Alignment.centerLeft, - decoration: getContainerColor(3), - child: Center( - child: Text( - widget.question.opt3!, - style: TextStyle( - color: isSelectedOptions[3] ? MyColors.white : MyColors.darkTextColor, - fontWeight: FontWeight.w600, - fontSize: 16, - ), - ).paddingOnly(top: 17, bottom: 17), - ), + child: widget.question.questionOptions != null + ? Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: widget.question.questionOptions!.map((QuestionOptions e) => AnswerTileForText(questionOption: e, onAnswerTapped: () {})).toList(), + ) + : const SizedBox(), + ); + } +} + +class AnswerTileForText extends StatelessWidget { + final QuestionOptions questionOption; + final Function() onAnswerTapped; + + const AnswerTileForText({Key? key, required this.questionOption, required this.onAnswerTapped}) : super(key: key); + + // Decoration getContainerColor(int index) { + // if (!isSelectedOptions[index]) { + // return MyDecorations.getContainersDecoration(MyColors.greyF7Color); + // } + // if (isSelectedOptions[index] && context.watch().currentGapTime > 0) { + // return MyDecorations.getContainersDecoration(MyColors.yellowColorII); + // } + // return MyDecorations.getContainersDecoration( + // isSelectedOptions[index] ? MyColors.greenColor : MyColors.greyF7Color, + // ); + // } + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + onAnswerTapped(); + }, + child: Container( + alignment: Alignment.centerLeft, + decoration: MyDecorations.getContainersDecoration(MyColors.greyF7Color), + child: Center( + child: Text( + questionOption.titleEn!, + style: TextStyle( + color: isSelectedOptions[0] ? MyColors.white : MyColors.darkTextColor, + fontWeight: FontWeight.w600, + fontSize: 16, ), - ), - ], + ).paddingOnly(top: 17, bottom: 17), + ), ), - ); + ).paddingOnly(top: 8, bottom: 8); } } + +// InkWell( +// onTap: () { +// if (widget.provider.currentQuestionNumber == 9) { +// widget.provider.cancelTimer(); +// widget.provider.resetValues(); +// Navigator.pushReplacementNamed( +// context, +// AppRoutes.marathonWinnerSelection, +// ); +// return; +// } +// updateOption(0, true); +// }, +// child: Container( +// alignment: Alignment.centerLeft, +// decoration: getContainerColor(0), +// child: Center( +// child: Text( +// widget.question.questionOptions![0].titleEn!, +// style: TextStyle( +// color: isSelectedOptions[0] ? MyColors.white : MyColors.darkTextColor, +// fontWeight: FontWeight.w600, +// fontSize: 16, +// ), +// ).paddingOnly(top: 17, bottom: 17), +// ), +// ), +// ), +// const SizedBox(height: 15), +// InkWell( +// onTap: () { +// if (widget.provider.currentQuestionNumber == 9) { +// widget.provider.cancelTimer(); +// widget.provider.resetValues(); +// Navigator.pushReplacementNamed( +// context, +// AppRoutes.marathonWinnerSelection, +// ); +// return; +// } +// updateOption(1, true); +// }, +// child: Container( +// alignment: Alignment.centerLeft, +// decoration: getContainerColor(1), +// child: Center( +// child: Text( +// widget.question.questionOptions![1].titleEn!, +// style: TextStyle( +// color: isSelectedOptions[1] ? MyColors.white : MyColors.darkTextColor, +// fontWeight: FontWeight.w600, +// fontSize: 16, +// ), +// ).paddingOnly(top: 17, bottom: 17), +// ), +// ), +// ), +// const SizedBox(height: 15), +// InkWell( +// onTap: () { +// if (widget.provider.currentQuestionNumber == 9) { +// widget.provider.cancelTimer(); +// widget.provider.resetValues(); +// Navigator.pushReplacementNamed( +// context, +// AppRoutes.marathonWinnerSelection, +// ); +// return; +// } +// updateOption(2, true); +// }, +// child: Container( +// alignment: Alignment.centerLeft, +// decoration: getContainerColor(2), +// child: Center( +// child: Text( +// widget.question.questionOptions![2].titleEn!, +// style: TextStyle( +// color: isSelectedOptions[2] ? MyColors.white : MyColors.darkTextColor, +// fontWeight: FontWeight.w600, +// fontSize: 16, +// ), +// ).paddingOnly(top: 17, bottom: 17), +// ), +// ), +// ), +// const SizedBox(height: 15), +// InkWell( +// onTap: () { +// if (widget.provider.currentQuestionNumber == 9) { +// widget.provider.cancelTimer(); +// widget.provider.resetValues(); +// Navigator.pushReplacementNamed( +// context, +// AppRoutes.marathonWinnerSelection, +// ); +// return; +// } +// updateOption(3, true); +// }, +// child: Container( +// alignment: Alignment.centerLeft, +// decoration: getContainerColor(3), +// child: Center( +// child: Text( +// widget.question.questionOptions![3].titleEn!, +// style: TextStyle( +// color: isSelectedOptions[3] ? MyColors.white : MyColors.darkTextColor, +// fontWeight: FontWeight.w600, +// fontSize: 16, +// ), +// ).paddingOnly(top: 17, bottom: 17), +// ), +// ), +// ),