diff --git a/lib/screens/bookmarks/provider/bookmarks.provider.dart b/lib/screens/bookmarks/provider/bookmarks.provider.dart index 63827e1..c4c9065 100644 --- a/lib/screens/bookmarks/provider/bookmarks.provider.dart +++ b/lib/screens/bookmarks/provider/bookmarks.provider.dart @@ -118,8 +118,9 @@ class Bookmarks extends _$Bookmarks { bookmark: bookmark, apiClient: ref.read(apiClientProvider)!, ); - if (result != null) { - state.bookmarks = state.bookmarks.map((b) => b.id == result.id ? result : b).toList(); + if (result == true) { + // On this case the bookmark always will pass from unarchived to archived + state.bookmarks = state.bookmarks.where((b) => b.id != bookmark.id).toList(); ref.notifyListeners(); } } diff --git a/lib/screens/bookmarks/provider/common_functions.dart b/lib/screens/bookmarks/provider/common_functions.dart index f7aa886..8c8d6c3 100644 --- a/lib/screens/bookmarks/provider/common_functions.dart +++ b/lib/screens/bookmarks/provider/common_functions.dart @@ -75,30 +75,21 @@ class BookmarkCommonFunctions { } } - static Future archiveUnarchive({ + static Future archiveUnarchive({ required AutoDisposeNotifierProviderRef ref, required Bookmark bookmark, required ApiClientService apiClient, }) async { final processModal = ProcessModal(); processModal.open( - bookmark.unread == true - ? t.bookmarks.bookmarkOptions.archivingBookmark - : t.bookmarks.bookmarkOptions.unarchivingBookmark, + bookmark.isArchived == true + ? t.bookmarks.bookmarkOptions.unarchivingBookmark + : t.bookmarks.bookmarkOptions.archivingBookmark, ); - final result = await apiClient.putUpdateBookmark( - bookmark.id!, - SetBookmarkData( - url: bookmark.url!, - description: bookmark.description ?? '', - unread: bookmark.unread ?? false, - shared: bookmark.shared ?? false, - isArchived: bookmark.isArchived == true ? false : true, - tagNames: bookmark.tagNames?.join(",") ?? '', - title: bookmark.title ?? '', - ), - ); + final result = bookmark.isArchived == true + ? await apiClient.postUnrchiveBookmark(bookmark.id!) + : await apiClient.postArchiveBookmark(bookmark.id!); processModal.close(); if (result.successful == true) { @@ -108,7 +99,6 @@ class BookmarkCommonFunctions { : t.bookmarks.bookmarkOptions.bookmarkArchivedSuccessfully, color: Colors.green, ); - return result.content; } else { ref.read(snackbarProvider.notifier).showSnacbkar( label: bookmark.isArchived == true @@ -116,7 +106,7 @@ class BookmarkCommonFunctions { : t.bookmarks.bookmarkOptions.bookmarkNotArchived, color: Colors.red, ); - return null; } + return result.successful; } } diff --git a/lib/screens/bookmarks/provider/search_bookmarks.provider.dart b/lib/screens/bookmarks/provider/search_bookmarks.provider.dart index e47c7a4..1627847 100644 --- a/lib/screens/bookmarks/provider/search_bookmarks.provider.dart +++ b/lib/screens/bookmarks/provider/search_bookmarks.provider.dart @@ -129,17 +129,18 @@ class SearchBookmarks extends _$SearchBookmarks { } void archiveUnarchive(Bookmark bookmark) async { - final result = await BookmarkCommonFunctions.markAsReadUnread( + final result = await BookmarkCommonFunctions.archiveUnarchive( ref: ref, bookmark: bookmark, apiClient: ref.read(apiClientProvider)!, ); - if (result != null) { - state.bookmarks = state.bookmarks.map((b) => b.id == result.id ? result : b).toList(); + if (result == true) { + // On this case the bookmark always will pass from unarchived to archived + state.bookmarks = state.bookmarks.where((b) => b.id != bookmark.id).toList(); ref.notifyListeners(); ref .read(bookmarksProvider.notifier) - .setBookmarks(ref.read(bookmarksProvider).bookmarks.map((b) => b.id == result.id ? result : b).toList()); + .setBookmarks(ref.read(bookmarksProvider).bookmarks.where((b) => b.id != bookmark.id).toList()); } } } diff --git a/lib/screens/bookmarks/ui/bookmark_item.dart b/lib/screens/bookmarks/ui/bookmark_item.dart index 49a899f..36e0015 100644 --- a/lib/screens/bookmarks/ui/bookmark_item.dart +++ b/lib/screens/bookmarks/ui/bookmark_item.dart @@ -20,12 +20,14 @@ class BookmarkItem extends ConsumerWidget { final Bookmark bookmark; final void Function(Bookmark bookmark) onDelete; final void Function(Bookmark bookmark) onReadUnread; + final void Function(Bookmark bookmark) onArchiveUnarchive; const BookmarkItem({ Key? key, required this.bookmark, required this.onDelete, required this.onReadUnread, + required this.onArchiveUnarchive, }) : super(key: key); @override @@ -45,7 +47,7 @@ class BookmarkItem extends ConsumerWidget { groupTag: ConfigOptions.slidableGroupTag, startActionPane: ActionPane( motion: const DrawerMotion(), - extentRatio: 0.5, + extentRatio: 0.75, children: [ SlidableAction( onPressed: (_) => onReadUnread(bookmark), @@ -54,13 +56,13 @@ class BookmarkItem extends ConsumerWidget { icon: bookmark.unread == true ? Icons.mark_email_read_rounded : Icons.mark_as_unread_rounded, padding: const EdgeInsets.all(4), ), - // SlidableAction( - // onPressed: (ctx) => {}, - // backgroundColor: Colors.grey, - // label: t.bookmarks.bookmarkOptions.archive, - // icon: Icons.archive_rounded, - // padding: const EdgeInsets.all(4), - // ), + SlidableAction( + onPressed: (ctx) => onArchiveUnarchive(bookmark), + backgroundColor: Colors.grey, + label: t.bookmarks.bookmarkOptions.archive, + icon: Icons.archive_rounded, + padding: const EdgeInsets.all(4), + ), SlidableAction( onPressed: (ctx) => Share.shareUri(Uri.parse(bookmark.url!)), backgroundColor: Colors.orange, diff --git a/lib/screens/bookmarks/ui/bookmarks.dart b/lib/screens/bookmarks/ui/bookmarks.dart index 945afc7..08736a7 100644 --- a/lib/screens/bookmarks/ui/bookmarks.dart +++ b/lib/screens/bookmarks/ui/bookmarks.dart @@ -134,6 +134,7 @@ class BookmarksScreen extends ConsumerWidget { onDelete: ref.read(bookmarksProvider.notifier).deleteBookmark, ), ), + onArchiveUnarchive: ref.read(bookmarksProvider.notifier).archiveUnarchive, ); }, ), diff --git a/lib/screens/bookmarks/ui/search_bookmarks.dart b/lib/screens/bookmarks/ui/search_bookmarks.dart index 74bfe0e..362cc6a 100644 --- a/lib/screens/bookmarks/ui/search_bookmarks.dart +++ b/lib/screens/bookmarks/ui/search_bookmarks.dart @@ -124,6 +124,7 @@ class SearchBookmarksScreen extends ConsumerWidget { onDelete: ref.read(searchBookmarksProvider.notifier).deleteBookmark, ), ), + onArchiveUnarchive: ref.read(searchBookmarksProvider.notifier).archiveUnarchive, ); }, ), diff --git a/lib/screens/tag_bookmarks/provider/tag_bookmarks.provider.dart b/lib/screens/tag_bookmarks/provider/tag_bookmarks.provider.dart index 637f0f3..21cf83f 100644 --- a/lib/screens/tag_bookmarks/provider/tag_bookmarks.provider.dart +++ b/lib/screens/tag_bookmarks/provider/tag_bookmarks.provider.dart @@ -122,13 +122,14 @@ class TagBookmarks extends _$TagBookmarks { } void archiveUnarchive(Bookmark bookmark) async { - final result = await BookmarkCommonFunctions.markAsReadUnread( + final result = await BookmarkCommonFunctions.archiveUnarchive( ref: ref, bookmark: bookmark, apiClient: ref.read(apiClientProvider)!, ); - if (result != null) { - state.bookmarks = state.bookmarks.map((b) => b.id == result.id ? result : b).toList(); + if (result == true) { + // On this case the bookmark always will pass from unarchived to archived + state.bookmarks = state.bookmarks.where((b) => b.id != bookmark.id).toList(); ref.notifyListeners(); } } diff --git a/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart b/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart index fbc0e7f..c93a7c3 100644 --- a/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart +++ b/lib/screens/tag_bookmarks/ui/tag_bookmarks.dart @@ -139,6 +139,7 @@ class TagBookmarksScreenState extends ConsumerState { onDelete: ref.read(tagBookmarksProvider.notifier).deleteBookmark, ), ), + onArchiveUnarchive: ref.read(tagBookmarksProvider.notifier).archiveUnarchive, ); }, ), diff --git a/lib/services/api_client.dart b/lib/services/api_client.dart index dc9a8a5..ef13a47 100644 --- a/lib/services/api_client.dart +++ b/lib/services/api_client.dart @@ -46,6 +46,8 @@ class ApiClientService { successful: true, content: BookmarksResponse.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -64,6 +66,8 @@ class ApiClientService { successful: true, content: CheckBookmark.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -80,6 +84,8 @@ class ApiClientService { successful: true, content: Bookmark.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -100,6 +106,8 @@ class ApiClientService { successful: true, content: TagsResponse.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -116,6 +124,8 @@ class ApiClientService { successful: true, content: Tag.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -129,6 +139,8 @@ class ApiClientService { successful: true, content: Tag.fromJson(response.data), ); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -139,6 +151,8 @@ class ApiClientService { try { await dioInstance.delete("/bookmarks/$bookmarkId/"); return const ApiResponse(successful: true); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false); @@ -155,6 +169,32 @@ class ApiClientService { successful: true, content: Bookmark.fromJson(result.data), ); + } on DioException { + return const ApiResponse(successful: false); + } catch (e, stackTrace) { + Sentry.captureException(e, stackTrace: stackTrace); + return const ApiResponse(successful: false); + } + } + + Future> postArchiveBookmark(int bookmarkId) async { + try { + await dioInstance.post("/bookmarks/$bookmarkId/archive/"); + return const ApiResponse(successful: true); + } on DioException { + return const ApiResponse(successful: false); + } catch (e, stackTrace) { + Sentry.captureException(e, stackTrace: stackTrace); + return const ApiResponse(successful: false); + } + } + + Future> postUnrchiveBookmark(int bookmarkId) async { + try { + await dioInstance.post("/bookmarks/$bookmarkId/unarchive/"); + return const ApiResponse(successful: true); + } on DioException { + return const ApiResponse(successful: false); } catch (e, stackTrace) { Sentry.captureException(e, stackTrace: stackTrace); return const ApiResponse(successful: false);