MIF_E31222846/lib/views/siswa/tugas/controllers/tugas_controller.dart

149 lines
5.5 KiB
Dart

import 'dart:convert';
import 'dart:developer';
import 'package:get/get.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:ui/constans/api_constans.dart';
import 'package:ui/models/tugas_model.dart';
import 'package:http/http.dart' as http;
import 'package:ui/widgets/my_snackbar.dart';
class TugasController extends GetxController {
TugasModel? tugasM;
var isLoading = false.obs;
Future<void> getTugas({required id, required type}) async {
final prefs = await SharedPreferences.getInstance();
final token = prefs.getString('token');
if (token == null) {
throw Exception("Token not found");
}
final headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer $token',
};
try {
isLoading(true);
final url = "${ApiConstants.tugasEnpoint}?id_matpel=$id&type_tugas=$type";
log("Requesting tugas URL: $url");
log("Parameters - id_matpel: $id, type_tugas: $type");
final response = await http.get(
Uri.parse(url),
headers: headers,
);
log("Response status: ${response.statusCode}");
log("Response body: ${response.body}");
if (response.statusCode == 200) {
final json = jsonDecode(response.body);
log("Parsed JSON: $json");
// Cek apakah response adalah object atau array
if (json is Map<String, dynamic>) {
// Format response dengan status dan message
log("Response is Map<String, dynamic>");
log("Keys in response: ${json.keys.toList()}");
if (json['status'] == true) {
try {
// Log struktur data sebelum parsing
if (json['data'] != null) {
log("Data field type: ${json['data'].runtimeType}");
if (json['data'] is List) {
log("Data list length: ${json['data'].length}");
if (json['data'].isNotEmpty) {
log("First data item type: ${json['data'][0].runtimeType}");
log("First data item: ${json['data'][0]}");
// Log detail submit_tugas
var firstItem = json['data'][0];
if (firstItem['submit_tugas'] != null) {
log("submit_tugas type: ${firstItem['submit_tugas'].runtimeType}");
log("submit_tugas value: ${firstItem['submit_tugas']}");
if (firstItem['submit_tugas'] is List) {
log("submit_tugas list length: ${firstItem['submit_tugas'].length}");
if (firstItem['submit_tugas'].isNotEmpty) {
log("First submit_tugas item: ${firstItem['submit_tugas'][0]}");
}
}
}
}
}
}
tugasM = TugasModel.fromJson(json);
log("Tugas model created successfully");
log("Data length: ${tugasM?.data.length ?? 0}");
// Log deskripsi untuk setiap tugas
if (tugasM?.data.isNotEmpty == true) {
for (int i = 0; i < tugasM!.data.length; i++) {
var tugas = tugasM!.data[i];
log("Tugas ${i + 1} - ID: ${tugas.id}, Nama: ${tugas.nama}");
log("Tugas ${i + 1} - Deskripsi: ${tugas.deskripsi ?? 'null'}");
}
}
} catch (parseError) {
log("Error parsing TugasModel: $parseError");
log("JSON structure: $json");
snackbarfailed("Gagal memparse data tugas: $parseError");
}
} else {
log("API returned false status: ${json['message']}");
snackbarfailed("Gagal memuat data tugas: ${json['message']}");
}
} else if (json is List) {
// Format response langsung array
log("Response is List");
log("List length: ${json.length}");
if (json.isNotEmpty) {
log("First item type: ${json[0].runtimeType}");
log("First item: ${json[0]}");
}
try {
// Validasi bahwa setiap item dalam array adalah Map
for (int i = 0; i < json.length; i++) {
if (json[i] is! Map<String, dynamic>) {
log("Item at index $i is not a Map: ${json[i].runtimeType}");
throw Exception("Invalid data format at index $i");
}
}
final wrappedJson = {
"status": true,
"message": "Success",
"data": json
};
tugasM = TugasModel.fromJson(wrappedJson);
log("Tugas model created from array response");
log("Data length: ${tugasM?.data.length ?? 0}");
} catch (parseError) {
log("Error parsing array response: $parseError");
log("Array structure: $json");
snackbarfailed("Gagal memparse data tugas: $parseError");
}
} else {
log("Unexpected response format: ${json.runtimeType}");
snackbarfailed("Format response tidak dikenali");
}
} else {
log("Terjadi kesalahan get data: ${response.statusCode}");
log("Error response: ${response.body}");
snackbarfailed(
"Gagal memuat data tugas. Status: ${response.statusCode}");
}
} catch (e) {
log("Error get tugas: $e");
log("Error stack trace: ${StackTrace.current}");
snackbarfailed("Terjadi kesalahan: $e");
} finally {
isLoading(false);
}
}
}