Final Tweaks in Disclosure

faiz_disclosure
Faiz Hashmi 1 year ago
parent cbc6219755
commit d77ace678d

@ -1,6 +1,6 @@
{ {
"id": "979813be-eafa-4d3e-d27e-08dae8a08a3b", "id": "979813be-eafa-4d3e-d27e-08dae8a08a3b",
"titleEn": "Upcoming Disclosure", "titleEn": "Disclosure Title",
"titleAr": "undefined", "titleAr": "undefined",
"descEn": "Submit disclosure using mobile app", "descEn": "Submit disclosure using mobile app",
"descAr": "undefined", "descAr": "undefined",

@ -581,5 +581,8 @@
"approvalDate": "تاريخ الموافقة", "approvalDate": "تاريخ الموافقة",
"versionStatus": "حالة الإصدار", "versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد", "supplierNo": "رقم المورد",
"paymentRequest": "طلب الدفع" "paymentRequest": "طلب الدفع",
"pleaseWriteHere": "يرجى الكتابة هنا",
"disclosures": "الإفصاحات",
"areYouSureYouWantToGoBack": "هل أنت متأكد أنك تريد الرجوع؟"
} }

@ -587,6 +587,9 @@
"versionStatus": "Version Status", "versionStatus": "Version Status",
"supplierNo": "Supplier Number", "supplierNo": "Supplier Number",
"paymentRequest": "Payment Request", "paymentRequest": "Payment Request",
"pOAmount": "PO Amount" "pOAmount": "PO Amount",
"pleaseWriteHere": "Please Write Here",
"disclosures": "Disclosures",
"areYouSureYouWantToGoBack": "Are you sure you want to go back?"
} }

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:logger/logger.dart' as L; import 'package:logger/logger.dart' as L;
@ -37,6 +38,7 @@ class DisclosureRepo {
} }
Future<DisclosureQuestionModel> getDisclosureNextQuestion({required int currentQuestionNumber}) async { Future<DisclosureQuestionModel> getDisclosureNextQuestion({required int currentQuestionNumber}) async {
log("getQuestion At Index: $currentQuestionNumber ");
String response = await rootBundle.loadString('assets/json/disclosure_questions.json'); String response = await rootBundle.loadString('assets/json/disclosure_questions.json');
List json = jsonDecode(response); List json = jsonDecode(response);
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel.fromJson(json.elementAt(currentQuestionNumber)); DisclosureQuestionModel currentQuestion = DisclosureQuestionModel.fromJson(json.elementAt(currentQuestionNumber));

@ -597,7 +597,10 @@ class CodegenLoader extends AssetLoader{
"approvalDate": "تاريخ الموافقة", "approvalDate": "تاريخ الموافقة",
"versionStatus": "حالة الإصدار", "versionStatus": "حالة الإصدار",
"supplierNo": "رقم المورد", "supplierNo": "رقم المورد",
"paymentRequest": "طلب الدفع" "paymentRequest": "طلب الدفع",
"pleaseWriteHere": "يرجى الكتابة هنا",
"disclosures": "الإفصاحات",
"areYouSureYouWantToGoBack": "هل أنت متأكد أنك تريد الرجوع؟"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"mohemm": "Mohemm", "mohemm": "Mohemm",
@ -1188,7 +1191,10 @@ static const Map<String,dynamic> en_US = {
"versionStatus": "Version Status", "versionStatus": "Version Status",
"supplierNo": "Supplier Number", "supplierNo": "Supplier Number",
"paymentRequest": "Payment Request", "paymentRequest": "Payment Request",
"pOAmount": "PO Amount" "pOAmount": "PO Amount",
"pleaseWriteHere": "Please Write Here",
"disclosures": "Disclosures",
"areYouSureYouWantToGoBack": "Are you sure you want to go back?"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};
} }

@ -568,5 +568,8 @@ abstract class LocaleKeys {
static const versionStatus = 'versionStatus'; static const versionStatus = 'versionStatus';
static const supplierNo = 'supplierNo'; static const supplierNo = 'supplierNo';
static const paymentRequest = 'paymentRequest'; static const paymentRequest = 'paymentRequest';
static const pleaseWriteHere = 'pleaseWriteHere';
static const disclosures = 'disclosures';
static const areYouSureYouWantToGoBack = 'areYouSureYouWantToGoBack';
} }

@ -6,6 +6,8 @@ class DisclosureQuestionModel {
String? id; String? id;
String? titleEn; String? titleEn;
String? titleAr; String? titleAr;
String? descEn;
String? descAr;
String? marathonId; String? marathonId;
int? questionTypeId; int? questionTypeId;
int? questionTime; int? questionTime;
@ -21,6 +23,8 @@ class DisclosureQuestionModel {
String? id, String? id,
String? titleEn, String? titleEn,
String? titleAr, String? titleAr,
String? descEn,
String? descAr,
String? marathonId, String? marathonId,
int? questionTypeId, int? questionTypeId,
int? questionTime, int? questionTime,
@ -37,6 +41,8 @@ class DisclosureQuestionModel {
id = json['id']; id = json['id'];
titleEn = json['titleEn']; titleEn = json['titleEn'];
titleAr = json['titleAr']; titleAr = json['titleAr'];
descEn = json['desEn'];
descAr = json['desAr'];
marathonId = json['marathonId']; marathonId = json['marathonId'];
questionTypeId = json['questionTypeId']; questionTypeId = json['questionTypeId'];
questionTime = json['questionTime']; questionTime = json['questionTime'];
@ -54,26 +60,6 @@ class DisclosureQuestionModel {
questionOptions!.sort((QuestionOptions a, QuestionOptions b) => a.sequence!.compareTo(b.sequence!)); questionOptions!.sort((QuestionOptions a, QuestionOptions b) => a.sequence!.compareTo(b.sequence!));
} }
} }
Map<String, dynamic> toJson() {
Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['titleEn'] = titleEn;
data['titleAr'] = titleAr;
data['marathonId'] = marathonId;
data['questionTypeId'] = questionTypeId;
data['questionTime'] = questionTime;
data['nextQuestGap'] = nextQuestGap;
data['gapType'] = gapType;
data['gapText'] = gapText;
data['gapImage'] = gapImage;
data['questOptionsLimit'] = questOptionsLimit;
data['remainingParticipantCount'] = remainingParticipantCount;
if (questionOptions != null) {
data['questionOptions'] = questionOptions!.map((v) => v.toJson()).toList();
}
return data;
}
} }
class QuestionOptions { class QuestionOptions {

@ -18,7 +18,7 @@ class DisclosureProvider extends ChangeNotifier {
final AppinioSwiperController swiperController = AppinioSwiperController(); final AppinioSwiperController swiperController = AppinioSwiperController();
DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected; DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected;
DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel(); DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel();
List<DisclosureCardContent> cardContentList = <DisclosureCardContent>[const DisclosureCardContent()]; List<DisclosureCardContent> cardContentList = <DisclosureCardContent>[];
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel(); DisclosureQuestionModel currentQuestion = DisclosureQuestionModel();
List<DisclosureQuestionCardStatus> answerStatusesList = <DisclosureQuestionCardStatus>[]; List<DisclosureQuestionCardStatus> answerStatusesList = <DisclosureQuestionCardStatus>[];
DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question; DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus.question;
@ -58,6 +58,13 @@ class DisclosureProvider extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
String currentAdditionalText = "";
void updateCurrentAdditionalText(String value) {
currentAdditionalText = value;
notifyListeners();
}
void updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus value) { void updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus value) {
currentQuestionSelectionStatus = value; currentQuestionSelectionStatus = value;
notifyListeners(); notifyListeners();
@ -66,9 +73,11 @@ class DisclosureProvider extends ChangeNotifier {
//************************************************ FUNCTIONS ********************************************************** //************************************************ FUNCTIONS **********************************************************
Future<void> callNextQuestionApi() async { Future<void> callNextQuestionApi() async {
log("currentQuestionNumber: $currentQuestionNumber");
if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) { if (currentQuestionNumber < (disclosureDetailsModel.totalQuestions!)) {
if (currentQuestionNumber == 0) { if (currentQuestionNumber == 0) {
for (int i = 1; i <= disclosureDetailsModel.totalQuestions!; i++) {
cardContentList.add(const DisclosureCardContent());
}
currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber); currentQuestion = await DisclosureRepo().getDisclosureNextQuestion(currentQuestionNumber: currentQuestionNumber);
updateCardData(); updateCardData();
if (Utils.isLoading) { if (Utils.isLoading) {
@ -83,16 +92,30 @@ class DisclosureProvider extends ChangeNotifier {
} }
} }
void updateCardData() { Future<void> 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) { if (currentQuestionNumber > 0) {
swiperController.swipeRight(); swiperController.swipeRight();
} }
selectedOptionIndex = null; selectedOptionIndex = null;
currentQuestionNumber++; currentQuestionNumber++;
if (currentQuestionNumber < disclosureDetailsModel.totalQuestions!) {
cardContentList.add(const DisclosureCardContent());
cardContentList.add(const DisclosureCardContent());
}
questionCardStatus = DisclosureQuestionCardStatus.question; questionCardStatus = DisclosureQuestionCardStatus.question;
notifyListeners(); notifyListeners();
} }
@ -146,6 +169,7 @@ class DisclosureProvider extends ChangeNotifier {
answerStatusesList[i] = DisclosureQuestionCardStatus.question; answerStatusesList[i] = DisclosureQuestionCardStatus.question;
} }
} }
currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus.unSelected;
AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale); AppRoutes.navigatorKey.currentContext!.setLocale(savedLocale);
notifyListeners(); notifyListeners();
} }

@ -1,23 +1,16 @@
import 'dart:async'; import 'dart:async';
import 'dart:developer';
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/consts.dart';
import 'package:mohem_flutter_app/classes/lottie_consts.dart';
import 'package:mohem_flutter_app/config/routes.dart'; import 'package:mohem_flutter_app/config/routes.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/widget_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/generated/locale_keys.g.dart';
import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart'; import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/models/marathon/question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/custom_status_widget.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_progress_container.dart'; import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_progress_container.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart'; import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart';
import 'package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card_builder.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart'; import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart'; import 'package:mohem_flutter_app/widgets/dialogs/confirm_dialog.dart';
@ -26,68 +19,47 @@ import 'package:provider/provider.dart';
class DisclosureScreen extends StatelessWidget { class DisclosureScreen extends StatelessWidget {
const DisclosureScreen({Key? key}) : super(key: key); const DisclosureScreen({Key? key}) : super(key: key);
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 == 0) {
if (gapImage == null) {
return Image.asset(MyLottieConsts.congratsGif, height: 200);
}
return Image.network(ApiConsts.marathonBaseUrlServices + gapImage, height: 200);
}
return Image.asset(MyLottieConsts.congratsGif, height: 200);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>(); DisclosureProvider provider = context.watch<DisclosureProvider>();
bool isButtonDisabled = provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct || provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.wrong;
bool isLastQuestion = provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!; bool isLastQuestion = provider.currentQuestionNumber == provider.disclosureDetailsModel.totalQuestions!;
bool isButtonDisabled = (provider.currentQuestionSelectionStatus != DisclosureQuestionsOptionStatus.correct && provider.currentQuestionSelectionStatus != DisclosureQuestionsOptionStatus.wrong) ||
(provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentAdditionalText.isEmpty) && !isLastQuestion ||
(isLastQuestion && provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.wrong);
return WillPopScope( return WillPopScope(
child: Scaffold( child: Scaffold(
appBar: AppBarWidget( appBar: AppBarWidget(
context, context,
title: LocaleKeys.disclosure.tr(), title: LocaleKeys.disclosure.tr(),
onHomeTapped: () { onHomeTapped: () {
if (provider.questionCardStatus == QuestionCardStatus.winnerFound) { showDialog(
provider.resetValues(); context: context,
provider.getDisclosureDetails(); builder: (BuildContext context) => ConfirmDialog(
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
} else { onTap: () {
showDialog( provider.resetValues();
context: context, provider.getDisclosureDetails();
builder: (BuildContext context) => ConfirmDialog( Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
message: LocaleKeys.youWantToLeaveMarathon.tr(), },
onTap: () { ),
provider.resetValues(); );
provider.getDisclosureDetails();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
}
}, },
onBackTapped: () { onBackTapped: () async {
if (provider.questionCardStatus == QuestionCardStatus.winnerFound) { if (provider.currentQuestionNumber > 1) {
provider.resetValues(); await provider.callPreviousQuestionApi();
provider.getDisclosureDetails(); return;
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
} else {
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
} }
showDialog(
context: context,
builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
onTap: () {
provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));
},
),
);
}, },
), ),
body: Column( body: Column(
@ -96,46 +68,15 @@ class DisclosureScreen extends StatelessWidget {
shrinkWrap: true, shrinkWrap: true,
children: <Widget>[ children: <Widget>[
10.height, 10.height,
if (provider.questionCardStatus == QuestionCardStatus.findingWinner) DisclosureProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
...<Widget>[] const DisclosureQuestionCard().paddingOnly(top: 12, left: 21, right: 21),
else if (provider.questionCardStatus == QuestionCardStatus.winnerFound)
...<Widget>[]
else ...<Widget>[
DisclosureProgressContainer(provider: provider).paddingOnly(left: 21, right: 21),
],
DisclosureQuestionCardBuilder(
onQuestion: (BuildContext context) => const DisclosureQuestionCard(),
onCompleted: (BuildContext context) => DisclosureCustomStatusWidget(
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) => const SizedBox(),
onWinner: (BuildContext context) => const SizedBox(),
onWrongAnswer: (BuildContext context) => DisclosureCustomStatusWidget(
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) => DisclosureCustomStatusWidget(
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) => DisclosureCustomStatusWidget(
asset: Lottie.asset(MyLottieConsts.winnerLottie, height: 168, reverse: false, repeat: true),
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),
// 50.height,
], ],
).expanded, ).expanded,
DefaultButton( DefaultButton(
isLastQuestion ? LocaleKeys.submit.tr() : LocaleKeys.next.tr(), isLastQuestion ? LocaleKeys.submit.tr() : LocaleKeys.next.tr(),
isButtonDisabled isButtonDisabled
? () async { ? null
: () async {
if (isLastQuestion) { if (isLastQuestion) {
provider.resetValues(); provider.resetValues();
provider.getDisclosureDetails(); provider.getDisclosureDetails();
@ -145,19 +86,22 @@ class DisclosureScreen extends StatelessWidget {
provider.updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.unSelected); provider.updateCurrentSelectionYesNo(DisclosureQuestionsOptionStatus.unSelected);
provider.updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer); provider.updateAnswerStatusesList(DisclosureQuestionCardStatus.correctAnswer);
await provider.callNextQuestionApi(); await provider.callNextQuestionApi();
} },
: null, textColor: !isButtonDisabled ? MyColors.whiteColor : MyColors.greyACColor,
textColor: isButtonDisabled ? MyColors.whiteColor : MyColors.greyACColor,
color: isLastQuestion ? MyColors.greenColor : null, color: isLastQuestion ? MyColors.greenColor : null,
).insideContainer, ).insideContainer,
], ],
), ),
), ),
onWillPop: () { onWillPop: () async {
if (provider.currentQuestionNumber > 1) {
await provider.callPreviousQuestionApi();
return Future<bool>.value(false);
}
showDialog( showDialog(
context: context, context: context,
builder: (BuildContext context) => ConfirmDialog( builder: (BuildContext context) => ConfirmDialog(
message: LocaleKeys.youWantToLeaveMarathon.tr(), message: LocaleKeys.areYouSureYouWantToGoBack.tr(),
onTap: () { onTap: () {
provider.resetValues(); provider.resetValues();
Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard)); Navigator.of(context).popUntil(ModalRoute.withName(AppRoutes.dashboard));

@ -37,9 +37,7 @@ class DisclosureDetailsCard extends StatelessWidget {
selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0, selectedLanguage: disclosureDetailsCard.selectedLanguage ?? 0,
englishContent: disclosureDetailsCard.descEn ?? "", englishContent: disclosureDetailsCard.descEn ?? "",
arabicContent: disclosureDetailsCard.descAr ?? "", arabicContent: disclosureDetailsCard.descAr ?? "",
).toText14( ).toText14(color: MyColors.grey77Color),
color: MyColors.grey77Color,
),
) )
], ],
), ),

@ -44,8 +44,7 @@ class DisclosureProgressContainer extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
"${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}" "${provider.currentQuestionNumber == 1 ? 0 : (((provider.currentQuestionNumber - 1) / (provider.disclosureDetailsModel.totalQuestions!)) * 100).toInt()}% ${LocaleKeys.completed.tr()}".toText14(),
.toText14(),
], ],
), ),
], ],
@ -89,10 +88,13 @@ class DisclosureProgressContainer extends StatelessWidget {
if (isNeedLeftBorder) { if (isNeedLeftBorder) {
return Row( return Row(
children: <Widget>[ children: <Widget>[
Divider( Expanded(
thickness: 6, child: AnimatedContainer(
color: color, duration: const Duration(milliseconds: 800), // Set animation duration
).expanded, height: 6, // Change thickness if needed
color: color,
),
),
Container( Container(
margin: EdgeInsets.zero, margin: EdgeInsets.zero,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,

@ -1,4 +1,7 @@
import 'dart:developer';
import 'package:appinio_swiper/appinio_swiper.dart'; import 'package:appinio_swiper/appinio_swiper.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:lottie/lottie.dart'; import 'package:lottie/lottie.dart';
@ -6,10 +9,13 @@ import 'package:mohem_flutter_app/app_state/app_state.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/classes/lottie_consts.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_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/disclosure/disclosure_question_model.dart'; import 'package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart';
import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart'; import 'package:mohem_flutter_app/ui/disclosure/disclosure_provider.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class DisclosureQuestionCard extends StatelessWidget { class DisclosureQuestionCard extends StatelessWidget {
@ -21,18 +27,25 @@ class DisclosureQuestionCard extends StatelessWidget {
return CupertinoPageScaffold( return CupertinoPageScaffold(
child: provider.cardContentList.isEmpty child: provider.cardContentList.isEmpty
? Lottie.asset(MyLottieConsts.hourGlassLottie, height: 250).paddingOnly(top: 50) ? Lottie.asset(MyLottieConsts.hourGlassLottie, height: 250).paddingOnly(top: 50)
: SizedBox( : Consumer<DisclosureProvider>(
height: MediaQuery.of(context).size.height * .45, builder: (BuildContext context, DisclosureProvider provider, Widget? child) {
width: double.infinity, return Container(
child: AppinioSwiper( constraints: BoxConstraints(minHeight: MediaQuery.of(context).size.height * .43),
duration: const Duration(milliseconds: 400), height: (provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentQuestionNumber != provider.disclosureDetailsModel.totalQuestions!)
padding: EdgeInsets.zero, ? MediaQuery.of(context).size.height * .6
isDisabled: true, : MediaQuery.of(context).size.height * .43,
controller: provider.swiperController, width: double.infinity,
unswipe: (int index, AppinioSwiperDirection direction) {}, child: AppinioSwiper(
onSwipe: (int index, AppinioSwiperDirection direction) {}, duration: const Duration(milliseconds: 400),
cards: provider.cardContentList, padding: EdgeInsets.zero,
), isDisabled: true,
controller: provider.swiperController,
unswipe: (int index, AppinioSwiperDirection direction) {},
onSwipe: (int index, AppinioSwiperDirection direction) {},
cards: provider.cardContentList,
),
);
},
), ),
); );
} }
@ -59,36 +72,39 @@ class DisclosureCardContent extends StatelessWidget {
), ),
alignment: Alignment.center, alignment: Alignment.center,
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[ children: <Widget>[
Container( Flexible(
width: double.infinity, child: Container(
decoration: const BoxDecoration( width: double.infinity,
borderRadius: BorderRadius.only( decoration: const BoxDecoration(
topLeft: Radius.circular(10), borderRadius: BorderRadius.only(
topRight: Radius.circular(10), topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
), ),
), constraints: BoxConstraints(minHeight: MediaQuery.of(context).size.height * .23),
child: Center(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 13, vertical: 15), padding: const EdgeInsets.only(left: 15, right: 15, top: 15),
child: Text( child: SingleChildScrollView(
displayLocalizedContent( child: Text(
isPhoneLangArabic: AppState().isArabic(context), displayLocalizedContent(
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0, isPhoneLangArabic: AppState().isArabic(context),
englishContent: provider.currentQuestion.titleEn ?? "", selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
arabicContent: provider.currentQuestion.titleAr ?? "", englishContent: provider.currentQuestion.titleEn ?? "",
), arabicContent: provider.currentQuestion.titleAr ?? "",
style: const TextStyle( ),
color: MyColors.darkTextColor, style: const TextStyle(
fontSize: 15, color: MyColors.darkTextColor,
height: 21 / 14, fontSize: 15,
fontWeight: FontWeight.w500, height: 21 / 14,
fontWeight: FontWeight.w500,
),
), ),
), ),
), ),
), ),
), ),
24.height,
const DisclosureAnswerContent(), const DisclosureAnswerContent(),
], ],
), ),
@ -103,25 +119,52 @@ class DisclosureAnswerContent extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
DisclosureProvider provider = context.watch<DisclosureProvider>(); DisclosureProvider provider = context.watch<DisclosureProvider>();
return Container( return Container(
padding: const EdgeInsets.symmetric(vertical: 20, horizontal: 13), padding: const EdgeInsets.only(bottom: 20, left: 8, right: 8),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: MyColors.kWhiteColor, color: MyColors.kWhiteColor,
borderRadius: BorderRadius.only( borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10),
),
), ),
child: provider.currentQuestion.questionOptions != null child: provider.currentQuestion.questionOptions != null
? Row( ? Column(
children: List<Widget>.generate( children: [
provider.currentQuestion.questionOptions!.length, Row(
(int index) => Expanded( children: List<Widget>.generate(
child: DisclosureAnswerTileForText( provider.currentQuestion.questionOptions!.length,
index: index, (int index) => Expanded(
onAnswerTapped: () => provider.updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.selected, selectedOptIndex: index, correctOptionIndex: -1), // child: DisclosureAnswerTileForText(
).paddingAll(8), index: index,
onAnswerTapped: () => provider.updateCurrentQuestionOptionStatus(status: DisclosureQuestionsOptionStatus.selected, selectedOptIndex: index, correctOptionIndex: -1), //
).paddingAll(8),
),
),
), ),
), if (provider.currentQuestionSelectionStatus == DisclosureQuestionsOptionStatus.correct && provider.currentQuestionNumber != provider.disclosureDetailsModel.totalQuestions!) ...[
15.height,
Text(
displayLocalizedContent(
isPhoneLangArabic: AppState().isArabic(context),
selectedLanguage: (provider.disclosureDetailsModel.selectedLanguage) ?? 0,
englishContent: provider.currentQuestion.descEn ?? "",
arabicContent: provider.currentQuestion.descAr ?? "",
),
style: const TextStyle(
color: MyColors.darkTextColor,
fontSize: 14,
height: 21 / 14,
fontWeight: FontWeight.w500,
),
).paddingOnly(left: 8, right: 8),
8.height,
DynamicTextFieldWidget(
LocaleKeys.pleaseWriteHere.tr(),
provider.currentAdditionalText,
lines: 3,
onChange: (value) {
provider.updateCurrentAdditionalText(value);
},
).paddingOnly(left: 8, right: 8),
],
],
) )
: const SizedBox(), : const SizedBox(),
); );

Loading…
Cancel
Save