@@ -19,82 +19,124 @@ package dev.sergiobelda.todometer.app.feature.edittasklist.ui
19
19
import androidx.compose.foundation.layout.Column
20
20
import androidx.compose.foundation.layout.padding
21
21
import androidx.compose.foundation.text.KeyboardOptions
22
+ import androidx.compose.material3.MaterialTheme
22
23
import androidx.compose.material3.Scaffold
23
24
import androidx.compose.material3.Text
24
25
import androidx.compose.runtime.Composable
25
- import androidx.compose.runtime.getValue
26
- import androidx.compose.runtime.mutableStateOf
27
- import androidx.compose.runtime.remember
28
- import androidx.compose.runtime.saveable.rememberSaveable
29
- import androidx.compose.runtime.setValue
30
26
import androidx.compose.ui.Modifier
31
27
import androidx.compose.ui.text.input.ImeAction
32
28
import androidx.compose.ui.text.input.KeyboardCapitalization
33
29
import dev.sergiobelda.navigation.compose.extended.annotation.NavDestination
34
30
import dev.sergiobelda.todometer.app.common.designsystem.components.TodometerTitledTextField
31
+ import dev.sergiobelda.todometer.app.common.designsystem.theme.Alpha.applyMediumEmphasisAlpha
35
32
import dev.sergiobelda.todometer.app.common.ui.components.SaveActionTopAppBar
36
33
import dev.sergiobelda.todometer.app.common.ui.loading.LoadingScreenDialog
37
34
import dev.sergiobelda.todometer.app.common.ui.values.TextFieldPadding
35
+ import dev.sergiobelda.todometer.app.feature.edittasklist.navigation.EditTaskListNavigationEvent
38
36
import dev.sergiobelda.todometer.common.resources.TodometerResources
37
+ import dev.sergiobelda.todometer.common.ui.base.BaseUI
39
38
40
- @NavDestination(
41
- destinationId = " edittasklist" ,
42
- name = " EditTaskList" ,
43
- )
44
- @Composable
45
- fun EditTaskListScreen (
46
- navigateBack : () -> Unit ,
47
- viewModel : EditTaskListViewModel ,
48
- ) {
49
- when {
50
- viewModel.state.isLoading -> {
51
- LoadingScreenDialog (navigateBack)
52
- }
39
+ data object EditTaskListScreen : BaseUI <EditTaskListUIState , EditTaskListContentState >() {
53
40
54
- ! viewModel.state.isLoading -> {
55
- viewModel.state.taskList?.let { taskList ->
56
- var taskListName by rememberSaveable { mutableStateOf(taskList.name) }
57
- var taskListNameInputError by remember { mutableStateOf(false ) }
41
+ @Composable
42
+ override fun rememberContentState (
43
+ uiState : EditTaskListUIState ,
44
+ ): EditTaskListContentState = rememberEditTaskListContentState(
45
+ taskListNameInputValue = uiState.taskList?.name ? : " " ,
46
+ )
58
47
48
+ @NavDestination(
49
+ destinationId = " edittasklist" ,
50
+ name = " EditTaskList" ,
51
+ )
52
+ @Composable
53
+ override fun Content (
54
+ uiState : EditTaskListUIState ,
55
+ contentState : EditTaskListContentState ,
56
+ ) {
57
+ when {
58
+ uiState.isLoading -> {
59
+ LoadingScreenDialog (
60
+ navigateBack = {
61
+ onEvent(
62
+ EditTaskListNavigationEvent .NavigateBack ,
63
+ )
64
+ },
65
+ )
66
+ }
67
+
68
+ ! uiState.isLoading -> {
59
69
Scaffold (
60
70
topBar = {
61
- SaveActionTopAppBar (
62
- navigateBack = navigateBack,
63
- title = TodometerResources .strings.editTaskList,
64
- isSaveButtonEnabled = ! viewModel.state.isLoading,
71
+ EditTaskListTopBar (
72
+ isSaveButtonEnabled = ! uiState.isLoading,
65
73
onSaveButtonClick = {
66
- if (taskListName.isBlank()) {
67
- taskListNameInputError = true
68
- } else {
69
- viewModel.updateTaskList(taskListName)
70
- navigateBack( )
71
- }
74
+ onEvent(
75
+ EditTaskListEvent . UpdateTaskList (
76
+ contentState.nameTextFieldValue,
77
+ ),
78
+ )
79
+ onEvent( EditTaskListNavigationEvent . NavigateBack )
72
80
},
73
81
)
74
82
},
75
83
content = { paddingValues ->
76
- Column (modifier = Modifier .padding(paddingValues)) {
77
- TodometerTitledTextField (
78
- title = TodometerResources .strings.name,
79
- value = taskListName,
80
- onValueChange = {
81
- taskListName = it
82
- taskListNameInputError = false
83
- },
84
- placeholder = { Text (TodometerResources .strings.enterTaskListName) },
85
- singleLine = true ,
86
- isError = taskListNameInputError,
87
- errorMessage = TodometerResources .strings.fieldNotEmpty,
88
- keyboardOptions = KeyboardOptions (
89
- capitalization = KeyboardCapitalization .Sentences ,
90
- imeAction = ImeAction .Done ,
91
- ),
92
- modifier = Modifier .padding(TextFieldPadding ),
93
- )
94
- }
84
+ EditTaskListContent (
85
+ taskListNameValue = contentState.nameTextFieldValue,
86
+ modifier = Modifier
87
+ .padding(paddingValues),
88
+ )
95
89
},
96
90
)
97
91
}
98
92
}
99
93
}
94
+
95
+ @Composable
96
+ private fun EditTaskListTopBar (
97
+ isSaveButtonEnabled : Boolean ,
98
+ onSaveButtonClick : () -> Unit ,
99
+ ) {
100
+ SaveActionTopAppBar (
101
+ navigateBack = {
102
+ onEvent(
103
+ EditTaskListNavigationEvent .NavigateBack ,
104
+ )
105
+ },
106
+ title = TodometerResources .strings.editTaskList,
107
+ isSaveButtonEnabled = isSaveButtonEnabled,
108
+ onSaveButtonClick = onSaveButtonClick,
109
+ saveButtonTintColor = if (isSaveButtonEnabled) {
110
+ MaterialTheme .colorScheme.primary
111
+ } else {
112
+ MaterialTheme .colorScheme.onSurface.applyMediumEmphasisAlpha()
113
+ },
114
+ )
115
+ }
116
+
117
+ @Composable
118
+ private fun EditTaskListContent (
119
+ taskListNameValue : String ,
120
+ modifier : Modifier ,
121
+ ) {
122
+ Column (
123
+ modifier = modifier,
124
+ ) {
125
+ TodometerTitledTextField (
126
+ title = TodometerResources .strings.name,
127
+ value = taskListNameValue,
128
+ onValueChange = {
129
+ onEvent(EditTaskListEvent .TaskListNameValueChange (it))
130
+ },
131
+ placeholder = { Text (TodometerResources .strings.enterTaskListName) },
132
+ singleLine = true ,
133
+ errorMessage = TodometerResources .strings.fieldNotEmpty,
134
+ keyboardOptions = KeyboardOptions (
135
+ capitalization = KeyboardCapitalization .Sentences ,
136
+ imeAction = ImeAction .Done ,
137
+ ),
138
+ modifier = Modifier .padding(TextFieldPadding ),
139
+ )
140
+ }
141
+ }
100
142
}
0 commit comments