import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:penyaluran_app/app/data/models/penitipan_bantuan_model.dart'; import 'package:penyaluran_app/app/utils/date_time_helper.dart'; import 'package:penyaluran_app/app/theme/app_colors.dart'; /// Dialog untuk menampilkan detail penitipan bantuan /// /// Dialog ini menampilkan informasi lengkap tentang penitipan bantuan. class DetailPenitipanDialog { /// Menampilkan dialog detail penitipan /// /// [context] adalah BuildContext /// [item] adalah model penitipan bantuan /// [donaturNama] adalah nama donatur /// [kategoriNama] adalah nama kategori bantuan /// [kategoriSatuan] adalah satuan kategori bantuan /// [getPetugasDesaNama] adalah fungsi untuk mendapatkan nama petugas desa /// [showFullScreenImage] adalah fungsi untuk menampilkan gambar layar penuh static void show({ required BuildContext context, required PenitipanBantuanModel item, required String donaturNama, required String kategoriNama, required String kategoriSatuan, required String Function(String?) getPetugasDesaNama, required Function(String) showFullScreenImage, }) { // Cek apakah penitipan berbentuk uang final isUang = item.isUang ?? false; Get.dialog( AlertDialog( title: const Text('Detail Penitipan'), content: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildInfoRow('ID', item.id ?? '-'), _buildInfoRow('Donatur', donaturNama), _buildInfoRow('Kategori', kategoriNama), _buildInfoRow( 'Jumlah', isUang ? 'Rp ${item.jumlah?.toStringAsFixed(0) ?? '0'}' : '${item.jumlah?.toString() ?? '0'} $kategoriSatuan', ), _buildInfoRow( 'Tanggal Penitipan', DateTimeHelper.formatDateTime( item.tanggalPenitipan ?? item.createdAt), ), _buildInfoRow( 'Status', item.status ?? 'Belum diproses', ), if (item.petugasDesaId != null) _buildInfoRow( 'Petugas Desa', getPetugasDesaNama(item.petugasDesaId), ), if (item.tanggalVerifikasi != null) _buildInfoRow( 'Tanggal Verifikasi', DateTimeHelper.formatDateTime(item.tanggalVerifikasi), ), if (item.deskripsi != null && item.deskripsi!.isNotEmpty) _buildInfoRow('Deskripsi', item.deskripsi!), // Gambar bukti penitipan if (item.fotoBantuan != null && item.fotoBantuan!.isNotEmpty) ...[ const SizedBox(height: 16), const Text( 'Bukti Penitipan', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14, ), ), const SizedBox(height: 8), GestureDetector( onTap: () => showFullScreenImage(item.fotoBantuan!.first), child: Container( height: 200, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), image: DecorationImage( image: NetworkImage(item.fotoBantuan!.first), fit: BoxFit.cover, ), ), ), ), ], // Bukti serah terima if (item.fotoBuktiSerahTerima != null && item.fotoBuktiSerahTerima!.isNotEmpty) ...[ const SizedBox(height: 16), const Text( 'Bukti Serah Terima', style: TextStyle( fontWeight: FontWeight.bold, fontSize: 14, ), ), const SizedBox(height: 8), GestureDetector( onTap: () => showFullScreenImage(item.fotoBuktiSerahTerima!), child: Container( height: 200, width: double.infinity, decoration: BoxDecoration( borderRadius: BorderRadius.circular(8), image: DecorationImage( image: NetworkImage(item.fotoBuktiSerahTerima!), fit: BoxFit.cover, ), ), ), ), ], ], ), ), actions: [ TextButton( onPressed: () => Get.back(), child: Text( 'Tutup', style: TextStyle( color: AppColors.primary, fontWeight: FontWeight.bold, ), ), ), ], ), ); } /// Menampilkan gambar dalam layar penuh static void showFullScreenImage(BuildContext context, String imageUrl) { Navigator.of(context).push( MaterialPageRoute( builder: (context) => Scaffold( appBar: AppBar( backgroundColor: Colors.black, iconTheme: const IconThemeData(color: Colors.white), ), body: Container( color: Colors.black, child: Center( child: InteractiveViewer( panEnabled: true, boundaryMargin: const EdgeInsets.all(20), minScale: 0.5, maxScale: 4, child: Image.network( imageUrl, fit: BoxFit.contain, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress == null) return child; return Center( child: CircularProgressIndicator( value: loadingProgress.expectedTotalBytes != null ? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : null, ), ); }, errorBuilder: (context, error, stackTrace) { return const Center( child: Text( 'Gagal memuat gambar', style: TextStyle(color: Colors.white), ), ); }, ), ), ), ), ), ), ); } /// Membangun baris informasi static Widget _buildInfoRow(String label, String value) { return Padding( padding: const EdgeInsets.only(bottom: 12), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( label, style: const TextStyle( fontWeight: FontWeight.bold, fontSize: 14, ), ), const SizedBox(height: 4), Text( value, style: const TextStyle(fontSize: 14), ), ], ), ); } }