@@ -2,9 +2,11 @@ package net.mullvad.mullvadvpn.compose.screen
2
2
3
3
import androidx.compose.animation.animateContentSize
4
4
import androidx.compose.foundation.background
5
+ import androidx.compose.foundation.layout.Column
5
6
import androidx.compose.foundation.layout.Row
6
7
import androidx.compose.foundation.layout.fillMaxSize
7
8
import androidx.compose.foundation.layout.fillMaxWidth
9
+ import androidx.compose.foundation.layout.height
8
10
import androidx.compose.foundation.layout.padding
9
11
import androidx.compose.foundation.layout.systemBarsPadding
10
12
import androidx.compose.foundation.lazy.LazyColumn
@@ -35,6 +37,7 @@ import net.mullvad.mullvadvpn.compose.component.MullvadCircularProgressIndicator
35
37
import net.mullvad.mullvadvpn.compose.constant.CommonContentKey
36
38
import net.mullvad.mullvadvpn.compose.constant.ContentType
37
39
import net.mullvad.mullvadvpn.compose.state.CustomListLocationsUiState
40
+ import net.mullvad.mullvadvpn.compose.textfield.SearchTextField
38
41
import net.mullvad.mullvadvpn.compose.transitions.SlideInFromRightTransition
39
42
import net.mullvad.mullvadvpn.lib.theme.AppTheme
40
43
import net.mullvad.mullvadvpn.lib.theme.Dimens
@@ -69,6 +72,7 @@ fun CustomListLocations(navigator: DestinationsNavigator, customListKey: String,
69
72
val state by customListsViewModel.uiState.collectAsState()
70
73
CustomListLocationsScreen (
71
74
uiState = state,
75
+ onSearchTermInput = customListsViewModel::onSearchTermInput,
72
76
onSaveClick = customListsViewModel::save,
73
77
onRelaySelectionClick = customListsViewModel::onRelaySelectionClick,
74
78
onBackClick = navigator::navigateUp
@@ -78,6 +82,7 @@ fun CustomListLocations(navigator: DestinationsNavigator, customListKey: String,
78
82
@Composable
79
83
fun CustomListLocationsScreen (
80
84
uiState : CustomListLocationsUiState ,
85
+ onSearchTermInput : (String ) -> Unit = {},
81
86
onSaveClick : () -> Unit = {},
82
87
onRelaySelectionClick : (RelayItem , selected: Boolean ) -> Unit = { _, _ -> },
83
88
onBackClick : () -> Unit = {}
@@ -89,12 +94,19 @@ fun CustomListLocationsScreen(
89
94
topBar = {
90
95
CustomListLocationsTopBar (
91
96
uiState = uiState,
97
+ onSearchTermInput = onSearchTermInput,
92
98
onBackClick = onBackClick,
93
99
onSaveClick = onSaveClick
94
100
)
95
101
},
96
102
content = { contentPadding ->
97
- LazyColumn (modifier = Modifier .padding(contentPadding).fillMaxSize()) {
103
+ LazyColumn (
104
+ horizontalAlignment = Alignment .CenterHorizontally ,
105
+ modifier =
106
+ Modifier .padding(contentPadding)
107
+ .padding(top = Dimens .verticalSpace)
108
+ .fillMaxSize()
109
+ ) {
98
110
when (uiState) {
99
111
is CustomListLocationsUiState .Loading -> {
100
112
loading()
@@ -114,40 +126,49 @@ fun CustomListLocationsScreen(
114
126
@Composable
115
127
private fun CustomListLocationsTopBar (
116
128
uiState : CustomListLocationsUiState ,
129
+ onSearchTermInput : (String ) -> Unit ,
117
130
onBackClick : () -> Unit ,
118
131
onSaveClick : () -> Unit
119
132
) {
120
- Row (Modifier .fillMaxWidth(), verticalAlignment = Alignment .CenterVertically ) {
121
- IconButton (onClick = onBackClick) {
122
- Icon (
123
- painter = painterResource(id = R .drawable.icon_back),
124
- contentDescription = null ,
125
- tint = Color .Unspecified ,
126
- )
127
- }
128
- Text (
129
- text =
130
- stringResource(
131
- if (uiState.newList) {
132
- R .string.add_locations
133
- } else {
134
- R .string.edit_locations
135
- }
136
- ),
137
- modifier = Modifier .weight(1f ).padding(end = Dimens .titleIconSize),
138
- textAlign = TextAlign .Start ,
139
- style = MaterialTheme .typography.titleLarge,
140
- color = MaterialTheme .colorScheme.onPrimary
141
- )
142
- IconButton (onClick = {}) {
143
- Icon (
144
- painter = painterResource(id = R .drawable.icons_search),
145
- contentDescription = null ,
146
- tint = Color .Unspecified ,
133
+ Column (modifier = Modifier .fillMaxWidth()) {
134
+ Row (modifier = Modifier .fillMaxWidth(), verticalAlignment = Alignment .CenterVertically ) {
135
+ IconButton (onClick = onBackClick) {
136
+ Icon (
137
+ painter = painterResource(id = R .drawable.icon_back),
138
+ contentDescription = null ,
139
+ tint = Color .Unspecified ,
140
+ )
141
+ }
142
+ Text (
143
+ text =
144
+ stringResource(
145
+ if (uiState.newList) {
146
+ R .string.add_locations
147
+ } else {
148
+ R .string.edit_locations
149
+ }
150
+ ),
151
+ modifier = Modifier .weight(1f ).padding(end = Dimens .titleIconSize),
152
+ textAlign = TextAlign .Start ,
153
+ style = MaterialTheme .typography.titleLarge,
154
+ color = MaterialTheme .colorScheme.onPrimary
147
155
)
156
+ TextButton (onClick = onSaveClick) {
157
+ Text (
158
+ text = stringResource(R .string.save),
159
+ color = MaterialTheme .colorScheme.onPrimary
160
+ )
161
+ }
148
162
}
149
- TextButton (onClick = onSaveClick) {
150
- Text (text = stringResource(R .string.save), color = MaterialTheme .colorScheme.onPrimary)
163
+ SearchTextField (
164
+ modifier =
165
+ Modifier .fillMaxWidth()
166
+ .height(Dimens .searchFieldHeight)
167
+ .padding(horizontal = Dimens .searchFieldHorizontalPadding),
168
+ backgroundColor = MaterialTheme .colorScheme.tertiaryContainer,
169
+ textColor = MaterialTheme .colorScheme.onTertiaryContainer,
170
+ ) { searchString ->
171
+ onSearchTermInput.invoke(searchString)
151
172
}
152
173
}
153
174
}
0 commit comments