feat: tâche créée immédiatement en local + détail tâche au clic

This commit is contained in:
2026-06-06 10:33:04 +02:00
parent 38df116328
commit 8cab357c4c
4 changed files with 27 additions and 21 deletions
@@ -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<Task?>(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 },
)
}
}
}
}
@@ -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,
)
}
@@ -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) }