diff --git a/app/src/main/java/com/example/tudee/presentation/components/TaskContent.kt b/app/src/main/java/com/example/tudee/presentation/components/TaskContent.kt index 5ec3ffe5..a3d53f9d 100644 --- a/app/src/main/java/com/example/tudee/presentation/components/TaskContent.kt +++ b/app/src/main/java/com/example/tudee/presentation/components/TaskContent.kt @@ -20,6 +20,7 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.Button import androidx.compose.material3.DatePicker +import androidx.compose.material3.DatePickerDefaults import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Text @@ -41,13 +42,13 @@ import com.example.tudee.designsystem.theme.TudeeTheme import com.example.tudee.presentation.components.buttons.ButtonState import com.example.tudee.presentation.components.buttons.PrimaryButton import com.example.tudee.presentation.components.buttons.SecondaryButton +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.home.viewmodel.CategoryUiState import com.example.tudee.presentation.screen.home.viewmodel.HomeActions import com.example.tudee.presentation.screen.home.viewmodel.HomeUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskPriorityUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskUiState import com.example.tudee.presentation.utils.clickWithRipple -import com.example.tudee.presentation.utils.toCategoryIcon import kotlinx.datetime.Instant import kotlinx.datetime.LocalDate import kotlinx.datetime.TimeZone @@ -143,7 +144,7 @@ fun TaskContent( placeholder = stringResource(R.string.set_due_date), leadingContent = { isFocused -> DefaultLeadingContent( - modifier = Modifier.clickWithRipple{ showDatePicker = true }, + modifier = Modifier.clickWithRipple { showDatePicker = true }, painter = painterResource(R.drawable.ic_add_calendar), isFocused = isFocused ) @@ -184,7 +185,13 @@ fun TaskContent( modifier = Modifier .padding(top = 8.dp) .clip(CircleShape) - .clickWithRipple { onAction(HomeActions.OnEditTaskPriorityChanged(priority)) } + .clickWithRipple { + onAction( + HomeActions.OnEditTaskPriorityChanged( + priority + ) + ) + } ) } } @@ -202,7 +209,7 @@ fun TaskContent( columns = GridCells.Adaptive(minSize = 104.dp), verticalArrangement = Arrangement.spacedBy(24.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier =Modifier + modifier = Modifier .heightIn(max = 3000.dp) .fillMaxWidth() .padding(bottom = 160.dp), @@ -211,9 +218,7 @@ fun TaskContent( items(categories) { categories -> CategoryItemWithBadge( - categoryPainter = painterResource( - categories.image.toCategoryIcon() - ), + categoryPainter = categories.image.toUiImage().asPainter(), showCheckedIcon = state.selectedTask.taskCategory.id == categories.id, badgeBackgroundColor = TudeeTheme.color.statusColors.greenAccent, categoryName = categories.title, @@ -246,7 +251,11 @@ fun TaskContent( ) { PrimaryButton( modifier = Modifier.fillMaxWidth(), - state = if (state.selectedTask.taskDescription.isNotBlank() == true && state.selectedTask.taskTitle.isNotBlank() == true) ButtonState.IDLE else ButtonState.DISABLED, + state = if (state.selectedTask.taskDescription.isNotBlank() == true && + state.selectedTask.taskTitle.isNotBlank() == true && + state.selectedTask.taskCategory.title.isNotBlank() == true + + ) ButtonState.IDLE else ButtonState.DISABLED, onClick = { if (mode == TaskContentMode.EDIT) { onAction(HomeActions.OnEditTaskButtonClicked) @@ -283,6 +292,10 @@ fun DatePickerDialogComponent( DatePickerDialog( onDismissRequest = onDismiss, + colors = DatePickerDefaults.colors( + containerColor = TudeeTheme.color.surface + , titleContentColor = TudeeTheme.color.textColors.title + ), confirmButton = { Button(onClick = { val selectedDateMillis = datePickerState.selectedDateMillis @@ -306,7 +319,24 @@ fun DatePickerDialogComponent( } } ) { - DatePicker(state = datePickerState) + DatePicker(state = datePickerState +, headline = { + + }, + colors = DatePickerDefaults.colors( + navigationContentColor =TudeeTheme.color.textColors.title , + headlineContentColor = TudeeTheme.color.textColors.title, + titleContentColor = TudeeTheme.color.textColors.title, + weekdayContentColor = TudeeTheme.color.textColors.title, + dayContentColor=TudeeTheme.color.textColors.title, + containerColor = TudeeTheme.color.statusColors.greenAccent , + selectedDayContainerColor = TudeeTheme.color.primary, + selectedDayContentColor = TudeeTheme.color.textColors.onPrimary, + todayContentColor = TudeeTheme.color.primary, + todayDateBorderColor = TudeeTheme.color.primary, + + ) + ) } } diff --git a/app/src/main/java/com/example/tudee/presentation/components/TudeeBottomSheet.kt b/app/src/main/java/com/example/tudee/presentation/components/TudeeBottomSheet.kt index 6c0ad56a..dac67b0c 100644 --- a/app/src/main/java/com/example/tudee/presentation/components/TudeeBottomSheet.kt +++ b/app/src/main/java/com/example/tudee/presentation/components/TudeeBottomSheet.kt @@ -4,7 +4,6 @@ import android.content.res.Configuration import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -40,12 +39,12 @@ import com.example.tudee.R import com.example.tudee.designsystem.theme.TudeeTheme import com.example.tudee.presentation.components.buttons.ButtonState import com.example.tudee.presentation.components.buttons.SecondaryButton +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.home.viewmodel.CategoryUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskPriorityUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskStatusUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskUiState import com.example.tudee.presentation.utils.clickWithRipple -import com.example.tudee.presentation.utils.toCategoryIcon import kotlinx.datetime.LocalDate @OptIn(ExperimentalMaterial3Api::class) @@ -148,7 +147,9 @@ private fun TudeeTaskDetails(task: TaskUiState, modifier: Modifier = Modifier) { .padding(top = 12.dp) .background(color = TudeeTheme.color.surfaceHigh, shape = CircleShape) ) { - task.taskCategory.image?.let { painterResource(it.toCategoryIcon()) }?.let { + task.taskCategory.image?.let { + it.toUiImage().asPainter() + }?.let { Image( modifier = Modifier.padding(15.dp), painter = it, contentDescription = null diff --git a/app/src/main/java/com/example/tudee/presentation/screen/category/model/UiImage.kt b/app/src/main/java/com/example/tudee/presentation/screen/category/model/UiImage.kt index adc15df5..f071d3bb 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/category/model/UiImage.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/category/model/UiImage.kt @@ -5,9 +5,10 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource -import androidx.core.text.isDigitsOnly import coil3.compose.rememberAsyncImagePainter import coil3.imageLoader +import com.example.tudee.presentation.utils.predefinedCategories +import com.example.tudee.presentation.utils.toCategoryIcon import java.io.File sealed class UiImage { @@ -36,8 +37,8 @@ sealed class UiImage { } fun String.toUiImage(): UiImage { - return if (isDigitsOnly()) { - UiImage.Drawable(toInt()) + return if (this in predefinedCategories.map { it.image }) { + UiImage.Drawable(this.toCategoryIcon()) } else { UiImage.External(this) } diff --git a/app/src/main/java/com/example/tudee/presentation/screen/home/components/TaskList.kt b/app/src/main/java/com/example/tudee/presentation/screen/home/components/TaskList.kt index 48f0c734..cd68fcbf 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/home/components/TaskList.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/home/components/TaskList.kt @@ -21,13 +21,13 @@ import com.example.tudee.designsystem.theme.TudeeTheme import com.example.tudee.domain.entity.TaskPriority import com.example.tudee.domain.entity.TaskStatus import com.example.tudee.presentation.components.CategoryTaskComponent +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.home.toTaskPriorityUiState import com.example.tudee.presentation.screen.home.toTaskStatusUiState import com.example.tudee.presentation.screen.home.viewmodel.CategoryUiState import com.example.tudee.presentation.screen.home.viewmodel.HomeActions import com.example.tudee.presentation.screen.home.viewmodel.TaskPriorityUiState import com.example.tudee.presentation.screen.home.viewmodel.TaskUiState -import com.example.tudee.presentation.utils.toCategoryIcon import kotlinx.datetime.LocalDate @Composable @@ -73,8 +73,9 @@ fun TaskList( priorityIcon = painterResource(id = priorityIcon), priorityBackgroundColor = priorityColor, taskIcon = { + Image( - painter = painterResource(task.taskCategory.image.toCategoryIcon()), + painter = task.taskCategory.image.toUiImage().asPainter(), contentDescription = "taskIcon", ) }, diff --git a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TaskButtonSheet.kt b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TaskButtonSheet.kt index 0cc5b7cf..2b0e806c 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TaskButtonSheet.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TaskButtonSheet.kt @@ -3,7 +3,6 @@ package com.example.tudee.presentation.screen.task_screen.component import android.util.Log import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -47,9 +46,9 @@ import com.example.tudee.presentation.components.buttons.ButtonColors import com.example.tudee.presentation.components.buttons.ButtonState import com.example.tudee.presentation.components.buttons.DefaultButton import com.example.tudee.presentation.components.buttons.PrimaryButton +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.task_screen.ui_states.TaskBottomSheetState import com.example.tudee.presentation.utils.clickWithRipple -import com.example.tudee.presentation.utils.toCategoryIcon import kotlinx.coroutines.launch import kotlinx.datetime.Clock import kotlinx.datetime.LocalDate @@ -79,10 +78,10 @@ fun TaskContent( val scope = rememberCoroutineScope() - if (taskState.isDatePickerVisible){ + if (taskState.isDatePickerVisible) { TudeeDateDialog( - onConfirm = {onConfirmDatePicker(it)}, - onDismiss = {onDismissDatePicker()}, + onConfirm = { onConfirmDatePicker(it) }, + onDismiss = { onDismissDatePicker() }, onClear = {} ) } @@ -134,16 +133,18 @@ fun TaskContent( } } } - Box (Modifier - .fillMaxWidth() - .zIndex(1f)){ - taskState.snackBarMessage?.let { isSuccess -> - SnackBarSection( - isSnackBarVisible = isSuccess, - showSnackBar= true - ) - } - } + Box( + Modifier + .fillMaxWidth() + .zIndex(1f) + ) { + taskState.snackBarMessage?.let { isSuccess -> + SnackBarSection( + isSnackBarVisible = isSuccess, + showSnackBar = true + ) + } + } } @@ -164,18 +165,18 @@ fun BottomSheetContent( .padding(horizontal = 16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { - if(isEditMode){ - item{ + if (isEditMode) { + item { Text( - text = stringResource(R.string.editNewTask) , + text = stringResource(R.string.editNewTask), style = TudeeTheme.textStyle.title.large, color = TudeeTheme.color.textColors.title ) } - }else{ + } else { item { Text( - text = stringResource(R.string.addNewTask) , + text = stringResource(R.string.addNewTask), style = TudeeTheme.textStyle.title.large, color = TudeeTheme.color.textColors.title ) @@ -205,37 +206,37 @@ fun BottomSheetContent( value = taskState.taskDescription ) } - item { - TudeeTextField( - value = taskState.taskDueDate?.toString() ?: "2024, 1, 1", - onValueChange = { newValue -> - val parts = newValue.split(", ") - if (parts.size == 3) { - try { - val year = parts[0].toInt() - val month = parts[1].toInt() - val day = parts[2].toInt() - onUpdateTaskDueDate(LocalDate(year, month, day)) - } catch (e: Exception) { - Log.e( - "BottomSheetContent", - "Invalid date format: $newValue, ${e.message}" - ) - } + item { + TudeeTextField( + value = taskState.taskDueDate?.toString() ?: "2024, 1, 1", + onValueChange = { newValue -> + val parts = newValue.split(", ") + if (parts.size == 3) { + try { + val year = parts[0].toInt() + val month = parts[1].toInt() + val day = parts[2].toInt() + onUpdateTaskDueDate(LocalDate(year, month, day)) + } catch (e: Exception) { + Log.e( + "BottomSheetContent", + "Invalid date format: $newValue, ${e.message}" + ) } - }, - leadingContent = { isFocused -> - DefaultLeadingContent( - modifier = Modifier.clickWithRipple { - onDateFieldClicked() - }, - painter = painterResource(R.drawable.ic_add_calendar), - isFocused = isFocused - ) - }, - placeholder = stringResource(R.string.set_due_date) - ) - } + } + }, + leadingContent = { isFocused -> + DefaultLeadingContent( + modifier = Modifier.clickWithRipple { + onDateFieldClicked() + }, + painter = painterResource(R.drawable.ic_add_calendar), + isFocused = isFocused + ) + }, + placeholder = stringResource(R.string.set_due_date) + ) + } item { Text( @@ -252,7 +253,9 @@ fun BottomSheetContent( val isSelected = taskState.selectedTaskPriority == taskPriority TudeeChip( label = taskPriority.name, - modifier = Modifier.clip(CircleShape).clickWithRipple { onUpdateTaskPriority(taskPriority) }, + modifier = Modifier + .clip(CircleShape) + .clickWithRipple { onUpdateTaskPriority(taskPriority) }, labelColor = if (isSelected) TudeeTheme.color.textColors.onPrimary else TudeeTheme.color.textColors.hint, backgroundColor = if (isSelected) { when (taskPriority) { @@ -281,7 +284,7 @@ fun BottomSheetContent( item { LazyVerticalGrid( columns = GridCells.Adaptive(minSize = 104.dp), - modifier =Modifier + modifier = Modifier .heightIn(max = 3000.dp) .fillMaxWidth() .padding(bottom = 160.dp), @@ -291,8 +294,10 @@ fun BottomSheetContent( ) { items(taskState.categories) { category -> CategoryComponent( - modifier = Modifier.clip(RoundedCornerShape(10.dp)).clickWithRipple { onSelectTaskCategory(category.id) }, - categoryPainter = painterResource(category.image.toCategoryIcon()), + modifier = Modifier + .clip(RoundedCornerShape(10.dp)) + .clickWithRipple { onSelectTaskCategory(category.id) }, + categoryPainter = category.image.toUiImage().asPainter(), categoryImageContentDescription = category.title, categoryName = category.title, showCheckedIcon = category.id == taskState.selectedCategoryId @@ -304,13 +309,14 @@ fun BottomSheetContent( } @Composable -private fun Title_operation(title:String) { +private fun Title_operation(title: String) { Text( - text = stringResource(R.string.editNewTask) , + text = stringResource(R.string.editNewTask), style = TudeeTheme.textStyle.title.large, color = TudeeTheme.color.textColors.title ) } + @Composable fun AddOrSaveButtons( modifier: Modifier = Modifier, @@ -350,7 +356,9 @@ fun AddOrSaveButtons( priority = taskState.selectedTaskPriority!!, categoryId = taskState.selectedCategoryId!!, status = TaskStatus.TODO, - assignedDate = taskState.taskDueDate?.toLocalDate() ?: Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault()).date + assignedDate = taskState.taskDueDate?.toLocalDate() + ?: Clock.System.now() + .toLocalDateTime(TimeZone.currentSystemDefault()).date ) ) diff --git a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TasksListContent.kt b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TasksListContent.kt index 49aa9a2a..3631f978 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TasksListContent.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/component/TasksListContent.kt @@ -42,9 +42,9 @@ import androidx.compose.ui.unit.dp import com.example.tudee.R import com.example.tudee.designsystem.theme.TudeeTheme import com.example.tudee.presentation.components.CategoryTaskComponent +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.task_screen.ui.NotTaskForTodayDialogue import com.example.tudee.presentation.screen.task_screen.ui_states.TaskUiState -import com.example.tudee.presentation.utils.toCategoryIcon import kotlinx.coroutines.launch import kotlin.math.roundToInt @@ -87,7 +87,7 @@ fun TasksListContent( priorityBackgroundColor = task.priority.containerColor, taskIcon = { Icon( - painter = painterResource(task.categoryIcon.toCategoryIcon()), + painter = task.categoryIcon.toUiImage().asPainter(), contentDescription = "Task Icon", modifier = Modifier.size(32.dp), tint = Color.Unspecified @@ -126,8 +126,8 @@ fun SwipeableCardWrapper( hiddenIconWidth = it.width.toFloat() } .padding(horizontal = 16.dp), onClick = { - onDeleteIconClick() - }) { + onDeleteIconClick() + }) { Icon( modifier = Modifier.size(32.dp), painter = painterResource(R.drawable.delete_ic), diff --git a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui/DetailsTask.kt b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui/DetailsTask.kt index 580ae64f..49a7f64c 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui/DetailsTask.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui/DetailsTask.kt @@ -2,7 +2,6 @@ package com.example.tudee.presentation.screen.task_screen.ui import androidx.compose.foundation.background import androidx.compose.foundation.border -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -30,12 +29,12 @@ import com.example.tudee.designsystem.theme.TudeeTheme import com.example.tudee.domain.entity.TaskStatus import com.example.tudee.presentation.components.TudeeChip import com.example.tudee.presentation.components.buttons.SecondaryButton +import com.example.tudee.presentation.screen.category.model.toUiImage import com.example.tudee.presentation.screen.task_screen.mappers.TaskPriorityUiState import com.example.tudee.presentation.screen.task_screen.mappers.TaskStatusUiState import com.example.tudee.presentation.screen.task_screen.mappers.toDomain import com.example.tudee.presentation.screen.task_screen.ui_states.TaskDetailsUiState import com.example.tudee.presentation.utils.clickWithRipple -import com.example.tudee.presentation.utils.toCategoryIcon import com.example.tudee.presentation.viewmodel.TaskBottomSheetViewModel @Composable @@ -83,7 +82,7 @@ private fun TaskCategoryIcon(categoryIconRes: String) { contentAlignment = Alignment.Center ) { Icon( - painter = painterResource(categoryIconRes.toCategoryIcon()), + painter = categoryIconRes.toUiImage().asPainter(), contentDescription = "category icon", modifier = Modifier.size(32.dp), tint = Color.Unspecified diff --git a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui_states/TaskBottomSheetState.kt b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui_states/TaskBottomSheetState.kt index 7a91f2ff..feaec037 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui_states/TaskBottomSheetState.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/ui_states/TaskBottomSheetState.kt @@ -1,8 +1,8 @@ package com.example.tudee.presentation.screen.task_screen.ui_states -import com.example.tudee.domain.entity.TaskCategory import com.example.tudee.domain.entity.TaskPriority import com.example.tudee.domain.entity.TaskStatus +import com.example.tudee.presentation.screen.home.viewmodel.CategoryUiState data class TaskBottomSheetState( val isButtonSheetVisible: Boolean = false, @@ -15,7 +15,7 @@ data class TaskBottomSheetState( val selectedCategoryId: Long? = null, val isEditMode: Boolean = false, val snackBarMessage: Boolean? = null, - val categories: List = emptyList(), + val categories: List = emptyList(), val taskPriorities: List = listOf( TaskPriority.HIGH, TaskPriority.MEDIUM, @@ -23,4 +23,5 @@ data class TaskBottomSheetState( ), val isDatePickerVisible: Boolean=false, - ) \ No newline at end of file + ) + diff --git a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModel.kt b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModel.kt index dd869ea9..44765315 100644 --- a/app/src/main/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModel.kt +++ b/app/src/main/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModel.kt @@ -3,6 +3,7 @@ package com.example.tudee.presentation.viewmodel import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.tudee.data.mapper.toCategoryUiState import com.example.tudee.domain.TaskCategoryService import com.example.tudee.domain.TaskService import com.example.tudee.domain.entity.Task @@ -36,13 +37,12 @@ class TaskBottomSheetViewModel( init { viewModelScope.launch { - _taskBottomSheetUiState.update { - it.copy( - categories = categoryService.getCategories().first() - ) + val categoryUiStates = + categoryService.getCategories().first().map { it.toCategoryUiState() } + _taskBottomSheetUiState.update { it.copy(categories = categoryUiStates) } } } - } + val isTaskValid: StateFlow = _taskBottomSheetUiState .map { state -> diff --git a/app/src/test/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModelTest.kt b/app/src/test/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModelTest.kt index 34d77bf2..ae80838c 100644 --- a/app/src/test/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModelTest.kt +++ b/app/src/test/java/com/example/tudee/presentation/screen/task_screen/viewmodel/TaskBottomSheetViewModelTest.kt @@ -7,6 +7,7 @@ import com.example.tudee.domain.entity.TaskCategory import com.example.tudee.domain.entity.TaskPriority import com.example.tudee.domain.entity.TaskStatus import com.example.tudee.domain.request.TaskCreationRequest +import com.example.tudee.presentation.screen.home.viewmodel.CategoryUiState import com.example.tudee.presentation.viewmodel.TaskBottomSheetViewModel import com.google.common.truth.Truth.assertThat import io.mockk.clearAllMocks @@ -73,6 +74,10 @@ class TaskBottomSheetViewModelTest { @Test fun `init should load categories`() = runTest { + val dummyCategories=listOf(CategoryUiState(id=1, + title="Shopping", image="ic_shopping", isPredefined=false), + CategoryUiState(id=2, title="Work", image="ic_work", isPredefined=false) + ) // When val state = viewModel.uiState.value // Then