From 7b60fb965f8cab2114659ef86f4b492c8eb0974c Mon Sep 17 00:00:00 2001 From: devttl Date: Thu, 16 Oct 2025 21:45:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E7=82=B9=E5=87=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/viewmodel/CategoryViewModel.kt | 18 +++++++++++++++--- .../data/viewmodel/CountdownViewModel.kt | 18 +++++++++++++++--- .../taskttl/data/viewmodel/TaskViewModel.kt | 12 ++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CategoryViewModel.kt b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CategoryViewModel.kt index bd0feae..7c66d7b 100644 --- a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CategoryViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CategoryViewModel.kt @@ -162,12 +162,16 @@ class CategoryViewModel(private val categoryRepository: CategoryRepository) : private fun addCategory(category: Category) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } categoryRepository.insertCategory(category) sendEvent(CategoryEffect.ShowMessage(getString(Res.string.category_add_success))) sendEvent(CategoryEffect.NavigateBack) } catch (e: Exception) { val errStr = getString(Res.string.category_add_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } @@ -175,13 +179,17 @@ class CategoryViewModel(private val categoryRepository: CategoryRepository) : private fun updateCategory(category: Category) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } categoryRepository.updateCategory(category) sendEvent(CategoryEffect.ShowMessage(getString(Res.string.category_update_success))) sendEvent(CategoryEffect.NavigateBack) hideEditDialog() } catch (e: Exception) { val errStr = getString(Res.string.category_update_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } @@ -189,12 +197,16 @@ class CategoryViewModel(private val categoryRepository: CategoryRepository) : private fun deleteCategory(categoryId: String) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } categoryRepository.deleteCategory(categoryId) sendEvent(CategoryEffect.ShowMessage(getString(Res.string.category_delete_success))) hideDeleteDialog() } catch (e: Exception) { val errStr = getString(Res.string.category_delete_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } diff --git a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CountdownViewModel.kt b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CountdownViewModel.kt index ea81ed6..d753b53 100644 --- a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CountdownViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/CountdownViewModel.kt @@ -94,12 +94,16 @@ class CountdownViewModel( private fun addCountdown(countdown: Countdown) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } countdownRepository.insertCountdown(countdown) sendEvent(CountdownEffect.ShowMessage(getString(Res.string.countdown_add_success))) sendEvent(CountdownEffect.NavigateBack) } catch (e: Exception) { val errStr = getString(Res.string.countdown_add_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } @@ -107,12 +111,16 @@ class CountdownViewModel( private fun updateCountdown(countdown: Countdown) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } countdownRepository.updateCountdown(countdown) sendEvent(CountdownEffect.ShowMessage(getString(Res.string.countdown_update_success))) sendEvent(CountdownEffect.NavigateBack) } catch (e: Exception) { val errStr = getString(Res.string.countdown_update_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } @@ -120,11 +128,15 @@ class CountdownViewModel( private fun deleteCountdown(countdownId: String) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } countdownRepository.deleteCountdown(countdownId) sendEvent(CountdownEffect.ShowMessage(getString(Res.string.countdown_delete_success))) } catch (e: Exception) { val errStr = getString(Res.string.countdown_delete_failed) - updateState { copy(isLoading = false, error = e.message ?: errStr) } + updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false, isProcessing = false) } } } } diff --git a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/TaskViewModel.kt b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/TaskViewModel.kt index 2080717..8b8d487 100644 --- a/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/TaskViewModel.kt +++ b/composeApp/src/commonMain/kotlin/com/taskttl/data/viewmodel/TaskViewModel.kt @@ -134,12 +134,16 @@ class TaskViewModel( private fun addTask(task: Task) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } taskRepository.insertTask(task) sendEvent(TaskEffect.ShowMessage(getString(Res.string.task_add_success))) sendEvent(TaskEffect.NavigateBack) } catch (e: Exception) { val errStr = getString(Res.string.task_add_failed) updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false,isProcessing = false) } } } } @@ -151,12 +155,16 @@ class TaskViewModel( private fun updateTask(task: Task) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } taskRepository.updateTask(task) sendEvent(TaskEffect.ShowMessage(getString(Res.string.task_update_success))) sendEvent(TaskEffect.NavigateBack) } catch (e: Exception) { val errStr = getString(Res.string.task_update_failed) updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false,isProcessing = false) } } } } @@ -168,11 +176,15 @@ class TaskViewModel( private fun deleteTask(taskId: String) { viewModelScope.launch { try { + if (state.value.isProcessing) return@launch + updateState { copy(isLoading = false, isProcessing = true) } taskRepository.deleteTask(taskId) sendEvent(TaskEffect.ShowMessage(getString(Res.string.task_delete_success))) } catch (e: Exception) { val errStr = getString(Res.string.task_delete_failed) updateState { copy(error = e.message ?: errStr) } + } finally { + updateState { copy(isLoading = false,isProcessing = false) } } } }