feat: intercept bookmark action on Search screen to show note dialog

Co-Authored-By: Claude <noreply@anthropic.com>
pull/2125/head
Rohit Karadkar 3 months ago
parent db1a8e9201
commit 54e8f80183

@ -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<String?>(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

@ -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)

Loading…
Cancel
Save