diff --git a/app/ios/Gemfile b/app/ios/Gemfile new file mode 100644 index 00000000..7a118b49 --- /dev/null +++ b/app/ios/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/app/ios/Gemfile.lock b/app/ios/Gemfile.lock new file mode 100644 index 00000000..96df74f3 --- /dev/null +++ b/app/ios/Gemfile.lock @@ -0,0 +1,217 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + addressable (2.8.5) + public_suffix (>= 2.0.2, < 6.0) + artifactory (3.0.15) + atomos (0.1.3) + aws-eventstream (1.2.0) + aws-partitions (1.848.0) + aws-sdk-core (3.186.0) + aws-eventstream (~> 1, >= 1.0.2) + aws-partitions (~> 1, >= 1.651.0) + aws-sigv4 (~> 1.5) + jmespath (~> 1, >= 1.6.1) + aws-sdk-kms (1.72.0) + aws-sdk-core (~> 3, >= 3.184.0) + aws-sigv4 (~> 1.1) + aws-sdk-s3 (1.136.0) + aws-sdk-core (~> 3, >= 3.181.0) + aws-sdk-kms (~> 1) + aws-sigv4 (~> 1.6) + aws-sigv4 (1.6.1) + aws-eventstream (~> 1, >= 1.0.2) + babosa (1.0.4) + claide (1.1.0) + colored (1.2) + colored2 (3.1.2) + commander (4.6.0) + highline (~> 2.0.0) + declarative (0.0.20) + digest-crc (0.6.5) + rake (>= 12.0.0, < 14.0.0) + domain_name (0.5.20190701) + unf (>= 0.0.5, < 1.0.0) + dotenv (2.8.1) + emoji_regex (3.2.3) + excon (0.104.0) + faraday (1.10.3) + faraday-em_http (~> 1.0) + faraday-em_synchrony (~> 1.0) + faraday-excon (~> 1.1) + faraday-httpclient (~> 1.0) + faraday-multipart (~> 1.0) + faraday-net_http (~> 1.0) + faraday-net_http_persistent (~> 1.0) + faraday-patron (~> 1.0) + faraday-rack (~> 1.0) + faraday-retry (~> 1.0) + ruby2_keywords (>= 0.0.4) + faraday-cookie_jar (0.0.7) + faraday (>= 0.8.0) + http-cookie (~> 1.0.0) + faraday-em_http (1.0.0) + faraday-em_synchrony (1.0.0) + faraday-excon (1.1.0) + faraday-httpclient (1.0.1) + faraday-multipart (1.0.4) + multipart-post (~> 2) + faraday-net_http (1.0.1) + faraday-net_http_persistent (1.2.0) + faraday-patron (1.0.0) + faraday-rack (1.0.0) + faraday-retry (1.0.3) + faraday_middleware (1.2.0) + faraday (~> 1.0) + fastimage (2.2.7) + fastlane (2.216.0) + CFPropertyList (>= 2.3, < 4.0.0) + addressable (>= 2.8, < 3.0.0) + artifactory (~> 3.0) + aws-sdk-s3 (~> 1.0) + babosa (>= 1.0.3, < 2.0.0) + bundler (>= 1.12.0, < 3.0.0) + colored + commander (~> 4.6) + dotenv (>= 2.1.1, < 3.0.0) + emoji_regex (>= 0.1, < 4.0) + excon (>= 0.71.0, < 1.0.0) + faraday (~> 1.0) + faraday-cookie_jar (~> 0.0.6) + faraday_middleware (~> 1.0) + fastimage (>= 2.1.0, < 3.0.0) + gh_inspector (>= 1.1.2, < 2.0.0) + google-apis-androidpublisher_v3 (~> 0.3) + google-apis-playcustomapp_v1 (~> 0.1) + google-cloud-storage (~> 1.31) + highline (~> 2.0) + http-cookie (~> 1.0.5) + json (< 3.0.0) + jwt (>= 2.1.0, < 3) + mini_magick (>= 4.9.4, < 5.0.0) + multipart-post (>= 2.0.0, < 3.0.0) + naturally (~> 2.2) + optparse (~> 0.1.1) + plist (>= 3.1.0, < 4.0.0) + rubyzip (>= 2.0.0, < 3.0.0) + security (= 0.1.3) + simctl (~> 1.6.3) + terminal-notifier (>= 2.0.0, < 3.0.0) + terminal-table (~> 3) + tty-screen (>= 0.6.3, < 1.0.0) + tty-spinner (>= 0.8.0, < 1.0.0) + word_wrap (~> 1.0.0) + xcodeproj (>= 1.13.0, < 2.0.0) + xcpretty (~> 0.3.0) + xcpretty-travis-formatter (>= 0.0.3) + gh_inspector (1.1.3) + google-apis-androidpublisher_v3 (0.52.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-core (0.11.2) + addressable (~> 2.5, >= 2.5.1) + googleauth (>= 0.16.2, < 2.a) + httpclient (>= 2.8.1, < 3.a) + mini_mime (~> 1.0) + representable (~> 3.0) + retriable (>= 2.0, < 4.a) + rexml + webrick + google-apis-iamcredentials_v1 (0.17.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-playcustomapp_v1 (0.13.0) + google-apis-core (>= 0.11.0, < 2.a) + google-apis-storage_v1 (0.29.0) + google-apis-core (>= 0.11.0, < 2.a) + google-cloud-core (1.6.0) + google-cloud-env (~> 1.0) + google-cloud-errors (~> 1.0) + google-cloud-env (1.6.0) + faraday (>= 0.17.3, < 3.0) + google-cloud-errors (1.3.1) + google-cloud-storage (1.45.0) + addressable (~> 2.8) + digest-crc (~> 0.4) + google-apis-iamcredentials_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.29.0) + google-cloud-core (~> 1.6) + googleauth (>= 0.16.2, < 2.a) + mini_mime (~> 1.0) + googleauth (1.8.1) + faraday (>= 0.17.3, < 3.a) + jwt (>= 1.4, < 3.0) + multi_json (~> 1.11) + os (>= 0.9, < 2.0) + signet (>= 0.16, < 2.a) + highline (2.0.3) + http-cookie (1.0.5) + domain_name (~> 0.5) + httpclient (2.8.3) + jmespath (1.6.2) + json (2.6.3) + jwt (2.7.1) + mini_magick (4.12.0) + mini_mime (1.1.5) + multi_json (1.15.0) + multipart-post (2.3.0) + nanaimo (0.3.0) + naturally (2.2.1) + optparse (0.1.1) + os (1.1.4) + plist (3.7.0) + public_suffix (5.0.3) + rake (13.1.0) + representable (3.2.0) + declarative (< 0.1.0) + trailblazer-option (>= 0.1.1, < 0.2.0) + uber (< 0.2.0) + retriable (3.1.2) + rexml (3.2.6) + rouge (2.0.7) + ruby2_keywords (0.0.5) + rubyzip (2.3.2) + security (0.1.3) + signet (0.18.0) + addressable (~> 2.8) + faraday (>= 0.17.5, < 3.a) + jwt (>= 1.5, < 3.0) + multi_json (~> 1.10) + simctl (1.6.10) + CFPropertyList + naturally + terminal-notifier (2.0.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + trailblazer-option (0.1.2) + tty-cursor (0.7.1) + tty-screen (0.8.1) + tty-spinner (0.9.3) + tty-cursor (~> 0.7) + uber (0.1.0) + unf (0.1.4) + unf_ext + unf_ext (0.0.9) + unicode-display_width (2.5.0) + webrick (1.8.1) + word_wrap (1.0.0) + xcodeproj (1.23.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + xcpretty (0.3.0) + rouge (~> 2.0.7) + xcpretty-travis-formatter (1.0.1) + xcpretty (~> 0.2, >= 0.0.7) + +PLATFORMS + arm64-darwin-23 + +DEPENDENCIES + fastlane + +BUNDLED WITH + 2.4.10 diff --git a/app/ios/fastlane/Appfile b/app/ios/fastlane/Appfile new file mode 100644 index 00000000..569a5559 --- /dev/null +++ b/app/ios/fastlane/Appfile @@ -0,0 +1,8 @@ +app_identifier("com.toki.bebrasPandai") # The bundle identifier of your app +apple_id("arrosyidbh@gmail.com") # Your Apple Developer Portal username + +itc_team_id("120270185") # App Store Connect Team ID +team_id("Y4R2BD2VKJ") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/app/ios/fastlane/Fastfile b/app/ios/fastlane/Fastfile new file mode 100644 index 00000000..a8b53d04 --- /dev/null +++ b/app/ios/fastlane/Fastfile @@ -0,0 +1,33 @@ +# This file contains the fastlane.tools configuration +# You can find the documentation at https://docs.fastlane.tools +# +# For a list of all available actions, check out +# +# https://docs.fastlane.tools/actions +# +# For a list of all available plugins, check out +# +# https://docs.fastlane.tools/plugins/available-plugins +# + +# Uncomment the line if you want fastlane to automatically update itself +# update_fastlane + +default_platform(:ios) + +platform :ios do + desc "Push a new beta build to TestFlight" + lane :beta do + get_certificates + get_provisioning_profile + # sync_code_signing + disable_automatic_code_signing(path: "Runner.xcodeproj") + increment_build_number + build_app( + # skip_build_archive: true, + archive_path: "../build/ios/archive/Runner.xcarchive", + ) + enable_automatic_code_signing(path: "Runner.xcodeproj") + upload_to_testflight + end +end diff --git a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart index 2b149604..eca50b64 100644 --- a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart +++ b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_cubit.dart @@ -20,14 +20,13 @@ class QuizExerciseCubit extends Cubit { late WeeklyQuiz quiz; late WeeklyQuizParticipation participation; - late QuizExercise currentProblem; int currentProblemIndex = 0; late List problemIdList; + late List problemList; + late List answerList; late QuizExerciseAttempt attempt; String? quizParticipantId; - String selectedAnswer = ''; - String shortAnswer = ''; late int remainingDuration; Timer? timer; @@ -65,28 +64,39 @@ class QuizExerciseCubit extends Cubit { // Shuffle Problem List problemIdList.shuffle(); + // reset index every time this method is called + currentProblemIndex = 0; + + // Fetch all quiz data + problemList = await quizExerciseRepository.getListQuizExercise( + taskIds: problemIdList); + problemList = problemList + .where((quizExercise) => + quizExercise.type == 'MULTIPLE_CHOICE' || + quizExercise.type == 'MULTIPLE_CHOICE_IMAGE' || + quizExercise.type == 'SHORT_ANSWER') + .toList(); + + problemIdList = problemList + .map((quizExercise) => quizExercise.id) // Extracting ids + .toList(); + // TODO(someone): fix the check logic later // if (weeklyQuizParticipant.attempts.isEmpty) { + answerList = problemList + .map((e) => QuizExerciseAnswer( + taskId: e.id, + correctAnswer: e.answer.correctAnswer, + answer: '', + taskChallengeGroup: e.challengeGroup)) + .toList(); attempt = QuizExerciseAttempt( startAt: DateTime.now(), totalBlank: problemIdList.length, totalCorrect: 0, totalIncorrect: 0, - answers: [], ); - // reset index every time this method is called - currentProblemIndex = 0; - - // Fetch all quiz data for it to be available when offline - await quizExerciseRepository - .getListQuizExerciseByTaskIdList(problemIdList); - - currentProblem = - await quizExerciseRepository.getQuizExercise(problemIdList.first); - - currentProblem.question.options?.shuffle(); - final duration = quiz.duration_minute[participation.challenge_group]; if (duration == null) { throw Exception('Duration for selected Challenge Group not found'); @@ -96,10 +106,12 @@ class QuizExerciseCubit extends Cubit { emit( QuizExerciseShow( quiz: quiz, - quizExercise: currentProblem, + quizExercise: problemList[currentProblemIndex], remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, - shortAnswer: shortAnswer, + answer: answerList[currentProblemIndex], + attempt: attempt, + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, ), ); } catch (e) { @@ -108,13 +120,31 @@ class QuizExerciseCubit extends Cubit { } void selectAnswer(String answerId) { - selectedAnswer = answerId; + answerList[currentProblemIndex].answer = answerId; + emit( + QuizExerciseShow( + quiz: quiz, + quizExercise: problemList[currentProblemIndex], + remainingDuration: Duration(seconds: remainingDuration), + answer: answerList[currentProblemIndex], + attempt: attempt, + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, + ), + ); + } + + void fillAnswer(String answer) { + answerList[currentProblemIndex].answer = answer; emit( QuizExerciseShow( quiz: quiz, - quizExercise: currentProblem, + quizExercise: problemList[currentProblemIndex], remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, + attempt: attempt, + answer: answerList[currentProblemIndex], + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, ), ); } @@ -131,104 +161,98 @@ class QuizExerciseCubit extends Cubit { } } - void fillAnswer(String answer) { - shortAnswer = answer; - - emit( - QuizExerciseShow( - quiz: quiz, - quizExercise: currentProblem, - remainingDuration: Duration(seconds: remainingDuration), - shortAnswer: shortAnswer, - ), - ); - } - Future finishExerciseTimeUp() async { await postQuizExerciseAttempt(); emit(QuizExerciseFinished(quizParticipantId!)); } Future submitAnswer() async { - if (((currentProblem.type == 'MULTIPLE_CHOICE' || - currentProblem.type == 'MULTIPLE_CHOICE_IMAGE') && - selectedAnswer == '') || - (currentProblem.type == 'SHORT_ANSWER') && shortAnswer == '') { + final currentProblem = problemList[currentProblemIndex]; + final answer = answerList[currentProblemIndex].answer; + if (answer == '') { emit( QuizExerciseShow( quiz: quiz, quizExercise: currentProblem, remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, - shortAnswer: shortAnswer, + attempt: attempt, + answer: answerList[currentProblemIndex], modalErrorMessage: currentProblem.type == 'SHORT_ANSWER' ? 'Isi jawaban anda' : 'Pilih salah satu jawaban', + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, ), ); return; } - try { - var verdict = 'INCORRECT'; - if (currentProblem.type == 'MULTIPLE_CHOICE' || - currentProblem.type == 'MULTIPLE_CHOICE_IMAGE' && - currentProblem.answer.correctAnswer.contains(selectedAnswer)) { - verdict = 'CORRECT'; - } + var verdict = 'INCORRECT'; + if ((currentProblem.type == 'MULTIPLE_CHOICE' || + currentProblem.type == 'MULTIPLE_CHOICE_IMAGE') && + currentProblem.answer.correctAnswer.contains(answer)) { + verdict = 'CORRECT'; + } + if (currentProblem.type == 'SHORT_ANSWER' && + currentProblem.answer.correctAnswer + .map((answer) => answer.toLowerCase()) + .contains(answer.trim().toLowerCase())) { + verdict = 'CORRECT'; + } + answerList[currentProblemIndex].verdict = verdict; - if (currentProblem.type == 'SHORT_ANSWER' && - currentProblem.answer.correctAnswer - .map((answer) => answer.toLowerCase()) - .contains(shortAnswer.trim().toLowerCase())) { - verdict = 'CORRECT'; - } + attempt.totalBlank = answerList.where((e) => e.verdict == null).length; + attempt.totalCorrect = answerList + .where((e) => e.verdict != null && e.verdict == 'CORRECT') + .length; + attempt.totalIncorrect = answerList + .where((e) => e.verdict != null && e.verdict == 'INCORRECT') + .length; - attempt.answers?.add( - QuizExerciseAnswer( - answer: currentProblem.type == 'SHORT_ANSWER' - ? shortAnswer - : selectedAnswer, - correctAnswer: currentProblem.answer.correctAnswer, - taskChallengeGroup: currentProblem.challengeGroup, - taskId: currentProblem.id, - verdict: verdict, - ), - ); - - if (verdict == 'CORRECT') { - attempt.totalCorrect++; - attempt.totalBlank--; - } else { - attempt.totalIncorrect++; - attempt.totalBlank--; - } + toNextQuestion(); + } - currentProblemIndex++; - - if (currentProblemIndex < problemIdList.length) { - currentProblem = await quizExerciseRepository - .getQuizExercise(problemIdList[currentProblemIndex]); - selectedAnswer = ''; - shortAnswer = ''; - emit( - QuizExerciseShow( - quiz: quiz, - quizExercise: currentProblem, - remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, - shortAnswer: shortAnswer, - ), - ); - } else { - await postQuizExerciseAttempt(); - emit(QuizExerciseFinished(quizParticipantId!)); - } + Future finishExercise() async { + try { + await postQuizExerciseAttempt(); + emit(QuizExerciseFinished(quizParticipantId!)); } catch (e) { emit(QuizExerciseFailed(e.toString())); } } + void toNextQuestion() { + if (currentProblemIndex == problemIdList.length - 1) return; + currentProblemIndex++; + emit( + QuizExerciseShow( + quiz: quiz, + quizExercise: problemList[currentProblemIndex], + remainingDuration: Duration(seconds: remainingDuration), + attempt: attempt, + answer: answerList[currentProblemIndex], + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, + ), + ); + } + + void toPreviousQuestion() { + if (currentProblemIndex == 0) return; + currentProblemIndex--; + emit( + QuizExerciseShow( + quiz: quiz, + quizExercise: problemList[currentProblemIndex], + remainingDuration: Duration(seconds: remainingDuration), + attempt: attempt, + answer: answerList[currentProblemIndex], + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, + ), + ); + } + Future postQuizExerciseAttempt() async { attempt.score = (attempt.totalCorrect / (attempt.totalCorrect + @@ -250,10 +274,12 @@ class QuizExerciseCubit extends Cubit { emit( QuizExerciseShow( quiz: quiz, - quizExercise: currentProblem, + quizExercise: problemList[currentProblemIndex], remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, - shortAnswer: shortAnswer, + attempt: attempt, + answer: answerList[currentProblemIndex], + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, ), ); } else { @@ -272,10 +298,12 @@ class QuizExerciseCubit extends Cubit { emit( QuizExerciseShow( quiz: quiz, - quizExercise: currentProblem, + quizExercise: problemList[currentProblemIndex], remainingDuration: Duration(seconds: remainingDuration), - selectedAnswer: selectedAnswer, - shortAnswer: shortAnswer, + attempt: attempt, + answer: answerList[currentProblemIndex], + currentProblemIndex: currentProblemIndex, + totalProblem: problemIdList.length, ), ); } diff --git a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_state.dart b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_state.dart index 9d0ef3fd..4a2d409b 100644 --- a/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_state.dart +++ b/app/lib/features/quiz_exercise/presentation/bloc/quiz_exercise_state.dart @@ -14,17 +14,21 @@ class QuizExerciseLoading extends QuizExerciseState {} class QuizExerciseShow extends QuizExerciseState { final QuizExercise quizExercise; final WeeklyQuiz quiz; + final QuizExerciseAnswer answer; + final QuizExerciseAttempt attempt; final Duration remainingDuration; - final String selectedAnswer; - final String shortAnswer; final String modalErrorMessage; + final int currentProblemIndex; + final int totalProblem; const QuizExerciseShow({ required this.quiz, required this.quizExercise, required this.remainingDuration, - this.shortAnswer = '', - this.selectedAnswer = '', + required this.currentProblemIndex, + required this.totalProblem, + required this.attempt, + required this.answer, this.modalErrorMessage = '', }); @@ -33,12 +37,14 @@ class QuizExerciseShow extends QuizExerciseState { quiz, quizExercise, remainingDuration, - selectedAnswer, - shortAnswer, + answer, + attempt, modalErrorMessage, ]; } +class QuizExerciseFinalization extends QuizExerciseState {} + class QuizExerciseFinished extends QuizExerciseState { final String quizParticipantId; const QuizExerciseFinished(this.quizParticipantId); diff --git a/app/lib/features/quiz_exercise/presentation/model/answer.dart b/app/lib/features/quiz_exercise/presentation/model/answer.dart index f5d5f623..0f494438 100644 --- a/app/lib/features/quiz_exercise/presentation/model/answer.dart +++ b/app/lib/features/quiz_exercise/presentation/model/answer.dart @@ -13,11 +13,12 @@ class Answer { }); factory Answer.fromJson(Map json) { + var correctAnswer = json['correct_answer']; return Answer( aspect: Aspect.fromJson(json['aspect'] as Map), - correctAnswer: (json['correct_answer'] as List) - .map((e) => e.toString()) - .toList(), + correctAnswer: correctAnswer == null + ? [] + : (correctAnswer as List).map((e) => e.toString()).toList(), explanation: Explanation.fromJson(json['explanation'] as Map), ); diff --git a/app/lib/features/quiz_exercise/presentation/model/questions.dart b/app/lib/features/quiz_exercise/presentation/model/questions.dart index 663890ba..6ab76684 100644 --- a/app/lib/features/quiz_exercise/presentation/model/questions.dart +++ b/app/lib/features/quiz_exercise/presentation/model/questions.dart @@ -2,15 +2,16 @@ import 'options.dart'; class Question { final String content; - final List? options; + final List options; - Question({required this.content, this.options}); + Question({required this.content, required this.options}); factory Question.fromJson(Map json) { + var options = json['options']; return Question( content: json['content'] as String, - options: json['options'] != null - ? (json['options'] as List) + options: options != null + ? (options as List) .map((e) => Options.fromJson(e as Map)) .toList() : [], diff --git a/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_answer.dart b/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_answer.dart index ceeece91..b2a51a92 100644 --- a/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_answer.dart +++ b/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_answer.dart @@ -3,14 +3,14 @@ class QuizExerciseAnswer { List correctAnswer; String taskChallengeGroup; String taskId; - String verdict; + String? verdict; QuizExerciseAnswer({ + required this.taskId, required this.answer, required this.correctAnswer, required this.taskChallengeGroup, - required this.taskId, - required this.verdict, + this.verdict, }); Map toJson() { diff --git a/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_attempt.dart b/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_attempt.dart index 1f23aeca..171e798e 100644 --- a/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_attempt.dart +++ b/app/lib/features/quiz_exercise/presentation/model/quiz_exercise_attempt.dart @@ -36,7 +36,8 @@ class QuizExerciseAttempt { totalCorrect: json['n_answer_correct'] as int, totalIncorrect: json['n_answer_incorrect'] as int, score: json['score'] as int, - answers: json['answers'] as List, + answers: + json['answers'] == null ? [] : json['answers'] as List, ); Map toJson() { diff --git a/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart b/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart index a5f1ead0..0b3edc3c 100644 --- a/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart +++ b/app/lib/features/quiz_exercise/presentation/pages/quiz_exercise_page.dart @@ -81,9 +81,13 @@ class _QuizExercisePageState extends State { task: state.quizExercise, context: context, remainingDuration: state.remainingDuration, - onTap: () { - onTaskTap(); + attempt: state.attempt, + onTaskTap: () { + onAnswerTap(); }, + showPreviousButton: state.currentProblemIndex > 0, + showNextButton: state.currentProblemIndex < + (state.totalProblem - 1), ); } return Container(); @@ -97,7 +101,7 @@ class _QuizExercisePageState extends State { ); } - void onTaskTap() { + void onAnswerTap() { showDialog( context: context, builder: (context) { @@ -109,8 +113,7 @@ class _QuizExercisePageState extends State { return TaskDialog( task: state.quizExercise, preview: false, - shortAnswer: state.shortAnswer, - selectedAnswer: state.selectedAnswer, + answer: state.answer.answer, error: state.modalErrorMessage, ); } diff --git a/app/lib/features/quiz_exercise/presentation/pages/task_dialog.dart b/app/lib/features/quiz_exercise/presentation/pages/task_dialog.dart index 5e1f374a..5cdc436d 100644 --- a/app/lib/features/quiz_exercise/presentation/pages/task_dialog.dart +++ b/app/lib/features/quiz_exercise/presentation/pages/task_dialog.dart @@ -10,8 +10,7 @@ import '../bloc/quiz_exercise_cubit.dart'; import '../model/quiz_exercise.dart'; class TaskDialog extends StatelessWidget { - final String? shortAnswer; - final String? selectedAnswer; + final String? answer; final String? error; final bool preview; final QuizExercise task; @@ -19,8 +18,7 @@ class TaskDialog extends StatelessWidget { required this.task, required this.preview, super.key, - this.shortAnswer, - this.selectedAnswer, + this.answer, this.error, }); @@ -48,52 +46,55 @@ class TaskDialog extends StatelessWidget { // ), // ), // if (!preview) - ...task.question.options!.asMap().entries.map((e) { - final current = String.fromCharCode(65 + e.key); + ...task.question.options.asMap().entries.map((e) { + final current = String.fromCharCode(65 + e.key); - return RadioListTile( - title: SizedBox( - child: Transform.translate( - offset: const Offset( - -20, - 0, - ), // Set the desired offset - child: Row( - children: [ - Text('$current. '), - task.type == 'MULTIPLE_CHOICE_IMAGE' - ? - Image.network( - e.value.content.replaceAll(Assets.sourceImg, Assets.urlImg), - width: MediaQuery.of(context).size.width - 240, - ) - : Flexible( - child: HtmlWithCachedImages( - data:e.value.content - ), - ) - ], - ), + return RadioListTile( + title: SizedBox( + child: Transform.translate( + offset: const Offset( + -20, + 0, + ), // Set the desired offset + child: Row( + children: [ + Text('$current. '), + task.type == 'MULTIPLE_CHOICE_IMAGE' + ? Image.network( + e.value.content.replaceAll( + Assets.sourceImg, Assets.urlImg), + width: + MediaQuery.of(context).size.width - 240, + ) + : Flexible( + child: HtmlWithCachedImages( + data: e.value.content), + ) + ], ), ), - value: e.value.id, - groupValue: selectedAnswer, - onChanged: (value) { - context - .read() - .selectAnswer(e.value.id); - }, - ); - }), + ), + value: e.value.id, + groupValue: answer, + onChanged: (value) { + context.read().selectAnswer(e.value.id); + }, + ); + }), // if (!preview) - task.type == 'SHORT_ANSWER' - ? Container( - padding: const EdgeInsets.only(top: 20), - child: CustomTextField('Jawaban anda', (value) { + task.type == 'SHORT_ANSWER' + ? Container( + padding: const EdgeInsets.only(top: 20), + child: CustomTextField( + 'Jawaban anda', + (value) { context.read().fillAnswer(value); - }, (p0) => null, ''), - ) - : Container(), + }, + (p0) => null, + answer, + ), + ) + : Container(), if (!preview) if (error != null) Text(error!), ], @@ -111,7 +112,6 @@ class TaskDialog extends StatelessWidget { }, ), ), - if (!preview) SizedBox( width: 100, @@ -122,11 +122,11 @@ class TaskDialog extends StatelessWidget { onTap: () { var error = ''; if (task.type == 'SHORT_ANSWER') { - if (shortAnswer == '') { + if (answer == '') { error = 'Isi jawaban anda'; } } else { - if (selectedAnswer == '') { + if (answer == '') { error = 'Pilih salah satu jawaban'; } } @@ -136,12 +136,8 @@ class TaskDialog extends StatelessWidget { backgroundColor: Colors.red, duration: const Duration(seconds: 1), behavior: SnackBarBehavior.floating, - margin: - const EdgeInsets.only( - bottom: 50, - left: 10, - right: 10 - ), + margin: const EdgeInsets.only( + bottom: 50, left: 10, right: 10), content: Text(error), ); diff --git a/app/lib/features/quiz_exercise/presentation/pages/task_view.dart b/app/lib/features/quiz_exercise/presentation/pages/task_view.dart index 3e51f911..397b7831 100644 --- a/app/lib/features/quiz_exercise/presentation/pages/task_view.dart +++ b/app/lib/features/quiz_exercise/presentation/pages/task_view.dart @@ -9,140 +9,213 @@ import '../../../../core/constants/assets.dart'; import '../../../../core/theme/font_theme.dart'; import '../bloc/quiz_exercise_cubit.dart'; import '../model/quiz_exercise.dart'; +import '../model/quiz_exercise_attempt.dart'; class TaskView extends StatelessWidget { final Duration? remainingDuration; final QuizExercise task; + final QuizExerciseAttempt attempt; final BuildContext context; - final Function onTap; + final Function onTaskTap; + final bool showPreviousButton; + final bool showNextButton; const TaskView({ required this.task, required this.context, - required this.onTap, + required this.onTaskTap, + required this.attempt, super.key, + this.showPreviousButton = false, + this.showNextButton = false, this.remainingDuration, }); Future _showExitConfirmationDialog(BuildContext context) async { return await showDialog( - context: context, - builder: (context) => AlertDialog( - title: const Text('Anda akan keluar dari latihan?'), - content: const Text('Latihan akan dianggap selesai dengan hasil seadanya'), - actions: [ - SizedBox( - width: 100, - height: 50, - child: Button( - buttonType: ButtonType.secondary, - text: 'Cancel', - onTap: () { - Navigator.of(context).pop(false); - }, - ), + context: context, + builder: (context) => AlertDialog( + title: const Text('Anda akan keluar dari latihan?'), + content: const Text( + 'Latihan akan dianggap selesai dengan hasil seadanya'), + actions: [ + SizedBox( + width: 100, + height: 50, + child: Button( + buttonType: ButtonType.secondary, + text: 'Cancel', + onTap: () { + Navigator.of(context).pop(false); + }, + ), + ), + SizedBox( + width: 100, + height: 50, + child: Button( + buttonType: ButtonType.tertiary, + text: 'Ya', + onTap: () { + context + .read() + .finishExerciseTimeUp(); + Navigator.of(context).pop(true); + })) + ], ), - SizedBox( - width: 100, - height: 50, - child: Button( - buttonType: ButtonType.tertiary, - text: 'Ya', - onTap: () { - context.read().finishExerciseTimeUp(); - Navigator.of(context).pop(true); - } - ) - ) - ], - ), - ) ?? false; + ) ?? + false; } @override Widget build(BuildContext context) { return WillPopScope( - onWillPop: () async { - // Display the popup when the back button is pressed - final result = await _showExitConfirmationDialog(context); - return result; - }, - child: Column( - children: [ - if (remainingDuration != null) + onWillPop: () async { + // Display the popup when the back button is pressed + final result = await _showExitConfirmationDialog(context); + return result; + }, + child: Column( + children: [ + if (remainingDuration != null) + Container( + color: Colors.yellowAccent, + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), + child: Text( + '${remainingDuration!.inMinutes.toString().padLeft(2, '0')} : ${remainingDuration!.inSeconds.remainder(60).toString().padLeft(2, '0')}'), + ), + if (remainingDuration != null) + const SizedBox( + height: 10, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Image.asset( + '${Assets.flagDir}${task.country}.png', + width: 40, + height: 20, + ), + Flexible( + child: Text( + task.title, + textAlign: TextAlign.center, + style: FontTheme.blackSubtitleBold(), + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Text( + task.id, + style: const TextStyle(fontSize: 9), + ), + Text( + task.source, + style: const TextStyle(fontSize: 7), + ), + ], + ), + ], + ), Container( - color: Colors.yellowAccent, - padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), - child: Text( - '${remainingDuration!.inMinutes.toString().padLeft(2, '0')} : ${remainingDuration!.inSeconds.remainder(60).toString().padLeft(2, '0')}'), + height: 2, + color: Colors.black, ), - if (remainingDuration != null) const SizedBox( - height: 10, + height: 3, ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Image.asset( - '${Assets.flagDir}${task.country}.png', - width: 40, - height: 20, - ), - Flexible( - child: Text( - task.title, - textAlign: TextAlign.center, - style: FontTheme.blackSubtitleBold(), + Container( + height: MediaQuery.of(context).size.height - 340, + width: double.infinity, + padding: const EdgeInsets.symmetric(horizontal: 8), + decoration: BoxDecoration(border: Border.all()), + child: SingleChildScrollView( + child: HtmlWithCachedImages( + // ignore: prefer_adjacent_string_concatenation + // data: '

Deskripsi

${task.description.content}' + + // '

Pertanyaan

${task.question.content}', + data: task.description.content + .replaceAll(Assets.sourceImg, Assets.urlImg), ), ), - Column( - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Text( - task.id, - style: const TextStyle(fontSize: 9), - ), - Text( - task.source, - style: const TextStyle(fontSize: 7), - ), - ], - ), - ], - ), - Container( - height: 2, - color: Colors.black, - ), - const SizedBox( - height: 3, - ), - Container( - height: MediaQuery.of(context).size.height - 340, - width: double.infinity, - padding: const EdgeInsets.symmetric(horizontal: 8), - decoration: BoxDecoration(border: Border.all()), - child: SingleChildScrollView( - child: HtmlWithCachedImages( - // ignore: prefer_adjacent_string_concatenation - // data: '

Deskripsi

${task.description.content}' + - // '

Pertanyaan

${task.question.content}', - data: task.description.content.replaceAll(Assets.sourceImg, Assets.urlImg), - ), ), - ), - const SizedBox( - height: 14, - ), - SizedBox( - width: 150, - child: Button( - text: 'JAWAB', - buttonType: ButtonType.primary, - onTap: onTap, + const SizedBox( + height: 14, ), - ), - ], - ) - ); + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + SizedBox( + width: 50, + child: Column( + children: [ + if (showPreviousButton) + Button( + innerHorizontalPadding: 4, + innerVerticalPadding: 8, + text: '<', + buttonType: ButtonType.primary, + onTap: () { + context + .read() + .toPreviousQuestion(); + }, + ), + ], + )), + Column( + children: [ + SizedBox( + width: 150, + child: Button( + innerHorizontalPadding: 4, + innerVerticalPadding: 8, + text: 'JAWAB', + buttonType: ButtonType.primary, + onTap: onTaskTap, + ), + ), + if (attempt.totalBlank == 0) + const SizedBox( + height: 12, + ), + if (attempt.totalBlank == 0) + SizedBox( + width: 150, + child: Button( + innerHorizontalPadding: 4, + innerVerticalPadding: 8, + text: 'FINISH', + buttonType: ButtonType.tertiary, + onTap: () { + context.read().finishExercise(); + }, + ), + ), + ], + ), + SizedBox( + width: 50, + child: Column( + children: [ + if (showNextButton) + Button( + innerHorizontalPadding: 4, + innerVerticalPadding: 8, + text: '>', + buttonType: ButtonType.primary, + onTap: () { + context + .read() + .toNextQuestion(); + }, + ), + ], + )), + ], + ), + ], + )); } } diff --git a/app/lib/features/quiz_exercise/presentation/repositories/quiz_exercise.dart b/app/lib/features/quiz_exercise/presentation/repositories/quiz_exercise.dart index 00a49152..1ad330cf 100644 --- a/app/lib/features/quiz_exercise/presentation/repositories/quiz_exercise.dart +++ b/app/lib/features/quiz_exercise/presentation/repositories/quiz_exercise.dart @@ -14,42 +14,19 @@ class QuizExerciseRepository { db.settings = FirebaseService.settings; } - Future> getListQuizExerciseByTaskIdList( - List taskIdList, - ) async { + Future> getListQuizExercise( + {List? taskIds}) async { final quizExerciseList = []; try { - final result = await db - .collection('task_set') - .where(FieldPath.documentId, whereIn: taskIdList) - .get(); - for (final element in result.docs) { - quizExerciseList.add(QuizExercise.fromJson(element.data())); - } - - return quizExerciseList; - } on FirebaseException catch (e) { - if (kDebugMode) { - print("Failed with error '${e.code}': '${e.message}'"); + if (taskIds == null) { + final globalResult = + await db.collection('configuration').doc('global_variables').get(); + final taskSet = globalResult.get('task_set_doc_index') as List; + taskIds = taskSet.map((e) => e['doc_id'] as String) as List; } - return quizExerciseList; - } catch (e) { - throw Exception(e.toString()); - } - } - Future> getListQuizExercise() async { - final quizExerciseList = []; - try { - final globalResult = - await db.collection('configuration').doc('global_variables').get(); - final taskSet = globalResult.get('task_set_doc_index') as List; - final taskIds = taskSet.map((e) => e['doc_id'] as String); - - final taskListResult = await db - .collection('task_set') - .where(FieldPath.documentId, whereIn: taskIds) - .get(); + final taskListResult = + await db.collection('task_set').where('id', whereIn: taskIds).get(); for (final element in taskListResult.docs) { quizExerciseList.add(QuizExercise.fromJson(element.data())); } @@ -73,7 +50,7 @@ class QuizExerciseRepository { final taskSet = globalResult.get('task_set_doc_$group') as List; for (final element in taskSet) { - quizExerciseBaseList + quizExerciseBaseList .add(QuizExerciseBase.fromJson(element as Map)); } @@ -88,16 +65,6 @@ class QuizExerciseRepository { } } - Future> getListQuizExerciseNew() async { - final quizExerciseBaseList = []; - try { - - return quizExerciseBaseList; - } catch (e) { - throw Exception(e.toString()); - } - } - Future getQuizExercise(String taskId) async { try { final result = @@ -131,8 +98,8 @@ class QuizExerciseRepository { } Future updateQuizExercise( - String taskId, - String? status, + String taskId, + String? status, ) async { try { // Update Status Task Set @@ -140,8 +107,8 @@ class QuizExerciseRepository { .collection('task_set') .doc(taskId) .update({ - 'status': status, - }); + 'status': status, + }); // Dapatkan referensi ke dokumen yang akan diperbarui final globalResult = FirebaseFirestore.instance @@ -172,10 +139,9 @@ class QuizExerciseRepository { // Update Status Configuration await globalResult.update({ 'task_set_doc_index': taskSet, - 'weeklyquiz_number' : weeklyQuizNumber + 'weeklyquiz_number': weeklyQuizNumber }); - - } catch (e) { + } catch (e) { throw Exception(e.toString()); } } diff --git a/app/lib/models/quiz_participation.dart b/app/lib/models/quiz_participation.dart index 25cc8fb1..511c8701 100644 --- a/app/lib/models/quiz_participation.dart +++ b/app/lib/models/quiz_participation.dart @@ -32,21 +32,26 @@ class WeeklyQuizParticipation extends Equatable { factory WeeklyQuizParticipation.fromJson( String id, Map json, - ) => - WeeklyQuizParticipation( - id: id, - quiz_start_at: json['quiz_start_at'] as String, - quiz_title: json['quiz_title'] as String, - user_name: json['user_name'] as String, - user_uid: json['user_uid'] as String, - challenge_group: json['challenge_group'] as String, - quiz_end_at: json['quiz_end_at'] as String, - quiz_id: json['quiz_id'] as String, - quiz_max_attempts: json['quiz_max_attempts'] as int, - attempts: (json['attempts'] as List) - .map((i) => QuizExerciseAttempt.fromJson(i as Map)) - .toList(), - ); + ) { + var attempts = json['attempts']; + return WeeklyQuizParticipation( + id: id, + quiz_start_at: json['quiz_start_at'] as String, + quiz_title: json['quiz_title'] as String, + user_name: json['user_name'] as String, + user_uid: json['user_uid'] as String, + challenge_group: json['challenge_group'] as String, + quiz_end_at: json['quiz_end_at'] as String, + quiz_id: json['quiz_id'] as String, + quiz_max_attempts: json['quiz_max_attempts'] as int, + attempts: attempts == null + ? [] + : (attempts as List) + .map((i) => + QuizExerciseAttempt.fromJson(i as Map)) + .toList(), + ); + } @override List get props => [ diff --git a/app/macos/Flutter/GeneratedPluginRegistrant.swift b/app/macos/Flutter/GeneratedPluginRegistrant.swift index 1ad35f2a..1e112358 100644 --- a/app/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/app/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,6 +12,7 @@ import firebase_messaging import firebase_storage import flutter_local_notifications import geolocator_apple +import google_sign_in_ios import path_provider_foundation import printing import shared_preferences_foundation @@ -26,6 +27,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseStoragePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseStoragePlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) + FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PrintingPlugin.register(with: registry.registrar(forPlugin: "PrintingPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) diff --git a/app/pubspec.lock b/app/pubspec.lock index 1dce1f7a..41c48f27 100644 --- a/app/pubspec.lock +++ b/app/pubspec.lock @@ -5,34 +5,34 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7" url: "https://pub.dev" source: hosted - version: "64.0.0" + version: "67.0.0" _flutterfire_internals: dependency: transitive description: name: _flutterfire_internals - sha256: "5dadadeecceac19d6a63c9d2e037bb8df58ddd4aedb94e8a056af2f39ee50f9d" + sha256: "53d06f578b8e988f60324f46fcd6ab919ccdc2dc8cbf0cd4161829b1dba7a62b" url: "https://pub.dev" source: hosted - version: "1.3.11" + version: "1.3.27" analyzer: dependency: transitive description: name: analyzer - sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.4.1" archive: dependency: transitive description: name: archive - sha256: "7e0d52067d05f2e0324268097ba723b71cb41ac8a6a2b24d1edf9c536b987b03" + sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" url: "https://pub.dev" source: hosted - version: "3.4.6" + version: "3.4.10" args: dependency: transitive description: @@ -61,10 +61,10 @@ packages: dependency: transitive description: name: barcode - sha256: "789f898eef0bd88312470bdb2cc996f895ad7dd5f89e9adde84b204546a90b45" + sha256: "91b143666f7bb13636f716b6d4e412e372ab15ff7969799af8c9e30a382e9385" url: "https://pub.dev" source: hosted - version: "2.2.4" + version: "2.2.6" bidi: dependency: transitive description: @@ -77,10 +77,10 @@ packages: dependency: transitive description: name: bloc - sha256: "3820f15f502372d979121de1f6b97bfcf1630ebff8fe1d52fb2b0bfa49be5b49" + sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" url: "https://pub.dev" source: hosted - version: "8.1.2" + version: "8.1.4" boolean_selector: dependency: transitive description: @@ -109,34 +109,34 @@ packages: dependency: transitive description: name: build_daemon - sha256: "5f02d73eb2ba16483e693f80bee4f088563a820e47d1027d4cdfe62b5bb43e65" + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" url: "https://pub.dev" source: hosted - version: "4.0.0" + version: "4.0.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "64e12b0521812d1684b1917bc80945625391cb9bdd4312536b1d69dcb6133ed8" + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "10c6bcdbf9d049a0b666702cf1cee4ddfdc38f02a19d35ae392863b47519848b" + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" url: "https://pub.dev" source: hosted - version: "2.4.6" + version: "2.4.9" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + sha256: "4ae8ffe5ac758da294ecf1802f2aff01558d8b1b00616aa7538ea9a8a5d50799" url: "https://pub.dev" source: hosted - version: "7.2.11" + version: "7.3.0" built_collection: dependency: transitive description: @@ -149,34 +149,34 @@ packages: dependency: transitive description: name: built_value - sha256: a8de5955205b4d1dbbbc267daddf2178bd737e4bab8987c04a500478c9651e74 + sha256: fedde275e0a6b798c3296963c5cd224e3e1b55d0e478d5b7e65e6b540f363a0e url: "https://pub.dev" source: hosted - version: "8.6.3" + version: "8.9.1" cached_network_image: dependency: "direct main" description: name: cached_network_image - sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613" + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257" + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" cached_network_svg_image: dependency: "direct main" description: @@ -213,10 +213,10 @@ packages: dependency: transitive description: name: cli_util - sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 url: "https://pub.dev" source: hosted - version: "0.4.0" + version: "0.4.1" clock: dependency: transitive description: @@ -229,34 +229,34 @@ packages: dependency: "direct main" description: name: cloud_firestore - sha256: "7dd7e9505e4e895c87e7bc0c4cf49a2c0b0255fae900ab7fcac3c5daa9f422d5" + sha256: ed89b3103dc35234dfb513af9e4f8f9fb0608e6e06cc93b77489e23f38a52f93 url: "https://pub.dev" source: hosted - version: "4.12.0" + version: "4.15.10" cloud_firestore_platform_interface: dependency: transitive description: name: cloud_firestore_platform_interface - sha256: f1a9436bc0d7f49e60df33b5eb872772733646d4f211516220a1f6006c8177f5 + sha256: "31c60ecb186c8356cca417e4151d6c383eb81c92933e3a0f3a9509688f5ec319" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "6.1.11" cloud_firestore_web: dependency: transitive description: name: cloud_firestore_web - sha256: "8df1e484d57f771242c2d8b3a534b921dfb0ba144a1cd441f23b1c7c4f33c3a1" + sha256: "9d952d3c8d5b87c34712537154ff7580bdc29b8b9fb3bf43002304999e585653" url: "https://pub.dev" source: hosted - version: "3.8.2" + version: "3.10.10" code_builder: dependency: transitive description: name: code_builder - sha256: "1be9be30396d7e4c0db42c35ea6ccd7cc6a1e19916b5dc64d6ac216b5544d677" + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 url: "https://pub.dev" source: hosted - version: "4.7.0" + version: "4.10.0" collection: dependency: transitive description: @@ -301,26 +301,26 @@ packages: dependency: transitive description: name: dart_style - sha256: abd7625e16f51f554ea244d090292945ec4d4be7bfbaf2ec8cccea568919d334 + sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.3.6" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" url: "https://pub.dev" source: hosted - version: "0.7.8" + version: "0.7.10" dio: dependency: "direct main" description: name: dio - sha256: "417e2a6f9d83ab396ec38ff4ea5da6c254da71e4db765ad737a42af6930140b7" + sha256: "0978e9a3e45305a80a7210dbeaf79d6ee8bee33f70c8e542dc654c952070217f" url: "https://pub.dev" source: hosted - version: "5.3.3" + version: "5.4.2+1" dropdown_search: dependency: "direct main" description: @@ -357,50 +357,50 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "6.1.4" + version: "7.0.0" firebase_auth: dependency: "direct main" description: name: firebase_auth - sha256: ee5e4f6e79483d1b39e2fe81cdef74f4c295c9865e150aefacd615eea96d3e7b + sha256: "376cdf5048e3552afa6e7883334a03450d332c68466759a63f5fcbe990feaecc" url: "https://pub.dev" source: hosted - version: "4.12.0" + version: "4.18.0" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: a664a8f1dbf73e6a56fd41364bcd0ad24f8d9d57428b365199dc795ee52b7d27 + sha256: "316c8dae2aaa5920aa752807a773f06d9b0da48efda2efbae14b93f0ee835ddd" url: "https://pub.dev" source: hosted - version: "7.0.2" + version: "7.2.0" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: "6a3c8c09c9ffcfea83ac4ce3d18d8b4c467c77d57713b2d786fd69ece5bb4a48" + sha256: "1859c548568fc5f979130c694222504cf255a4b3af5186d1b4d6e5772ae6d08f" url: "https://pub.dev" source: hosted - version: "5.8.5" + version: "5.10.1" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "7706f4ade6cc2698c70074083bc262586a185047f6bfdd53938dcc35d35cbb9e" + sha256: "4e8728edb3053ffcc194315cb0c10f4676947db793581409e36040065918c94f" url: "https://pub.dev" source: hosted - version: "2.21.0" + version: "2.27.2" firebase_core_platform_interface: dependency: transitive description: @@ -413,58 +413,58 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: "0631a2ec971dbc540275e2fa00c3a8a2676f0a7adbc3c197d6fba569db689d97" + sha256: "6afef1b46818eabdc6058df1148307f80e5653c0eaf26beeec693c89154752d4" url: "https://pub.dev" source: hosted - version: "2.8.1" + version: "2.13.0" firebase_messaging: dependency: "direct main" description: name: firebase_messaging - sha256: "53952a6f7860c44429bec80719c411e0ff77ce6cf31fade1515c7bdd87abe4a1" + sha256: fd3ae8fd4e1687cac1f5fd788c7f8e69bb1bbb2e3947cdc4c46f304e19ed2f07 url: "https://pub.dev" source: hosted - version: "14.7.3" + version: "14.7.21" firebase_messaging_platform_interface: dependency: transitive description: name: firebase_messaging_platform_interface - sha256: "543390d1c76aaf3fa563de223d1732a5def5a5efe31428e43a44e9a47efc5ed3" + sha256: df3c04f31f365cc78052c65678d3b437bfc644b29f63f9e533ba459a6606143a url: "https://pub.dev" source: hosted - version: "4.5.12" + version: "4.5.29" firebase_messaging_web: dependency: transitive description: name: firebase_messaging_web - sha256: ecfe4e851652dc5f40f1e42efcac0c2bc6bf5ef08faca936c94e1472c247d222 + sha256: b60252e4b77a66f3466190d2679b7144218199442c00e6ced45c2963484e9db0 url: "https://pub.dev" source: hosted - version: "3.5.12" + version: "3.7.1" firebase_storage: dependency: "direct main" description: name: firebase_storage - sha256: c00e907fe1a136a662c47d60faf971094a5441095438c065f66c2f39dff47a9a + sha256: a5702165e965141efc758542375d21c5ec1019d7107b8bae43614add6511abf4 url: "https://pub.dev" source: hosted - version: "11.4.0" + version: "11.6.11" firebase_storage_platform_interface: dependency: transitive description: name: firebase_storage_platform_interface - sha256: "387f903eb7cbe63e77197e73987c84201335c42250b7284580e3bac42ffd9dd4" + sha256: "657166ab179d3c88092c199381b1fa6d6d254a51627aeaebd87c32f989850038" url: "https://pub.dev" source: hosted - version: "5.0.0" + version: "5.1.14" firebase_storage_web: dependency: transitive description: name: firebase_storage_web - sha256: "6128bfd8e03418983d457b980bf4fcc73e1fc88f51d00b3e04db8376a41d3047" + sha256: "7bf66872f490c8c8bf61d8db89f1c6d96d5ed38ce988047d4840c90a145f0fc7" url: "https://pub.dev" source: hosted - version: "3.6.11" + version: "3.8.1" fixnum: dependency: transitive description: @@ -482,10 +482,10 @@ packages: dependency: "direct main" description: name: flutter_bloc - sha256: e74efb89ee6945bcbce74a5b3a5a3376b088e5f21f55c263fc38cbdc6237faae + sha256: f0ecf6e6eb955193ca60af2d5ca39565a86b8a142452c5b24d96fb477428f4d2 url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.1.5" flutter_cache_manager: dependency: transitive description: @@ -538,10 +538,10 @@ packages: dependency: "direct main" description: name: flutter_local_notifications - sha256: "501ed9d54f1c8c0535b7991bade36f9e7e3b45a2346401f03775c1ec7a3c06ae" + sha256: "401643a6ea9d8451365f2ec11145335bf130560cfde367bdf8f0be6d60f89479" url: "https://pub.dev" source: hosted - version: "15.1.2" + version: "15.1.3" flutter_local_notifications_linux: dependency: transitive description: @@ -596,18 +596,18 @@ packages: dependency: "direct main" description: name: font_awesome_flutter - sha256: "52671aea66da73b58d42ec6d0912b727a42248dd9a7c76d6c20f275783c48c08" + sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f" url: "https://pub.dev" source: hosted - version: "10.6.0" + version: "10.7.0" freezed: dependency: "direct dev" description: name: freezed - sha256: "21bf2825311de65501d22e563e3d7605dff57fb5e6da982db785ae5372ff018a" + sha256: "57247f692f35f068cae297549a46a9a097100685c6780fe67177503eea5ed4e5" url: "https://pub.dev" source: hosted - version: "2.4.5" + version: "2.4.7" freezed_annotation: dependency: "direct main" description: @@ -620,42 +620,42 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "4.0.0" geocoding: dependency: "direct main" description: name: geocoding - sha256: e1dc0ac56666d9ed1d5a9ae5543ce9eb5986db6209cc7600103487d09192059c + sha256: "790eea732b22a08dd36fc3761bcd29040461ac20ece4d165264a6c0b5338f115" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.2" geocoding_android: dependency: transitive description: name: geocoding_android - sha256: "609db1d71bc364dd9d0616f72a41c01e0c74f3a3807efb85e0d5a67e57baf50f" + sha256: "4e1539a136c6ab4c44963cfc631970ee499f706a03654fc1d446b2100caf7221" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "3.3.0" geocoding_ios: dependency: transitive description: name: geocoding_ios - sha256: c85495ce8fb34e4fbd2dd8fc5f79263d622d9f88c4af948c965daf6b27a7f3a1 + sha256: "8a39bfb650af55209c42e564036a550b32d029e0733af01dc66c5afea50388d3" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.3.0" geocoding_platform_interface: dependency: transitive description: name: geocoding_platform_interface - sha256: "8848605d307d844d89937cdb4b8ad7dfa880552078f310fa24d8a460f6dddab4" + sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.2.0" geolocator: dependency: "direct main" description: @@ -668,34 +668,34 @@ packages: dependency: transitive description: name: geolocator_android - sha256: "93906636752ea4d4e778afa981fdfe7409f545b3147046300df194330044d349" + sha256: f15d1536cd01b1399578f1da1eb5d566e7a718db6a3648f2c24d2e2f859f0692 url: "https://pub.dev" source: hosted - version: "4.3.1" + version: "4.5.4" geolocator_apple: dependency: transitive description: name: geolocator_apple - sha256: ab90ae811c42ec2f6021e01eca71df00dee6ff1e69d2c2dafd4daeb0b793f73d + sha256: bc2aca02423ad429cb0556121f56e60360a2b7d694c8570301d06ea0c00732fd url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.7" geolocator_platform_interface: dependency: transitive description: name: geolocator_platform_interface - sha256: b7aca62aa05d7e610c396a53a1936ff87fce2f735d76e93fde9269c341c46a25 + sha256: "009a21c4bc2761e58dccf07c24f219adaebe0ff707abdfd40b0a763d4003fab9" url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.2.2" geolocator_web: dependency: transitive description: name: geolocator_web - sha256: "59083f7e0871b78299918d92bf930a14377f711d2d1156c558cd5ebae6c20d58" + sha256: "102e7da05b48ca6bf0a5bda0010f886b171d1a08059f01bfe02addd0175ebece" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.2.1" geolocator_windows: dependency: transitive description: @@ -708,10 +708,10 @@ packages: dependency: "direct main" description: name: get_it - sha256: f79870884de16d689cf9a7d15eedf31ed61d750e813c538a6efb92660fea83c3 + sha256: e6017ce7fdeaf218dc51a100344d8cb70134b80e28b760f8bb23c242437bafd7 url: "https://pub.dev" source: hosted - version: "7.6.4" + version: "7.6.7" glob: dependency: transitive description: @@ -740,50 +740,50 @@ packages: dependency: transitive description: name: google_identity_services_web - sha256: "000b7a31e1fa17ee04b6c0553a2b2ea18f9f9352e4dcc0c9fcc785cf10f2484e" + sha256: "9482364c9f8b7bd36902572ebc3a7c2b5c8ee57a9c93e6eb5099c1a9ec5265d8" url: "https://pub.dev" source: hosted - version: "0.2.2" + version: "0.3.1+1" google_sign_in: dependency: "direct main" description: name: google_sign_in - sha256: f45038d27bcad37498f282295ae97eece23c9349fc16649154067b87b9f1fd03 + sha256: "0b8787cb9c1a68ad398e8010e8c8766bfa33556d2ab97c439fb4137756d7308f" url: "https://pub.dev" source: hosted - version: "6.1.5" + version: "6.2.1" google_sign_in_android: dependency: transitive description: name: google_sign_in_android - sha256: "6031f59074a337fdd81be821aba84cee3a41338c6e958499a5cd34d3e1db80ef" + sha256: "38cef11ed22fc0c9bfa7b00bf7f2d91012138f5613089522917fd26c853be93e" url: "https://pub.dev" source: hosted - version: "6.1.20" + version: "6.1.22" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: "8edfde9698b5951f3d02632eceb39cc283865c3cff0b03216bf951089f10345b" + sha256: "1e0d4fde6cc07a8ff423f6bc931e83a74163d6af702004bacaee752649fdd2e7" url: "https://pub.dev" source: hosted - version: "5.6.3" + version: "5.7.5" google_sign_in_platform_interface: dependency: transitive description: name: google_sign_in_platform_interface - sha256: "35ceee5f0eadc1c07b0b4af7553246e315c901facbb7d3dadf734ba2693ceec4" + sha256: "1f6e5787d7a120cc0359ddf315c92309069171306242e181c09472d1b00a2971" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.5" google_sign_in_web: dependency: transitive description: name: google_sign_in_web - sha256: "939e9172a378ec4eaeb7f71eeddac9b55ebd0e8546d336daec476a68e5279766" + sha256: fc0f14ed45ea616a6cfb4d1c7534c2221b7092cc4f29a709f0c3053cc3e821bd url: "https://pub.dev" source: hosted - version: "0.12.0+5" + version: "0.12.4" graphs: dependency: transitive description: @@ -828,26 +828,26 @@ packages: dependency: transitive description: name: image - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "4.1.7" injectable: dependency: "direct main" description: name: injectable - sha256: cd3c422e13270c81f64ab73c80406b2b2ed563fe59d0ff2093eb7eee63d0bbeb + sha256: "3d98967224a5fdd4094a61bf53ed9616c3fbcf3e090bf83e7cb7d436d0c20041" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" injectable_generator: dependency: "direct dev" description: name: injectable_generator - sha256: f9d3c05f0938403f79ad6c6d23ec8e37a7a05ad980b1bf9399493f3e41845788 + sha256: "2ca3ada337eac0ef6b82f8049c970ddb63947738fdf32ac6cbef8d1567d7ba05" url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.6.1" intl: dependency: "direct main" description: @@ -972,10 +972,10 @@ packages: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" nested: dependency: transitive description: @@ -1028,26 +1028,26 @@ packages: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -1060,10 +1060,10 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: @@ -1076,82 +1076,98 @@ packages: dependency: transitive description: name: pdf - sha256: aa8835fcb9cfaf57ab2f1970e8548ceed3d0cb53eda7da906648f8153eaf37c9 + sha256: "243f05342fc0bdf140eba5b069398985cdbdd3dbb1d776cf43d5ea29cc570ba6" + url: "https://pub.dev" + source: hosted + version: "3.10.8" + pdf_widget_wrapper: + dependency: transitive + description: + name: pdf_widget_wrapper + sha256: "9c3ca36e5000c9682d52bbdc486867ba7c5ee4403d1a5d6d03ed72157753377b" url: "https://pub.dev" source: hosted - version: "3.10.6" + version: "1.0.3" permission_handler: dependency: "direct main" description: name: permission_handler - sha256: "284a66179cabdf942f838543e10413246f06424d960c92ba95c84439154fcac8" + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" url: "https://pub.dev" source: hosted - version: "11.0.1" + version: "11.3.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: f9fddd3b46109bd69ff3f9efa5006d2d309b7aec0f3c1c5637a60a2d5659e76e + sha256: "1acac6bae58144b442f11e66621c062aead9c99841093c38f5bcdcc24c1c3474" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "12.0.5" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + url: "https://pub.dev" + source: hosted + version: "9.4.4" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" url: "https://pub.dev" source: hosted - version: "9.1.4" + version: "0.1.1" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + sha256: "48d4fcf201a1dad93ee869ab0d4101d084f49136ec82a8a06ed9cfeacab9fd20" url: "https://pub.dev" source: hosted - version: "3.12.0" + version: "4.2.1" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" url: "https://pub.dev" source: hosted - version: "0.1.3" + version: "0.2.1" petitparser: dependency: transitive description: name: petitparser - sha256: cb3798bef7fc021ac45b308f4b51208a152792445cce0448c9a4ba5879dd8750 + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 url: "https://pub.dev" source: hosted - version: "5.4.0" + version: "6.0.2" platform: dependency: transitive description: name: platform - sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.6" + version: "2.1.8" pointycastle: dependency: transitive description: name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" url: "https://pub.dev" source: hosted - version: "3.7.3" + version: "3.7.4" pool: dependency: transitive description: @@ -1164,26 +1180,18 @@ packages: dependency: "direct main" description: name: printing - sha256: ad39a42a5f83125952457dfd94f395c8cf0eb1f7759583dadb769be5c7f99d24 + sha256: "1c99cab90ebcc1fff65831d264627d5b529359d563e53f33ab9b8117f2d280bc" url: "https://pub.dev" source: hosted - version: "5.11.1" - process: - dependency: transitive - description: - name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" - source: hosted - version: "4.2.4" + version: "5.12.0" provider: dependency: transitive description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.0.5" + version: "6.1.2" pub_semver: dependency: transitive description: @@ -1208,14 +1216,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" - quiver: - dependency: transitive - description: - name: quiver - sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47 - url: "https://pub.dev" - source: hosted - version: "3.2.1" recase: dependency: transitive description: @@ -1252,10 +1252,10 @@ packages: dependency: transitive description: name: shared_preferences_foundation - sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.3.5" shared_preferences_linux: dependency: transitive description: @@ -1268,18 +1268,18 @@ packages: dependency: transitive description: name: shared_preferences_platform_interface - sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: d762709c2bbe80626ecc819143013cc820fa49ca5e363620ee20a8b15a3e3daf + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" shared_preferences_windows: dependency: transitive description: @@ -1321,10 +1321,10 @@ packages: dependency: transitive description: name: source_gen - sha256: fc0da689e5302edb6177fdd964efcb7f58912f43c28c2047a808f5bfff643d16 + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.5.0" source_helper: dependency: transitive description: @@ -1341,22 +1341,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" sqflite: dependency: transitive description: name: sqflite - sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" + sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.2" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bb4738f15b23352822f4c42a531677e5c6f522e079461fd240ead29d8d8a54a6 + sha256: "3da423ce7baf868be70e2c0976c28a1bb2f73644268b7ffa7d2e08eab71f16a4" url: "https://pub.dev" source: hosted - version: "2.5.0+2" + version: "2.5.4" stack_trace: dependency: transitive description: @@ -1393,10 +1401,10 @@ packages: dependency: transitive description: name: synchronized - sha256: "5fcbd27688af6082f5abd611af56ee575342c30e87541d0245f7ff99faa02c60" + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.0+1" term_glyph: dependency: transitive description: @@ -1441,34 +1449,34 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.5" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.3.0" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "4ac97281cf60e2e8c5cc703b2b28528f9b50c8f7cebc71df6bdf0845f647268a" + sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.2.5" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" url_launcher_macos: dependency: transitive description: @@ -1481,58 +1489,58 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "7fd2f55fe86cea2897b963e864dc01a7eb0719ecc65fcef4c1cc3d686d718bb2" + sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" uuid: dependency: transitive description: name: uuid - sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 url: "https://pub.dev" source: hosted - version: "3.0.7" + version: "4.3.3" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33 url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.10+1" vector_math: dependency: transitive description: @@ -1565,38 +1573,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + sha256: "1d8e795e2a8b3730c41b8a98a2dff2e0fb57ae6f0764a1c46ec5915387d257b2" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.4" win32: dependency: transitive description: name: win32 - sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3" + sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a" url: "https://pub.dev" source: hosted - version: "5.0.9" + version: "5.4.0" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "0.2.0+3" + version: "1.0.4" xml: dependency: transitive description: name: xml - sha256: "5bc72e1e45e941d825fd7468b9b4cc3b9327942649aeb6fc5cdbf135f0a86e84" + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 url: "https://pub.dev" source: hosted - version: "6.3.0" + version: "6.5.0" yaml: dependency: transitive description: @@ -1606,5 +1622,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=3.2.0-0 <4.0.0" - flutter: ">=3.13.0" + dart: ">=3.3.0 <4.0.0" + flutter: ">=3.19.0"