From 15e4a9295cafdbb38445ac961bb10b720d04cf3e Mon Sep 17 00:00:00 2001 From: akhdanre Date: Mon, 19 May 2025 02:09:30 +0700 Subject: [PATCH] fix: navigation on the quiz multiplayer and the result page --- .../controller/admin_result_controller.dart | 7 +- .../detail_participant_result_controller.dart | 20 ++++- .../view/detail_participant_result_page.dart | 88 ++++++++++++------- .../monitor_quiz/view/monitor_quiz_view.dart | 69 ++++++++------- .../controller/play_quiz_controller.dart | 14 ++- .../view/play_quiz_multiplayer.dart | 30 +++---- 6 files changed, 142 insertions(+), 86 deletions(-) diff --git a/lib/feature/admin_result_page/controller/admin_result_controller.dart b/lib/feature/admin_result_page/controller/admin_result_controller.dart index 3b24dcc..c309f68 100644 --- a/lib/feature/admin_result_page/controller/admin_result_controller.dart +++ b/lib/feature/admin_result_page/controller/admin_result_controller.dart @@ -35,6 +35,11 @@ class AdminResultController extends GetxController { void goToDetailParticipants(String userId, String username) => Get.toNamed( AppRoutes.quizMPLResultPage, - arguments: {"user_id": userId, "session_id": sessionId, "username": username}, + arguments: { + "user_id": userId, + "session_id": sessionId, + "username": username, + "is_admin": true, + }, ); } diff --git a/lib/feature/admin_result_page/controller/detail_participant_result_controller.dart b/lib/feature/admin_result_page/controller/detail_participant_result_controller.dart index a159013..6f11dd6 100644 --- a/lib/feature/admin_result_page/controller/detail_participant_result_controller.dart +++ b/lib/feature/admin_result_page/controller/detail_participant_result_controller.dart @@ -1,5 +1,5 @@ -import 'dart:convert'; import 'package:get/get.dart'; +import 'package:quiz_app/app/routes/app_pages.dart'; import 'package:quiz_app/data/models/history/participant_history_result.dart'; import 'package:quiz_app/data/services/answer_service.dart'; @@ -12,6 +12,7 @@ class ParticipantResultController extends GetxController { final RxBool isLoading = false.obs; RxString participantName = "".obs; + bool isAdmin = false; @override void onInit() { @@ -24,6 +25,7 @@ class ParticipantResultController extends GetxController { final args = Get.arguments; participantName.value = args["username"]; + isAdmin = args["is_admin"]; final response = await _answerService.getAnswerSession(args["session_id"], args["user_id"]); if (response != null) { @@ -44,4 +46,20 @@ class ParticipantResultController extends GetxController { int getTotalQuestions() { return participantResult.value?.totalQuestions ?? 0; } + + void goBackPage() { + if (isAdmin) { + Get.back(); + } else { + Get.offAllNamed(AppRoutes.mainPage); + } + } + + void onPop(bool isPop, dynamic value) { + if (isAdmin) { + Get.back(); + } else { + Get.offAllNamed(AppRoutes.mainPage); + } + } } diff --git a/lib/feature/admin_result_page/view/detail_participant_result_page.dart b/lib/feature/admin_result_page/view/detail_participant_result_page.dart index 4ba5b66..0534908 100644 --- a/lib/feature/admin_result_page/view/detail_participant_result_page.dart +++ b/lib/feature/admin_result_page/view/detail_participant_result_page.dart @@ -12,43 +12,63 @@ class ParticipantDetailPage extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.background, - appBar: AppBar( - title: const Text('Detail Peserta'), - backgroundColor: Colors.white, - foregroundColor: AppColors.darkText, - elevation: 0, - leading: IconButton( - icon: const Icon(LucideIcons.arrowLeft), - onPressed: () => Get.back(), - ), - ), - body: Obx(() { - if (controller.isLoading.value) { - return const Center(child: CircularProgressIndicator()); - } + return PopScope( + canPop: false, + onPopInvokedWithResult: controller.onPop, + child: Scaffold( + backgroundColor: AppColors.background, + body: Obx(() { + if (controller.isLoading.value) { + return const Center(child: CircularProgressIndicator()); + } - final participant = controller.participantResult.value; - if (participant == null) { - return const Center(child: Text('Data peserta tidak tersedia.')); - } + final participant = controller.participantResult.value; + if (participant == null) { + return const Center(child: Text('Data peserta tidak tersedia.')); + } - return Column( - children: [ - _buildParticipantHeader(participant), - Expanded( - child: ListView.builder( - padding: const EdgeInsets.all(16), - itemCount: participant.answers.length, - itemBuilder: (context, index) { - return _buildAnswerCard(participant.answers[index], index + 1); - }, - ), + return SafeArea( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), + color: Colors.white, + child: Row( + children: [ + IconButton( + icon: const Icon(LucideIcons.arrowLeft), + color: AppColors.darkText, + onPressed: controller.goBackPage, + ), + const SizedBox(width: 8), + const Text( + 'Detail Peserta', + style: TextStyle( + color: AppColors.darkText, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + // Body Content + _buildParticipantHeader(participant), + Expanded( + child: ListView.builder( + padding: const EdgeInsets.all(16), + itemCount: participant.answers.length, + itemBuilder: (context, index) { + return _buildAnswerCard(participant.answers[index], index + 1); + }, + ), + ), + ], ), - ], - ); - }), + ); + }), + ), ); } diff --git a/lib/feature/monitor_quiz/view/monitor_quiz_view.dart b/lib/feature/monitor_quiz/view/monitor_quiz_view.dart index 57c7788..6ebccb9 100644 --- a/lib/feature/monitor_quiz/view/monitor_quiz_view.dart +++ b/lib/feature/monitor_quiz/view/monitor_quiz_view.dart @@ -11,42 +11,45 @@ class MonitorQuizView extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.background, - body: SafeArea( - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildSectionHeader("Monitor Admin"), - Obx(() => _buildCurrentQuestion( - questionText: controller.currentQuestion.value, - )), - const SizedBox(height: 24), - _buildSectionHeader('Daftar Peserta'), - const SizedBox(height: 16), - Expanded( - child: Obx( - () => ListView.separated( - itemCount: controller.participan.length, - separatorBuilder: (context, index) => const SizedBox(height: 12), - itemBuilder: (context, index) { - final student = controller.participan[index]; - final totalAnswers = student.correct.value + student.wrong.value; - final progressPercent = totalAnswers > 0 ? student.correct.value / totalAnswers : 0.0; + return PopScope( + canPop: false, + child: Scaffold( + backgroundColor: AppColors.background, + body: SafeArea( + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildSectionHeader("Monitor Admin"), + Obx(() => _buildCurrentQuestion( + questionText: controller.currentQuestion.value, + )), + const SizedBox(height: 24), + _buildSectionHeader('Daftar Peserta'), + const SizedBox(height: 16), + Expanded( + child: Obx( + () => ListView.separated( + itemCount: controller.participan.length, + separatorBuilder: (context, index) => const SizedBox(height: 12), + itemBuilder: (context, index) { + final student = controller.participan[index]; + final totalAnswers = student.correct.value + student.wrong.value; + final progressPercent = totalAnswers > 0 ? student.correct.value / totalAnswers : 0.0; - return _buildStudentCard( - name: student.name, - totalBenar: student.correct.value, - totalSalah: student.wrong.value, - progressPercent: progressPercent, - ); - }, + return _buildStudentCard( + name: student.name, + totalBenar: student.correct.value, + totalSalah: student.wrong.value, + progressPercent: progressPercent, + ); + }, + ), ), ), - ), - ], + ], + ), ), ), ), diff --git a/lib/feature/play_quiz_multiplayer/controller/play_quiz_controller.dart b/lib/feature/play_quiz_multiplayer/controller/play_quiz_controller.dart index f7f7ba3..083973b 100644 --- a/lib/feature/play_quiz_multiplayer/controller/play_quiz_controller.dart +++ b/lib/feature/play_quiz_multiplayer/controller/play_quiz_controller.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:quiz_app/app/routes/app_pages.dart'; import 'package:quiz_app/component/global_button.dart'; import 'package:quiz_app/data/controllers/user_controller.dart'; import 'package:quiz_app/data/services/socket_service.dart'; @@ -129,10 +130,19 @@ class PlayQuizMultiplayerController extends GetxController { } } + void goToDetailResult() { + Get.offAllNamed(AppRoutes.quizMPLResultPage, arguments: { + "user_id": _userController.userData!.id, + "session_id": sessionId, + "username": _userController.userName.value, + "is_admin": false, + }); + } + @override void onClose() { fillInAnswerController.dispose(); - _cancelTimer(); // Important: cancel timer when controller is closed + _cancelTimer(); super.onClose(); } } @@ -140,7 +150,7 @@ class PlayQuizMultiplayerController extends GetxController { class MultiplayerQuestionModel { final int questionIndex; final String question; - final String type; // 'option', 'true_false', 'fill_in_the_blank' + final String type; final int duration; final List? options; diff --git a/lib/feature/play_quiz_multiplayer/view/play_quiz_multiplayer.dart b/lib/feature/play_quiz_multiplayer/view/play_quiz_multiplayer.dart index afc32f9..6981b05 100644 --- a/lib/feature/play_quiz_multiplayer/view/play_quiz_multiplayer.dart +++ b/lib/feature/play_quiz_multiplayer/view/play_quiz_multiplayer.dart @@ -7,19 +7,22 @@ import 'package:quiz_app/feature/play_quiz_multiplayer/controller/play_quiz_cont class PlayQuizMultiplayerView extends GetView { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: const Color(0xFFF9FAFB), - body: Obx(() { - if (controller.isDone.value) { - return _buildDoneView(); - } + return PopScope( + canPop: false, + child: Scaffold( + backgroundColor: const Color(0xFFF9FAFB), + body: Obx(() { + if (controller.isDone.value) { + return _buildDoneView(); + } - if (controller.currentQuestion.value == null) { - return const Center(child: CircularProgressIndicator()); - } + if (controller.currentQuestion.value == null) { + return const Center(child: CircularProgressIndicator()); + } - return _buildQuestionView(); - }), + return _buildQuestionView(); + }), + ), ); } @@ -245,10 +248,7 @@ class PlayQuizMultiplayerView extends GetView { ), const SizedBox(height: 40), ElevatedButton( - onPressed: () { - // Arahkan ke halaman hasil atau leaderboard - Get.back(); - }, + onPressed: controller.goToDetailResult, style: ElevatedButton.styleFrom( backgroundColor: const Color(0xFF2563EB), foregroundColor: Colors.white,