diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a962a03..4fc89af 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.14" + versionName = "0.0.15" 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 13800e6..16ca01e 100644 --- a/app/src/main/java/com/planify/mobile/ui/MainScreen.kt +++ b/app/src/main/java/com/planify/mobile/ui/MainScreen.kt @@ -72,8 +72,9 @@ fun MainScreen( 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/") + // destination.route is the pattern ("project/{projectId}"), arguments hold the real value + val createProjectId = if (currentRoute == Route.Project().path) + navBackStack?.arguments?.getString("projectId") ?: inboxProjectId else inboxProjectId @@ -85,9 +86,10 @@ fun MainScreen( Route.Filter.path to "Filtres", Route.Settings.path to "Paramètres", ) - val title = drawerTitles[currentRoute] - ?: projects.find { "project/${it.id}" == currentRoute }?.name - ?: "BonsaiTask" + val activeProjectName = if (currentRoute == Route.Project().path) + projects.find { it.id == navBackStack?.arguments?.getString("projectId") }?.name + else null + val title = drawerTitles[currentRoute] ?: activeProjectName ?: "BonsaiTask" ModalNavigationDrawer( drawerState = drawerState, @@ -154,7 +156,7 @@ fun MainScreen( NavigationDrawerItem( icon = { Icon(Icons.Default.FolderOpen, null) }, label = { Text(project.name) }, - selected = currentRoute == "project/${project.id}", + selected = currentRoute == Route.Project().path && navBackStack?.arguments?.getString("projectId") == project.id, onClick = { navController.navigate(Route.Project().buildRoute(project.id)) scope.launch { drawerState.close() } diff --git a/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt b/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt index f0e731e..63237a8 100644 --- a/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt +++ b/app/src/main/java/com/planify/mobile/ui/task/TaskEditSheet.kt @@ -26,6 +26,7 @@ import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.ui.graphics.Color import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState @@ -150,6 +151,15 @@ fun TaskEditSheet( Spacer(Modifier.height(12.dp)) + state.saveError?.let { error -> + Text( + text = error, + color = Color.Red, + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(vertical = 4.dp), + ) + } + Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End, 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 70362b1..e0eb35c 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 @@ -129,6 +129,13 @@ class TaskEditViewModel @Inject constructor( val taskIdLong = st.taskId?.toLongOrNull() if (authManager.isLoggedIn && projectIdLong != null) { + // Refresh token if expired before calling API + val tokenOk = authManager.refreshIfNeeded() + if (!tokenOk) { + _state.update { it.copy(isSaving = false, saveError = "Session expirée, veuillez vous reconnecter") } + return@launch + } + val apiResult = if (taskIdLong != null) { apiClient.updateIssue(projectIdLong, taskIdLong, request) } else {