toggle method

Future<void> toggle({
  1. required BookmarkKind kind,
  2. required String targetId,
})

Toggle the bookmark for targetId of the given kind. After the write succeeds, invalidates bookmarksProvider and the matching isBookmarkedProvider so dependent UI refreshes.

Implementation

Future<void> toggle({
  required BookmarkKind kind,
  required String targetId,
}) async {
  final ds = ref.read(supabaseDatasourceProvider);
  final wasBookmarked = await ds.isBookmarked(kind: kind, targetId: targetId);
  state = const AsyncLoading();
  try {
    if (wasBookmarked) {
      await ds.deleteBookmarkByTarget(kind: kind, targetId: targetId);
    } else {
      await ds.createBookmark(kind: kind, targetId: targetId);
    }
    state = const AsyncData(null);
    // Refresh dependent reads.
    ref.invalidate(bookmarksProvider);
    ref.invalidate(isBookmarkedProvider(kind: kind, targetId: targetId));
  } catch (e, st) {
    state = AsyncError(e, st);
    rethrow;
  }
}