mirror of
https://github.com/wismna/DoNext.git
synced 2025-12-06 00:02:40 -05:00
Add delete task dialog confirmation
This commit is contained in:
@@ -50,8 +50,35 @@ fun RecycleBinScreen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
val grouped = tasks.groupBy { it.listName }
|
val grouped = tasks.groupBy { it.listName }
|
||||||
|
|
||||||
val context = LocalContext.current
|
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(
|
LazyColumn(
|
||||||
modifier = modifier.padding(8.dp)
|
modifier = modifier.padding(8.dp)
|
||||||
) {
|
) {
|
||||||
@@ -76,11 +103,7 @@ fun RecycleBinScreen(
|
|||||||
modifier = Modifier.animateItem(),
|
modifier = Modifier.animateItem(),
|
||||||
task = item.task,
|
task = item.task,
|
||||||
onSwipeLeft = { viewModel.restore(item.task.id!!) },
|
onSwipeLeft = { viewModel.restore(item.task.id!!) },
|
||||||
onSwipeRight = {
|
onSwipeRight = { viewModel.onTaskDeleteRequest(item.task.id!!) },
|
||||||
// TODO: add confirmation dialog
|
|
||||||
viewModel.deleteForever(item.task.id!!)
|
|
||||||
Toast.makeText(context, "Task deleted", Toast.LENGTH_SHORT).show()
|
|
||||||
},
|
|
||||||
onTaskClick = { viewModel.onTaskClicked(item.task) }
|
onTaskClick = { viewModel.onTaskClicked(item.task) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.wismna.geoffroy.donext.presentation.viewmodel
|
|||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
|
import androidx.lifecycle.SavedStateHandle
|
||||||
import androidx.lifecycle.ViewModel
|
import androidx.lifecycle.ViewModel
|
||||||
import androidx.lifecycle.viewModelScope
|
import androidx.lifecycle.viewModelScope
|
||||||
import com.wismna.geoffroy.donext.domain.model.Task
|
import com.wismna.geoffroy.donext.domain.model.Task
|
||||||
@@ -25,12 +26,16 @@ class RecycleBinViewModel @Inject constructor(
|
|||||||
private val toggleTaskDeletedUseCase: ToggleTaskDeletedUseCase,
|
private val toggleTaskDeletedUseCase: ToggleTaskDeletedUseCase,
|
||||||
private val permanentlyDeleteTaskUseCase: PermanentlyDeleteTaskUseCase,
|
private val permanentlyDeleteTaskUseCase: PermanentlyDeleteTaskUseCase,
|
||||||
private val emptyRecycleBinUseCase: EmptyRecycleBinUseCase,
|
private val emptyRecycleBinUseCase: EmptyRecycleBinUseCase,
|
||||||
private val uiEventBus: UiEventBus
|
private val uiEventBus: UiEventBus,
|
||||||
|
private val savedStateHandle: SavedStateHandle
|
||||||
) : ViewModel() {
|
) : ViewModel() {
|
||||||
|
|
||||||
var deletedTasks by mutableStateOf<List<TaskWithListName>>(emptyList())
|
var deletedTasks by mutableStateOf<List<TaskWithListName>>(emptyList())
|
||||||
private set
|
private set
|
||||||
|
|
||||||
|
var taskToDelete by mutableStateOf(savedStateHandle.get<Long>("taskToDelete"))
|
||||||
|
private set
|
||||||
|
|
||||||
init {
|
init {
|
||||||
loadDeletedTasks()
|
loadDeletedTasks()
|
||||||
}
|
}
|
||||||
@@ -52,7 +57,6 @@ class RecycleBinViewModel @Inject constructor(
|
|||||||
fun restore(taskId: Long) {
|
fun restore(taskId: Long) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
toggleTaskDeletedUseCase(taskId, false)
|
toggleTaskDeletedUseCase(taskId, false)
|
||||||
loadDeletedTasks()
|
|
||||||
|
|
||||||
uiEventBus.send(
|
uiEventBus.send(
|
||||||
UiEvent.ShowUndoSnackbar(
|
UiEvent.ShowUndoSnackbar(
|
||||||
@@ -66,13 +70,26 @@ class RecycleBinViewModel @Inject constructor(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
fun onTaskDeleteRequest(taskId: Long) {
|
||||||
fun deleteForever(taskId: Long) {
|
taskToDelete = taskId
|
||||||
viewModelScope.launch {
|
savedStateHandle["taskToDelete"] = taskId
|
||||||
permanentlyDeleteTaskUseCase(taskId)
|
|
||||||
loadDeletedTasks()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun onConfirmDelete() {
|
||||||
|
taskToDelete?.let {
|
||||||
|
viewModelScope.launch {
|
||||||
|
permanentlyDeleteTaskUseCase(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taskToDelete = null
|
||||||
|
savedStateHandle["taskToDelete"] = null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun onCancelDelete() {
|
||||||
|
taskToDelete = null
|
||||||
|
savedStateHandle["taskToDelete"] = null
|
||||||
|
}
|
||||||
|
|
||||||
fun emptyRecycleBin() {
|
fun emptyRecycleBin() {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
emptyRecycleBinUseCase()
|
emptyRecycleBinUseCase()
|
||||||
|
|||||||
Reference in New Issue
Block a user