import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../common/theme_shadcn.dart'; import '../../injection_container.dart'; import '../common/widgets/standard_states.dart'; import 'controllers/rent_controller.dart'; class RentDashboard extends StatefulWidget { const RentDashboard({super.key}); @override State createState() => _RentDashboardState(); } class _RentDashboardState extends State { late final RentController _controller; @override void initState() { super.initState(); _controller = getIt(); _loadData(); } Future _loadData() async { await _controller.loadRents(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: ShadcnTheme.background, body: ChangeNotifierProvider.value( value: _controller, child: Consumer( builder: (context, controller, child) { if (controller.isLoading) { return const StandardLoadingState(message: '임대 정보를 불러오는 중...'); } if (controller.hasError) { return StandardErrorState( message: controller.error!, onRetry: _loadData, ); } return SingleChildScrollView( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 제목 Text('임대 현황', style: ShadcnTheme.headingH3), const SizedBox(height: 24), // 임대 목록 보기 버튼 _buildViewRentListButton(), const SizedBox(height: 32), // 백엔드에 대시보드 API가 없어 연체/진행중 데이터를 표시할 수 없음 Center( child: Container( padding: const EdgeInsets.all(40), child: Column( children: [ Icon(Icons.info_outline, size: 64, color: Colors.blue[400]), const SizedBox(height: 16), Text( '임대 대시보드 기능은 백엔드 API가 준비되면 제공될 예정입니다.', style: ShadcnTheme.bodyLarge, textAlign: TextAlign.center, ), const SizedBox(height: 8), Text( '임대 목록에서 단순 데이터를 확인하세요.', style: ShadcnTheme.bodyMedium.copyWith(color: ShadcnTheme.foregroundMuted), ), ], ), ), ), ], ), ); }, ), ), ); } Widget _buildViewRentListButton() { return Center( child: ElevatedButton.icon( onPressed: () { Navigator.pushNamed(context, '/rent/list'); }, icon: const Icon(Icons.list), label: const Text('임대 목록 보기'), style: ElevatedButton.styleFrom( backgroundColor: ShadcnTheme.primary, foregroundColor: ShadcnTheme.primaryForeground, padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), ), ), ); } String _formatCurrency(dynamic amount) { if (amount == null) return '0'; final num = amount is String ? double.tryParse(amount) ?? 0 : amount.toDouble(); return num.toStringAsFixed(0); } }