This commit is contained in:
Trey t
2025-11-05 10:38:46 -06:00
parent 025fcf677a
commit 2be3a5a3a8
23 changed files with 2837 additions and 124 deletions

View File

@@ -4,7 +4,7 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class Task(
data class CustomTask (
val id: Int,
val residence: Int,
@SerialName("created_by") val createdBy: Int,

View File

@@ -74,8 +74,8 @@ data class ResidenceSummary(
val country: String,
@SerialName("is_primary") val isPrimary: Boolean,
@SerialName("task_summary") val taskSummary: TaskSummary,
@SerialName("last_completed_task") val lastCompletedTask: Task?,
@SerialName("next_upcoming_task") val nextUpcomingTask: Task?,
@SerialName("last_completed_task") val lastCompletedCustomTask: CustomTask?,
@SerialName("next_upcoming_task") val nextUpcomingCustomTask: CustomTask?,
@SerialName("created_at") val createdAt: String,
@SerialName("updated_at") val updatedAt: String
)

View File

@@ -9,14 +9,14 @@ import io.ktor.http.*
class TaskApi(private val client: HttpClient = ApiClient.httpClient) {
private val baseUrl = ApiClient.getBaseUrl()
suspend fun getTasks(token: String): ApiResult<List<Task>> {
suspend fun getTasks(token: String): ApiResult<List<CustomTask>> {
return try {
val response = client.get("$baseUrl/tasks/") {
header("Authorization", "Token $token")
}
if (response.status.isSuccess()) {
val data: PaginatedResponse<Task> = response.body()
val data: PaginatedResponse<CustomTask> = response.body()
ApiResult.Success(data.results)
} else {
ApiResult.Error("Failed to fetch tasks", response.status.value)
@@ -42,7 +42,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) {
}
}
suspend fun createTask(token: String, request: TaskCreateRequest): ApiResult<Task> {
suspend fun createTask(token: String, request: TaskCreateRequest): ApiResult<CustomTask> {
return try {
val response = client.post("$baseUrl/tasks/") {
header("Authorization", "Token $token")
@@ -60,7 +60,7 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) {
}
}
suspend fun updateTask(token: String, id: Int, request: TaskCreateRequest): ApiResult<Task> {
suspend fun updateTask(token: String, id: Int, request: TaskCreateRequest): ApiResult<CustomTask> {
return try {
val response = client.put("$baseUrl/tasks/$id/") {
header("Authorization", "Token $token")

View File

@@ -34,7 +34,7 @@ fun ResidenceDetailScreen(
var residenceState by remember { mutableStateOf<ApiResult<Residence>>(ApiResult.Loading) }
val tasksState by residenceViewModel.residenceTasksState.collectAsState()
val completionState by taskCompletionViewModel.createCompletionState.collectAsState()
val taskAddNewTaskState by taskViewModel.taskAddNewTaskState.collectAsState()
val taskAddNewTaskState by taskViewModel.taskAddNewCustomTaskState.collectAsState()
var showCompleteDialog by remember { mutableStateOf(false) }
var selectedTask by remember { mutableStateOf<TaskDetail?>(null) }

View File

@@ -2,10 +2,8 @@ package com.mycrib.android.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.mycrib.shared.models.ResidenceCreateRequest
import com.mycrib.shared.models.Task
import com.mycrib.shared.models.CustomTask
import com.mycrib.shared.models.TaskCreateRequest
import com.mycrib.shared.models.TaskDetail
import com.mycrib.shared.models.TasksByResidenceResponse
import com.mycrib.shared.network.ApiResult
import com.mycrib.shared.network.TaskApi
@@ -17,14 +15,14 @@ import kotlinx.coroutines.launch
class TaskViewModel : ViewModel() {
private val taskApi = TaskApi()
private val _tasksState = MutableStateFlow<ApiResult<List<Task>>>(ApiResult.Loading)
val tasksState: StateFlow<ApiResult<List<Task>>> = _tasksState
private val _tasksState = MutableStateFlow<ApiResult<List<CustomTask>>>(ApiResult.Loading)
val tasksState: StateFlow<ApiResult<List<CustomTask>>> = _tasksState
private val _tasksByResidenceState = MutableStateFlow<ApiResult<TasksByResidenceResponse>>(ApiResult.Loading)
val tasksByResidenceState: StateFlow<ApiResult<TasksByResidenceResponse>> = _tasksByResidenceState
private val _taskAddNewTaskState = MutableStateFlow<ApiResult<Task>>(ApiResult.Loading)
val taskAddNewTaskState: StateFlow<ApiResult<Task>> = _taskAddNewTaskState
private val _taskAddNewCustomTaskState = MutableStateFlow<ApiResult<CustomTask>>(ApiResult.Loading)
val taskAddNewCustomTaskState: StateFlow<ApiResult<CustomTask>> = _taskAddNewCustomTaskState
fun loadTasks() {
viewModelScope.launch {
@@ -52,17 +50,17 @@ class TaskViewModel : ViewModel() {
fun createNewTask(request: TaskCreateRequest) {
viewModelScope.launch {
_taskAddNewTaskState.value = ApiResult.Loading
_taskAddNewCustomTaskState.value = ApiResult.Loading
try {
_taskAddNewTaskState.value = taskApi.createTask(TokenStorage.getToken()!!, request)
_taskAddNewCustomTaskState.value = taskApi.createTask(TokenStorage.getToken()!!, request)
} catch (e: Exception) {
_taskAddNewTaskState.value = ApiResult.Error(e.message ?: "Unknown error")
_taskAddNewCustomTaskState.value = ApiResult.Error(e.message ?: "Unknown error")
}
}
}
fun resetAddTaskState() {
_taskAddNewTaskState.value = ApiResult.Loading // or ApiResult.Idle if you have it
_taskAddNewCustomTaskState.value = ApiResult.Loading // or ApiResult.Idle if you have it
}
}