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