From 8cab357c4c343e7f0106ebc7928ce11b119fe45b Mon Sep 17 00:00:00 2001 From: Gato Date: Sat, 6 Jun 2026 10:33:04 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20t=C3=A2che=20cr=C3=A9=C3=A9e=20imm?= =?UTF-8?q?=C3=A9diatement=20en=20local=20+=20d=C3=A9tail=20t=C3=A2che=20a?= =?UTF-8?q?u=20clic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../java/com/planify/mobile/ui/MainScreen.kt | 11 ++++++++++ .../mobile/ui/navigation/PlanifyNavHost.kt | 20 +++++++++---------- .../mobile/ui/task/TaskEditViewModel.kt | 15 ++++++-------- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 20fd10d..a962a03 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,7 +16,7 @@ android { minSdk = 26 targetSdk = 35 versionCode = 1 - versionName = "0.0.13" + versionName = "0.0.14" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/planify/mobile/ui/MainScreen.kt b/app/src/main/java/com/planify/mobile/ui/MainScreen.kt index e3a4c96..13800e6 100644 --- a/app/src/main/java/com/planify/mobile/ui/MainScreen.kt +++ b/app/src/main/java/com/planify/mobile/ui/MainScreen.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import com.planify.mobile.domain.model.Task import com.planify.mobile.ui.auth.AuthViewModel import com.planify.mobile.ui.navigation.DrawerViewModel import com.planify.mobile.ui.navigation.PlanifyNavHost @@ -69,6 +70,7 @@ fun MainScreen( val currentRoute = navBackStack?.destination?.route var showCreateTask by remember { mutableStateOf(false) } + var selectedTask by remember { mutableStateOf(null) } val inboxProjectId = projects.find { it.isInbox }?.id ?: "" val createProjectId = if (currentRoute?.startsWith("project/") == true) currentRoute.removePrefix("project/") @@ -209,6 +211,7 @@ fun MainScreen( PlanifyNavHost( navController = navController, authViewModel = authViewModel, + onTaskClick = { task -> selectedTask = task }, modifier = Modifier.padding(padding), ) @@ -218,6 +221,14 @@ fun MainScreen( onDismiss = { showCreateTask = false }, ) } + + selectedTask?.let { task -> + TaskEditSheet( + taskId = task.id, + projectId = task.projectId, + onDismiss = { selectedTask = null }, + ) + } } } } diff --git a/app/src/main/java/com/planify/mobile/ui/navigation/PlanifyNavHost.kt b/app/src/main/java/com/planify/mobile/ui/navigation/PlanifyNavHost.kt index eaf07d5..f87e62f 100644 --- a/app/src/main/java/com/planify/mobile/ui/navigation/PlanifyNavHost.kt +++ b/app/src/main/java/com/planify/mobile/ui/navigation/PlanifyNavHost.kt @@ -7,6 +7,7 @@ import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument +import com.planify.mobile.domain.model.Task import com.planify.mobile.ui.auth.AuthViewModel import com.planify.mobile.ui.filter.FilterScreen import com.planify.mobile.ui.inbox.InboxScreen @@ -21,6 +22,7 @@ import com.planify.mobile.ui.today.TodayScreen fun PlanifyNavHost( navController: NavHostController, authViewModel: AuthViewModel, + onTaskClick: (Task) -> Unit, modifier: Modifier = Modifier, ) { NavHost( @@ -29,15 +31,11 @@ fun PlanifyNavHost( modifier = modifier, ) { composable(Route.Inbox.path) { - InboxScreen( - onTaskClick = { /* TODO #11 : ouvrir édition */ } - ) + InboxScreen(onTaskClick = onTaskClick) } composable(Route.Today.path) { - TodayScreen( - onTaskClick = { /* TODO #11 : ouvrir édition */ } - ) + TodayScreen(onTaskClick = onTaskClick) } composable( @@ -47,21 +45,21 @@ fun PlanifyNavHost( val projectId = backStack.arguments?.getString("projectId") ?: return@composable ProjectScreen( projectId = projectId, - onTaskClick = { /* TODO: ouvrir édition */ }, + onTaskClick = onTaskClick, onBack = { navController.popBackStack() }, ) } composable(Route.Scheduled.path) { - ScheduledScreen(onTaskClick = { /* TODO: ouvrir édition */ }) + ScheduledScreen(onTaskClick = onTaskClick) } composable(Route.Search.path) { - SearchScreen(onTaskClick = { /* TODO: ouvrir édition */ }) + SearchScreen(onTaskClick = onTaskClick) } composable(Route.Filter.path) { - FilterScreen(onTaskClick = { /* TODO: ouvrir édition */ }) + FilterScreen(onTaskClick = onTaskClick) } composable( @@ -71,7 +69,7 @@ fun PlanifyNavHost( val labelId = backStack.arguments?.getString("labelId") ?: return@composable LabelScreen( labelId = labelId, - onTaskClick = { /* TODO: ouvrir édition */ }, + onTaskClick = onTaskClick, ) } diff --git a/app/src/main/java/com/planify/mobile/ui/task/TaskEditViewModel.kt b/app/src/main/java/com/planify/mobile/ui/task/TaskEditViewModel.kt index e903999..70362b1 100644 --- a/app/src/main/java/com/planify/mobile/ui/task/TaskEditViewModel.kt +++ b/app/src/main/java/com/planify/mobile/ui/task/TaskEditViewModel.kt @@ -150,15 +150,12 @@ class TaskEditViewModel @Inject constructor( addedAt = now, updatedAt = now, ) - // Insert locally only if the project already exists in Room. - // If not (sync not yet complete), the next sync will populate both. - val projectExists = projectRepository.getProjectById(task.projectId) != null - if (projectExists) { - if (st.taskId == null) taskRepository.insertTask(task) - else taskRepository.updateTask(task) - saveReminders(task.id, st, task) - } else { - // Sync will bring the task; trigger it now. + // Always insert/update locally — FK constraint removed, no crash risk. + if (st.taskId == null) taskRepository.insertTask(task) + else taskRepository.updateTask(task) + saveReminders(task.id, st, task) + // If the project isn't in Room yet, sync to pull it. + if (projectRepository.getProjectById(task.projectId) == null) { viewModelScope.launch { syncManager.sync() } } _state.update { it.copy(isSaving = false) }