Add delete task dialog confirmation

This commit is contained in:
Geoffroy Bonneville
2025-10-23 22:16:59 -04:00
parent dc46386e0d
commit 35416f4725
2 changed files with 54 additions and 14 deletions

View File

@@ -50,8 +50,35 @@ fun RecycleBinScreen(
}
val grouped = tasks.groupBy { it.listName }
val context = LocalContext.current
if (viewModel.taskToDelete != null) {
AlertDialog(
onDismissRequest = { viewModel.onCancelDelete() },
title = { Text("Delete task") },
text = {
Text("Are you sure you want to permanently delete this task? This cannot be undone.")
},
confirmButton = {
TextButton(
onClick = {
viewModel.onConfirmDelete()
Toast.makeText(context, "Task deleted", Toast.LENGTH_SHORT).show()
},
colors = ButtonDefaults.textButtonColors(
contentColor = MaterialTheme.colorScheme.error
)
) {
Text("Delete")
}
},
dismissButton = {
TextButton(onClick = { viewModel.onCancelDelete() }) {
Text("Cancel")
}
}
)
}
LazyColumn(
modifier = modifier.padding(8.dp)
) {
@@ -76,11 +103,7 @@ fun RecycleBinScreen(
modifier = Modifier.animateItem(),
task = item.task,
onSwipeLeft = { viewModel.restore(item.task.id!!) },
onSwipeRight = {
// TODO: add confirmation dialog
viewModel.deleteForever(item.task.id!!)
Toast.makeText(context, "Task deleted", Toast.LENGTH_SHORT).show()
},
onSwipeRight = { viewModel.onTaskDeleteRequest(item.task.id!!) },
onTaskClick = { viewModel.onTaskClicked(item.task) }
)
}

View File

@@ -3,6 +3,7 @@ package com.wismna.geoffroy.donext.presentation.viewmodel
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.wismna.geoffroy.donext.domain.model.Task
@@ -25,12 +26,16 @@ class RecycleBinViewModel @Inject constructor(
private val toggleTaskDeletedUseCase: ToggleTaskDeletedUseCase,
private val permanentlyDeleteTaskUseCase: PermanentlyDeleteTaskUseCase,
private val emptyRecycleBinUseCase: EmptyRecycleBinUseCase,
private val uiEventBus: UiEventBus
private val uiEventBus: UiEventBus,
private val savedStateHandle: SavedStateHandle
) : ViewModel() {
var deletedTasks by mutableStateOf<List<TaskWithListName>>(emptyList())
private set
var taskToDelete by mutableStateOf(savedStateHandle.get<Long>("taskToDelete"))
private set
init {
loadDeletedTasks()
}
@@ -52,7 +57,6 @@ class RecycleBinViewModel @Inject constructor(
fun restore(taskId: Long) {
viewModelScope.launch {
toggleTaskDeletedUseCase(taskId, false)
loadDeletedTasks()
uiEventBus.send(
UiEvent.ShowUndoSnackbar(
@@ -66,13 +70,26 @@ class RecycleBinViewModel @Inject constructor(
)
}
}
fun onTaskDeleteRequest(taskId: Long) {
taskToDelete = taskId
savedStateHandle["taskToDelete"] = taskId
}
fun deleteForever(taskId: Long) {
fun onConfirmDelete() {
taskToDelete?.let {
viewModelScope.launch {
permanentlyDeleteTaskUseCase(taskId)
loadDeletedTasks()
permanentlyDeleteTaskUseCase(it)
}
}
taskToDelete = null
savedStateHandle["taskToDelete"] = null
}
fun onCancelDelete() {
taskToDelete = null
savedStateHandle["taskToDelete"] = null
}
fun emptyRecycleBin() {
viewModelScope.launch {
emptyRecycleBinUseCase()