app: ArticlesSearchScreen display no results message
authorDa Risk <da_risk@geekorum.com>
Tue, 26 Mar 2024 16:56:00 -0400
changeset 1229 933c91d5cdd8
parent 1228 d79b184243d8
child 1230 fb260764db01
app: ArticlesSearchScreen display no results message
app/src/main/java/com/geekorum/ttrss/articles_list/search/ArticlesSearchScreen.kt
app/src/main/java/com/geekorum/ttrss/articles_list/search/SearchViewModel.kt
app/src/main/res/values-fr/strings.xml
app/src/main/res/values/strings.xml
--- a/app/src/main/java/com/geekorum/ttrss/articles_list/search/ArticlesSearchScreen.kt	Tue Mar 26 01:17:03 2024 -0400
+++ b/app/src/main/java/com/geekorum/ttrss/articles_list/search/ArticlesSearchScreen.kt	Tue Mar 26 16:56:00 2024 -0400
@@ -31,7 +31,9 @@
 import androidx.compose.foundation.lazy.LazyColumn
 import androidx.compose.foundation.lazy.rememberLazyListState
 import androidx.compose.material3.HorizontalDivider
+import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
 import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
 import androidx.compose.material3.windowsizeclass.WindowSizeClass
 import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
@@ -39,6 +41,10 @@
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.buildAnnotatedString
 import androidx.compose.ui.unit.dp
 import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -46,6 +52,7 @@
 import androidx.paging.compose.collectAsLazyPagingItems
 import androidx.paging.compose.itemContentType
 import androidx.paging.compose.itemKey
+import com.geekorum.ttrss.R
 import com.geekorum.ttrss.articles_list.ActivityViewModel
 import com.geekorum.ttrss.articles_list.ArticleCard
 import com.geekorum.ttrss.articles_list.CompactArticleListItem
@@ -70,10 +77,16 @@
     contentPadding: PaddingValues = PaddingValues(0.dp)
 ) {
     val pagingItems = viewModel.articles.collectAsLazyPagingItems()
+    val loadState by debouncedPagingViewStateFor(pagingItems)
+
+    val isEmpty = pagingItems.itemCount == 0
+    if (isEmpty && (loadState is LoadState.NotLoading || loadState is LoadState.Error)) {
+        NoResultsForQuery(viewModel.query, modifier = Modifier.padding(contentPadding))
+        return
+    }
 
     val listState = rememberLazyListState()
     var animateItemAppearance by remember { mutableStateOf(true) }
-    val loadState by debouncedPagingViewStateFor(pagingItems)
     LaunchedEffect(loadState, pagingItems.itemCount) {
         if (loadState is LoadState.NotLoading) {
             Timber.i("loading item reset animate item appearance")
@@ -236,6 +249,28 @@
 }
 
 
+@Composable
+private fun NoResultsForQuery(query: String, modifier: Modifier = Modifier) {
+    Column(modifier.padding(horizontal = 16.dp)) {
+        Text(buildNoArticlesText(query), style = MaterialTheme.typography.titleLarge)
+        Text(
+            stringResource(R.string.label_articles_search_no_results_instructions),
+            Modifier.padding(top = 16.dp))
+    }
+}
+
+@Composable
+private fun buildNoArticlesText(query: String): AnnotatedString {
+    val text = stringResource(R.string.label_articles_search_no_results, query)
+    return buildAnnotatedString {
+        append(text)
+        val startIndex = text.indexOf('"')
+        val endIndex = text.lastIndexOf('"')
+        val queryStyle = SpanStyle(color = MaterialTheme.colorScheme.primary)
+        addStyle(queryStyle, startIndex, endIndex)
+    }
+}
+
 private fun onShareClicked(context: Context, article: Article) {
     context.startActivity(createShareArticleIntent(context, article))
 }
--- a/app/src/main/java/com/geekorum/ttrss/articles_list/search/SearchViewModel.kt	Tue Mar 26 01:17:03 2024 -0400
+++ b/app/src/main/java/com/geekorum/ttrss/articles_list/search/SearchViewModel.kt	Tue Mar 26 16:56:00 2024 -0400
@@ -46,9 +46,10 @@
     private val articlesRepository: ArticlesRepository = sessionActivityComponent.articleRepository
     private val setFieldActionFactory = sessionActivityComponent.setArticleFieldActionFactory
 
+    val query = savedStateHandle.get<String>(ARG_QUERY)!!
+
     val articles: Flow<PagingData<ArticleWithFeed>> = Pager(PagingConfig(pageSize = 50)) {
-        val searchQuery = savedStateHandle.get<String>(ARG_QUERY)!!
-        articlesRepository.searchArticles(searchQuery)
+        articlesRepository.searchArticles(query)
     }.flow
         .cachedIn(viewModelScope)
 
--- a/app/src/main/res/values-fr/strings.xml	Tue Mar 26 01:17:03 2024 -0400
+++ b/app/src/main/res/values-fr/strings.xml	Tue Mar 26 16:56:00 2024 -0400
@@ -40,6 +40,7 @@
     <string name="sort_order_oldest_first">Le plus vieux</string>
     <string name="title_article_search">Recherche</string>
     <string name="menu_item_mark_feed_as_read">Marquer comme lu</string>
+    <string name="label_articles_search_no_results">Pas d\'articles trouvés pour \"%1$s\"</string>
     <string name="title_article_details">Détails de l\'article</string>
     <string name="title_feeds_menu">Flux</string>
     <string name="drawer_open">Ouvrir le menu</string>
@@ -115,4 +116,5 @@
     <string name="title_manage_feeds">Gestion des flux</string>
     <string name="content_desc_btn_clear">Effacer</string>
     <string name="placeholder_textfield_search">Rechercher des articles</string>
+    <string name="label_articles_search_no_results_instructions">Vérifiez l\'orthographe ou essayez un autre terme de recherche</string>
 </resources>
\ No newline at end of file
--- a/app/src/main/res/values/strings.xml	Tue Mar 26 01:17:03 2024 -0400
+++ b/app/src/main/res/values/strings.xml	Tue Mar 26 16:56:00 2024 -0400
@@ -48,6 +48,8 @@
     <string name="label_feed_name" translatable="false">{feed_name}</string>
     <string name="label_tag" translatable="false">#{tag}</string>
     <string name="menu_item_mark_feed_as_read">Mark as read</string>
+    <string name="label_articles_search_no_results">No articles found for \"%1$s\"</string>
+    <string name="label_articles_search_no_results_instructions">Check the spelling or try a different search term</string>
 
     <!-- activity article details -->
     <string name="title_article_details">Article details</string>