import 'package:flutter/material.dart'; import 'package:adminduk_puger/widget/bottom_nav.dart'; import 'package:adminduk_puger/widget/card_item.dart'; import 'package:adminduk_puger/theme.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:adminduk_puger/cubit/submission_cubit.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; String kontak = '

Langkah langkah mengirim data perekaman :

  1. PIlih jenis dokumen yang ingin dibuat (KTP,KK,Akta,dll)
  2. Perhatikan jenis formulir yang diperlukan
  3. Unduh formulir yang dibutuhkan di fitur "Daftar Formulir"
  4. Cetak Formulir di tempat foto copy terdekat
  5. Mengisi data formulir 
  6. Mengisi kelengkapan kebutuhan data pada pembuatan dokumen
  7. Apabila masih bingung atau ada yang perlu ditanyakan bisa menghubungi admin dengan cara menekan text ini, lalu tekan bagian "Contact"
'; class HomeScreen extends StatefulWidget { @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State { int _currentIndex = 0; final List _routes = ['/home', '/submission', '/setting']; @override void initState() { super.initState(); context.read().fetchSubmissions(); } void _onTap(int index) { setState(() { _currentIndex = index; }); Navigator.pushReplacementNamed(context, _routes[index]); } @override Widget build(BuildContext context) { final submissionState = context.watch().state; return Scaffold( backgroundColor: Colors.grey[100], bottomNavigationBar: BottomNav( currentIndex: _currentIndex, onTap: _onTap, ), body: SafeArea( child: Column( children: [ // AppBar SizedBox( width: double.infinity, child: Container( height: 150, decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topRight, end: Alignment.bottomCenter, colors: [putih, biru], ), borderRadius: const BorderRadius.only( bottomLeft: Radius.circular(34), bottomRight: Radius.circular(34), ), ), child: Padding( padding: EdgeInsets.only(left: 20, top: 30), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "Adminduk\nPuger", style: GoogleFonts.poppins( fontSize: 25, fontWeight: FontWeight.bold, ), textAlign: TextAlign.left, ), ], ), ), ), ), // Body Expanded( child: SingleChildScrollView( padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ _buildServiceButtons(), SizedBox(height: 10), _buildDocumentGrid( submissionState, submissionState.keys.toList(), context, ), ], ), ), ), ], ), ), ); } Widget _buildServiceButtons() { return Container( margin: EdgeInsets.symmetric(horizontal: 16, vertical: 10), padding: EdgeInsets.symmetric(vertical: 15), decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(10), boxShadow: [ BoxShadow( color: Colors.grey.withOpacity(0.2), spreadRadius: 1, blurRadius: 2, offset: Offset(0, 1), ), ], ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ _buildCategoryItem( assetPath: 'assets/images/icons/documents.png', label: "Daftar\nFormulir", onTap: () { Navigator.pushNamed(context, '/document'); }, ), _buildCategoryItem( assetPath: 'assets/images/icons/riwayat.png', label: "Riwayat\nPengajuan", onTap: () { Navigator.pushNamed(context, '/submission'); }, ), _buildCategoryItem( icon: Icons.help_outline, label: "Bantuan &\nPanduan", onTap: () { showModalBottomSheet( context: context, isScrollControlled: true, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(20)), ), builder: (context) { return DraggableScrollableSheet( expand: false, initialChildSize: 0.7, minChildSize: 0.3, maxChildSize: 0.95, builder: (context, scrollController) { return Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ const Text( "Kontak Bantuan", style: TextStyle( fontWeight: FontWeight.bold, fontSize: 18, ), ), const SizedBox(height: 12), Expanded( child: SingleChildScrollView( controller: scrollController, child: HtmlWidget( kontak, onTapUrl: (url) async { if (await canLaunchUrl(Uri.parse(url))) { await launchUrl( Uri.parse(url), mode: LaunchMode.externalApplication, ); } else { print("Gagal membuka URL: $url"); } return true; }, ), ), ), const SizedBox(height: 12), TextButton( onPressed: () => Navigator.pop(context), child: const Text("Tutup"), ), ], ), ); }, ); }, ); }, ), ], ), ); } Widget _buildCategoryItem({ IconData? icon, String? assetPath, VoidCallback? onTap, required String label, }) { return Column( children: [ GestureDetector( onTap: onTap, child: Container( padding: EdgeInsets.all(10), decoration: BoxDecoration( color: Colors.blue.withOpacity(0.1), borderRadius: BorderRadius.circular(8), ), child: icon != null ? Icon(icon, color: Colors.blue, size: 24) : Image.asset(assetPath!, width: 24, height: 24), ), ), SizedBox(height: 8), Text( label, textAlign: TextAlign.center, style: TextStyle(fontSize: 12), ), ], ); } Widget _buildDocumentGrid( Map data, List submittedTypes, BuildContext context, ) { // Helper untuk ngecek status 'Diproses' bool hasPending(List? items) { if (items == null) return false; return items.any((item) => item['status'] == 'Diproses'); } // Helper buat munculin snackbar void showPendingSnackBar() { ScaffoldMessenger.of(context).showSnackBar( SnackBar( content: Text( "Anda masih memiliki pengajuan yang berstatus 'Diproses'", ), ), ); } return Padding( padding: EdgeInsets.symmetric(horizontal: 16), child: GridView.count( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), crossAxisCount: 2, crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 1.3, children: [ if (submittedTypes.contains('ektp')) CardItem( title: "Kartu Tanda\nPenduduk (KTP)", iconPath: "ktp.png", onPress: hasPending(data['ektp']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/ktp_option'), ), if (submittedTypes.contains('kia')) CardItem( title: "Kartu Identitas Anak (KIA)", iconPath: "kids.png", onPress: hasPending(data['kia']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/kia_option'), ), if (submittedTypes.contains('kk')) CardItem( title: "Kartu Keluarga\n(KK)", iconPath: "kk.png", onPress: hasPending(data['kk']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/kkform'), ), if (submittedTypes.contains('birth_certif')) CardItem( title: "Akta Kelahiran", iconPath: "aktehidup.png", onPress: hasPending(data['birth_certif']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/birthcertif'), ), if (submittedTypes.contains('die_certif')) CardItem( title: "Akta Kematian", iconPath: "aktemati.png", onPress: hasPending(data['die_certif']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/diecertif'), ), if (submittedTypes.contains('moving_letter')) CardItem( title: "Surat Pindah", iconPath: "suratpindah.png", onPress: hasPending(data['moving_letter']) ? showPendingSnackBar : () => Navigator.pushNamed(context, '/moving_letter'), ), ], ), ); } }