feat: tâche créée immédiatement en local + détail tâche au clic
This commit is contained in:
@@ -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) }
|
||||
|
||||
Reference in New Issue
Block a user