Untitled

 avatar
unknown
plain_text
a month ago
2.1 kB
4
Indexable
Future<bool> startQuiz(String quizType) async {
  isLoading.value = true;

  // Load quizzes jika belum tersedia
  if (quizzes.isEmpty) {
    debugPrint('Quizzes not loaded yet, loading now…');
    await loadQuizzes();
  }

  // Ambil quiz berdasarkan category
  final quiz = getQuizByCategory(category);

  if (quiz == null) {
    debugPrint('Quiz not found for category: $category');

    debugPrint(
      'Available quizzes: '
      '${quizzes.map((q) => q.category).join(", ")}',
    );

    throw Exception('Kuis $category tidak ditemukan');
  }

  // Cek apakah quiz sudah pernah diselesaikan
  final completed = await isQuizCompleted(quiz.idQuiz);

  if (completed) {
    final quizCategory =
        CooldownHelper.parseCategory(quiz.category);

    final nextLabel =
        CooldownHelper.getNextAvailableLabel(quizCategory) ??
        'Coba lagi nanti';

    Get.snackbar(
      CooldownHelper.getLimitSnackbarTitle(quizCategory),
      nextLabel,
      snackPosition: SnackPosition.BOTTOM,
      backgroundColor: Colors.orange,
      colorText: Colors.white,
      duration: const Duration(seconds: 4),
    );

    return false;
  }

  debugPrint(
    'Loading quiz with questions for ID: ${quiz.idQuiz}',
  );

  // Ambil token autentikasi
  final token = await _authController.getToken();

  // Fetch detail quiz beserta pertanyaan
  final fullQuiz = await Quiz.fetchQuizById(
    quiz.idQuiz,
    token: token,
  );

  currentQuiz.value = fullQuiz;

  final questions = fullQuiz.questions ?? [];

  // Validasi apakah quiz memiliki pertanyaan
  if (questions.isEmpty) {
    throw Exception('Tidak ada pertanyaan untuk kuis ini');
  }

  // Urutkan pertanyaan berdasarkan order
  questions.sort(
    (a, b) => a.order.compareTo(b.order),
  );

  debugPrint('Loaded ${questions.length} questions');

  // Inisialisasi state quiz
  currentQuestions.value = questions;
  currentQuestionIndex.value = 0;

  userAnswers.value = List.filled(
    questions.length,
    null,
  );

  totalScore.value = 0;

  return true;
}
Editor is loading...
Leave a Comment