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.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester 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.compose.ui.unit.dp
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle 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.DraggableScrollbar
import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.rememberDraggableScroller import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.rememberDraggableScroller
import com.google.samples.apps.nowinandroid.core.designsystem.component.scrollbar.scrollbarState 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 recentSearchQueriesUiState by searchViewModel.recentSearchQueriesUiState.collectAsStateWithLifecycle()
val searchResultUiState by searchViewModel.searchResultUiState.collectAsStateWithLifecycle() val searchResultUiState by searchViewModel.searchResultUiState.collectAsStateWithLifecycle()
val searchQuery by searchViewModel.searchQuery.collectAsStateWithLifecycle() val searchQuery by searchViewModel.searchQuery.collectAsStateWithLifecycle()
var pendingBookmarkId by remember { mutableStateOf<String?>(null) }
SearchScreen( SearchScreen(
modifier = modifier, modifier = modifier,
searchQuery = searchQuery, searchQuery = searchQuery,
@ -114,13 +120,28 @@ internal fun SearchScreen(
onSearchQueryChanged = searchViewModel::onSearchQueryChanged, onSearchQueryChanged = searchViewModel::onSearchQueryChanged,
onSearchTriggered = searchViewModel::onSearchTriggered, onSearchTriggered = searchViewModel::onSearchTriggered,
onClearRecentSearches = searchViewModel::clearRecentSearches, onClearRecentSearches = searchViewModel::clearRecentSearches,
onNewsResourcesCheckedChanged = searchViewModel::setNewsResourceBookmarked, onNewsResourcesCheckedChanged = { id, checked ->
if (checked) {
pendingBookmarkId = id
} else {
searchViewModel.setNewsResourceBookmarked(id, false)
}
},
onNewsResourceViewed = { searchViewModel.setNewsResourceViewed(it, true) }, onNewsResourceViewed = { searchViewModel.setNewsResourceViewed(it, true) },
onFollowButtonClick = searchViewModel::followTopic, onFollowButtonClick = searchViewModel::followTopic,
onBackClick = onBackClick, onBackClick = onBackClick,
onInterestsClick = onInterestsClick, onInterestsClick = onInterestsClick,
onTopicClick = onTopicClick, onTopicClick = onTopicClick,
) )
pendingBookmarkId?.let { id ->
BookmarkNoteDialog(
onDismiss = { note ->
searchViewModel.bookmarkWithNote(id, note)
pendingBookmarkId = null
},
)
}
} }
@Composable @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) { fun followTopic(followedTopicId: String, followed: Boolean) {
viewModelScope.launch { viewModelScope.launch {
userDataRepository.setTopicIdFollowed(followedTopicId, followed) userDataRepository.setTopicIdFollowed(followedTopicId, followed)

Loading…
Cancel
Save