From 54e8f801838b6393610954e094de0aa2a4648924 Mon Sep 17 00:00:00 2001 From: Rohit Karadkar Date: Tue, 9 Jun 2026 08:56:10 +0530 Subject: [PATCH] feat: intercept bookmark action on Search screen to show note dialog Co-Authored-By: Claude --- .../feature/search/impl/SearchScreen.kt | 23 ++++++++++++++++++- .../feature/search/impl/SearchViewModel.kt | 9 ++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchScreen.kt b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchScreen.kt index bb7164f2a..85452cb21 100644 --- a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchScreen.kt +++ b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchScreen.kt @@ -52,7 +52,9 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.focus.FocusRequester @@ -80,6 +82,7 @@ import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.google.samples.apps.nowinandroid.core.ui.BookmarkNoteDialog import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.DraggableScrollbar import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.rememberDraggableScroller import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.scrollbarState @@ -106,6 +109,9 @@ internal fun SearchScreen( val recentSearchQueriesUiState by searchViewModel.recentSearchQueriesUiState.collectAsStateWithLifecycle() val searchResultUiState by searchViewModel.searchResultUiState.collectAsStateWithLifecycle() val searchQuery by searchViewModel.searchQuery.collectAsStateWithLifecycle() + + var pendingBookmarkId by remember { mutableStateOf(null) } + SearchScreen( modifier = modifier, searchQuery = searchQuery, @@ -114,13 +120,28 @@ internal fun SearchScreen( onSearchQueryChanged = searchViewModel::onSearchQueryChanged, onSearchTriggered = searchViewModel::onSearchTriggered, onClearRecentSearches = searchViewModel::clearRecentSearches, - onNewsResourcesCheckedChanged = searchViewModel::setNewsResourceBookmarked, + onNewsResourcesCheckedChanged = { id, checked -> + if (checked) { + pendingBookmarkId = id + } else { + searchViewModel.setNewsResourceBookmarked(id, false) + } + }, onNewsResourceViewed = { searchViewModel.setNewsResourceViewed(it, true) }, onFollowButtonClick = searchViewModel::followTopic, onBackClick = onBackClick, onInterestsClick = onInterestsClick, onTopicClick = onTopicClick, ) + + pendingBookmarkId?.let { id -> + BookmarkNoteDialog( + onDismiss = { note -> + searchViewModel.bookmarkWithNote(id, note) + pendingBookmarkId = null + }, + ) + } } @Composable diff --git a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchViewModel.kt b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchViewModel.kt index 13628de70..e6750084d 100644 --- a/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchViewModel.kt +++ b/feature/search/impl/src/main/kotlin/com/google/samples/apps/nowinandroid/feature/search/impl/SearchViewModel.kt @@ -121,6 +121,15 @@ class SearchViewModel @Inject constructor( } } + fun bookmarkWithNote(newsResourceId: String, note: String) { + viewModelScope.launch { + userDataRepository.setNewsResourceBookmarked(newsResourceId, true) + if (note.isNotBlank()) { + userDataRepository.setBookmarkNote(newsResourceId, note) + } + } + } + fun followTopic(followedTopicId: String, followed: Boolean) { viewModelScope.launch { userDataRepository.setTopicIdFollowed(followedTopicId, followed)