import 'dart:async'; import 'dart:developer'; import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mohem_flutter_app/api/marathon/demo_marathon_repo.dart'; import 'package:mohem_flutter_app/classes/utils.dart'; import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart'; import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart'; class DisclosureProvider extends ChangeNotifier { //************************************************ VARIABLES ********************************************************** final AppinioSwiperController swiperController = AppinioSwiperController(); DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected; DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel(); List cardContentList = []; DisclosureQuestionModel currentQuestion = DisclosureQuestionModel(); List answerStatusesList = []; DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question; int? selectedOptionIndex; String? selectedOptionId; int? totalQualifiers; Locale savedLocale = const Locale("en", "US"); bool iAmWinner = false; bool isGettingQualifiers = false; bool isPrivilegedWithMarathon = false; bool _isLoading = false; bool get isLoading => _isLoading; set isLoading(bool value) { _isLoading = value; notifyListeners(); } bool _isButtonEnabled = false; bool get isButtonEnabled => _isButtonEnabled; set isButtonEnabled(bool value) { _isButtonEnabled = value; notifyListeners(); } int _currentQuestionNumber = 0; int get currentQuestionNumber => _currentQuestionNumber; set currentQuestionNumber(int value) { _currentQuestionNumber = value; notifyListeners(); } String currentAdditionalText = ""; void updateCurrentAdditionalText(String value) { currentAdditionalText = value; notifyListeners(); } void updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus value) { currentQuestionSelectionStatus = value; notifyListeners(); } //************************************************ FUNCTIONS ********************************************************** Future callNextQuestionApi() async { if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) { if (currentQuestionNumber == 0) { for (int i = 1; i <= disclosureDetailsModel.totalQuestions!; i++) { cardContentList.add(const DisclosureCardContent()); } currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber); updateCardData(); if (Utils.isLoading) { Utils.hideLoading(AppRoutes.navigatorKey.currentContext!); } Navigator.pushReplacementNamed(AppRoutes.navigatorKey.currentContext!, AppRoutes.disclosureScreen); } else { currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber); updateCardData(); } notifyListeners(); } } Future callPreviousQuestionApi() async { currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber - 2); updateCardData(isForPrevious: true); notifyListeners(); } void updateCardData({bool isForPrevious = false}) { if (isForPrevious) { selectedOptionIndex = null; currentQuestionNumber--; cardContentList.add(const DisclosureCardContent()); cardContentList.add(const DisclosureCardContent()); swiperController.swipeLeft(); questionCardStatus = DisclosureQuestionCardStatus.question; notifyListeners(); return; } if (currentQuestionNumber > 0) { swiperController.swipeRight(); } selectedOptionIndex = null; currentQuestionNumber++; questionCardStatus = DisclosureQuestionCardStatus.question; notifyListeners(); } void populateQuestionStatusesList() { answerStatusesList.clear(); if (disclosureDetailsModel.totalQuestions != null) { for (int i = 0; i < disclosureDetailsModel.totalQuestions!; i++) { answerStatusesList.add(DisclosureQuestionCardStatus.question); } notifyListeners(); } } void updateCurrentQuestionOptionStatus({required DisclosureQuestionsOptionStatus status, required int selectedOptIndex, required int correctOptionIndex}) { if (selectedOptIndex == 0) { updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.correct); } else if (selectedOptIndex == 1) { updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.wrong); } for (int i = 0; i < currentQuestion.questionOptions!.length; i++) { currentQuestion.questionOptions![i].optionStatus = DisclosureQuestionsOptionStatus.unSelected; } if (status == DisclosureQuestionsOptionStatus.wrong) { currentQuestion.questionOptions![correctOptionIndex].optionStatus = DisclosureQuestionsOptionStatus.correct; // if person's answer is wrong we have to show him the actual right answer } currentQuestion.questionOptions![selectedOptIndex].optionStatus = status; selectedOptionId = currentQuestion.questionOptions![selectedOptIndex].id; selectedOptionIndex = selectedOptIndex; notifyListeners(); } void updateQuestionCardStatus(DisclosureQuestionCardStatus status) { questionCardStatus = status; notifyListeners(); } void updateAnswerStatusesList(DisclosureQuestionCardStatus status) { answerStatusesList[currentQuestionNumber - 1] = status; notifyListeners(); } void resetValues() async { _currentQuestionNumber = 0; iAmWinner = false; cardContentList.clear(); isButtonEnabled = false; currentQuestion = DisclosureQuestionModel(); if (answerStatusesList.isNotEmpty) { for (int i = 0; i < answerStatusesList.length; i++) { answerStatusesList[i] = DisclosureQuestionCardStatus.question; } } currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected; AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale); notifyListeners(); } Future getDisclosureDetails() async { isLoading = true; notifyListeners(); disclosureDetailsModel = await DisclosureRepo().getDisclosureDetails(); populateQuestionStatusesList(); isLoading = false; notifyListeners(); } Future onStartDisclosurePressed(BuildContext context) async { await callNextQuestionApi(); } }