diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/RecycleBinScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/RecycleBinScreen.kt index c5717cd..c839dd6 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/RecycleBinScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/RecycleBinScreen.kt @@ -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) } ) } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/RecycleBinViewModel.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/RecycleBinViewModel.kt index b79cb02..c76b409 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/RecycleBinViewModel.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/RecycleBinViewModel.kt @@ -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>(emptyList()) private set + var taskToDelete by mutableStateOf(savedStateHandle.get("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 deleteForever(taskId: Long) { - viewModelScope.launch { - permanentlyDeleteTaskUseCase(taskId) - loadDeletedTasks() - } + fun onTaskDeleteRequest(taskId: Long) { + taskToDelete = taskId + savedStateHandle["taskToDelete"] = taskId } + + fun onConfirmDelete() { + taskToDelete?.let { + viewModelScope.launch { + permanentlyDeleteTaskUseCase(it) + } + } + taskToDelete = null + savedStateHandle["taskToDelete"] = null + } + + fun onCancelDelete() { + taskToDelete = null + savedStateHandle["taskToDelete"] = null + } + fun emptyRecycleBin() { viewModelScope.launch { emptyRecycleBinUseCase()