Perbarui model dan tampilan untuk mendukung perubahan struktur data pengguna. Ganti properti nama dan telepon dengan namaLengkap dan noHp di beberapa model, termasuk DonaturModel, PetugasDesaModel, dan WargaModel. Modifikasi tampilan dan controller untuk menggunakan properti baru ini. Tambahkan fungsionalitas baru untuk menampilkan nama lengkap dan nomor telepon dengan lebih baik di berbagai tampilan. Perbarui rute dan logika aplikasi untuk mencerminkan perubahan ini.
This commit is contained in:
@ -1,24 +1,26 @@
|
||||
import 'dart:convert';
|
||||
|
||||
class DonaturModel {
|
||||
final String? id;
|
||||
final String? nama;
|
||||
final String id; // Primary key yang juga foreign key ke auth.users(id)
|
||||
final String? namaLengkap;
|
||||
final String? alamat;
|
||||
final String? telepon;
|
||||
final String? noHp;
|
||||
final String? email;
|
||||
final String? jenis;
|
||||
final String? deskripsi;
|
||||
final String? status;
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
|
||||
DonaturModel({
|
||||
this.id,
|
||||
this.nama,
|
||||
required this.id,
|
||||
this.namaLengkap,
|
||||
this.alamat,
|
||||
this.telepon,
|
||||
this.noHp,
|
||||
this.email,
|
||||
this.jenis,
|
||||
this.status,
|
||||
this.deskripsi,
|
||||
this.status = 'AKTIF',
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
});
|
||||
@ -30,11 +32,12 @@ class DonaturModel {
|
||||
|
||||
factory DonaturModel.fromJson(Map<String, dynamic> json) => DonaturModel(
|
||||
id: json["id"],
|
||||
nama: json["nama"],
|
||||
namaLengkap: json["nama_lengkap"],
|
||||
alamat: json["alamat"],
|
||||
telepon: json["telepon"],
|
||||
noHp: json["no_hp"],
|
||||
email: json["email"],
|
||||
jenis: json["jenis"],
|
||||
deskripsi: json["deskripsi"],
|
||||
status: json["status"] ?? 'AKTIF',
|
||||
createdAt: json["created_at"] != null
|
||||
? DateTime.parse(json["created_at"])
|
||||
@ -46,13 +49,20 @@ class DonaturModel {
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"nama": nama,
|
||||
"nama_lengkap": namaLengkap,
|
||||
"alamat": alamat,
|
||||
"telepon": telepon,
|
||||
"no_hp": noHp,
|
||||
"email": email,
|
||||
"jenis": jenis,
|
||||
"deskripsi": deskripsi,
|
||||
"status": status ?? 'AKTIF',
|
||||
"created_at": createdAt?.toIso8601String(),
|
||||
"updated_at": updatedAt?.toIso8601String(),
|
||||
};
|
||||
|
||||
// Helper method untuk mendapatkan nama yang ditampilkan
|
||||
String get displayName => namaLengkap ?? 'Donatur';
|
||||
|
||||
// Getter untuk kompatibilitas dengan kode yang masih menggunakan nama
|
||||
String? get nama => namaLengkap;
|
||||
}
|
||||
|
@ -1,26 +1,31 @@
|
||||
import 'dart:convert';
|
||||
import 'package:penyaluran_app/app/data/models/desa_model.dart';
|
||||
|
||||
class PetugasDesaModel {
|
||||
final String? id;
|
||||
final String? nama;
|
||||
final String? alamatLengkap;
|
||||
final String? noTelp;
|
||||
final String id; // Primary key yang juga foreign key ke auth.users(id)
|
||||
final String? desaId;
|
||||
final String? namaLengkap;
|
||||
final String? alamat;
|
||||
final String? noHp;
|
||||
final String? email;
|
||||
final String? jabatan;
|
||||
final String? userId;
|
||||
final String? nip;
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
final DesaModel? desa;
|
||||
|
||||
PetugasDesaModel({
|
||||
this.id,
|
||||
this.nama,
|
||||
this.alamatLengkap,
|
||||
this.noTelp,
|
||||
required this.id,
|
||||
this.desaId,
|
||||
this.namaLengkap,
|
||||
this.alamat,
|
||||
this.noHp,
|
||||
this.email,
|
||||
this.jabatan,
|
||||
this.userId,
|
||||
this.nip,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
this.desa,
|
||||
});
|
||||
|
||||
factory PetugasDesaModel.fromRawJson(String str) =>
|
||||
@ -28,32 +33,44 @@ class PetugasDesaModel {
|
||||
|
||||
String toRawJson() => json.encode(toJson());
|
||||
|
||||
factory PetugasDesaModel.fromJson(Map<String, dynamic> json) =>
|
||||
PetugasDesaModel(
|
||||
id: json["id"],
|
||||
nama: json["nama"],
|
||||
alamatLengkap: json["alamat_lengkap"],
|
||||
noTelp: json["no_telp"],
|
||||
email: json["email"],
|
||||
jabatan: json["jabatan"],
|
||||
userId: json["user_id"],
|
||||
createdAt: json["created_at"] != null
|
||||
? DateTime.parse(json["created_at"])
|
||||
: null,
|
||||
updatedAt: json["updated_at"] != null
|
||||
? DateTime.parse(json["updated_at"])
|
||||
: null,
|
||||
);
|
||||
factory PetugasDesaModel.fromJson(Map<String, dynamic> json) {
|
||||
DesaModel? desa;
|
||||
if (json["desa"] != null && json["desa"] is Map<String, dynamic>) {
|
||||
desa = DesaModel.fromJson(json["desa"]);
|
||||
}
|
||||
|
||||
return PetugasDesaModel(
|
||||
id: json["id"],
|
||||
desaId: json["desa_id"],
|
||||
namaLengkap: json["nama_lengkap"],
|
||||
alamat: json["alamat"],
|
||||
noHp: json["no_hp"],
|
||||
email: json["email"],
|
||||
jabatan: json["jabatan"],
|
||||
nip: json["nip"],
|
||||
createdAt: json["created_at"] != null
|
||||
? DateTime.parse(json["created_at"])
|
||||
: null,
|
||||
updatedAt: json["updated_at"] != null
|
||||
? DateTime.parse(json["updated_at"])
|
||||
: null,
|
||||
desa: desa,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"nama": nama,
|
||||
"alamat_lengkap": alamatLengkap,
|
||||
"no_telp": noTelp,
|
||||
"desa_id": desaId,
|
||||
"nama_lengkap": namaLengkap,
|
||||
"alamat": alamat,
|
||||
"no_hp": noHp,
|
||||
"email": email,
|
||||
"jabatan": jabatan,
|
||||
"user_id": userId,
|
||||
"nip": nip,
|
||||
"created_at": createdAt?.toIso8601String(),
|
||||
"updated_at": updatedAt?.toIso8601String(),
|
||||
};
|
||||
|
||||
// Helper method untuk mendapatkan nama yang ditampilkan
|
||||
String get displayName => namaLengkap ?? 'Petugas Desa';
|
||||
}
|
||||
|
@ -101,20 +101,16 @@ class TindakanPengaduanModel {
|
||||
|
||||
// Getter untuk mendapatkan nama petugas
|
||||
String get namaPetugas {
|
||||
if (petugas != null && petugas!['nama'] != null) {
|
||||
return petugas!['nama'];
|
||||
} else if (petugas != null && petugas!['name'] != null) {
|
||||
return petugas!['name'];
|
||||
if (petugas != null && petugas!['nama_lengkap'] != null) {
|
||||
return petugas!['nama_lengkap'];
|
||||
}
|
||||
return 'Petugas';
|
||||
}
|
||||
|
||||
// Getter untuk mendapatkan nama verifikator
|
||||
String get namaVerifikator {
|
||||
if (verifikator != null && verifikator!['nama'] != null) {
|
||||
return verifikator!['nama'];
|
||||
} else if (verifikator != null && verifikator!['name'] != null) {
|
||||
return verifikator!['name'];
|
||||
if (verifikator != null && verifikator!['nama_lengkap'] != null) {
|
||||
return verifikator!['nama_lengkap'];
|
||||
}
|
||||
return 'Belum diverifikasi';
|
||||
}
|
||||
|
@ -1,51 +1,58 @@
|
||||
import 'package:penyaluran_app/app/data/models/desa_model.dart';
|
||||
|
||||
class UserModel {
|
||||
// Model dasar untuk pengguna dengan informasi autentikasi umum
|
||||
class BaseUserModel {
|
||||
final String id;
|
||||
final String email;
|
||||
final String? name;
|
||||
final String? avatar;
|
||||
final String role;
|
||||
final int? roleId;
|
||||
final String roleName;
|
||||
final bool isActive;
|
||||
final DesaModel? desa;
|
||||
final String? desaId;
|
||||
final DateTime? lastLogin;
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
final String? name;
|
||||
final String? role;
|
||||
final DesaModel? desa;
|
||||
|
||||
UserModel({
|
||||
BaseUserModel({
|
||||
required this.id,
|
||||
required this.email,
|
||||
this.name,
|
||||
this.avatar,
|
||||
required this.role,
|
||||
this.roleId,
|
||||
required this.roleName,
|
||||
this.isActive = true,
|
||||
this.desa,
|
||||
this.desaId,
|
||||
this.lastLogin,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
this.name,
|
||||
this.role,
|
||||
this.desa,
|
||||
});
|
||||
|
||||
factory UserModel.fromJson(Map<String, dynamic> json) {
|
||||
factory BaseUserModel.fromJson(Map<String, dynamic> json) {
|
||||
// Pastikan id dan email tidak null
|
||||
if (json['id'] == null || json['email'] == null) {
|
||||
throw Exception('UserModel: id dan email tidak boleh null');
|
||||
throw Exception('BaseUserModel: id dan email tidak boleh null');
|
||||
}
|
||||
|
||||
// Parse desa jika ada
|
||||
DesaModel? desaModel;
|
||||
// Dapatkan roleName, default ke 'warga' jika tidak tersedia
|
||||
String roleName = 'warga';
|
||||
if (json['roles'] != null && json['roles']['role_name'] != null) {
|
||||
roleName = json['roles']['role_name'];
|
||||
} else if (json['role'] != null) {
|
||||
roleName = json['role'];
|
||||
}
|
||||
|
||||
// Parse desa data jika ada
|
||||
DesaModel? desa;
|
||||
if (json['desa'] != null && json['desa'] is Map<String, dynamic>) {
|
||||
desaModel = DesaModel.fromJson(json['desa'] as Map<String, dynamic>);
|
||||
desa = DesaModel.fromJson(json['desa']);
|
||||
}
|
||||
|
||||
return UserModel(
|
||||
return BaseUserModel(
|
||||
id: json['id'],
|
||||
email: json['email'],
|
||||
name: json['name'],
|
||||
avatar: json['avatar'],
|
||||
desa: desaModel,
|
||||
desaId: json['desa_id'],
|
||||
role: json['role'] ?? 'WARGA',
|
||||
roleId: json['role_id'],
|
||||
roleName: roleName,
|
||||
isActive: json['is_active'] ?? true,
|
||||
lastLogin: json['last_login'] != null
|
||||
? DateTime.parse(json['last_login'])
|
||||
@ -56,6 +63,9 @@ class UserModel {
|
||||
updatedAt: json['updated_at'] != null
|
||||
? DateTime.parse(json['updated_at'])
|
||||
: null,
|
||||
name: json['name'],
|
||||
role: roleName,
|
||||
desa: desa,
|
||||
);
|
||||
}
|
||||
|
||||
@ -63,83 +73,25 @@ class UserModel {
|
||||
return {
|
||||
'id': id,
|
||||
'email': email,
|
||||
'name': name,
|
||||
'avatar': avatar,
|
||||
'desa_id': desaId,
|
||||
'desa': desa?.toJson(),
|
||||
'role': role,
|
||||
'role_id': roleId,
|
||||
'role': roleName,
|
||||
'is_active': isActive,
|
||||
'last_login': lastLogin?.toIso8601String(),
|
||||
'created_at': createdAt?.toIso8601String(),
|
||||
'updated_at': updatedAt?.toIso8601String(),
|
||||
};
|
||||
}
|
||||
|
||||
UserModel copyWith({
|
||||
String? id,
|
||||
String? email,
|
||||
String? name,
|
||||
String? avatar,
|
||||
DesaModel? desa,
|
||||
String? desaId,
|
||||
String? role,
|
||||
bool? isActive,
|
||||
DateTime? lastLogin,
|
||||
DateTime? createdAt,
|
||||
DateTime? updatedAt,
|
||||
}) {
|
||||
return UserModel(
|
||||
id: id ?? this.id,
|
||||
email: email ?? this.email,
|
||||
name: name ?? this.name,
|
||||
avatar: avatar ?? this.avatar,
|
||||
desa: desa ?? this.desa,
|
||||
desaId: desaId ?? this.desaId,
|
||||
role: role ?? this.role,
|
||||
isActive: isActive ?? this.isActive,
|
||||
lastLogin: lastLogin ?? this.lastLogin,
|
||||
createdAt: createdAt ?? this.createdAt,
|
||||
updatedAt: updatedAt ?? this.updatedAt,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class User {
|
||||
final String? id;
|
||||
final String? name;
|
||||
final String? email;
|
||||
final String? phone;
|
||||
final String? role;
|
||||
final String? token;
|
||||
|
||||
User({
|
||||
this.id,
|
||||
this.name,
|
||||
this.email,
|
||||
this.phone,
|
||||
this.role,
|
||||
this.token,
|
||||
});
|
||||
|
||||
factory User.fromJson(Map<String, dynamic> json) {
|
||||
return User(
|
||||
id: json['id'],
|
||||
name: json['name'],
|
||||
email: json['email'],
|
||||
phone: json['phone'],
|
||||
role: json['role'],
|
||||
token: json['token'],
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
return {
|
||||
'id': id,
|
||||
'name': name,
|
||||
'email': email,
|
||||
'phone': phone,
|
||||
'role': role,
|
||||
'token': token,
|
||||
'desa': desa?.toJson(),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// Class untuk menampung data user lengkap (BaseUserModel + data spesifik role)
|
||||
class UserData<T> {
|
||||
final BaseUserModel baseUser;
|
||||
final T roleData;
|
||||
|
||||
UserData({
|
||||
required this.baseUser,
|
||||
required this.roleData,
|
||||
});
|
||||
}
|
||||
|
@ -1,41 +1,44 @@
|
||||
import 'dart:convert';
|
||||
import 'package:penyaluran_app/app/data/models/desa_model.dart';
|
||||
|
||||
// warga == penerima bantuan
|
||||
class WargaModel {
|
||||
final String? id;
|
||||
final String? nama;
|
||||
final String? nik;
|
||||
final String id; // Primary key yang juga foreign key ke auth.users(id)
|
||||
final String? desaId;
|
||||
final String? namaLengkap;
|
||||
final String? alamat;
|
||||
final String? desa;
|
||||
final String? kecamatan;
|
||||
final String? kabupaten;
|
||||
final String? provinsi;
|
||||
final String? telepon;
|
||||
final String? noHp;
|
||||
final String? email;
|
||||
final String? nik;
|
||||
final String? tempatLahir;
|
||||
final DateTime? tanggalLahir;
|
||||
final String? jenisKelamin;
|
||||
final String? agama;
|
||||
final String? kategoriEkonomi;
|
||||
final String? status;
|
||||
final String? catatan;
|
||||
final String? kategori; // Contoh: 'lansia', 'disabilitas', 'miskin', dll
|
||||
final String? status; // Contoh: 'AKTIF', 'NONAKTIF'
|
||||
final String? lokasiPenyaluranId; // Referensi ke LokasiPenyaluran
|
||||
final DateTime? createdAt;
|
||||
final DateTime? updatedAt;
|
||||
final DesaModel? desa;
|
||||
|
||||
WargaModel({
|
||||
this.id,
|
||||
this.nama,
|
||||
this.nik,
|
||||
required this.id,
|
||||
this.desaId,
|
||||
this.namaLengkap,
|
||||
this.alamat,
|
||||
this.desa,
|
||||
this.kecamatan,
|
||||
this.kabupaten,
|
||||
this.provinsi,
|
||||
this.telepon,
|
||||
this.noHp,
|
||||
this.email,
|
||||
this.nik,
|
||||
this.tempatLahir,
|
||||
this.tanggalLahir,
|
||||
this.jenisKelamin,
|
||||
this.agama,
|
||||
this.kategoriEkonomi,
|
||||
this.status = 'AKTIF',
|
||||
this.catatan,
|
||||
this.kategori,
|
||||
this.status,
|
||||
this.lokasiPenyaluranId,
|
||||
this.createdAt,
|
||||
this.updatedAt,
|
||||
this.desa,
|
||||
});
|
||||
|
||||
factory WargaModel.fromRawJson(String str) =>
|
||||
@ -43,45 +46,58 @@ class WargaModel {
|
||||
|
||||
String toRawJson() => json.encode(toJson());
|
||||
|
||||
factory WargaModel.fromJson(Map<String, dynamic> json) => WargaModel(
|
||||
id: json["id"],
|
||||
nama: json["nama"],
|
||||
nik: json["nik"],
|
||||
alamat: json["alamat"],
|
||||
desa: json["desa"],
|
||||
kecamatan: json["kecamatan"],
|
||||
kabupaten: json["kabupaten"],
|
||||
provinsi: json["provinsi"],
|
||||
telepon: json["telepon"] ?? json["no_telp"],
|
||||
email: json["email"],
|
||||
catatan: json["catatan"],
|
||||
kategori: json["kategori"],
|
||||
status: json["status"],
|
||||
lokasiPenyaluranId: json["lokasi_penyaluran_id"],
|
||||
createdAt: json["created_at"] != null
|
||||
? DateTime.parse(json["created_at"])
|
||||
: null,
|
||||
updatedAt: json["updated_at"] != null
|
||||
? DateTime.parse(json["updated_at"])
|
||||
: null,
|
||||
);
|
||||
factory WargaModel.fromJson(Map<String, dynamic> json) {
|
||||
DesaModel? desa;
|
||||
if (json["desa"] != null && json["desa"] is Map<String, dynamic>) {
|
||||
desa = DesaModel.fromJson(json["desa"]);
|
||||
}
|
||||
|
||||
return WargaModel(
|
||||
id: json["id"],
|
||||
desaId: json["desa_id"],
|
||||
namaLengkap: json["nama_lengkap"],
|
||||
alamat: json["alamat"],
|
||||
noHp: json["no_hp"],
|
||||
email: json["email"],
|
||||
nik: json["nik"],
|
||||
tempatLahir: json["tempat_lahir"],
|
||||
tanggalLahir: json["tanggal_lahir"] != null
|
||||
? DateTime.parse(json["tanggal_lahir"])
|
||||
: null,
|
||||
jenisKelamin: json["jenis_kelamin"],
|
||||
agama: json["agama"],
|
||||
kategoriEkonomi: json["kategori_ekonomi"],
|
||||
status: json["status"] ?? 'AKTIF',
|
||||
catatan: json["catatan"],
|
||||
createdAt: json["created_at"] != null
|
||||
? DateTime.parse(json["created_at"])
|
||||
: null,
|
||||
updatedAt: json["updated_at"] != null
|
||||
? DateTime.parse(json["updated_at"])
|
||||
: null,
|
||||
desa: desa,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"id": id,
|
||||
"nama": nama,
|
||||
"nik": nik,
|
||||
"desa_id": desaId,
|
||||
"nama_lengkap": namaLengkap,
|
||||
"alamat": alamat,
|
||||
"desa": desa,
|
||||
"kecamatan": kecamatan,
|
||||
"kabupaten": kabupaten,
|
||||
"provinsi": provinsi,
|
||||
"telepon": telepon,
|
||||
"no_hp": noHp,
|
||||
"email": email,
|
||||
"catatan": catatan,
|
||||
"kategori": kategori,
|
||||
"nik": nik,
|
||||
"tempat_lahir": tempatLahir,
|
||||
"tanggal_lahir": tanggalLahir?.toIso8601String(),
|
||||
"jenis_kelamin": jenisKelamin,
|
||||
"agama": agama,
|
||||
"kategori_ekonomi": kategoriEkonomi,
|
||||
"status": status,
|
||||
"lokasi_penyaluran_id": lokasiPenyaluranId,
|
||||
"catatan": catatan,
|
||||
"created_at": createdAt?.toIso8601String(),
|
||||
"updated_at": updatedAt?.toIso8601String(),
|
||||
};
|
||||
|
||||
// Helper method untuk mendapatkan nama yang ditampilkan
|
||||
String get displayName => namaLengkap ?? 'Warga';
|
||||
}
|
||||
|
@ -1,44 +1,162 @@
|
||||
import 'package:penyaluran_app/app/services/supabase_service.dart';
|
||||
import 'package:penyaluran_app/app/data/models/user_model.dart';
|
||||
import 'package:penyaluran_app/app/data/models/warga_model.dart';
|
||||
import 'package:penyaluran_app/app/data/models/petugas_desa_model.dart';
|
||||
import 'package:penyaluran_app/app/data/models/donatur_model.dart';
|
||||
import 'package:penyaluran_app/app/data/models/desa_model.dart';
|
||||
|
||||
class AuthProvider {
|
||||
final SupabaseService _supabaseService = SupabaseService.to;
|
||||
|
||||
// Cache untuk menyimpan data profil pengguna
|
||||
UserModel? _cachedUser;
|
||||
// Cache untuk menyimpan data pengguna
|
||||
UserData? _cachedUserData;
|
||||
|
||||
// Metode untuk login
|
||||
Future<UserModel?> signIn(String email, String password) async {
|
||||
Future<UserData?> signIn(String email, String password) async {
|
||||
try {
|
||||
final response = await _supabaseService.signIn(email, password);
|
||||
// Step 1: Login
|
||||
final response = await _supabaseService.client.auth.signInWithPassword(
|
||||
email: email,
|
||||
password: password,
|
||||
);
|
||||
|
||||
if (response.user != null && response.user?.email != null) {
|
||||
// Ambil profil pengguna dari database
|
||||
final profileData = await _supabaseService.getUserProfile();
|
||||
print('DEBUG: Profile data dari signIn: $profileData');
|
||||
|
||||
if (profileData != null) {
|
||||
// Buat UserModel dengan data yang ada
|
||||
_cachedUser = UserModel.fromJson({
|
||||
...profileData,
|
||||
'id': response.user!.id,
|
||||
'email': response.user!.email!,
|
||||
});
|
||||
print(
|
||||
'DEBUG: User model dibuat: ${_cachedUser?.name}, desa: ${_cachedUser?.desa?.nama}');
|
||||
return _cachedUser;
|
||||
}
|
||||
|
||||
// Jika profil belum tersedia, gunakan data default
|
||||
_cachedUser = UserModel(
|
||||
id: response.user!.id,
|
||||
email: response.user!.email!,
|
||||
role: 'WARGA', // Default role
|
||||
);
|
||||
print('DEBUG: User model default dibuat: ${_cachedUser?.email}');
|
||||
return _cachedUser;
|
||||
final user = response.user;
|
||||
if (user == null) {
|
||||
print('Login gagal!');
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
|
||||
final userId = user.id;
|
||||
|
||||
// Step 2: Ambil role dari view `users_with_roles` atau tabel roles
|
||||
String roleName;
|
||||
try {
|
||||
final roleResponse = await _supabaseService.client
|
||||
.from('users_with_roles')
|
||||
.select('role_name')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
roleName = roleResponse['role_name'];
|
||||
} catch (e) {
|
||||
print('Error mengambil role dari users_with_roles: $e');
|
||||
print('Mencoba ambil role dari tabel roles...');
|
||||
|
||||
// Fallback ke cara lama jika view users_with_roles tidak tersedia
|
||||
try {
|
||||
// Ambil role_id dari user metadata
|
||||
final roleId = user.userMetadata?['role_id'];
|
||||
if (roleId == null) {
|
||||
print('Tidak ada role_id di user metadata');
|
||||
return null;
|
||||
}
|
||||
|
||||
final roleResponse = await _supabaseService.client
|
||||
.from('roles')
|
||||
.select('role_name')
|
||||
.eq('id', roleId)
|
||||
.single();
|
||||
|
||||
roleName = roleResponse['role_name'];
|
||||
} catch (e) {
|
||||
print('Error mengambil role dari tabel roles: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
print('Role: $roleName');
|
||||
|
||||
// Step 3: Ambil profil user berdasarkan role
|
||||
Map<String, dynamic>? profileResponse;
|
||||
dynamic roleData;
|
||||
DesaModel? desa;
|
||||
|
||||
// Buat BaseUserModel
|
||||
final baseUser = BaseUserModel(
|
||||
id: userId,
|
||||
email: user.email ?? '',
|
||||
roleId: user.userMetadata?['role_id'],
|
||||
roleName: roleName,
|
||||
createdAt: DateTime.parse(user.createdAt),
|
||||
updatedAt:
|
||||
user.updatedAt != null ? DateTime.parse(user.updatedAt!) : null,
|
||||
);
|
||||
|
||||
if (roleName == 'warga') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('warga')
|
||||
.select('*, desa:desa_id(id, nama, kecamatan, kabupaten, provinsi)')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
if (profileResponse != null) {
|
||||
// Ekstrak data desa jika ada
|
||||
if (profileResponse['desa'] != null) {
|
||||
desa = DesaModel.fromJson(profileResponse['desa']);
|
||||
print('Data Desa: ${desa.nama}');
|
||||
}
|
||||
|
||||
roleData = WargaModel.fromJson(profileResponse);
|
||||
print('Data Warga: ${roleData.namaLengkap}');
|
||||
} else {
|
||||
print('Tidak menemukan data warga untuk ID: $userId');
|
||||
return null;
|
||||
}
|
||||
} else if (roleName == 'petugas_desa') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('petugas_desa')
|
||||
.select('*, desa:desa_id(id, nama, kecamatan, kabupaten, provinsi)')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
if (profileResponse != null) {
|
||||
// Ekstrak data desa jika ada
|
||||
if (profileResponse['desa'] != null) {
|
||||
desa = DesaModel.fromJson(profileResponse['desa']);
|
||||
print('Data Desa: ${desa.nama}');
|
||||
}
|
||||
|
||||
roleData = PetugasDesaModel.fromJson(profileResponse);
|
||||
print(
|
||||
'Data Petugas Desa: ${roleData.namaLengkap}, Desa: ${roleData.desa?.nama}');
|
||||
}
|
||||
} else if (roleName == 'donatur') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('donatur')
|
||||
.select('*')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
roleData = DonaturModel.fromJson(profileResponse);
|
||||
print('Data Donatur: ${roleData.namaLengkap}');
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (roleData == null) {
|
||||
print('Tidak menemukan data profil untuk role: $roleName');
|
||||
return null;
|
||||
}
|
||||
|
||||
// Perbarui baseUser dengan data desa jika ada
|
||||
final updatedBaseUser = BaseUserModel(
|
||||
id: baseUser.id,
|
||||
email: baseUser.email,
|
||||
roleId: baseUser.roleId,
|
||||
roleName: baseUser.roleName,
|
||||
createdAt: baseUser.createdAt,
|
||||
updatedAt: baseUser.updatedAt,
|
||||
desa: desa, // Set desa dari data yang diambil
|
||||
);
|
||||
|
||||
// Simpan cache user data
|
||||
final userData = UserData(
|
||||
baseUser: updatedBaseUser,
|
||||
roleData: roleData,
|
||||
);
|
||||
_cachedUserData = userData;
|
||||
|
||||
return userData;
|
||||
} catch (e) {
|
||||
print('Error pada signIn: $e');
|
||||
rethrow;
|
||||
@ -49,57 +167,159 @@ class AuthProvider {
|
||||
Future<void> signOut() async {
|
||||
try {
|
||||
await _supabaseService.signOut();
|
||||
_cachedUser = null; // Hapus cache saat logout
|
||||
_cachedUserData = null; // Hapus cache saat logout
|
||||
} catch (e) {
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
// Metode untuk mendapatkan user saat ini
|
||||
Future<UserModel?> getCurrentUser() async {
|
||||
// Jika ada cache dan user masih terautentikasi, gunakan cache
|
||||
if (_cachedUser != null && _supabaseService.isAuthenticated) {
|
||||
print(
|
||||
'DEBUG: Menggunakan data user dari cache: ${_cachedUser?.name}, desa: ${_cachedUser?.desa?.nama}');
|
||||
return _cachedUser;
|
||||
Future<UserData?> getCurrentUser({bool skipCache = false}) async {
|
||||
// Jika ada cache dan user masih terautentikasi, gunakan cache kecuali skipCache = true
|
||||
if (!skipCache &&
|
||||
_cachedUserData != null &&
|
||||
_supabaseService.isAuthenticated) {
|
||||
print('DEBUG: Menggunakan data user dari cache');
|
||||
return _cachedUserData;
|
||||
}
|
||||
|
||||
final user = _supabaseService.currentUser;
|
||||
if (user != null) {
|
||||
if (_supabaseService.currentUser != null) {
|
||||
try {
|
||||
// Ambil profil pengguna dari database
|
||||
final profileData = await _supabaseService.getUserProfile();
|
||||
print('DEBUG: Profile data dari getCurrentUser: $profileData');
|
||||
// Login berhasil, lakukan proses yang sama seperti di signIn
|
||||
// tapi dengan user yang sudah ada
|
||||
final user = _supabaseService.currentUser!;
|
||||
final userId = user.id;
|
||||
|
||||
if (profileData != null) {
|
||||
// Buat UserModel dengan data yang ada
|
||||
_cachedUser = UserModel.fromJson({
|
||||
...profileData,
|
||||
'id': user.id,
|
||||
'email': user.email!,
|
||||
});
|
||||
print(
|
||||
'DEBUG: User model dibuat: ${_cachedUser?.name}, desa: ${_cachedUser?.desa?.nama}');
|
||||
return _cachedUser;
|
||||
// Step 2: Ambil role dari view `users_with_roles` atau tabel roles
|
||||
String roleName;
|
||||
try {
|
||||
final roleResponse = await _supabaseService.client
|
||||
.from('users_with_roles')
|
||||
.select('role_name')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
roleName = roleResponse['role_name'];
|
||||
} catch (e) {
|
||||
print('Error mengambil role dari users_with_roles: $e');
|
||||
print('Mencoba ambil role dari tabel roles...');
|
||||
|
||||
// Fallback ke cara lama jika view users_with_roles tidak tersedia
|
||||
try {
|
||||
// Ambil role_id dari user metadata
|
||||
final roleId = user.userMetadata?['role_id'];
|
||||
if (roleId == null) {
|
||||
print('Tidak ada role_id di user metadata');
|
||||
return null;
|
||||
}
|
||||
|
||||
final roleResponse = await _supabaseService.client
|
||||
.from('roles')
|
||||
.select('role_name')
|
||||
.eq('id', roleId)
|
||||
.single();
|
||||
|
||||
roleName = roleResponse['role_name'];
|
||||
} catch (e) {
|
||||
print('Error mengambil role dari tabel roles: $e');
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Jika profil belum tersedia, gunakan data default
|
||||
_cachedUser = UserModel(
|
||||
id: user.id,
|
||||
email: user.email!,
|
||||
role: 'WARGA', // Default role
|
||||
print('Role: $roleName');
|
||||
|
||||
// Step 3: Ambil profil user berdasarkan role
|
||||
Map<String, dynamic>? profileResponse;
|
||||
dynamic roleData;
|
||||
DesaModel? desa;
|
||||
|
||||
// Buat BaseUserModel
|
||||
final baseUser = BaseUserModel(
|
||||
id: userId,
|
||||
email: user.email ?? '',
|
||||
roleId: user.userMetadata?['role_id'],
|
||||
roleName: roleName ?? '',
|
||||
createdAt: DateTime.parse(user.createdAt),
|
||||
updatedAt:
|
||||
user.updatedAt != null ? DateTime.parse(user.updatedAt!) : null,
|
||||
);
|
||||
print('DEBUG: User model default dibuat: ${_cachedUser?.email}');
|
||||
return _cachedUser;
|
||||
|
||||
if ((roleName ?? '').toLowerCase() == 'warga') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('warga')
|
||||
.select(
|
||||
'*, desa:desa_id(id, nama, kecamatan, kabupaten, provinsi)')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
if (profileResponse != null) {
|
||||
// Ekstrak data desa jika ada
|
||||
if (profileResponse['desa'] != null) {
|
||||
desa = DesaModel.fromJson(profileResponse['desa']);
|
||||
print('Data Desa: ${desa.nama}');
|
||||
}
|
||||
|
||||
roleData = WargaModel.fromJson(profileResponse);
|
||||
print('Data Warga: ${roleData.namaLengkap}');
|
||||
} else {
|
||||
print('Tidak menemukan data warga untuk ID: $userId');
|
||||
return null;
|
||||
}
|
||||
} else if (roleName.toLowerCase() == 'petugas_desa') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('petugas_desa')
|
||||
.select(
|
||||
'*, desa:desa_id(id, nama, kecamatan, kabupaten, provinsi)')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
if (profileResponse != null) {
|
||||
// Ekstrak data desa jika ada
|
||||
if (profileResponse['desa'] != null) {
|
||||
desa = DesaModel.fromJson(profileResponse['desa']);
|
||||
print('Data Desa: ${desa.nama}');
|
||||
}
|
||||
|
||||
roleData = PetugasDesaModel.fromJson(profileResponse);
|
||||
}
|
||||
} else if (roleName.toLowerCase() == 'donatur') {
|
||||
profileResponse = await _supabaseService.client
|
||||
.from('donatur')
|
||||
.select('*')
|
||||
.eq('id', userId)
|
||||
.single();
|
||||
|
||||
if (profileResponse != null) {
|
||||
roleData = DonaturModel.fromJson(profileResponse);
|
||||
}
|
||||
}
|
||||
|
||||
if (roleData == null) {
|
||||
print('Tidak menemukan data profil untuk role: $roleName');
|
||||
return null;
|
||||
}
|
||||
|
||||
// Perbarui baseUser dengan data desa jika ada
|
||||
final updatedBaseUser = BaseUserModel(
|
||||
id: baseUser.id,
|
||||
email: baseUser.email,
|
||||
roleId: baseUser.roleId,
|
||||
roleName: baseUser.roleName,
|
||||
createdAt: baseUser.createdAt,
|
||||
updatedAt: baseUser.updatedAt,
|
||||
desa: desa, // Set desa dari data yang diambil
|
||||
);
|
||||
|
||||
// Simpan cache user data
|
||||
final userData = UserData(
|
||||
baseUser: updatedBaseUser,
|
||||
roleData: roleData,
|
||||
);
|
||||
_cachedUserData = userData;
|
||||
|
||||
return userData;
|
||||
} catch (e) {
|
||||
print('Error pada getCurrentUser: $e');
|
||||
// Jika terjadi error, kembalikan model dengan data minimal
|
||||
_cachedUser = UserModel(
|
||||
id: user.id,
|
||||
email: user.email!,
|
||||
role: 'WARGA', // Default role
|
||||
);
|
||||
return _cachedUser;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
@ -115,31 +335,49 @@ class AuthProvider {
|
||||
return await _supabaseService.getWargaByUserId();
|
||||
}
|
||||
|
||||
// Metode untuk membuat profil warga
|
||||
Future<void> createWargaProfile({
|
||||
required String nik,
|
||||
required String namaLengkap,
|
||||
required String jenisKelamin,
|
||||
String? noHp,
|
||||
String? alamat,
|
||||
String? tempatLahir,
|
||||
DateTime? tanggalLahir,
|
||||
String? agama,
|
||||
}) async {
|
||||
await _supabaseService.createWargaProfile(
|
||||
nik: nik,
|
||||
namaLengkap: namaLengkap,
|
||||
jenisKelamin: jenisKelamin,
|
||||
noHp: noHp,
|
||||
alamat: alamat,
|
||||
tempatLahir: tempatLahir,
|
||||
tanggalLahir: tanggalLahir,
|
||||
agama: agama,
|
||||
);
|
||||
// // Metode untuk membuat profil donatur
|
||||
// Future<void> createDonaturProfile({
|
||||
// required String namaLengkap,
|
||||
// String? instansi,
|
||||
// String? jabatan,
|
||||
// String? noHp,
|
||||
// String? alamat,
|
||||
// String? desaId,
|
||||
// }) async {
|
||||
// await _supabaseService.createDonaturProfile(
|
||||
// namaLengkap: namaLengkap,
|
||||
// instansi: instansi,
|
||||
// jabatan: jabatan,
|
||||
// noHp: noHp,
|
||||
// alamat: alamat,
|
||||
// desaId: desaId,
|
||||
// );
|
||||
|
||||
// Invalidasi cache setelah membuat profil baru
|
||||
_cachedUser = null;
|
||||
}
|
||||
// // Invalidasi cache setelah membuat profil baru
|
||||
// _cachedUserData = null;
|
||||
// }
|
||||
|
||||
// // Metode untuk membuat profil petugas desa
|
||||
// Future<void> createPetugasDesaProfile({
|
||||
// required String namaLengkap,
|
||||
// String? nip,
|
||||
// String? jabatan,
|
||||
// String? noHp,
|
||||
// String? alamat,
|
||||
// String? desaId,
|
||||
// }) async {
|
||||
// await _supabaseService.createPetugasDesaProfile(
|
||||
// namaLengkap: namaLengkap,
|
||||
// nip: nip,
|
||||
// jabatan: jabatan,
|
||||
// noHp: noHp,
|
||||
// alamat: alamat,
|
||||
// desaId: desaId,
|
||||
// );
|
||||
|
||||
// // Invalidasi cache setelah membuat profil baru
|
||||
// _cachedUserData = null;
|
||||
// }
|
||||
|
||||
// Metode untuk mendapatkan notifikasi pengguna
|
||||
Future<List<Map<String, dynamic>>> getUserNotifications(
|
||||
|
Reference in New Issue
Block a user