diff --git a/lib/config/options.dart b/lib/config/options.dart index a1c5dbb..e7b3009 100644 --- a/lib/config/options.dart +++ b/lib/config/options.dart @@ -1,3 +1,4 @@ class ConfigOptions { static const int listLimit = 20; + static const String slidableGroupTag = "bookmarksSlidable"; } diff --git a/lib/screens/bookmarks/ui/bookmark_item.dart b/lib/screens/bookmarks/ui/bookmark_item.dart index 0ff6575..49a899f 100644 --- a/lib/screens/bookmarks/ui/bookmark_item.dart +++ b/lib/screens/bookmarks/ui/bookmark_item.dart @@ -7,6 +7,7 @@ import 'package:flutter_svg/flutter_svg.dart'; import 'package:linkdy/screens/bookmarks/provider/favicon_loader.provider.dart'; +import 'package:linkdy/config/options.dart'; import 'package:linkdy/i18n/strings.g.dart'; import 'package:linkdy/models/data/bookmarks.dart'; import 'package:linkdy/providers/app_status.provider.dart'; @@ -40,6 +41,8 @@ class BookmarkItem extends ConsumerWidget { } return Slidable( + key: ValueKey(bookmark.id!), + groupTag: ConfigOptions.slidableGroupTag, startActionPane: ActionPane( motion: const DrawerMotion(), extentRatio: 0.5, diff --git a/lib/screens/bookmarks/ui/bookmarks.dart b/lib/screens/bookmarks/ui/bookmarks.dart index 181fb48..899277e 100644 --- a/lib/screens/bookmarks/ui/bookmarks.dart +++ b/lib/screens/bookmarks/ui/bookmarks.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:linkdy/constants/enums.dart'; import 'package:linkdy/screens/bookmarks/provider/bookmarks.provider.dart'; @@ -106,34 +107,36 @@ class BookmarksScreen extends ConsumerWidget { ), ), if (bookmarks.bookmarks.isNotEmpty) - SliverList.builder( - itemCount: bookmarks.bookmarks.length + 1, - itemBuilder: (context, index) { - // index == bookmarks.value!.content!.results!.length -> itemCount + 1 - if (index == bookmarks.bookmarks.length) { - if (bookmarks.loadingMore) { - return const SizedBox( - height: 80, - child: Center( - child: CircularProgressIndicator(), - ), - ); + SlidableAutoCloseBehavior( + child: SliverList.builder( + itemCount: bookmarks.bookmarks.length + 1, + itemBuilder: (context, index) { + // index == bookmarks.value!.content!.results!.length -> itemCount + 1 + if (index == bookmarks.bookmarks.length) { + if (bookmarks.loadingMore) { + return const SizedBox( + height: 80, + child: Center( + child: CircularProgressIndicator(), + ), + ); + } + // Bottom gap for FAB + return const SizedBox(height: 80); } - // Bottom gap for FAB - return const SizedBox(height: 80); - } - return BookmarkItem( - bookmark: bookmarks.bookmarks[index], - onReadUnread: ref.read(bookmarksProvider.notifier).markAsReadUnread, - onDelete: (bookmark) => showDialog( - context: context, - builder: (context) => DeleteBookmarkModal( - bookmark: bookmark, - onDelete: ref.read(bookmarksProvider.notifier).deleteBookmark, + return BookmarkItem( + bookmark: bookmarks.bookmarks[index], + onReadUnread: ref.read(bookmarksProvider.notifier).markAsReadUnread, + onDelete: (bookmark) => showDialog( + context: context, + builder: (context) => DeleteBookmarkModal( + bookmark: bookmark, + onDelete: ref.read(bookmarksProvider.notifier).deleteBookmark, + ), ), - ), - ); - }, + ); + }, + ), ), ], ), diff --git a/lib/screens/bookmarks/ui/search_bookmarks.dart b/lib/screens/bookmarks/ui/search_bookmarks.dart index 3521c84..74bfe0e 100644 --- a/lib/screens/bookmarks/ui/search_bookmarks.dart +++ b/lib/screens/bookmarks/ui/search_bookmarks.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:linkdy/screens/bookmarks/provider/search_bookmarks.provider.dart'; import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart'; @@ -101,29 +102,31 @@ class SearchBookmarksScreen extends ConsumerWidget { return NotificationListener( onNotification: scrollListener, - child: ListView.builder( - itemCount: provider.loadingMore ? provider.bookmarks.length + 1 : provider.bookmarks.length, - itemBuilder: (context, index) { - if (provider.loadingMore == true && index == provider.bookmarks.length) { - return const Padding( - padding: EdgeInsets.all(16), - child: Center( - child: CircularProgressIndicator(), + child: SlidableAutoCloseBehavior( + child: ListView.builder( + itemCount: provider.loadingMore ? provider.bookmarks.length + 1 : provider.bookmarks.length, + itemBuilder: (context, index) { + if (provider.loadingMore == true && index == provider.bookmarks.length) { + return const Padding( + padding: EdgeInsets.all(16), + child: Center( + child: CircularProgressIndicator(), + ), + ); + } + return BookmarkItem( + bookmark: provider.bookmarks[index], + onReadUnread: ref.read(searchBookmarksProvider.notifier).markAsReadUnread, + onDelete: (bookmark) => showDialog( + context: context, + builder: (context) => DeleteBookmarkModal( + bookmark: bookmark, + onDelete: ref.read(searchBookmarksProvider.notifier).deleteBookmark, + ), ), ); - } - return BookmarkItem( - bookmark: provider.bookmarks[index], - onReadUnread: ref.read(searchBookmarksProvider.notifier).markAsReadUnread, - onDelete: (bookmark) => showDialog( - context: context, - builder: (context) => DeleteBookmarkModal( - bookmark: bookmark, - onDelete: ref.read(searchBookmarksProvider.notifier).deleteBookmark, - ), - ), - ); - }, + }, + ), ), ); }, diff --git a/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart b/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart index cc04053..fbc0e7f 100644 --- a/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart +++ b/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:linkdy/screens/bookmarks/ui/bookmark_item.dart'; import 'package:linkdy/screens/bookmarks/ui/delete_bookmark_modal.dart'; @@ -115,30 +116,32 @@ class TagBookmarksScreenState extends ConsumerState { ), ), if (provider.bookmarks.isNotEmpty) - SliverList.builder( - itemCount: - provider.loadingMore == true ? provider.bookmarks.length + 1 : provider.bookmarks.length, - itemBuilder: (context, index) { - if (provider.loadingMore == true && index == provider.bookmarks.length) { - return const Padding( - padding: EdgeInsets.all(16), - child: Center( - child: CircularProgressIndicator(), + SlidableAutoCloseBehavior( + child: SliverList.builder( + itemCount: + provider.loadingMore == true ? provider.bookmarks.length + 1 : provider.bookmarks.length, + itemBuilder: (context, index) { + if (provider.loadingMore == true && index == provider.bookmarks.length) { + return const Padding( + padding: EdgeInsets.all(16), + child: Center( + child: CircularProgressIndicator(), + ), + ); + } + return BookmarkItem( + bookmark: provider.bookmarks[index], + onReadUnread: ref.read(tagBookmarksProvider.notifier).markAsReadUnread, + onDelete: (bookmark) => showDialog( + context: context, + builder: (context) => DeleteBookmarkModal( + bookmark: bookmark, + onDelete: ref.read(tagBookmarksProvider.notifier).deleteBookmark, + ), ), ); - } - return BookmarkItem( - bookmark: provider.bookmarks[index], - onReadUnread: ref.read(tagBookmarksProvider.notifier).markAsReadUnread, - onDelete: (bookmark) => showDialog( - context: context, - builder: (context) => DeleteBookmarkModal( - bookmark: bookmark, - onDelete: ref.read(tagBookmarksProvider.notifier).deleteBookmark, - ), - ), - ); - }, + }, + ), ), ], ),