TKK_E32232276/lib/dashboard/d_guru/database/db_pesan_private.dart

127 lines
4.0 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
class DbPesanPrivate {
static final supabase = Supabase.instance.client;
static Future<String> getUserIdAsync() async {
final prefs = await SharedPreferences.getInstance();
final ortuId = prefs.getString('user_id_admin');
if (ortuId != null) return ortuId;
final id = supabase.auth.currentUser?.id;
if (id != null) return id;
throw Exception('User belum login');
}
// Get Admin ID (for the current logged in user)
Future<String?> getAdminId() async {
try {
final userId = await getUserIdAsync();
final res = await supabase
.from('user_admin')
.select('id')
.eq('id', userId)
.single();
return res['id']?.toString();
} catch (e) {
if (kDebugMode) print('Get Admin ID Error: $e');
return null;
}
}
// Stream chat between Admin and Guru
Stream<List<Map<String, dynamic>>> getChatWithGuruStream(String idAdmin, String idGuru) {
return supabase
.from('chat_private')
.stream(primaryKey: ['id_tabel'])
.order('created_at', ascending: true)
.map((data) => data
.where((e) =>
(e['pengirim_admin'] == idAdmin && e['penerima_guru'] == idGuru) ||
(e['pengirim_guru'] == idGuru && e['penerima_admin'] == idAdmin))
.map((e) => e as Map<String, dynamic>)
.toList());
}
// Stream chat between Admin and Murid
Stream<List<Map<String, dynamic>>> getChatWithMuridStream(String idAdmin, String idMurid) {
return supabase
.from('chat_private')
.stream(primaryKey: ['id_tabel'])
.order('created_at', ascending: true)
.map((data) => data
.where((e) =>
(e['pengirim_admin'] == idAdmin && e['penerima_murid'] == idMurid) ||
(e['pengirim_murid'] == idMurid && e['penerima_admin'] == idAdmin))
.map((e) => e as Map<String, dynamic>)
.toList());
}
// Send Message to Guru
Future<void> sendMessageToGuru({
required String text,
required String idAdmin,
required String idGuru,
}) async {
try {
final userId = await getUserIdAsync();
await supabase.from('chat_private').insert({
'text': text,
'pengirim_admin': idAdmin,
'penerima_guru': idGuru,
'user_id': userId,
});
} catch (e) {
if (kDebugMode) print('Send Message Error: $e');
throw Exception('Gagal mengirim pesan: $e');
}
}
// Send Message to Murid
Future<void> sendMessageToMurid({
required String text,
required String idAdmin,
required String idMurid,
}) async {
try {
final userId = await getUserIdAsync();
await supabase.from('chat_private').insert({
'text': text,
'pengirim_admin': idAdmin,
'penerima_murid': idMurid,
'user_id': userId,
});
} catch (e) {
if (kDebugMode) print('Send Message Error: $e');
throw Exception('Gagal mengirim pesan: $e');
}
}
// Stream chat between Admin and Murid (For Murid App)
Stream<List<Map<String, dynamic>>> getChatWithAdminStream(String idMurid, String idAdmin) {
return supabase
.from('chat_private')
.stream(primaryKey: ['id_tabel'])
.order('created_at', ascending: true)
.map((data) => data
.where((e) =>
(e['pengirim_admin'] == idAdmin && e['penerima_murid'] == idMurid) ||
(e['pengirim_murid'] == idMurid && e['penerima_admin'] == idAdmin))
.map((e) => e as Map<String, dynamic>)
.toList());
}
// Send message general (For Murid App sending to admin)
Future<void> sendMessage(Map<String, dynamic> data) async {
try {
await supabase.from('chat_private').insert(data);
} catch (e) {
if (kDebugMode) print('Send Message Error: $e');
throw Exception('Gagal mengirim pesan: $e');
}
}
}