feat: toggle tâche → statut terminé sur API + bouton déconnexion dans le menu

This commit is contained in:
2026-06-06 11:24:28 +02:00
parent 6109e4a5df
commit 33f95cc5a5
3 changed files with 35 additions and 2 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.16" versionName = "0.0.17"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
} }
@@ -18,6 +18,7 @@ import androidx.compose.material.icons.outlined.FilterList
import androidx.compose.material.icons.outlined.Inbox import androidx.compose.material.icons.outlined.Inbox
import androidx.compose.material.icons.outlined.Menu import androidx.compose.material.icons.outlined.Menu
import androidx.compose.material.icons.outlined.Search import androidx.compose.material.icons.outlined.Search
import androidx.compose.material.icons.outlined.Logout
import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material.icons.outlined.Today import androidx.compose.material.icons.outlined.Today
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -174,6 +175,15 @@ fun MainScreen(
scope.launch { drawerState.close() } scope.launch { drawerState.close() }
}, },
) )
NavigationDrawerItem(
icon = { Icon(Icons.Outlined.Logout, null) },
label = { Text("Déconnexion") },
selected = false,
onClick = {
authViewModel.logout()
scope.launch { drawerState.close() }
},
)
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
Text( Text(
text = "v${com.planify.mobile.BuildConfig.VERSION_NAME}", text = "v${com.planify.mobile.BuildConfig.VERSION_NAME}",
@@ -7,6 +7,10 @@ import com.planify.mobile.domain.model.Project
import com.planify.mobile.domain.model.Section import com.planify.mobile.domain.model.Section
import com.planify.mobile.domain.model.Task import com.planify.mobile.domain.model.Task
import com.planify.mobile.domain.model.ViewStyle import com.planify.mobile.domain.model.ViewStyle
import com.planify.mobile.data.bonsai.BonsaiApiClient
import com.planify.mobile.data.bonsai.BonsaiAuthManager
import com.planify.mobile.data.bonsai.BonsaiSyncManager
import com.planify.mobile.data.bonsai.dto.BonsaIssueRequest
import com.planify.mobile.domain.repository.ProjectRepository import com.planify.mobile.domain.repository.ProjectRepository
import com.planify.mobile.domain.repository.SectionRepository import com.planify.mobile.domain.repository.SectionRepository
import com.planify.mobile.domain.repository.TaskRepository import com.planify.mobile.domain.repository.TaskRepository
@@ -32,6 +36,8 @@ class ProjectViewModel @Inject constructor(
private val taskRepository: TaskRepository, private val taskRepository: TaskRepository,
private val projectRepository: ProjectRepository, private val projectRepository: ProjectRepository,
private val sectionRepository: SectionRepository, private val sectionRepository: SectionRepository,
private val apiClient: BonsaiApiClient,
private val authManager: BonsaiAuthManager,
) : ViewModel() { ) : ViewModel() {
private val projectId: String = checkNotNull(savedStateHandle["projectId"]) private val projectId: String = checkNotNull(savedStateHandle["projectId"])
@@ -66,7 +72,24 @@ class ProjectViewModel @Inject constructor(
) )
fun toggleTask(task: Task) { fun toggleTask(task: Task) {
viewModelScope.launch { taskRepository.checkTask(task.id, !task.checked) } val newChecked = !task.checked
viewModelScope.launch {
taskRepository.checkTask(task.id, newChecked)
val projectIdLong = task.projectId.toLongOrNull() ?: return@launch
val taskIdLong = task.id.toLongOrNull() ?: return@launch
if (!authManager.isLoggedIn) return@launch
authManager.refreshIfNeeded()
val request = BonsaIssueRequest(
name = task.content,
priority = BonsaiSyncManager.toBonsaiPriority(task.priority),
status = BonsaiSyncManager.toBonsaiStatus(newChecked),
dueDate = task.dueDate?.date,
description = task.description.ifBlank { null },
)
apiClient.updateIssue(projectIdLong, taskIdLong, request)
}
} }
fun reorderTasks(reordered: List<Task>) { fun reorderTasks(reordered: List<Task>) {