feat: add selection state to BookmarksViewModel with enter/exit/toggle/selectAll

Co-Authored-By: Claude <noreply@anthropic.com>
pull/2125/head
Rohit Karadkar 1 week ago
parent f80446c3d6
commit 6727e89415

@ -44,6 +44,31 @@ class BookmarksViewModel @Inject constructor(
var shouldDisplayUndoBookmark by mutableStateOf(false)
private var lastRemovedBookmarkId: String? = null
var isInSelectionMode by mutableStateOf(false)
private set
var selectedIds by mutableStateOf(emptySet<String>())
private set
fun enterSelectionMode(initialId: String) {
isInSelectionMode = true
selectedIds = setOf(initialId)
}
fun exitSelectionMode() {
isInSelectionMode = false
selectedIds = emptySet()
}
fun toggleSelection(id: String) {
selectedIds = if (id in selectedIds) selectedIds - id else selectedIds + id
}
fun selectAll() {
val currentFeed = (feedUiState.value as? NewsFeedUiState.Success)?.feed ?: return
selectedIds = currentFeed.map { it.id }.toSet()
}
val feedUiState: StateFlow<NewsFeedUiState> =
userNewsResourceRepository.observeAllBookmarked()
.map<List<UserNewsResource>, NewsFeedUiState>(NewsFeedUiState::Success)

@ -112,6 +112,30 @@ class BookmarksViewModelTest {
assertTrue(item.feed.first().hasBeenViewed)
}
@Test
fun enterSelectionMode_setsSelectedId() = runTest {
viewModel.enterSelectionMode("news1")
assertTrue(viewModel.isInSelectionMode)
assertEquals(setOf("news1"), viewModel.selectedIds)
}
@Test
fun toggleSelection_addsAndRemovesId() = runTest {
viewModel.enterSelectionMode("news1")
viewModel.toggleSelection("news2")
assertEquals(setOf("news1", "news2"), viewModel.selectedIds)
viewModel.toggleSelection("news1")
assertEquals(setOf("news2"), viewModel.selectedIds)
}
@Test
fun exitSelectionMode_clearsState() = runTest {
viewModel.enterSelectionMode("news1")
viewModel.exitSelectionMode()
assertFalse(viewModel.isInSelectionMode)
assertTrue(viewModel.selectedIds.isEmpty())
}
@Test
fun feedUiState_undoneBookmarkRemoval_bookmarkIsRestored() = runTest {
backgroundScope.launch(UnconfinedTestDispatcher()) { viewModel.feedUiState.collect() }

Loading…
Cancel
Save