Skip to content

Commit 4716c7f

Browse files
authored
Merge pull request #913 from hoangchungk53qx1/main
Refactor Search Feature
2 parents b6459d4 + 66eafdc commit 4716c7f

File tree

4 files changed

+44
-48
lines changed

4 files changed

+44
-48
lines changed

feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/RecentSearchQueriesUiState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ package com.google.samples.apps.nowinandroid.feature.search
1919
import com.google.samples.apps.nowinandroid.core.data.model.RecentSearchQuery
2020

2121
sealed interface RecentSearchQueriesUiState {
22-
object Loading : RecentSearchQueriesUiState
22+
data object Loading : RecentSearchQueriesUiState
2323

2424
data class Success(
2525
val recentQueries: List<RecentSearchQuery> = emptyList(),

feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchResultUiState.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ import com.google.samples.apps.nowinandroid.core.model.data.FollowableTopic
2020
import com.google.samples.apps.nowinandroid.core.model.data.UserNewsResource
2121

2222
sealed interface SearchResultUiState {
23-
object Loading : SearchResultUiState
23+
data object Loading : SearchResultUiState
2424

2525
/**
2626
* The state query is empty or too short. To distinguish the state between the
2727
* (initial state or when the search query is cleared) vs the state where no search
2828
* result is returned, explicitly define the empty query state.
2929
*/
30-
object EmptyQuery : SearchResultUiState
30+
data object EmptyQuery : SearchResultUiState
3131

32-
object LoadFailed : SearchResultUiState
32+
data object LoadFailed : SearchResultUiState
3333

3434
data class Success(
3535
val topics: List<FollowableTopic> = emptyList(),
@@ -42,5 +42,5 @@ sealed interface SearchResultUiState {
4242
* A state where the search contents are not ready. This happens when the *Fts tables are not
4343
* populated yet.
4444
*/
45-
object SearchNotReady : SearchResultUiState
45+
data object SearchNotReady : SearchResultUiState
4646
}

feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchScreen.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,7 @@ private fun RecentSearchesBody(
441441
style = MaterialTheme.typography.headlineSmall,
442442
modifier = Modifier
443443
.padding(vertical = 16.dp)
444-
.clickable {
445-
onRecentSearchClicked(recentSearch)
446-
}
444+
.clickable { onRecentSearchClicked(recentSearch) }
447445
.fillMaxWidth(),
448446
)
449447
}

feature/search/src/main/java/com/google/samples/apps/nowinandroid/feature/search/SearchViewModel.kt

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -48,46 +48,43 @@ class SearchViewModel @Inject constructor(
4848
private val analyticsHelper: AnalyticsHelper,
4949
) : ViewModel() {
5050

51-
val searchQuery = savedStateHandle.getStateFlow(SEARCH_QUERY, "")
51+
val searchQuery = savedStateHandle.getStateFlow(key = SEARCH_QUERY, initialValue = "")
5252

5353
val searchResultUiState: StateFlow<SearchResultUiState> =
54-
getSearchContentsCountUseCase().flatMapLatest { totalCount ->
55-
if (totalCount < SEARCH_MIN_FTS_ENTITY_COUNT) {
56-
flowOf(SearchResultUiState.SearchNotReady)
57-
} else {
58-
searchQuery.flatMapLatest { query ->
59-
if (query.length < SEARCH_QUERY_MIN_LENGTH) {
60-
flowOf(SearchResultUiState.EmptyQuery)
61-
} else {
62-
getSearchContentsUseCase(query).asResult().map {
63-
when (it) {
64-
is Result.Success -> {
65-
SearchResultUiState.Success(
66-
topics = it.data.topics,
67-
newsResources = it.data.newsResources,
68-
)
69-
}
70-
71-
is Result.Loading -> {
72-
SearchResultUiState.Loading
73-
}
54+
getSearchContentsCountUseCase()
55+
.flatMapLatest { totalCount ->
56+
if (totalCount < SEARCH_MIN_FTS_ENTITY_COUNT) {
57+
flowOf(SearchResultUiState.SearchNotReady)
58+
} else {
59+
searchQuery.flatMapLatest { query ->
60+
if (query.length < SEARCH_QUERY_MIN_LENGTH) {
61+
flowOf(SearchResultUiState.EmptyQuery)
62+
} else {
63+
getSearchContentsUseCase(query)
64+
.asResult()
65+
.map { result ->
66+
when (result) {
67+
is Result.Success -> SearchResultUiState.Success(
68+
topics = result.data.topics,
69+
newsResources = result.data.newsResources,
70+
)
7471

75-
is Result.Error -> {
76-
SearchResultUiState.LoadFailed
72+
is Result.Loading -> SearchResultUiState.Loading
73+
is Result.Error -> SearchResultUiState.LoadFailed
74+
}
7775
}
78-
}
7976
}
8077
}
8178
}
82-
}
83-
}.stateIn(
84-
scope = viewModelScope,
85-
started = SharingStarted.WhileSubscribed(5_000),
86-
initialValue = SearchResultUiState.Loading,
87-
)
79+
}.stateIn(
80+
scope = viewModelScope,
81+
started = SharingStarted.WhileSubscribed(5_000),
82+
initialValue = SearchResultUiState.Loading,
83+
)
8884

8985
val recentSearchQueriesUiState: StateFlow<RecentSearchQueriesUiState> =
90-
recentSearchQueriesUseCase().map(RecentSearchQueriesUiState::Success)
86+
recentSearchQueriesUseCase()
87+
.map(RecentSearchQueriesUiState::Success)
9188
.stateIn(
9289
scope = viewModelScope,
9390
started = SharingStarted.WhileSubscribed(5_000),
@@ -107,16 +104,9 @@ class SearchViewModel @Inject constructor(
107104
*/
108105
fun onSearchTriggered(query: String) {
109106
viewModelScope.launch {
110-
recentSearchRepository.insertOrReplaceRecentSearch(query)
107+
recentSearchRepository.insertOrReplaceRecentSearch(searchQuery = query)
111108
}
112-
analyticsHelper.logEvent(
113-
AnalyticsEvent(
114-
type = SEARCH_QUERY,
115-
extras = listOf(
116-
Param(SEARCH_QUERY, query),
117-
),
118-
),
119-
)
109+
analyticsHelper.logEventSearchTriggered(query = query)
120110
}
121111

122112
fun clearRecentSearches() {
@@ -126,6 +116,14 @@ class SearchViewModel @Inject constructor(
126116
}
127117
}
128118

119+
private fun AnalyticsHelper.logEventSearchTriggered(query: String) =
120+
logEvent(
121+
event = AnalyticsEvent(
122+
type = SEARCH_QUERY,
123+
extras = listOf(element = Param(key = SEARCH_QUERY, value = query)),
124+
),
125+
)
126+
129127
/** Minimum length where search query is considered as [SearchResultUiState.EmptyQuery] */
130128
private const val SEARCH_QUERY_MIN_LENGTH = 2
131129

0 commit comments

Comments
 (0)