import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:get/get.dart'; import '../controllers/home_controller.dart'; import '../../../widgets/history_card_widget.dart'; import '../../../widgets/target_progress_chart.dart'; import '../../../widgets/logout_dialog.dart'; class HomeView extends GetView { const HomeView({super.key}); @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, body: SafeArea( child: Obx(() { if (controller.isLoading.value) { return const Center( child: CircularProgressIndicator(color: Color(0xFF5B9BD5)), ); } return SingleChildScrollView( padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 28), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // ── Header ────────────────────────────────────────────── Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Hello,', style: TextStyle( fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black87, ), ), Obx( () => Text( controller.namaUser.value, style: const TextStyle( fontSize: 32, fontWeight: FontWeight.bold, color: Color(0xFF5B9BD5), height: 1.1, ), ), ), ], ), GestureDetector( onTap: () => _confirmLogout(context), child: Container( padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: const Color(0xFFF2F2F2), borderRadius: BorderRadius.circular(10), ), child: const Icon( Icons.logout_rounded, color: Color(0xFF5B9BD5), size: 22, ), ), ), ], ), const SizedBox(height: 24), // ── Card Target (tanpa tombol edit) ────────────────────── Obx( () => Container( width: double.infinity, padding: const EdgeInsets.all(22), decoration: BoxDecoration( gradient: const LinearGradient( colors: [Color(0xFF5B9BD5), Color(0xFF90C4E8)], begin: Alignment.topLeft, end: Alignment.bottomRight, ), borderRadius: BorderRadius.circular(20), ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ // Kiri: info target Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( 'Target Kamu!', style: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.w600, ), ), const SizedBox(height: 10), // Emoji + nama target Row( children: [ Container( width: 48, height: 48, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(12), ), child: Center( child: Text( controller.targetEmoji.value, style: const TextStyle(fontSize: 26), ), ), ), const SizedBox(width: 10), Expanded( child: Text( controller.targetLabel.value, style: const TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold, ), maxLines: 2, overflow: TextOverflow.ellipsis, ), ), ], ), const SizedBox(height: 14), // Label nominal Text( 'Nominal Target', style: TextStyle( color: Colors.white.withOpacity(0.75), fontSize: 11, fontWeight: FontWeight.w500, ), ), const SizedBox(height: 2), Text( NumberFormat.currency( locale: 'id_ID', symbol: 'Rp ', decimalDigits: 0, ).format(controller.targetNominal.value), style: const TextStyle( color: Colors.white, fontSize: 18, fontWeight: FontWeight.bold, ), ), ], ), ), const SizedBox(width: 16), // Kanan: chart TargetProgressChart( percent: controller.targetPercent.value, size: 130, ), ], ), ), ), const SizedBox(height: 28), // ── Buka Celengan ──────────────────────────────────────── GestureDetector( onTap: () => controller.bukaCelengan(context), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: const [ Text( 'Buka Celenganmu', style: TextStyle( fontSize: 15, fontWeight: FontWeight.w600, color: Colors.black87, ), ), Icon(Icons.chevron_right, color: Colors.black54), ], ), ), const SizedBox(height: 24), // ── Total Uang ─────────────────────────────────────────── Obx( () => Container( padding: const EdgeInsets.symmetric( horizontal: 16, vertical: 12, ), decoration: BoxDecoration( color: const Color(0xFFF2F2F2), borderRadius: BorderRadius.circular(14), ), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( controller.totalUang.value, style: const TextStyle( fontSize: 22, fontWeight: FontWeight.bold, color: Colors.black87, ), ), Container( padding: const EdgeInsets.symmetric( horizontal: 22, vertical: 12, ), decoration: BoxDecoration( color: const Color(0xFF5B9BD5), borderRadius: BorderRadius.circular(12), ), child: const Text( 'Total Uang', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 14, ), ), ), ], ), ), ), const SizedBox(height: 28), // ── History ────────────────────────────────────────────── const Text( 'Uang Masuk', style: TextStyle( fontSize: 16, fontWeight: FontWeight.bold, color: Colors.black87, ), ), const SizedBox(height: 4), Container( height: 3, width: 50, decoration: BoxDecoration( color: Colors.grey.shade300, borderRadius: BorderRadius.circular(2), ), ), const SizedBox(height: 12), Obx( () => ListView.separated( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), itemCount: controller.recentHistory.length, separatorBuilder: (_, __) => const Divider(height: 1, color: Color(0xFFF0F0F0)), itemBuilder: (_, index) { final item = controller.recentHistory[index]; return HistoryCardWidget( amount: item.amount, date: item.date, percent: item.percent, tipe: item.tipe, ); }, ), ), ], ), ); }), ), ); } void _confirmLogout(BuildContext context) { showDialog( context: context, barrierDismissible: false, builder: (_) => LogoutDialog(onLogout: controller.logout), ); } }