feat: tâche créée immédiatement en local + détail tâche au clic
This commit is contained in:
@@ -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.
|
if (st.taskId == null) taskRepository.insertTask(task)
|
||||||
val projectExists = projectRepository.getProjectById(task.projectId) != null
|
else taskRepository.updateTask(task)
|
||||||
if (projectExists) {
|
saveReminders(task.id, st, task)
|
||||||
if (st.taskId == null) taskRepository.insertTask(task)
|
// If the project isn't in Room yet, sync to pull it.
|
||||||
else taskRepository.updateTask(task)
|
if (projectRepository.getProjectById(task.projectId) == null) {
|
||||||
saveReminders(task.id, st, task)
|
|
||||||
} else {
|
|
||||||
// Sync will bring the task; trigger it now.
|
|
||||||
viewModelScope.launch { syncManager.sync() }
|
viewModelScope.launch { syncManager.sync() }
|
||||||
}
|
}
|
||||||
_state.update { it.copy(isSaving = false) }
|
_state.update { it.copy(isSaving = false) }
|
||||||
|
|||||||
Reference in New Issue
Block a user