TKK_E32221002/lib/app/modules/home/controllers/home_controller.dart

122 lines
3.6 KiB
Dart

import 'package:get/get.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:intl/intl.dart';
import '../../../routes/app_pages.dart';
import 'package:flutter/material.dart';
class HomeController extends GetxController {
final db = FirebaseDatabase.instance.ref();
final historyList = <Map<String, dynamic>>[].obs;
var feSebelum = 0.0.obs;
var feSesudah = 0.0.obs;
var pompaOn = false.obs;
@override
void onInit() {
super.onInit();
_setupListeners();
ambilHistoryTerbaru();
}
void _setupListeners() {
// Listener untuk kadar Fe dari Firebase Realtime Database
db.child("kadar_fe").onValue.listen((event) {
final data = Map<String, dynamic>.from(event.snapshot.value as Map);
double sebelum = double.tryParse(data['sebelum'].toString()) ?? 0.0;
double sesudah = double.tryParse(data['sesudah'].toString()) ?? 0.0;
// Format ke 2 angka di belakang koma
feSebelum.value = double.parse(sebelum.toStringAsFixed(2));
feSesudah.value = double.parse(sesudah.toStringAsFixed(2));
});
// Listener untuk status pompa
db.child("relay/pompa").onValue.listen((event) {
pompaOn.value = event.snapshot.value == true;
});
}
// Mengambil 3 history terbaru dari Firestore
void ambilHistoryTerbaru() async {
final snapshot = await FirebaseFirestore.instance
.collection("history")
.orderBy("timestamp", descending: true)
.limit(3)
.get();
historyList.assignAll(snapshot.docs.map((doc) {
final data = doc.data();
final time = data['timestamp'];
if (time is String) {
data['formatted_time'] = time;
} else if (time is Timestamp) {
data['formatted_time'] =
DateFormat("dd-MM-yyyy HH:mm").format(time.toDate());
} else {
data['formatted_time'] = "Tidak diketahui";
}
return data;
}).toList());
}
// Toggle status pompa ke Realtime Database
void togglePompa() {
final newValue = !pompaOn.value;
db.child("relay/pompa").set(newValue);
pompaOn.value = newValue;
}
// Navigasi ke halaman info dan histori
void keInfo() => Get.toNamed(Routes.INFO);
void keHistory() => Get.toNamed(Routes.HISTORY);
// Penilaian hasil deteksi berdasarkan kadar Fe
String get hasilDeteksi {
final fe = feSesudah.value;
if (fe <= 0.3) {
return "Bersih";
} else if (fe > 0.3 && fe <= 1.0) {
return "Perlu Penyaringan";
} else {
return "Keruh (Tercemar)";
}
}
// Simpan data ke Firestore
Future<void> simpanKeFirestore() async {
try {
final now = DateTime.now();
final timestamp = DateFormat("dd-MM-yyyy HH:mm").format(now);
// Pastikan nilai disimpan dengan 2 digit desimal
await FirebaseFirestore.instance.collection("history").add({
"fe_sebelum": double.parse(feSebelum.value.toStringAsFixed(2)),
"fe_sesudah": double.parse(feSesudah.value.toStringAsFixed(2)),
"result": hasilDeteksi,
"timestamp": timestamp,
});
Get.snackbar(
"Berhasil",
"Data berhasil disimpan ke histori",
snackPosition: SnackPosition.TOP,
backgroundColor: const Color(0xFF1E3A8A),
colorText: Colors.white,
);
ambilHistoryTerbaru(); // Refresh list setelah simpan
} catch (e) {
Get.snackbar(
"Gagal",
"Terjadi kesalahan saat menyimpan data",
snackPosition: SnackPosition.TOP,
backgroundColor: Colors.red,
colorText: Colors.white,
);
debugPrint("Error simpan: $e");
}
}
}