diff --git a/lib/api/services/beneficiary_service.dart b/lib/api/services/beneficiary_service.dart index dcd2096..3021a2e 100644 --- a/lib/api/services/beneficiary_service.dart +++ b/lib/api/services/beneficiary_service.dart @@ -103,5 +103,29 @@ class BeneficiaryService { return false; } -} + Future> fetchBeneficiaryList() async { + try { + final response = await _dio.get( + "/api/beneficiaries/get", // replace with actual path + options: Options( + headers: { + "Content-Type": "application/json", + }, + ), + ); + + if (response.statusCode == 200) { + // Assuming API returns JSON array of beneficiaries + return response.data as List; + } else { + throw Exception("Failed to fetch beneficiaries"); + } + } catch (e) { + print("Error fetching beneficiaries: $e"); + return []; + } + } +} + + diff --git a/lib/features/auth/controllers/theme_cubit.dart b/lib/features/auth/controllers/theme_cubit.dart index 0b17c55..193e6a0 100644 --- a/lib/features/auth/controllers/theme_cubit.dart +++ b/lib/features/auth/controllers/theme_cubit.dart @@ -3,7 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'theme_state.dart'; import 'package:kmobile/config/theme_type.dart'; import 'package:shared_preferences/shared_preferences.dart'; -// import 'package:kmobile/config/themes.dart'; class ThemeCubit extends Cubit { ThemeCubit(): super(ThemeViolet()) { diff --git a/lib/features/beneficiaries/screens/manage_beneficiaries_screen.dart b/lib/features/beneficiaries/screens/manage_beneficiaries_screen.dart index ef8563f..d2b85c1 100644 --- a/lib/features/beneficiaries/screens/manage_beneficiaries_screen.dart +++ b/lib/features/beneficiaries/screens/manage_beneficiaries_screen.dart @@ -3,6 +3,10 @@ import 'package:flutter_svg/svg.dart'; import 'package:kmobile/features/beneficiaries/screens/add_beneficiary_screen.dart'; import 'package:material_symbols_icons/material_symbols_icons.dart'; import '../../../l10n/app_localizations.dart'; +import '../../../di/injection.dart'; +import 'package:kmobile/api/services/beneficiary_service.dart'; +import 'package:shimmer/shimmer.dart'; + class ManageBeneficiariesScreen extends StatefulWidget { const ManageBeneficiariesScreen({super.key}); @@ -12,7 +16,7 @@ class ManageBeneficiariesScreen extends StatefulWidget { _ManageBeneficiariesScreen(); } -class _ManageBeneficiariesScreen extends State { +/*class _ManageBeneficiariesScreen extends State { final List> beneficiaries = [ {'bank': 'State Bank Of India', 'name': 'Trina Bakshi'}, {'bank': 'State Bank Of India', 'name': 'Sheetal Rao'}, @@ -94,3 +98,103 @@ class _ManageBeneficiariesScreen extends State { ); } } +*/ +class _ManageBeneficiariesScreen extends State { + var service = getIt(); + //final BeneficiaryService _service = BeneficiaryService(); + bool _isLoading = true; + List _beneficiaries = []; + + @override + void initState() { + super.initState(); + _loadBeneficiaries(); + } + + Future _loadBeneficiaries() async { + final data = await service.fetchBeneficiaryList(); + setState(() { + _beneficiaries = data; + _isLoading = false; + }); + } + + Widget _buildShimmerList() { + return ListView.builder( + itemCount: 6, + itemBuilder: (context, index) => Shimmer.fromColors( + baseColor: Colors.grey.shade300, + highlightColor: Colors.grey.shade100, + child: ListTile( + leading: CircleAvatar( + radius: 24, + backgroundColor: Colors.white, + ), + title: Container( + height: 16, + color: Colors.white, + margin: const EdgeInsets.symmetric(vertical: 4), + ), + subtitle: Container( + height: 14, + color: Colors.white, + margin: const EdgeInsets.symmetric(vertical: 4), + ), + ), + ), + ); + } + + Widget _buildBeneficiaryList() { + if (_beneficiaries.isEmpty) { + return Center(child: Text(AppLocalizations.of(context).noBeneficiaryFound)); + } + return ListView.builder( + itemCount: _beneficiaries.length, + itemBuilder: (context, index) { + final item = _beneficiaries[index]; + return ListTile( + leading: CircleAvatar( + radius: 24, + backgroundColor: Theme.of(context).primaryColor.withOpacity(0.2), + child: Text( + item['name'] != null && item['name'].isNotEmpty + ? item['name'][0].toUpperCase() + : '?', + style: const TextStyle(fontWeight: FontWeight.bold), + ), + ), + title: Text(item['name'] ?? 'Unknown'), + subtitle: Text(item['accountNumber'] ?? 'No account number'), + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(AppLocalizations.of(context).beneficiaries), + ), + body: _isLoading ? _buildShimmerList() : _buildBeneficiaryList(), + floatingActionButton: Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const AddBeneficiaryScreen(), + ), + ); + }, + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + foregroundColor: Theme.of(context).primaryColor, + elevation: 5, + child: const Icon(Icons.add), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c2fbe2e..64b08c6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -227,6 +227,7 @@ "invalidIfsc": "Invalid IFSC code", "validIfsc": "Valid IFSC", "beneficiaryAddedSuccess": "Beneficiary Added Successfully", - "beneficiaryAdditionFailed": "Beneficiary Addition Failed" + "beneficiaryAdditionFailed": "Beneficiary Addition Failed", + "noBeneficiaryFound": "No beneficiaries found" } diff --git a/lib/l10n/app_hi.arb b/lib/l10n/app_hi.arb index 724e901..aa5b049 100644 --- a/lib/l10n/app_hi.arb +++ b/lib/l10n/app_hi.arb @@ -227,5 +227,6 @@ "invalidIfsc": "अमान्य IFSC कोड", "validIfsc": "मान्य IFSC", "beneficiaryAddedSuccess": "लाभार्थी सफलतापूर्वक जोड़ा गया", - "beneficiaryAdditionFailed": "लाभार्थी जोड़ने में विफल" + "beneficiaryAdditionFailed": "लाभार्थी जोड़ने में विफल", + "noBeneficiaryFound": "कोई लाभार्थी नहीं मिला" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index fc2a865..8593d7b 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -1390,6 +1390,12 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Beneficiary Addition Failed'** String get beneficiaryAdditionFailed; + + /// No description provided for @noBeneficiaryFound. + /// + /// In en, this message translates to: + /// **'No beneficiaries found'** + String get noBeneficiaryFound; } class _AppLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index e3065a0..9495354 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -655,4 +655,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get beneficiaryAdditionFailed => 'Beneficiary Addition Failed'; + + @override + String get noBeneficiaryFound => 'No beneficiaries found'; } diff --git a/lib/l10n/app_localizations_hi.dart b/lib/l10n/app_localizations_hi.dart index 76849b9..2929a4a 100644 --- a/lib/l10n/app_localizations_hi.dart +++ b/lib/l10n/app_localizations_hi.dart @@ -655,4 +655,7 @@ class AppLocalizationsHi extends AppLocalizations { @override String get beneficiaryAdditionFailed => 'लाभार्थी जोड़ने में विफल'; + + @override + String get noBeneficiaryFound => 'कोई लाभार्थी नहीं मिला'; }