Skip to content
Snippets Groups Projects
Commit 793f7d9e authored by Baryshnikov Oleg's avatar Baryshnikov Oleg
Browse files

Fix the searchbar animation appearing.

Clean the searchbar after closing.
parent c55e608c
No related branches found
No related tags found
No related merge requests found
package cz.fel.barysole.ackeetesttask.ui.uielement.main package cz.fel.barysole.ackeetesttask.ui.uielement.main
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
...@@ -38,50 +37,51 @@ fun MySearchBar( ...@@ -38,50 +37,51 @@ fun MySearchBar(
mutableStateOf(false) mutableStateOf(false)
} }
val searchBarState by characterSearchViewModel.uiState.collectAsState() val searchBarState by characterSearchViewModel.uiState.collectAsState()
AnimatedVisibility(visible = isSearchBarShowing.value) { if (!isSearchBarShowing.value) {
SearchBar( characterSearchViewModel.acceptAction(UiAction.SearchCharacters(""))
modifier = Modifier.padding(if (isSearchBarIsActive.value) 0.dp else 8.dp), }
query = searchBarState.query, SearchBar(
onQueryChange = { characterSearchViewModel.acceptAction(UiAction.SearchCharacters(it)) }, modifier = Modifier.padding(if (isSearchBarIsActive.value) 0.dp else 8.dp),
onSearch = { characterSearchViewModel.acceptAction(UiAction.SearchCharacters(it)) }, query = searchBarState.query,
active = isSearchBarIsActive.value, onQueryChange = { characterSearchViewModel.acceptAction(UiAction.SearchCharacters(it)) },
onActiveChange = { isSearchBarIsActive.value = it }, onSearch = { characterSearchViewModel.acceptAction(UiAction.SearchCharacters(it)) },
placeholder = { active = isSearchBarIsActive.value,
Text(text = "Start enter a name...") onActiveChange = { isSearchBarIsActive.value = it },
}, placeholder = {
leadingIcon = { Text(text = "Start enter a name...")
Icon( },
painterResource(R.drawable.baseline_arrow_back_ios_new_24), leadingIcon = {
modifier = Modifier.clickable { isSearchBarShowing.value = false }, Icon(
contentDescription = "Arrow back icon" painterResource(R.drawable.baseline_arrow_back_ios_new_24),
) modifier = Modifier.clickable { isSearchBarShowing.value = false },
}, contentDescription = "Arrow back icon"
trailingIcon = { )
Icon( },
painterResource(R.drawable.baseline_close_24), trailingIcon = {
contentDescription = "Close icon", Icon(
modifier = Modifier.clickable { painterResource(R.drawable.baseline_close_24),
if (searchBarState.query.isNotBlank()) { contentDescription = "Close icon",
characterSearchViewModel.acceptAction(UiAction.SearchCharacters("")) modifier = Modifier.clickable {
} else { if (searchBarState.query.isNotBlank()) {
isSearchBarShowing.value = false characterSearchViewModel.acceptAction(UiAction.SearchCharacters(""))
}
}
)
},
tonalElevation = 0.dp,
colors = if (isSearchBarIsActive.value) SearchBarDefaults.colors(containerColor = MaterialTheme.colorScheme.background) else SearchBarDefaults.colors()
) {
characterSearchViewModel.pagingDataFlow.collectAsLazyPagingItems().let {
// do not show elements when the query is empty
if (searchBarState.query.isNotBlank()) {
if (it.loadState.refresh is LoadState.Error) {
rememberCoroutineScope().launch {
snackbar.showSnackbar("Network error!")
}
} else { } else {
CharacterList(it) isSearchBarShowing.value = false
}
}
)
},
tonalElevation = 0.dp,
colors = if (isSearchBarIsActive.value) SearchBarDefaults.colors(containerColor = MaterialTheme.colorScheme.background) else SearchBarDefaults.colors()
) {
characterSearchViewModel.pagingDataFlow.collectAsLazyPagingItems().let {
// do not show elements when the query is empty
if (searchBarState.query.isNotBlank()) {
if (it.loadState.refresh is LoadState.Error) {
rememberCoroutineScope().launch {
snackbar.showSnackbar("Network error!")
} }
} else {
CharacterList(it)
} }
} }
} }
......
package cz.fel.barysole.ackeetesttask.ui.uielement.main package cz.fel.barysole.ackeetesttask.ui.uielement.main
import androidx.compose.animation.Crossfade
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Search
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
...@@ -35,30 +36,32 @@ fun MyTopAppBar( ...@@ -35,30 +36,32 @@ fun MyTopAppBar(
mutableStateOf(false) mutableStateOf(false)
} }
// showing iff isSearchBarShowing is true // showing iff isSearchBarShowing is true
MySearchBar(isSearchBarShowing, snackbar) Crossfade(targetState = isSearchBarShowing.value) { showSearchBar ->
if (!isSearchBarShowing.value) { when (showSearchBar) {
TopAppBar( true -> MySearchBar(isSearchBarShowing, snackbar)
modifier = Modifier.shadow(16.dp), false -> TopAppBar(
title = { modifier = Modifier.shadow(16.dp),
Text( title = {
//there is no null in the screenWithTopAppBarList Text(
stringResource(selectedScreen!!.nameResId), //there is no null in the screenWithTopAppBarList
maxLines = 1, stringResource(selectedScreen!!.nameResId),
overflow = TextOverflow.Ellipsis maxLines = 1,
) overflow = TextOverflow.Ellipsis
}, )
actions = { },
if (selectedScreen == Screen.Characters) { actions = {
IconButton(onClick = { isSearchBarShowing.value = true }) { if (selectedScreen == Screen.Characters) {
Icon( IconButton(onClick = { isSearchBarShowing.value = true }) {
imageVector = Icons.Default.Search, Icon(
contentDescription = "Search button" imageVector = Icons.Default.Search,
) contentDescription = "Search button"
)
}
} }
} },
}, colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.background)
colors = TopAppBarDefaults.topAppBarColors(containerColor = MaterialTheme.colorScheme.background) )
) }
} }
} }
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment