import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../l10n/app_localizations.dart'; import '../model/collection.dart'; import '../service/bookmarks_provider.dart'; import '../service/shared_link_provider.dart'; import '../service/storage.dart'; import '../widgets/create_bookmark_collection_dialog.dart'; import 'collection_page.dart'; import 'search_page.dart' show SearchPage; class CollectionsListPage extends StatefulWidget { const CollectionsListPage({super.key}); static const String routeName = '/collections'; @override State createState() => _CollectionsListPageState(); } class _CollectionsListPageState extends State { bool addingNewBookmark = false; final bookmarkCountMap = Storage.loadPerCollectionBookmarkCount(); Widget bottomSheetBuilder(BuildContext context) { final titleTextFieldController = TextEditingController( text: context .read() .currentMapsLinkMetadata! .placeName, ); return SizedBox( height: 200, child: TextField(controller: titleTextFieldController), ); } void onAddButtonPressed() => showDialog( context: context, builder: (context) => CreateBookmarkCollectionDialog(onSavePressed: onCollectionSaved), ); void onCollectionSaved(Collection collection) { Storage.addOrUpdateCollection(collection); setState(() {}); } Widget collectionsListItemBuilder( BuildContext context, Collection collection, ) { return ListTile( title: Text(collection.name), onTap: () => navigateToCollection(collection.id), onLongPress: () => onEditCollection(collection), leading: const Icon(Icons.list_rounded), trailing: Text( bookmarkCountMap[collection.id]?.toString() ?? '0', style: Theme.of(context).textTheme.bodyMedium, ), ); } void navigateToCollection(int collectionId) { BookmarksProvider.selectedCollectionId = collectionId; Navigator.pushNamed(context, CollectionPage.routeName); } void onEditCollection(Collection selectedCollection) => showDialog( context: context, builder: (context) => CreateBookmarkCollectionDialog( selectedCollection: selectedCollection, onSavePressed: onCollectionSaved, onDeletePressed: () { Storage.deleteCollection( selectedCollection, ).whenComplete(() => setState(() {})); }, ), ); @override Widget build(BuildContext context) { final collections = Storage.loadCollections(); final provider = context.watch(); addingNewBookmark = provider.currentMapsLinkMetadata != null; return Scaffold( appBar: AppBar( title: addingNewBookmark ? Text(AppLocalizations.of(context)!.chooseCollection) : Text(AppLocalizations.of(context)!.collections), actions: [ if (addingNewBookmark) TextButton( onPressed: () => provider.removeCurrentMapsLink(), child: Text(AppLocalizations.of(context)!.cancel), ) else IconButton( onPressed: () => Navigator.of(context).pushNamed(SearchPage.routeName), icon: Icon(Icons.search), ), ], ), floatingActionButton: FloatingActionButton( onPressed: onAddButtonPressed, child: Icon(Icons.add), ), body: collections.isNotEmpty ? ListView.builder( itemBuilder: (context, index) => collectionsListItemBuilder( context, collections.elementAt(index), ), itemCount: collections.length, ) : Center( child: Text(AppLocalizations.of(context)!.tipCreateCollections), ), ); } }