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
+1 -1
View File
@@ -16,7 +16,7 @@ android {
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 1 versionCode = 1
versionName = "0.0.13" versionName = "0.0.14"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -48,6 +48,7 @@ import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.planify.mobile.domain.model.Task
import com.planify.mobile.ui.auth.AuthViewModel import com.planify.mobile.ui.auth.AuthViewModel
import com.planify.mobile.ui.navigation.DrawerViewModel import com.planify.mobile.ui.navigation.DrawerViewModel
import com.planify.mobile.ui.navigation.PlanifyNavHost import com.planify.mobile.ui.navigation.PlanifyNavHost
@@ -69,6 +70,7 @@ fun MainScreen(
val currentRoute = navBackStack?.destination?.route val currentRoute = navBackStack?.destination?.route
var showCreateTask by remember { mutableStateOf(false) } var showCreateTask by remember { mutableStateOf(false) }
var selectedTask by remember { mutableStateOf<Task?>(null) }
val inboxProjectId = projects.find { it.isInbox }?.id ?: "" val inboxProjectId = projects.find { it.isInbox }?.id ?: ""
val createProjectId = if (currentRoute?.startsWith("project/") == true) val createProjectId = if (currentRoute?.startsWith("project/") == true)
currentRoute.removePrefix("project/") currentRoute.removePrefix("project/")
@@ -209,6 +211,7 @@ fun MainScreen(
PlanifyNavHost( PlanifyNavHost(
navController = navController, navController = navController,
authViewModel = authViewModel, authViewModel = authViewModel,
onTaskClick = { task -> selectedTask = task },
modifier = Modifier.padding(padding), modifier = Modifier.padding(padding),
) )
@@ -218,6 +221,14 @@ fun MainScreen(
onDismiss = { showCreateTask = false }, 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.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.navArgument import androidx.navigation.navArgument
import com.planify.mobile.domain.model.Task
import com.planify.mobile.ui.auth.AuthViewModel import com.planify.mobile.ui.auth.AuthViewModel
import com.planify.mobile.ui.filter.FilterScreen import com.planify.mobile.ui.filter.FilterScreen
import com.planify.mobile.ui.inbox.InboxScreen import com.planify.mobile.ui.inbox.InboxScreen
@@ -21,6 +22,7 @@ import com.planify.mobile.ui.today.TodayScreen
fun PlanifyNavHost( fun PlanifyNavHost(
navController: NavHostController, navController: NavHostController,
authViewModel: AuthViewModel, authViewModel: AuthViewModel,
onTaskClick: (Task) -> Unit,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
NavHost( NavHost(
@@ -29,15 +31,11 @@ fun PlanifyNavHost(
modifier = modifier, modifier = modifier,
) { ) {
composable(Route.Inbox.path) { composable(Route.Inbox.path) {
InboxScreen( InboxScreen(onTaskClick = onTaskClick)
onTaskClick = { /* TODO #11 : ouvrir édition */ }
)
} }
composable(Route.Today.path) { composable(Route.Today.path) {
TodayScreen( TodayScreen(onTaskClick = onTaskClick)
onTaskClick = { /* TODO #11 : ouvrir édition */ }
)
} }
composable( composable(
@@ -47,21 +45,21 @@ fun PlanifyNavHost(
val projectId = backStack.arguments?.getString("projectId") ?: return@composable val projectId = backStack.arguments?.getString("projectId") ?: return@composable
ProjectScreen( ProjectScreen(
projectId = projectId, projectId = projectId,
onTaskClick = { /* TODO: ouvrir édition */ }, onTaskClick = onTaskClick,
onBack = { navController.popBackStack() }, onBack = { navController.popBackStack() },
) )
} }
composable(Route.Scheduled.path) { composable(Route.Scheduled.path) {
ScheduledScreen(onTaskClick = { /* TODO: ouvrir édition */ }) ScheduledScreen(onTaskClick = onTaskClick)
} }
composable(Route.Search.path) { composable(Route.Search.path) {
SearchScreen(onTaskClick = { /* TODO: ouvrir édition */ }) SearchScreen(onTaskClick = onTaskClick)
} }
composable(Route.Filter.path) { composable(Route.Filter.path) {
FilterScreen(onTaskClick = { /* TODO: ouvrir édition */ }) FilterScreen(onTaskClick = onTaskClick)
} }
composable( composable(
@@ -71,7 +69,7 @@ fun PlanifyNavHost(
val labelId = backStack.arguments?.getString("labelId") ?: return@composable val labelId = backStack.arguments?.getString("labelId") ?: return@composable
LabelScreen( LabelScreen(
labelId = labelId, labelId = labelId,
onTaskClick = { /* TODO: ouvrir édition */ }, onTaskClick = onTaskClick,
) )
} }
@@ -150,15 +150,12 @@ class TaskEditViewModel @Inject constructor(
addedAt = now, addedAt = now,
updatedAt = now, updatedAt = now,
) )
// Insert locally only if the project already exists in Room. // Always insert/update locally — FK constraint removed, no crash risk.
// 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) if (st.taskId == null) taskRepository.insertTask(task)
else taskRepository.updateTask(task) else taskRepository.updateTask(task)
saveReminders(task.id, st, task) saveReminders(task.id, st, task)
} else { // If the project isn't in Room yet, sync to pull it.
// Sync will bring the task; trigger it now. if (projectRepository.getProjectById(task.projectId) == null) {
viewModelScope.launch { syncManager.sync() } viewModelScope.launch { syncManager.sync() }
} }
_state.update { it.copy(isSaving = false) } _state.update { it.copy(isSaving = false) }