223 lines
7.1 KiB
Dart
223 lines
7.1 KiB
Dart
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
|
import 'package:firebase_database/firebase_database.dart';
|
|
import 'package:firebase_auth/firebase_auth.dart';
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
import 'package:shared_preferences/shared_preferences.dart';
|
|
|
|
class NotifikasiService {
|
|
static final FlutterLocalNotificationsPlugin _notificationsPlugin =
|
|
FlutterLocalNotificationsPlugin();
|
|
|
|
// Flag internal untuk mencegah pengiriman notifikasi duplikat
|
|
static final Map<String, bool> _notifikasiTerkirim = {
|
|
'alarm1': false,
|
|
'alarm2': false,
|
|
'stok0_kotak1': false,
|
|
'stok0_kotak2': false,
|
|
'stok3_kotak1': false,
|
|
'stok3_kotak2': false,
|
|
};
|
|
|
|
static Future<void> init() async {
|
|
const AndroidInitializationSettings initializationSettingsAndroid =
|
|
AndroidInitializationSettings('@mipmap/ic_launcher');
|
|
|
|
const InitializationSettings initializationSettings =
|
|
InitializationSettings(android: initializationSettingsAndroid);
|
|
|
|
await _notificationsPlugin.initialize(initializationSettings);
|
|
}
|
|
|
|
static Future<void> simpanKeFirestore(
|
|
String userId,
|
|
String title,
|
|
String body,
|
|
) async {
|
|
final firestore = FirebaseFirestore.instance;
|
|
await firestore
|
|
.collection('users')
|
|
.doc(userId)
|
|
.collection('notifikasi')
|
|
.add({
|
|
'judul': title,
|
|
'pesan': body,
|
|
'timestamp': FieldValue.serverTimestamp(),
|
|
});
|
|
}
|
|
|
|
static Future<void> showNotification(String title, String body) async {
|
|
print('showNotification dipanggil dengan judul: $title, body: $body');
|
|
|
|
// Dihapus karena penyimpanan ke Firestore sudah dilakukan di tempat lain
|
|
// final user = FirebaseAuth.instance.currentUser;
|
|
// if (user != null) {
|
|
// await simpanKeFirestore(user.uid, title, body);
|
|
// }
|
|
|
|
const AndroidNotificationDetails androidDetails =
|
|
AndroidNotificationDetails(
|
|
'obat_channel_id',
|
|
'Obat Channel',
|
|
importance: Importance.max,
|
|
priority: Priority.high,
|
|
);
|
|
|
|
const NotificationDetails platformDetails = NotificationDetails(
|
|
android: androidDetails,
|
|
);
|
|
|
|
await _notificationsPlugin.show(
|
|
DateTime.now().millisecondsSinceEpoch ~/ 1000,
|
|
title,
|
|
body,
|
|
platformDetails,
|
|
);
|
|
}
|
|
|
|
static Future<void> listenToAllNotifikasiWithUserId(String userId) async {
|
|
final ref = FirebaseDatabase.instance.ref();
|
|
|
|
for (int kotak = 1; kotak <= 2; kotak++) {
|
|
ref.child('status/alarm$kotak').onValue.listen((event) async {
|
|
print("Alarm $kotak listener dipanggil");
|
|
bool alarmAktif = event.snapshot.value == true;
|
|
final alarmKey = 'alarm$kotak';
|
|
|
|
final userIdSnapshot =
|
|
await ref.child('jadwal/kotak$kotak/userId').get();
|
|
if (!userIdSnapshot.exists || userIdSnapshot.value != userId) {
|
|
_notifikasiTerkirim[alarmKey] = false;
|
|
return;
|
|
}
|
|
|
|
if (alarmAktif) {
|
|
if (!_notifikasiTerkirim[alarmKey]!) {
|
|
String title = 'Alarm Kotak $kotak Aktif';
|
|
String body = 'Waktunya minum obat';
|
|
await showNotification(title, body);
|
|
await simpanKeFirestore(userId, title, body);
|
|
_notifikasiTerkirim[alarmKey] = true;
|
|
}
|
|
} else {
|
|
_notifikasiTerkirim[alarmKey] = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
for (int kotak = 1; kotak <= 2; kotak++) {
|
|
ref.child('jadwal/kotak$kotak/jumlahObat').onValue.listen((event) async {
|
|
final jumlahValue = event.snapshot.value;
|
|
int jumlah = 0;
|
|
|
|
if (jumlahValue is int) {
|
|
jumlah = jumlahValue;
|
|
} else if (jumlahValue is String) {
|
|
jumlah = int.tryParse(jumlahValue) ?? 0;
|
|
}
|
|
|
|
final userIdSnapshot =
|
|
await ref.child('jadwal/kotak$kotak/userId').get();
|
|
if (!userIdSnapshot.exists || userIdSnapshot.value != userId) {
|
|
for (int i = 0; i <= 3; i++) {
|
|
_notifikasiTerkirim['stok${i}_kotak$kotak'] = false;
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (jumlah == 0) {
|
|
final key = 'stok0_kotak$kotak';
|
|
if (!_notifikasiTerkirim[key]!) {
|
|
String title = 'Obat Kotak $kotak Habis';
|
|
String body = 'Isi ulang obat segera!';
|
|
await showNotification(title, body);
|
|
await simpanKeFirestore(userId, title, body);
|
|
_notifikasiTerkirim[key] = true;
|
|
}
|
|
for (int i = 1; i <= 3; i++) {
|
|
_notifikasiTerkirim['stok${i}_kotak$kotak'] = false;
|
|
}
|
|
} else if (jumlah > 0 && jumlah <= 3) {
|
|
final key = 'stok$jumlah\_kotak$kotak';
|
|
if (!_notifikasiTerkirim[key]!) {
|
|
String title = 'Obat Sisa di Kotak $kotak';
|
|
String body = 'Obat tinggal $jumlah, waktunya isi ulang';
|
|
await showNotification(title, body);
|
|
await simpanKeFirestore(userId, title, body);
|
|
_notifikasiTerkirim[key] = true;
|
|
}
|
|
for (int i = 1; i <= 3; i++) {
|
|
if (i != jumlah) {
|
|
_notifikasiTerkirim['stok${i}_kotak$kotak'] = false;
|
|
}
|
|
}
|
|
_notifikasiTerkirim['stok0_kotak$kotak'] = false;
|
|
} else {
|
|
for (int i = 0; i <= 3; i++) {
|
|
_notifikasiTerkirim['stok${i}_kotak$kotak'] = false;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
void syncTimestampIfAuthorizedWithListener(String userId) {
|
|
final ref = FirebaseDatabase.instance.ref();
|
|
|
|
ref.child('status/kotak1').onValue.listen((event) async {
|
|
final now = DateTime.now();
|
|
final timestamp = now.toIso8601String();
|
|
|
|
final statusValue = event.snapshot.value;
|
|
if (statusValue != true) return;
|
|
|
|
final userIdSnap1 = await ref.child('jadwal/kotak1/userId').get();
|
|
final obatSnap1 = await ref.child('jadwal/kotak1/obat1').get();
|
|
|
|
if (userIdSnap1.value != userId) return;
|
|
|
|
final namaObat = obatSnap1.value?.toString() ?? 'Tidak diketahui';
|
|
|
|
await FirebaseFirestore.instance
|
|
.collection('users')
|
|
.doc(userId)
|
|
.collection('history')
|
|
.add({
|
|
'timestamp': timestamp,
|
|
'namaObat': namaObat,
|
|
'kotak': 'Kotak 1',
|
|
});
|
|
|
|
print('✅ History Kotak 1 dikirim: $namaObat');
|
|
await ref.child('status/kotak1').set(false);
|
|
});
|
|
|
|
ref.child('status/kotak2').onValue.listen((event) async {
|
|
final now = DateTime.now();
|
|
final timestamp = now.toIso8601String();
|
|
|
|
final statusValue = event.snapshot.value;
|
|
if (statusValue != true) return;
|
|
|
|
final userIdSnap2 = await ref.child('jadwal/kotak2/userId').get();
|
|
final obatSnap2 = await ref.child('jadwal/kotak2/obat2').get();
|
|
|
|
if (userIdSnap2.value != userId) return;
|
|
|
|
final namaObat = obatSnap2.value?.toString() ?? 'Tidak diketahui';
|
|
|
|
await FirebaseFirestore.instance
|
|
.collection('users')
|
|
.doc(userId)
|
|
.collection('history')
|
|
.add({
|
|
'timestamp': timestamp,
|
|
'namaObat': namaObat,
|
|
'kotak': 'Kotak 2',
|
|
});
|
|
|
|
print('✅ History Kotak 2 dikirim: $namaObat');
|
|
await ref.child('status/kotak2').set(false);
|
|
});
|
|
}
|