Skip to content

Commit

Permalink
Improve TaskContract state and TaskScreen composable
Browse files Browse the repository at this point in the history
  • Loading branch information
FarshadTahmasbi committed Sep 23, 2023
1 parent 87f8ae9 commit 6ba2557
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 43 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.androidisland.todocompose.feature.task

import androidx.compose.runtime.Immutable
import com.androidisland.todocompose.arch.CommonEffect
import com.androidisland.todocompose.arch.MviAction
import com.androidisland.todocompose.arch.MviState
Expand All @@ -8,10 +9,16 @@ import com.androidisland.todocompose.enums.Priority


class TaskContract {
@Immutable
data class State(
val originTask: ToDoTask?,
val modifiedTask: ToDoTask
) : MviState
val taskId: Int,
val immutableTaskTitle: String?,
val taskTitle: String,
val taskDescription: String,
val taskPriority: Priority,
) : MviState {
fun toMutableTask() = ToDoTask(taskId, taskTitle, taskDescription, taskPriority)
}

sealed class Action : MviAction {
object LoadTask : Action()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,13 @@ class TaskViewModel @Inject constructor(

override val initialState: TaskContract.State
get() = TaskContract.State(
originTask = null,
modifiedTask = ToDoTask.blank()
taskId = taskId,
//We choose the proper toolbar by checking title null,
//So if the task id is valid, we pass an empty string until the task is loaded!
immutableTaskTitle = if (isTaskIdValid) "" else null,
taskTitle = "",
taskDescription = "",
taskPriority = Priority.LOW
)

override suspend fun handleAction(
Expand All @@ -50,27 +55,15 @@ class TaskViewModel @Inject constructor(
}

is TaskContract.Action.OnTaskTitleChange -> setState(
currentState.copy(
modifiedTask = currentState.modifiedTask.copy(
title = action.value
)
)
currentState.copy(taskTitle = action.value)
)

is TaskContract.Action.OnTaskDescriptionChange -> setState(
currentState.copy(
modifiedTask = currentState.modifiedTask.copy(
description = action.value
)
)
currentState.copy(taskDescription = action.value)
)

is TaskContract.Action.OnTaskPriorityChange -> setState(
currentState.copy(
modifiedTask = currentState.modifiedTask.copy(
priority = action.value
)
)
currentState.copy(taskPriority = action.value)
)

is TaskContract.Action.OnAddOrInsertClick -> onAddOrInsertClickAction()
Expand All @@ -83,15 +76,18 @@ class TaskViewModel @Inject constructor(
val task = getTask()
setState(
currentState.copy(
originTask = task,
modifiedTask = task ?: currentState.modifiedTask
taskId = task?.id ?: 0,
immutableTaskTitle = task?.title,
taskTitle = task?.title.orEmpty(),
taskDescription = task?.description.orEmpty(),
taskPriority = task?.priority ?: Priority.LOW
)
)
}
}

private fun onAddOrInsertClickAction() {
val task = currentState.modifiedTask
val task = currentState.toMutableTask()
if (taskRepository.isValidTask(task)) {
taskActionEventChannel.trySend(TaskActionEvent(TaskAction.INSERT_OR_UPDATE, task))
navigateToTaskList()
Expand All @@ -105,7 +101,7 @@ class TaskViewModel @Inject constructor(
}

private fun onDeleteClickAction() {
val task = currentState.modifiedTask
val task = currentState.toMutableTask()
taskActionEventChannel.trySend(TaskActionEvent(TaskAction.DELETE, task))
navigateToTaskList()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,24 +25,22 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import com.androidisland.todocompose.R
import com.androidisland.todocompose.component.DisplayAlertDialog
import com.androidisland.todocompose.data.models.ToDoTask
import com.androidisland.todocompose.enums.Priority
import com.androidisland.todocompose.enums.TaskAction


@Composable
fun TaskAppBar(
task: ToDoTask?,
taskTitle: String?,
onCloseClicked: () -> Unit,
onActionClicked: (TaskAction) -> Unit
) {
if (task == null) {
if (taskTitle == null) {
NewTaskAppBar(
onBackClicked = onCloseClicked, onActionClicked = onActionClicked
)
} else {
ExistingTaskAppBar(
selectedTask = task,
taskTitle = taskTitle,
onCloseClicked = onCloseClicked,
onActionClicked = onActionClicked
)
Expand Down Expand Up @@ -99,13 +97,13 @@ fun AddAction(
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ExistingTaskAppBar(
selectedTask: ToDoTask,
taskTitle: String,
onCloseClicked: () -> Unit,
onActionClicked: (TaskAction) -> Unit
) {
TopAppBar(title = {
Text(
text = selectedTask.title,
text = taskTitle,
color = MaterialTheme.colorScheme.onPrimary,
maxLines = 1,
overflow = TextOverflow.Ellipsis
Expand All @@ -116,7 +114,7 @@ fun ExistingTaskAppBar(
containerColor = MaterialTheme.colorScheme.primary,
titleContentColor = MaterialTheme.colorScheme.onPrimary
), actions = {
ExistingTaskAppBarActions(selectedTask, onActionClicked)
ExistingTaskAppBarActions(taskTitle, onActionClicked)
})
}

Expand All @@ -135,21 +133,21 @@ fun CloseAction(

@Composable
fun ExistingTaskAppBarActions(
selectedTask: ToDoTask,
taskTitle: String,
onActionClicked: (TaskAction) -> Unit
) {
var isDialogVisible by rememberSaveable {
mutableStateOf(false)
}

val message = buildAnnotatedString {
val original = stringResource(id = R.string.delete_task_confirm_msg, selectedTask.title)
val original = stringResource(id = R.string.delete_task_confirm_msg, taskTitle)
append(original)
val start = original.indexOf(selectedTask.title)
val start = original.indexOf(taskTitle)
addStyle(
style = SpanStyle(fontWeight = FontWeight.Bold),
start = start,
end = start + selectedTask.title.length
end = start + taskTitle.length
)
}

Expand Down Expand Up @@ -201,7 +199,5 @@ fun NewTaskAppBarPreview() {
@Preview
@Composable
fun ExistingTaskAppBarPreview() {
ExistingTaskAppBar(selectedTask = ToDoTask(
1, "Title", "Description goes here", Priority.LOW
), onCloseClicked = {}, onActionClicked = {})
ExistingTaskAppBar("My Task", onCloseClicked = {}, onActionClicked = {})
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,18 @@ fun TaskScreen(

Scaffold(topBar = {
TaskAppBar(
task = state.originTask,
taskTitle = state.immutableTaskTitle,
onCloseClicked = taskViewModel::navigateToTaskList,
onActionClicked = taskViewModel::onActionClick
)
}, snackbarHost = { CustomSnackbarHost(hostState = snackbarAppState.hostState) },
content = { padding ->
TaskContent(
title = state.modifiedTask.title,
title = state.taskTitle,
onTitleChanged = taskViewModel::onTaskTitleChange,
description = state.modifiedTask.description,
description = state.taskDescription,
onDescriptionChanged = taskViewModel::onTaskDescriptionChange,
priority = state.modifiedTask.priority,
priority = state.taskPriority,
onPrioritySelected = taskViewModel::onTaskPriorityChange,
padding
)
Expand Down

0 comments on commit 6ba2557

Please sign in to comment.