Notifikasi transaksi: hanya untuk admin + transaksi dari orang lain (bukan transaksi sendiri)
This commit is contained in:
@@ -27,6 +27,12 @@ class CartLine {
|
||||
class AppState extends ChangeNotifier {
|
||||
final SupabaseClient _supabase = Supabase.instance.client;
|
||||
|
||||
// Stream notifikasi transaksi baru (dipakai UI untuk banner+suara+getar).
|
||||
// Diisi setiap createSale sukses DAN setiap realtime INSERT dari HP lain.
|
||||
final StreamController<Sale> newSaleNotifications =
|
||||
StreamController<Sale>.broadcast();
|
||||
final Set<String> _notifiedSaleIds = {};
|
||||
|
||||
// Client dengan service_role key untuk operasi admin (buat/edit/hapus akun kasir).
|
||||
// PERINGATAN: key ini bypass RLS — hanya untuk app POS di device terpercaya.
|
||||
final SupabaseClient _admin = SupabaseClient(supabaseUrl, supabaseServiceKey);
|
||||
@@ -135,6 +141,38 @@ class AppState extends ChangeNotifier {
|
||||
if (elapsed < const Duration(seconds: 15)) return;
|
||||
}
|
||||
await refresh();
|
||||
_checkNewSales();
|
||||
}
|
||||
|
||||
bool _salesFirstLoad = true;
|
||||
|
||||
/// Deteksi transaksi baru dari polling/refresh dan kirim ke stream
|
||||
/// notifikasi. Load pertama dilewati agar tidak spam saat start.
|
||||
void _checkNewSales() {
|
||||
// Hanya admin yang perlu notifikasi — kasir tidak (mereka yang
|
||||
// transaksi, jadi sudah tahu).
|
||||
if (userRole != 'admin') {
|
||||
for (final s in sales) {
|
||||
_notifiedSaleIds.add(s.id);
|
||||
}
|
||||
_salesFirstLoad = false;
|
||||
return;
|
||||
}
|
||||
final now = DateTime.now();
|
||||
for (final s in sales) {
|
||||
if (!_notifiedSaleIds.contains(s.id)) {
|
||||
_notifiedSaleIds.add(s.id);
|
||||
// Lewati transaksi lama (>5 menit) agar tidak spam notif saat start.
|
||||
// Lewati juga transaksi sendiri — admin tahu kalau dia yang jualan.
|
||||
if (!_salesFirstLoad &&
|
||||
s.userId != userId &&
|
||||
now.difference(s.date).inMinutes.abs() <= 5 &&
|
||||
!newSaleNotifications.isClosed) {
|
||||
newSaleNotifications.add(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
_salesFirstLoad = false;
|
||||
}
|
||||
|
||||
Future<void> refresh() async {
|
||||
@@ -686,6 +724,11 @@ class AppState extends ChangeNotifier {
|
||||
cart.clear();
|
||||
_discount = 0;
|
||||
notifyListeners();
|
||||
|
||||
// Tandai ID transaksi lokal agar tidak di-notify lagi via polling
|
||||
// (admin yang jualan sendiri tidak perlu notif transaksinya sendiri).
|
||||
_notifiedSaleIds.add(sale.id);
|
||||
|
||||
return sale;
|
||||
} catch (e) {
|
||||
await _offlineQueue.addToQueue({
|
||||
|
||||
Reference in New Issue
Block a user