diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/dao/TaskDao.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/dao/TaskDao.kt index ab8053f..0f3fbbf 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/dao/TaskDao.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/dao/TaskDao.kt @@ -13,6 +13,9 @@ interface TaskDao { @Query("SELECT * FROM tasks WHERE task_list_id = :listId AND deleted = 0 ORDER BY done ASC, priority DESC") fun getTasksForList(listId: Long): Flow> + @Query("SELECT * FROM tasks WHERE deleted = 1") + suspend fun getDeletedTasks(): List + @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertTask(task: TaskEntity) @@ -27,4 +30,7 @@ interface TaskDao { @Query("UPDATE tasks SET deleted = :deleted WHERE task_list_id = :taskListId") suspend fun toggleAllTasksFromListDeleted(taskListId: Long, deleted: Boolean) + + @Query("DELETE FROM tasks WHERE id = :taskId") + suspend fun permanentDeleteTask(taskId: Long) } \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/repository/TaskRepositoryImpl.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/repository/TaskRepositoryImpl.kt index 2d31b5f..d8c91f0 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/repository/TaskRepositoryImpl.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/data/local/repository/TaskRepositoryImpl.kt @@ -20,6 +20,10 @@ class TaskRepositoryImpl @Inject constructor( return taskDao.getTasksForList(listId).map {entity -> entity.map { it.toDomain() }} } + override suspend fun getDeletedTasks(): List { + return taskDao.getDeletedTasks().map {entity -> entity.toDomain() } + } + override suspend fun insertTask(task: Task) { taskDao.insertTask(task.toEntity()) } @@ -28,7 +32,7 @@ class TaskRepositoryImpl @Inject constructor( taskDao.updateTask(task.toEntity()) } - override suspend fun deleteTask(taskId: Long, isDeleted: Boolean) { + override suspend fun toggleTaskDeleted(taskId: Long, isDeleted: Boolean) { taskDao.toggleTaskDeleted(taskId, isDeleted) } @@ -36,6 +40,10 @@ class TaskRepositoryImpl @Inject constructor( taskDao.toggleTaskDone(taskId, isDone) } + override suspend fun permanentlyDeleteTask(taskId: Long) { + taskDao.permanentDeleteTask(taskId) + } + override fun getTaskLists(): Flow> { return taskListDao.getTaskLists().map {entities -> entities.map { it.toDomain() }} } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/model/AppDestination.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/model/AppDestination.kt index ebac09c..4e0c380 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/model/AppDestination.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/model/AppDestination.kt @@ -15,4 +15,9 @@ sealed class AppDestination( title = "Manage Lists", showBackButton = true, ) + object RecycleBin : AppDestination( + route = "recycleBin", + title = "Recycle Bin", + showBackButton = true, + ) } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/repository/TaskRepository.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/repository/TaskRepository.kt index dbd33f3..1ac2610 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/repository/TaskRepository.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/repository/TaskRepository.kt @@ -7,10 +7,12 @@ import kotlinx.coroutines.flow.Flow interface TaskRepository { fun getTasksForList(listId: Long): Flow> + suspend fun getDeletedTasks(): List suspend fun insertTask(task: Task) suspend fun updateTask(task: Task) - suspend fun deleteTask(taskId: Long, isDeleted: Boolean) + suspend fun toggleTaskDeleted(taskId: Long, isDeleted: Boolean) suspend fun toggleTaskDone(taskId: Long, isDone: Boolean) + suspend fun permanentlyDeleteTask(taskId: Long) fun getTaskLists(): Flow> suspend fun insertTaskList(taskList: TaskList) diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/GetDeletedTasksUseCase.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/GetDeletedTasksUseCase.kt new file mode 100644 index 0000000..6930b0f --- /dev/null +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/GetDeletedTasksUseCase.kt @@ -0,0 +1,9 @@ +package com.wismna.geoffroy.donext.domain.usecase + +import com.wismna.geoffroy.donext.domain.model.Task +import com.wismna.geoffroy.donext.domain.repository.TaskRepository +import javax.inject.Inject + +class GetDeletedTasksUseCase @Inject constructor(private val repository: TaskRepository) { + suspend operator fun invoke(): List = repository.getDeletedTasks() +} \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/DeleteTaskUseCase.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/PermanentlyDeleteTaskUseCase.kt similarity index 70% rename from donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/DeleteTaskUseCase.kt rename to donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/PermanentlyDeleteTaskUseCase.kt index 05d6bf7..5c628a6 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/DeleteTaskUseCase.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/PermanentlyDeleteTaskUseCase.kt @@ -3,10 +3,10 @@ package com.wismna.geoffroy.donext.domain.usecase import com.wismna.geoffroy.donext.domain.repository.TaskRepository import javax.inject.Inject -class DeleteTaskUseCase @Inject constructor( +class PermanentlyDeleteTaskUseCase @Inject constructor( private val repository: TaskRepository ) { suspend operator fun invoke(taskId: Long) { - repository.deleteTask(taskId, true) + repository.permanentlyDeleteTask(taskId) } } \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/ToggleTaskDeletedUseCase.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/ToggleTaskDeletedUseCase.kt new file mode 100644 index 0000000..5bdbaef --- /dev/null +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/domain/usecase/ToggleTaskDeletedUseCase.kt @@ -0,0 +1,12 @@ +package com.wismna.geoffroy.donext.domain.usecase + +import com.wismna.geoffroy.donext.domain.repository.TaskRepository +import javax.inject.Inject + +class ToggleTaskDeletedUseCase @Inject constructor( + private val repository: TaskRepository +) { + suspend operator fun invoke(taskId: Long, isDeleted: Boolean) { + repository.toggleTaskDeleted(taskId, isDeleted) + } +} \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt index 77ebfe1..1f45758 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MainScreen.kt @@ -84,9 +84,11 @@ fun MainScreen( MenuScreen ( currentDestination = viewModel.currentDestination, onNavigate = { route -> - scope.launch { drawerState.close() } - navController.navigate(route) { - restoreState = true + scope.launch { + drawerState.close() + navController.navigate(route) { + restoreState = true + } } } ) @@ -201,6 +203,12 @@ fun AppContent( showAddListSheet = {viewModel.showAddListSheet = true} ) } + + composable(AppDestination.RecycleBin.route) { + RecycleBinScreen( + modifier = Modifier + ) + } } } } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt index 76c67b8..7a4c925 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/MenuScreen.kt @@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.List import androidx.compose.material3.Badge @@ -70,6 +71,13 @@ fun MenuScreen( Column { HorizontalDivider() + NavigationDrawerItem( + label = { Text("Recycle Bin") }, + icon = { Icon(Icons.Default.Delete, contentDescription = "Recycle Bin") }, + selected = currentDestination is AppDestination.RecycleBin, + onClick = { onNavigate(AppDestination.RecycleBin.route) }, + modifier = Modifier.padding(NavigationDrawerItemDefaults.ItemPadding) + ) NavigationDrawerItem( label = { Text("Edit Lists") }, icon = { Icon(Icons.Default.Edit, contentDescription = "Edit Lists") }, 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 new file mode 100644 index 0000000..c522b72 --- /dev/null +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/RecycleBinScreen.kt @@ -0,0 +1,65 @@ +package com.wismna.geoffroy.donext.presentation.screen + +import android.widget.Toast +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel +import com.wismna.geoffroy.donext.presentation.viewmodel.RecycleBinViewModel +import com.wismna.geoffroy.donext.presentation.viewmodel.TaskItemViewModel + +@Composable +fun RecycleBinScreen( + modifier: Modifier = Modifier, + viewModel: RecycleBinViewModel = hiltViewModel(), +) { + val tasks = viewModel.deletedTasks + + if (tasks.isEmpty()) { + // Placeholder when recycle bin is empty + Box( + modifier = modifier.fillMaxSize(), + contentAlignment = Alignment.Center + ) { + Text("Recycle Bin is empty") + } + } else { + val context = LocalContext.current + LazyColumn( + modifier = modifier.padding(8.dp) + ) { + items(tasks, key = { it.id!! }) { task -> + Card( + //onClick = { onTaskClick(task) }, + //elevation = CardDefaults.elevatedCardElevation(defaultElevation = 2.dp), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surfaceContainer, + ), + ) { + TaskItemScreen( + viewModel = TaskItemViewModel(task), + onSwipeLeft = { + viewModel.restore(task.id!!) + Toast.makeText(context, "Task restored", Toast.LENGTH_SHORT).show() + }, + onSwipeRight = { + viewModel.deleteForever(task.id!!) + Toast.makeText(context, "Task deleted", Toast.LENGTH_SHORT).show() + } + ) + } + } + } + } +} diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskItemScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskItemScreen.kt index 43b3f20..c885f17 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskItemScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskItemScreen.kt @@ -1,6 +1,5 @@ package com.wismna.geoffroy.donext.presentation.screen -import android.widget.Toast import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -28,12 +27,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.wismna.geoffroy.donext.domain.model.Priority import com.wismna.geoffroy.donext.presentation.viewmodel.TaskItemViewModel @@ -41,23 +40,14 @@ import com.wismna.geoffroy.donext.presentation.viewmodel.TaskItemViewModel fun TaskItemScreen( modifier: Modifier = Modifier, viewModel: TaskItemViewModel, - onSwipeDone: () -> Unit, - onSwipeDelete: () -> Unit + onSwipeLeft: () -> Unit, + onSwipeRight: () -> Unit ) { - val context = LocalContext.current val dismissState = rememberSwipeToDismissBoxState( confirmValueChange = { when (it) { - SwipeToDismissBoxValue.StartToEnd -> { - onSwipeDelete() - Toast.makeText(context, "Task deleted", Toast.LENGTH_SHORT).show() - } - - SwipeToDismissBoxValue.EndToStart -> { - onSwipeDone() - Toast.makeText(context, "Task done", Toast.LENGTH_SHORT).show() - } - + SwipeToDismissBoxValue.StartToEnd -> { onSwipeRight() } + SwipeToDismissBoxValue.EndToStart -> { onSwipeLeft() } SwipeToDismissBoxValue.Settled -> return@rememberSwipeToDismissBoxState false } return@rememberSwipeToDismissBoxState true @@ -101,6 +91,7 @@ fun TaskItemScreen( // Title Text( text = viewModel.name, + fontSize = 18.sp, style = baseStyle, modifier = Modifier .align( @@ -134,13 +125,14 @@ fun TaskItemScreen( Box( modifier = Modifier .fillMaxWidth() - .height(40.dp) // 👈 adjust to the typical description height - .padding(top = 20.dp), + .height(40.dp) + .padding(top = 24.dp), contentAlignment = Alignment.TopStart ) { if (!viewModel.description.isNullOrBlank()) { Text( text = viewModel.description, + color = MaterialTheme.colorScheme.tertiary, style = baseStyle.copy( fontSize = MaterialTheme.typography.bodyMedium.fontSize, fontStyle = FontStyle.Italic diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskListScreen.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskListScreen.kt index c1d9e0c..40acdc9 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskListScreen.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/screen/TaskListScreen.kt @@ -1,5 +1,6 @@ package com.wismna.geoffroy.donext.presentation.screen +import android.widget.Toast import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize @@ -19,6 +20,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import com.wismna.geoffroy.donext.domain.model.Task @@ -38,6 +40,7 @@ fun TaskListScreen( tasks.partition { !it.isDone } } + val context = LocalContext.current LazyColumn( modifier = Modifier.fillMaxSize(), contentPadding = PaddingValues(8.dp), @@ -58,11 +61,13 @@ fun TaskListScreen( TaskItemScreen( modifier = Modifier.animateItem(), viewModel = TaskItemViewModel(task), - onSwipeDone = { + onSwipeLeft = { viewModel.updateTaskDone(task.id!!, true) + Toast.makeText(context, "Task done", Toast.LENGTH_SHORT).show() }, - onSwipeDelete = { + onSwipeRight = { viewModel.deleteTask(task.id!!) + Toast.makeText(context, "Task moved to recycle bin", Toast.LENGTH_SHORT).show() } ) } @@ -94,11 +99,13 @@ fun TaskListScreen( TaskItemScreen( modifier = Modifier.animateItem(), viewModel = TaskItemViewModel(task), - onSwipeDone = { + onSwipeLeft = { viewModel.updateTaskDone(task.id!!, false) + Toast.makeText(context, "Task done", Toast.LENGTH_SHORT).show() }, - onSwipeDelete = { + onSwipeRight = { viewModel.deleteTask(task.id!!) + Toast.makeText(context, "Task moved to recycle bin", Toast.LENGTH_SHORT).show() }, ) } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/ui/theme/Theme.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/ui/theme/Theme.kt index 909ab7c..4eefde5 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/ui/theme/Theme.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/ui/theme/Theme.kt @@ -25,48 +25,48 @@ fun DoNextTheme( darkTheme -> darkColorScheme( primary = Purple40, - onPrimary = Color.White, + onPrimary = LightSurfaceContainer, primaryContainer = Purple40Container, - onPrimaryContainer = Color.White, + onPrimaryContainer = LightSurfaceContainer, secondary = PurpleGrey40, - onSecondary = Color.White, + onSecondary = LightSurfaceContainer, secondaryContainer = PurpleGrey40Container, - onSecondaryContainer = Color.White, - tertiary = Pink40, - onTertiary = Color.White, + onSecondaryContainer = LightSurfaceContainer, + tertiary = Pink80, + onTertiary = DarkSurfaceContainer, tertiaryContainer = Pink40Container, - onTertiaryContainer = Color.White, + onTertiaryContainer = LightSurfaceContainer, background = Color(0xFF121212), - onBackground = Color.White, + onBackground = LightSurfaceContainer, surface = Color(0xFF121212), - onSurface = Color.White, + onSurface = LightSurfaceContainer, surfaceVariant = DarkSurfaceContainer, - onSurfaceVariant = Color.White, + onSurfaceVariant = LightSurfaceContainer, error = Color(0xFFCF6679), - onError = Color.Black + onError = DarkSurfaceContainer ) else -> lightColorScheme( primary = Purple80, - onPrimary = Color.Black, + onPrimary = DarkSurfaceContainer, primaryContainer = Purple80Container, - onPrimaryContainer = Color.Black, + onPrimaryContainer = DarkSurfaceContainer, secondary = PurpleGrey80, - onSecondary = Color.Black, + onSecondary = DarkSurfaceContainer, secondaryContainer = PurpleGrey80Container, - onSecondaryContainer = Color.Black, - tertiary = Pink80, - onTertiary = Color.Black, + onSecondaryContainer = DarkSurfaceContainer, + tertiary = Pink40, + onTertiary = LightSurfaceContainer, tertiaryContainer = Pink80Container, - onTertiaryContainer = Color.Black, + onTertiaryContainer = DarkSurfaceContainer, background = Color(0xFFFFFBFE), - onBackground = Color.Black, + onBackground = DarkSurfaceContainer, surface = Color(0xFFFFFBFE), - onSurface = Color.Black, + onSurface = DarkSurfaceContainer, surfaceVariant = LightSurfaceContainer, - onSurfaceVariant = Color.Black, + onSurfaceVariant = DarkSurfaceContainer, error = Color(0xFFB00020), - onError = Color.White + onError = LightSurfaceContainer ) } diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/MainViewModel.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/MainViewModel.kt index 04af77f..04b41c2 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/MainViewModel.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/MainViewModel.kt @@ -38,7 +38,7 @@ class MainViewModel @Inject constructor( .onEach { lists -> destinations = lists.map { taskList -> AppDestination.TaskList(taskList.id!!, taskList.name) - } + AppDestination.ManageLists + } + AppDestination.ManageLists + AppDestination.RecycleBin isLoading = false if (startDestination == AppDestination.ManageLists && destinations.isNotEmpty()) { startDestination = destinations.first() 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 new file mode 100644 index 0000000..ffc8504 --- /dev/null +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/RecycleBinViewModel.kt @@ -0,0 +1,49 @@ +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.ViewModel +import androidx.lifecycle.viewModelScope +import com.wismna.geoffroy.donext.domain.model.Task +import com.wismna.geoffroy.donext.domain.usecase.GetDeletedTasksUseCase +import com.wismna.geoffroy.donext.domain.usecase.PermanentlyDeleteTaskUseCase +import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDeletedUseCase +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class RecycleBinViewModel @Inject constructor( + private val getDeletedTasks: GetDeletedTasksUseCase, + private val restoreTask: ToggleTaskDeletedUseCase, + private val permanentlyDeleteTask: PermanentlyDeleteTaskUseCase +) : ViewModel() { + + var deletedTasks by mutableStateOf>(emptyList()) + private set + + init { + loadDeletedTasks() + } + + fun loadDeletedTasks() { + viewModelScope.launch { + deletedTasks = getDeletedTasks() + } + } + + fun restore(taskId: Long) { + viewModelScope.launch { + restoreTask(taskId, false) + loadDeletedTasks() + } + } + + fun deleteForever(taskId: Long) { + viewModelScope.launch { + permanentlyDeleteTask(taskId) + loadDeletedTasks() + } + } +} diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskListViewModel.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskListViewModel.kt index 078a354..e10a922 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskListViewModel.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskListViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope import com.wismna.geoffroy.donext.domain.model.Task import com.wismna.geoffroy.donext.domain.usecase.DeleteTaskListUseCase import com.wismna.geoffroy.donext.domain.usecase.GetTasksForListUseCase +import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDeletedUseCase import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDoneUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.launchIn @@ -20,7 +21,7 @@ import javax.inject.Inject class TaskListViewModel @Inject constructor( getTasks: GetTasksForListUseCase, private val toggleTaskDoneUseCase: ToggleTaskDoneUseCase, - private val deleteTaskListUseCase: DeleteTaskListUseCase, + private val toggleTaskDeletedUseCase: ToggleTaskDeletedUseCase, savedStateHandle: SavedStateHandle ) : ViewModel() { @@ -47,7 +48,7 @@ class TaskListViewModel @Inject constructor( } fun deleteTask(taskId: Long) { viewModelScope.launch { - deleteTaskListUseCase(taskId) + toggleTaskDeletedUseCase(taskId, true) } } } \ No newline at end of file diff --git a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskViewModel.kt b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskViewModel.kt index df6bced..b9ecf63 100644 --- a/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskViewModel.kt +++ b/donextv2/src/main/java/com/wismna/geoffroy/donext/presentation/viewmodel/TaskViewModel.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.viewModelScope import com.wismna.geoffroy.donext.domain.model.Priority import com.wismna.geoffroy.donext.domain.model.Task import com.wismna.geoffroy.donext.domain.usecase.AddTaskUseCase -import com.wismna.geoffroy.donext.domain.usecase.DeleteTaskUseCase +import com.wismna.geoffroy.donext.domain.usecase.ToggleTaskDeletedUseCase import com.wismna.geoffroy.donext.domain.usecase.UpdateTaskUseCase import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.launch @@ -18,7 +18,7 @@ import javax.inject.Inject class TaskViewModel @Inject constructor( private val createTaskUseCase: AddTaskUseCase, private val updateTaskUseCase: UpdateTaskUseCase, - private val deleteTaskUseCase: DeleteTaskUseCase + private val toggleTaskDeletedUseCase: ToggleTaskDeletedUseCase ) : ViewModel() { var title by mutableStateOf("") @@ -79,7 +79,7 @@ class TaskViewModel @Inject constructor( fun delete() { editingTaskId?.let { id -> viewModelScope.launch { - deleteTaskUseCase(id) + toggleTaskDeletedUseCase(id, true) reset() } }