From 14cd51c65bf1331d6a0f0f47f2248c86210c35df Mon Sep 17 00:00:00 2001 From: akhdanre Date: Thu, 1 May 2025 20:22:20 +0700 Subject: [PATCH] feat: working on the history binding --- lib/core/endpoint/api_endpoint.dart | 2 + lib/data/models/history/quiz_history.dart | 42 +++++++++++++++++ lib/data/services/answer_service.dart | 0 lib/data/services/history_service.dart | 31 +++++++++++++ .../history/binding/history_binding.dart | 5 ++- .../controller/history_controller.dart | 45 +++++-------------- lib/feature/history/view/history_view.dart | 7 +-- .../controller/quiz_play_controller.dart | 1 + 8 files changed, 95 insertions(+), 38 deletions(-) create mode 100644 lib/data/models/history/quiz_history.dart create mode 100644 lib/data/services/answer_service.dart create mode 100644 lib/data/services/history_service.dart diff --git a/lib/core/endpoint/api_endpoint.dart b/lib/core/endpoint/api_endpoint.dart index 92f5238..8416918 100644 --- a/lib/core/endpoint/api_endpoint.dart +++ b/lib/core/endpoint/api_endpoint.dart @@ -8,4 +8,6 @@ class APIEndpoint { static const String quiz = "/quiz"; static const String userQuiz = "/quiz/user"; + + static const String historyQuiz = "/history"; } diff --git a/lib/data/models/history/quiz_history.dart b/lib/data/models/history/quiz_history.dart new file mode 100644 index 0000000..5a73af1 --- /dev/null +++ b/lib/data/models/history/quiz_history.dart @@ -0,0 +1,42 @@ +class QuizHistory { + final String quizId; + final String answerId; + final String title; + final String description; + final int totalCorrect; + final int totalQuestion; + final String date; + + QuizHistory({ + required this.quizId, + required this.answerId, + required this.title, + required this.description, + required this.totalCorrect, + required this.totalQuestion, + required this.date, + }); + + factory QuizHistory.fromJson(Map json) { + return QuizHistory( + quizId: json['quiz_id'], + answerId: json['answer_id'], + title: json['title'], + description: json['description'], + totalCorrect: json['total_correct'], + totalQuestion: json['total_question'], + date: json["date"]); + } + + Map toJson() { + return { + 'quiz_id': quizId, + 'answer_id': answerId, + 'title': title, + 'description': description, + 'total_correct': totalCorrect, + 'total_question': totalQuestion, + 'date': date + }; + } +} diff --git a/lib/data/services/answer_service.dart b/lib/data/services/answer_service.dart new file mode 100644 index 0000000..e69de29 diff --git a/lib/data/services/history_service.dart b/lib/data/services/history_service.dart new file mode 100644 index 0000000..1bfe06c --- /dev/null +++ b/lib/data/services/history_service.dart @@ -0,0 +1,31 @@ +import 'package:dio/dio.dart'; +import 'package:get/get.dart'; +import 'package:quiz_app/core/endpoint/api_endpoint.dart'; +import 'package:quiz_app/core/utils/logger.dart'; +import 'package:quiz_app/data/models/base/base_model.dart'; +import 'package:quiz_app/data/models/history/quiz_history.dart'; +import 'package:quiz_app/data/providers/dio_client.dart'; + +class HistoryService extends GetxService { + late final Dio _dio; + + @override + void onInit() { + _dio = Get.find().dio; + super.onInit(); + } + + Future?> getHistory(String userId) async { + try { + final result = await _dio.get("${APIEndpoint.historyQuiz}/$userId"); + + final parsedResponse = BaseResponseModel>.fromJson( + result.data, + (data) => (data as List).map((e) => QuizHistory.fromJson(e as Map)).toList(), + ); + return parsedResponse.data; + } catch (e, stacktrace) { + logC.e(e, stackTrace: stacktrace); + } + } +} diff --git a/lib/feature/history/binding/history_binding.dart b/lib/feature/history/binding/history_binding.dart index e9a4706..725ec3c 100644 --- a/lib/feature/history/binding/history_binding.dart +++ b/lib/feature/history/binding/history_binding.dart @@ -1,9 +1,12 @@ import 'package:get/get.dart'; +import 'package:quiz_app/data/controllers/user_controller.dart'; +import 'package:quiz_app/data/services/history_service.dart'; import 'package:quiz_app/feature/history/controller/history_controller.dart'; class HistoryBinding extends Bindings { @override void dependencies() { - Get.lazyPut(() => HistoryController()); + Get.lazyPut(() => HistoryService()); + Get.lazyPut(() => HistoryController(Get.find(), Get.find())); } } diff --git a/lib/feature/history/controller/history_controller.dart b/lib/feature/history/controller/history_controller.dart index 8c79610..44a2f5d 100644 --- a/lib/feature/history/controller/history_controller.dart +++ b/lib/feature/history/controller/history_controller.dart @@ -1,23 +1,15 @@ import 'package:get/get.dart'; - -class HistoryItem { - final String title; - final String date; - final int score; - final int totalQuestions; - final String duration; - - HistoryItem({ - required this.title, - required this.date, - required this.score, - required this.totalQuestions, - required this.duration, - }); -} +import 'package:quiz_app/data/controllers/user_controller.dart'; +import 'package:quiz_app/data/models/history/quiz_history.dart'; +import 'package:quiz_app/data/services/history_service.dart'; class HistoryController extends GetxController { - final historyList = [].obs; + HistoryService _historyService; + UserController _userController; + + HistoryController(this._historyService, this._userController); + + final historyList = [].obs; @override void onInit() { @@ -25,22 +17,7 @@ class HistoryController extends GetxController { loadDummyHistory(); } - void loadDummyHistory() { - historyList.value = [ - HistoryItem( - title: "Fisika Dasar", - date: "24 April 2025", - score: 8, - totalQuestions: 10, - duration: "5m 21s", - ), - HistoryItem( - title: "Sejarah Indonesia", - date: "22 April 2025", - score: 7, - totalQuestions: 10, - duration: "4m 35s", - ), - ]; + void loadDummyHistory() async { + historyList.value = await _historyService.getHistory(_userController.userData!.id) ?? []; } } diff --git a/lib/feature/history/view/history_view.dart b/lib/feature/history/view/history_view.dart index d475e22..7bded36 100644 --- a/lib/feature/history/view/history_view.dart +++ b/lib/feature/history/view/history_view.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:quiz_app/data/models/history/quiz_history.dart'; import 'package:quiz_app/feature/history/controller/history_controller.dart'; class HistoryView extends GetView { @@ -60,7 +61,7 @@ class HistoryView extends GetView { ); } - Widget _buildHistoryCard(HistoryItem item) { + Widget _buildHistoryCard(QuizHistory item) { return Container( margin: const EdgeInsets.only(bottom: 16), padding: const EdgeInsets.all(16), @@ -106,14 +107,14 @@ class HistoryView extends GetView { const Icon(Icons.check_circle, size: 14, color: Colors.green), const SizedBox(width: 4), Text( - "Skor: ${item.score}/${item.totalQuestions}", + "Skor: ${item.totalCorrect}/${item.totalQuestion}", style: const TextStyle(fontSize: 12), ), const SizedBox(width: 16), const Icon(Icons.timer, size: 14, color: Colors.grey), const SizedBox(width: 4), Text( - item.duration, + "3 menit", style: const TextStyle(fontSize: 12), ), ], diff --git a/lib/feature/quiz_play/controller/quiz_play_controller.dart b/lib/feature/quiz_play/controller/quiz_play_controller.dart index 130f08c..9e28bf6 100644 --- a/lib/feature/quiz_play/controller/quiz_play_controller.dart +++ b/lib/feature/quiz_play/controller/quiz_play_controller.dart @@ -136,6 +136,7 @@ class QuizPlayController extends GetxController { void _finishQuiz() async { _timer?.cancel(); + AppDialog.showMessage(Get.context!, "Yeay semua soal selesai"); await Future.delayed(Duration(seconds: 2)); Get.offAllNamed(