Browse Source

Add Screen State

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 year ago
parent
commit
b50a114e7d

+ 37 - 38
app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt

@@ -36,8 +36,16 @@ import kotlinx.coroutines.launch
 
 class AssistantViewModel(private val repository: AssistantRepositoryType) : ViewModel() {
 
-    private val _errorMessage = MutableStateFlow<String?>(null)
-    val errorMessage: StateFlow<String?> = _errorMessage
+    sealed class State {
+        data object Idle: State()
+        data object Loading: State()
+        data class Error(val messageId: Int): State()
+        data class TaskCreated(val messageId: Int): State()
+        data class TaskDeleted(val messageId: Int): State()
+    }
+
+    private val _state = MutableStateFlow<State>(State.Loading)
+    val state: StateFlow<State> = _state
 
     private val _selectedTaskType = MutableStateFlow<TaskType?>(null)
     val selectedTaskType: StateFlow<TaskType?> = _selectedTaskType
@@ -50,15 +58,6 @@ class AssistantViewModel(private val repository: AssistantRepositoryType) : View
     private val _filteredTaskList = MutableStateFlow<List<Task>?>(null)
     val filteredTaskList: StateFlow<List<Task>?> = _filteredTaskList
 
-    private val _loading = MutableStateFlow(true)
-    val loading: StateFlow<Boolean> = _loading
-
-    private val _isTaskCreated = MutableStateFlow<Boolean?>(null)
-    val isTaskCreated: StateFlow<Boolean?> = _isTaskCreated
-
-    private val _isTaskDeleted = MutableStateFlow<Boolean?>(null)
-    val isTaskDeleted: StateFlow<Boolean?> = _isTaskDeleted
-
     init {
         getTaskTypes()
         getTaskList()
@@ -71,8 +70,14 @@ class AssistantViewModel(private val repository: AssistantRepositoryType) : View
         viewModelScope.launch(Dispatchers.IO) {
             val result = repository.createTask(input, type)
 
-            _isTaskCreated.update {
-                result.isSuccess
+            val messageId = if (result.isSuccess) {
+                R.string.assistant_screen_task_create_success_message
+            } else {
+                R.string.assistant_screen_task_create_fail_message
+            }
+
+            _state.update {
+                State.TaskCreated(messageId)
             }
         }
     }
@@ -100,8 +105,8 @@ class AssistantViewModel(private val repository: AssistantRepositoryType) : View
                     result.first()
                 }
             } else {
-                _errorMessage.update {
-                    taskTypesResult.message
+                _state.update {
+                    State.Error(R.string.assistant_screen_task_types_error_state_message)
                 }
             }
         }
@@ -115,14 +120,14 @@ class AssistantViewModel(private val repository: AssistantRepositoryType) : View
 
                 filterTaskList(_selectedTaskType.value?.id)
 
-                _loading.update {
-                    false
+                _state.update {
+                    State.Idle
                 }
 
                 onCompleted()
             } else {
-                _errorMessage.update {
-                    result.message
+                _state.update {
+                    State.Error(R.string.assistant_screen_task_list_error_state_message)
                 }
             }
         }
@@ -132,31 +137,25 @@ class AssistantViewModel(private val repository: AssistantRepositoryType) : View
         viewModelScope.launch(Dispatchers.IO) {
             val result = repository.deleteTask(id)
 
-            _isTaskDeleted.update {
-                if (result.isSuccess) {
-                    removeTaskFromList(id)
-                }
-
-                result.isSuccess
+            val messageId = if (result.isSuccess) {
+                R.string.assistant_screen_task_delete_success_message
+            } else {
+                R.string.assistant_screen_task_delete_fail_message
             }
-        }
-    }
 
-    fun resetErrorState() {
-        _errorMessage.update {
-            null
-        }
-    }
+            _state.update {
+                State.TaskDeleted(messageId)
+            }
 
-    fun resetTaskDeletionState() {
-        _isTaskDeleted.update {
-            null
+            if (result.isSuccess) {
+                removeTaskFromList(id)
+            }
         }
     }
 
-    fun resetTaskAddState() {
-        _isTaskCreated.update {
-            null
+    fun resetState() {
+        _state.update {
+            State.Idle
         }
     }
 

+ 23 - 43
app/src/main/java/com/nextcloud/client/assistant/AsssistantScreen.kt

@@ -70,12 +70,9 @@ import kotlinx.coroutines.delay
 @OptIn(ExperimentalMaterial3Api::class)
 @Composable
 fun AssistantScreen(viewModel: AssistantViewModel, activity: Activity) {
-    val loading by viewModel.loading.collectAsState()
-    val errorMessage by viewModel.errorMessage.collectAsState()
+    val state by viewModel.state.collectAsState()
     val selectedTaskType by viewModel.selectedTaskType.collectAsState()
     val filteredTaskList by viewModel.filteredTaskList.collectAsState()
-    val isTaskCreated by viewModel.isTaskCreated.collectAsState()
-    val isTaskDeleted by viewModel.isTaskDeleted.collectAsState()
     val taskTypes by viewModel.taskTypes.collectAsState()
     var showAddTaskAlertDialog by remember { mutableStateOf(false) }
     var showDeleteTaskAlertDialog by remember { mutableStateOf(false) }
@@ -95,7 +92,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, activity: Activity) {
     }
 
     Box(Modifier.nestedScroll(pullRefreshState.nestedScrollConnection)) {
-        if (loading || pullRefreshState.isRefreshing) {
+        if (state == AssistantViewModel.State.Loading || pullRefreshState.isRefreshing) {
             CenterText(text = stringResource(id = R.string.assistant_screen_loading))
         } else {
             if (filteredTaskList.isNullOrEmpty()) {
@@ -134,9 +131,7 @@ fun AssistantScreen(viewModel: AssistantViewModel, activity: Activity) {
         }
     }
 
-    CheckErrorMessage(errorMessage, activity, viewModel)
-    CheckTaskAdd(isTaskCreated, activity, viewModel)
-    CheckTaskDeletion(isTaskDeleted, activity, viewModel)
+    ScreenState(state, activity, viewModel)
 
     if (showDeleteTaskAlertDialog) {
         taskIdToDeleted?.let { id ->
@@ -167,50 +162,35 @@ fun AssistantScreen(viewModel: AssistantViewModel, activity: Activity) {
 }
 
 @Composable
-private fun CheckTaskAdd(isTaskCreated: Boolean?, activity: Activity, viewModel: AssistantViewModel) {
-    isTaskCreated?.let {
-        val messageId = if (it) {
-            R.string.assistant_screen_task_create_success_message
-        } else {
-            R.string.assistant_screen_task_create_fail_message
+private fun ScreenState(
+    state: AssistantViewModel.State,
+    activity: Activity,
+    viewModel: AssistantViewModel
+) {
+    val messageId: Int? = when (state) {
+        is AssistantViewModel.State.Error -> {
+            state.messageId
         }
 
-        DisplayUtils.showSnackMessage(
-            activity,
-            stringResource(id = messageId)
-        )
-
-        viewModel.resetTaskAddState()
-    }
-}
-
-@Composable
-private fun CheckErrorMessage(errorMessage: String?, activity: Activity, viewModel: AssistantViewModel) {
-    errorMessage?.let {
-        DisplayUtils.showSnackMessage(
-            activity,
-            errorMessage
-        )
-
-        viewModel.resetErrorState()
-    }
-}
+        is AssistantViewModel.State.TaskCreated -> {
+            state.messageId
+        }
 
-@Composable
-private fun CheckTaskDeletion(isTaskDeleted: Boolean?, activity: Activity, viewModel: AssistantViewModel) {
-    isTaskDeleted?.let {
-        val messageId = if (it) {
-            R.string.assistant_screen_task_delete_success_message
-        } else {
-            R.string.assistant_screen_task_delete_fail_message
+        is AssistantViewModel.State.TaskDeleted -> {
+            state.messageId
         }
+        else -> {
+            null
+        }
+    }
 
+    messageId?.let {
         DisplayUtils.showSnackMessage(
             activity,
             stringResource(id = messageId)
         )
 
-        viewModel.resetTaskDeletionState()
+        viewModel.resetState()
     }
 }
 
@@ -245,7 +225,7 @@ private fun AssistantContent(
 
 @Composable
 private fun EmptyTaskList(selectedTaskType: TaskType?, taskTypes: List<TaskType>?, viewModel: AssistantViewModel) {
-    val text = if (selectedTaskType?.name ==  stringResource(id = R.string.assistant_screen_all_task_type)) {
+    val text = if (selectedTaskType?.name == stringResource(id = R.string.assistant_screen_all_task_type)) {
         stringResource(id = R.string.assistant_screen_no_task_available_for_all_task_filter_text)
     } else {
         stringResource(

+ 3 - 0
app/src/main/res/values/strings.xml

@@ -20,6 +20,9 @@
 
     <string name="ecosystem_apps_display_assistant">Assistant</string>
 
+    <string name="assistant_screen_task_types_error_state_message">Cannot able to fetch task types, please check your internet connection.</string>
+    <string name="assistant_screen_task_list_error_state_message">Cannot able to fetch task list, please check your internet connection.</string>
+
     <string name="assistant_screen_top_bar_title">Assistant</string>
     <string name="assistant_screen_loading">Task List are loading, please wait</string>
     <string name="assistant_screen_no_task_available_for_all_task_filter_text">No task available. Select a task type to create a new task.</string>