66 * SPDX-License-Identifier: GPL-3.0-or-later
77 */
88
9+ @file:Suppress(" TooManyFunctions" )
10+
911package com.nextcloud.talk.openconversations
1012
1113import android.content.res.Configuration
@@ -19,11 +21,11 @@ import androidx.compose.foundation.layout.WindowInsets
1921import androidx.compose.foundation.layout.WindowInsetsSides
2022import androidx.compose.foundation.layout.asPaddingValues
2123import androidx.compose.foundation.layout.fillMaxSize
24+ import androidx.compose.foundation.layout.fillMaxWidth
2225import androidx.compose.foundation.layout.imePadding
2326import androidx.compose.foundation.layout.navigationBars
2427import androidx.compose.foundation.layout.navigationBarsPadding
2528import androidx.compose.foundation.layout.only
26- import androidx.compose.foundation.layout.fillMaxWidth
2729import androidx.compose.foundation.layout.padding
2830import androidx.compose.foundation.layout.safeDrawing
2931import androidx.compose.foundation.layout.size
@@ -39,17 +41,17 @@ import androidx.compose.material3.Icon
3941import androidx.compose.material3.IconButton
4042import androidx.compose.material3.MaterialTheme
4143import androidx.compose.material3.Scaffold
44+ import androidx.compose.material3.SearchBar
45+ import androidx.compose.material3.SearchBarDefaults
46+ import androidx.compose.material3.SearchBarState
4247import androidx.compose.material3.SnackbarHost
4348import androidx.compose.material3.SnackbarHostState
4449import androidx.compose.material3.Surface
4550import androidx.compose.material3.Text
46- import androidx.compose.material3.SearchBar
47- import androidx.compose.material3.SearchBarDefaults
48- import androidx.compose.material3.SearchBarState
4951import androidx.compose.material3.TopAppBar
50- import androidx.compose.material3.rememberSearchBarState
5152import androidx.compose.material3.darkColorScheme
5253import androidx.compose.material3.lightColorScheme
54+ import androidx.compose.material3.rememberSearchBarState
5355import androidx.compose.runtime.Composable
5456import androidx.compose.runtime.LaunchedEffect
5557import androidx.compose.runtime.getValue
@@ -262,7 +264,9 @@ private fun OpenConversationsSearchBar(
262264 modifier = Modifier .focusRequester(focusRequester)
263265 )
264266 },
265- modifier = Modifier .fillMaxWidth().padding(end = 16 .dp)
267+ modifier = Modifier
268+ .fillMaxWidth()
269+ .padding(end = 16 .dp)
266270 )
267271}
268272
@@ -280,11 +284,16 @@ private fun ConversationsBody(
280284 CircularProgressIndicator (modifier = Modifier .align(Alignment .Center ))
281285 }
282286 is OpenConversationsViewModel .FetchConversationsSuccessState -> {
287+ val filtered = if (searchTerm.isBlank()) {
288+ viewState.conversations
289+ } else {
290+ viewState.conversations.filter { it.displayName.contains(searchTerm, ignoreCase = true ) }
291+ }
283292 LazyColumn (
284293 modifier = Modifier .fillMaxSize(),
285294 contentPadding = WindowInsets .navigationBars.asPaddingValues()
286295 ) {
287- items(viewState.conversations ) { conversation ->
296+ items(filtered ) { conversation ->
288297 OpenConversationItem (
289298 conversation = conversation,
290299 userBaseUrl = userBaseUrl,
@@ -295,7 +304,19 @@ private fun ConversationsBody(
295304 }
296305 }
297306 is OpenConversationsViewModel .FetchConversationsEmptyState -> {
298- EmptyConversationsView (modifier = Modifier .align(Alignment .Center ))
307+ if (searchTerm.isNotBlank()) {
308+ EmptyConversationsView (
309+ headline = stringResource(R .string.nc_no_search_results_headline),
310+ body = stringResource(R .string.nc_no_search_results_text),
311+ modifier = Modifier .align(Alignment .Center )
312+ )
313+ } else {
314+ EmptyConversationsView (
315+ headline = stringResource(R .string.nc_no_open_conversations_headline),
316+ body = stringResource(R .string.nc_no_open_conversations_text),
317+ modifier = Modifier .align(Alignment .Center )
318+ )
319+ }
299320 }
300321 is OpenConversationsViewModel .FetchConversationsErrorState -> {
301322 // Error shown via Snackbar; no additional UI needed here
@@ -380,7 +401,7 @@ private fun highlightSearchTerm(name: String, searchTerm: String, highlightColor
380401 }
381402
382403@Composable
383- private fun EmptyConversationsView (modifier : Modifier = Modifier ) {
404+ private fun EmptyConversationsView (headline : String , body : String , modifier : Modifier = Modifier ) {
384405 Column (
385406 modifier = modifier.padding(32 .dp),
386407 horizontalAlignment = Alignment .CenterHorizontally
@@ -393,13 +414,13 @@ private fun EmptyConversationsView(modifier: Modifier = Modifier) {
393414 )
394415 Spacer (modifier = Modifier .size(16 .dp))
395416 Text (
396- text = stringResource( R .string.nc_no_open_conversations_headline) ,
417+ text = headline ,
397418 style = MaterialTheme .typography.titleLarge,
398419 color = MaterialTheme .colorScheme.onSurface
399420 )
400421 Spacer (modifier = Modifier .size(8 .dp))
401422 Text (
402- text = stringResource( R .string.nc_no_open_conversations_text) ,
423+ text = body ,
403424 style = MaterialTheme .typography.bodyMedium,
404425 textAlign = TextAlign .Center ,
405426 color = MaterialTheme .colorScheme.onSurfaceVariant
@@ -549,6 +570,37 @@ private fun PreviewOpenConversationsEmpty() {
549570 }
550571}
551572
573+ @Preview(name = " Light – No search results" , showBackground = true )
574+ @Preview(name = " Dark – No search results" , showBackground = true , uiMode = Configuration .UI_MODE_NIGHT_YES )
575+ @Composable
576+ private fun PreviewOpenConversationsNoSearchResults () {
577+ val colorScheme = if (isSystemInDarkTheme()) darkColorScheme() else lightColorScheme()
578+ MaterialTheme (colorScheme = colorScheme) {
579+ Surface {
580+ OpenConversationsScreenContent (
581+ viewState = OpenConversationsViewModel .FetchConversationsSuccessState (
582+ conversations = listOf (
583+ Conversation (
584+ token = " abc1" ,
585+ displayName = " Design Team" ,
586+ description = " All design discussions" ,
587+ type = ConversationEnums .ConversationType .ROOM_GROUP_CALL
588+ )
589+ )
590+ ),
591+ searchTerm = " xyz" ,
592+ userBaseUrl = null ,
593+ snackbarHostState = remember { SnackbarHostState () },
594+ listenerInput = OpenConversationsScreenListenerInput (
595+ onSearchTermChange = {},
596+ onConversationClick = {},
597+ onBackClick = {}
598+ )
599+ )
600+ }
601+ }
602+ }
603+
552604@Preview(name = " RTL – Arabic" , showBackground = true , locale = " ar" )
553605@Composable
554606private fun PreviewOpenConversationsRtl () {
0 commit comments