From c46a43aa4e52f592b3589329d5f7686027997468 Mon Sep 17 00:00:00 2001 From: Florian Griffon Date: Sun, 15 Dec 2024 03:25:44 +0100 Subject: [PATCH] feat: favorite page --- .../lib/features/contacts/contact_page.dart | 6 ++- .../lib/features/contacts/contact_state.dart | 46 +++++++++++++------ .../widgets/alphabet_scroll_page.dart | 15 +++--- .../features/favorites/favorites_page.dart | 31 ++++++++----- dialer/lib/features/home/home_page.dart | 2 +- 5 files changed, 65 insertions(+), 35 deletions(-) diff --git a/dialer/lib/features/contacts/contact_page.dart b/dialer/lib/features/contacts/contact_page.dart index 93acc45..9f09490 100644 --- a/dialer/lib/features/contacts/contact_page.dart +++ b/dialer/lib/features/contacts/contact_page.dart @@ -17,8 +17,10 @@ class _ContactPageState extends State { return Scaffold( body: contactState.loading ? const LoadingIndicatorWidget() - // : ContactListWidget(contacts: contactState.contacts), - : AlphabetScrollPage(scrollOffset: contactState.scrollOffset), + : AlphabetScrollPage( + scrollOffset: contactState.scrollOffset, + contacts: contactState.contacts, // Use all contacts here + ), ); } } diff --git a/dialer/lib/features/contacts/contact_state.dart b/dialer/lib/features/contacts/contact_state.dart index 75e70d8..82e21c2 100644 --- a/dialer/lib/features/contacts/contact_state.dart +++ b/dialer/lib/features/contacts/contact_state.dart @@ -19,12 +19,15 @@ class ContactState extends StatefulWidget { class _ContactStateState extends State { final ContactService _contactService = ContactService(); - List _contacts = []; + List _allContacts = []; + List _favoriteContacts = []; bool _loading = true; double _scrollOffset = 0.0; Contact? _selfContact = Contact(); - List get contacts => _contacts; + // Getters for all contacts and favorites + List get contacts => _allContacts; + List get favoriteContacts => _favoriteContacts; bool get loading => _loading; double get scrollOffset => _scrollOffset; Contact? get selfContact => _selfContact; @@ -32,9 +35,7 @@ class _ContactStateState extends State { @override void initState() { super.initState(); - fetchContacts(); - - // Add listener for contact changes + fetchContacts(); // Fetch all contacts by default FlutterContacts.addListener(_onContactChange); } @@ -42,20 +43,33 @@ class _ContactStateState extends State { @override void dispose() { - // Remove listener FlutterContacts.removeListener(_onContactChange); super.dispose(); } - Future fetchContacts({bool onlyStarred = false}) async { - List contacts = onlyStarred - ? await _contactService.fetchFavoriteContacts() - : await _contactService.fetchContacts(); + // Fetch all contacts + Future fetchContacts() async { + setState(() => _loading = true); + try { + List contacts = await _contactService.fetchContacts(); + _processContacts(contacts); + } finally { + setState(() => _loading = false); + } + } - debugPrint( - "Fetched ${contacts.length} ${onlyStarred ? 'favorite' : ''} contacts"); + // Fetch only favorite contacts + Future fetchFavoriteContacts() async { + setState(() => _loading = true); + try { + List contacts = await _contactService.fetchFavoriteContacts(); + setState(() => _favoriteContacts = contacts); + } finally { + setState(() => _loading = false); + } + } - // Find selfContact before filtering + void _processContacts(List contacts) { _selfContact = contacts.firstWhere( (contact) => contact.displayName.toLowerCase() == "user", orElse: () => Contact(), @@ -70,8 +84,9 @@ class _ContactStateState extends State { contacts.sort((a, b) => a.displayName.compareTo(b.displayName)); setState(() { - _contacts = contacts; - _loading = false; + _allContacts = contacts; + _favoriteContacts = + contacts.where((contact) => contact.isStarred).toList(); _selfContact = _selfContact; }); } @@ -96,6 +111,7 @@ class _ContactStateState extends State { } } + class _InheritedContactState extends InheritedWidget { final _ContactStateState data; diff --git a/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart b/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart index 24794a8..3ed3fc4 100644 --- a/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart +++ b/dialer/lib/features/contacts/widgets/alphabet_scroll_page.dart @@ -11,8 +11,13 @@ import 'share_own_qr.dart'; class AlphabetScrollPage extends StatefulWidget { final double scrollOffset; + final List contacts; - const AlphabetScrollPage({super.key, required this.scrollOffset}); + const AlphabetScrollPage({ + super.key, + required this.scrollOffset, + required this.contacts, + }); @override _AlphabetScrollPageState createState() => _AlphabetScrollPageState(); @@ -24,8 +29,7 @@ class _AlphabetScrollPageState extends State { @override void initState() { super.initState(); - _scrollController = - ScrollController(initialScrollOffset: widget.scrollOffset); + _scrollController = ScrollController(initialScrollOffset: widget.scrollOffset); _scrollController.addListener(_onScroll); } @@ -73,9 +77,8 @@ class _AlphabetScrollPageState extends State { @override Widget build(BuildContext context) { - final contactState = ContactState.of(context); - final contacts = contactState.contacts; - final selfContact = contactState.selfContact; + final contacts = widget.contacts; + final selfContact = ContactState.of(context).selfContact; final contactState = ContactState.of(context); final contacts = contactState.contacts; diff --git a/dialer/lib/features/favorites/favorites_page.dart b/dialer/lib/features/favorites/favorites_page.dart index 48227c5..47f74ec 100644 --- a/dialer/lib/features/favorites/favorites_page.dart +++ b/dialer/lib/features/favorites/favorites_page.dart @@ -1,23 +1,32 @@ +import 'package:dialer/features/contacts/contact_state.dart'; +import 'package:dialer/features/contacts/widgets/alphabet_scroll_page.dart'; import 'package:flutter/material.dart'; +import 'package:dialer/widgets/loading_indicator.dart'; -class FavoritePage extends StatefulWidget { - const FavoritePage({super.key}); +class FavoritesPage extends StatefulWidget { + const FavoritesPage({super.key}); @override - _FavoritePageState createState() => _FavoritePageState(); + _FavoritesPageState createState() => _FavoritesPageState(); } -class _FavoritePageState extends State { +class _FavoritesPageState extends State { + @override + void initState() { + super.initState(); + } + @override Widget build(BuildContext context) { + final contactState = ContactState.of(context); return Scaffold( - backgroundColor: Colors.black, - body: Center( // Center the text within the body - child: Text( - "Hello", - style: TextStyle(color: Colors.white), // Change text color for visibility - ), - ), + body: contactState.loading + ? const LoadingIndicatorWidget() + : AlphabetScrollPage( + scrollOffset: contactState.scrollOffset, + contacts: + contactState.favoriteContacts, // Use only favorites here + ), ); } } diff --git a/dialer/lib/features/home/home_page.dart b/dialer/lib/features/home/home_page.dart index 5552388..99328cb 100644 --- a/dialer/lib/features/home/home_page.dart +++ b/dialer/lib/features/home/home_page.dart @@ -140,7 +140,7 @@ class _MyHomePageState extends State TabBarView( controller: _tabController, children: const [ - FavoritePage(), + FavoritesPage(), HistoryPage(), ContactPage(), SettingsPage(), // Add your SettingsPage here