#22 boilerplate for task screen
This commit is contained in:
parent
7ad1047091
commit
1a2e192227
10 changed files with 200 additions and 81 deletions
|
@ -40,6 +40,7 @@ import be.ugent.sel.studeez.screens.session.SessionRoute
|
|||
import be.ugent.sel.studeez.screens.session_recap.SessionRecapRoute
|
||||
import be.ugent.sel.studeez.screens.sign_up.SignUpRoute
|
||||
import be.ugent.sel.studeez.screens.splash.SplashRoute
|
||||
import be.ugent.sel.studeez.screens.tasks.SubjectRoute
|
||||
import be.ugent.sel.studeez.screens.tasks.TaskRoute
|
||||
import be.ugent.sel.studeez.screens.timer_overview.TimerOverviewRoute
|
||||
import be.ugent.sel.studeez.screens.timer_selection.TimerSelectionRoute
|
||||
|
@ -146,14 +147,21 @@ fun StudeezNavGraph(
|
|||
)
|
||||
}
|
||||
|
||||
composable(StudeezDestinations.TASKS_SCREEN) {
|
||||
TaskRoute(
|
||||
composable(StudeezDestinations.SUBJECT_SCREEN) {
|
||||
SubjectRoute(
|
||||
open = open,
|
||||
viewModel = hiltViewModel(),
|
||||
drawerActions = drawerActions,
|
||||
navigationBarActions = navigationBarActions,
|
||||
)
|
||||
}
|
||||
|
||||
composable(StudeezDestinations.TASKS_SCREEN) {
|
||||
TaskRoute(
|
||||
viewModel = hiltViewModel()
|
||||
)
|
||||
}
|
||||
|
||||
// TODO Sessions screen
|
||||
|
||||
composable(StudeezDestinations.PROFILE_SCREEN) {
|
||||
|
|
|
@ -3,6 +3,7 @@ package be.ugent.sel.studeez.common.composable.navbar
|
|||
import be.ugent.sel.studeez.domain.LogService
|
||||
import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN
|
||||
import be.ugent.sel.studeez.navigation.StudeezDestinations.PROFILE_SCREEN
|
||||
import be.ugent.sel.studeez.navigation.StudeezDestinations.SUBJECT_SCREEN
|
||||
import be.ugent.sel.studeez.navigation.StudeezDestinations.TASKS_SCREEN
|
||||
import be.ugent.sel.studeez.screens.StudeezViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
|
@ -18,7 +19,7 @@ class NavigationBarViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
fun onTasksClick(open: (String) -> Unit) {
|
||||
open(TASKS_SCREEN)
|
||||
open(SUBJECT_SCREEN)
|
||||
}
|
||||
|
||||
fun onSessionsClick(open: (String) -> Unit) {
|
||||
|
|
|
@ -30,4 +30,7 @@ abstract class DatabaseModule {
|
|||
|
||||
@Binds
|
||||
abstract fun provideSubjectDAO(impl: FireBaseSubjectDAO): SubjectDAO
|
||||
|
||||
@Binds
|
||||
abstract fun provideTaskDAO(impl: FireBaseTaskDAO): TaskDAO
|
||||
}
|
13
app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt
Normal file
13
app/src/main/java/be/ugent/sel/studeez/domain/TaskDAO.kt
Normal file
|
@ -0,0 +1,13 @@
|
|||
package be.ugent.sel.studeez.domain
|
||||
|
||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
interface TaskDAO {
|
||||
|
||||
fun getTasks(): Flow<List<Task>>
|
||||
|
||||
fun saveTask(newTask: Task)
|
||||
|
||||
fun deleteTask(oldTask: Task)
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package be.ugent.sel.studeez.domain.implementation
|
||||
|
||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||
import be.ugent.sel.studeez.domain.AccountDAO
|
||||
import be.ugent.sel.studeez.domain.TaskDAO
|
||||
import com.google.firebase.firestore.FirebaseFirestore
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
||||
class FireBaseTaskDAO @Inject constructor(
|
||||
private val firestore: FirebaseFirestore,
|
||||
private val auth: AccountDAO,
|
||||
) : TaskDAO {
|
||||
override fun getTasks(): Flow<List<Task>> {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun saveTask(newTask: Task) {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun deleteTask(oldTask: Task) {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
}
|
|
@ -10,8 +10,10 @@ object StudeezDestinations {
|
|||
const val TIMER_SELECTION_SCREEN = "timer_selection"
|
||||
const val SESSION_SCREEN = "session"
|
||||
const val SESSION_RECAP = "session_recap"
|
||||
const val TASKS_SCREEN = "tasks"
|
||||
// const val SESSIONS_SCREEN = "sessions"
|
||||
const val SUBJECT_SCREEN = "subjects"
|
||||
const val TASKS_SCREEN = "tasks"
|
||||
|
||||
// const val SESSIONS_SCREEN = "sessions"
|
||||
const val PROFILE_SCREEN = "profile"
|
||||
|
||||
// const val TIMERS_SCREEN = "timers"
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
package be.ugent.sel.studeez.screens.tasks
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import be.ugent.sel.studeez.R
|
||||
import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton
|
||||
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
|
||||
import be.ugent.sel.studeez.common.composable.SubjectEntry
|
||||
import be.ugent.sel.studeez.common.composable.drawer.DrawerActions
|
||||
import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions
|
||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||
import be.ugent.sel.studeez.resources
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
|
||||
@Composable
|
||||
fun SubjectRoute(
|
||||
open: (String) -> Unit,
|
||||
viewModel: SubjectViewModel,
|
||||
drawerActions: DrawerActions,
|
||||
navigationBarActions: NavigationBarActions,
|
||||
) {
|
||||
SubjectScreen(
|
||||
drawerActions = drawerActions,
|
||||
navigationBarActions = navigationBarActions,
|
||||
addSubject = { viewModel.addSubject() },
|
||||
) { viewModel.getSubjects() }
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun SubjectScreen(
|
||||
drawerActions: DrawerActions,
|
||||
navigationBarActions: NavigationBarActions,
|
||||
addSubject: () -> Unit,
|
||||
getSubjects: () -> Flow<List<Subject>>,
|
||||
) {
|
||||
PrimaryScreenTemplate(
|
||||
title = resources().getString(R.string.tasks),
|
||||
drawerActions = drawerActions,
|
||||
navigationBarActions = navigationBarActions,
|
||||
barAction = {},
|
||||
) {
|
||||
val subjects = getSubjects().collectAsState(initial = emptyList())
|
||||
Column(
|
||||
modifier = Modifier.padding(top = 5.dp)
|
||||
) {
|
||||
LazyColumn {
|
||||
// if (subjects.value.isNotEmpty()) {
|
||||
// item {
|
||||
// SubjectEntry(subject = subjects.value[0])
|
||||
// }
|
||||
// }
|
||||
// if (subjects.value.size > 1) {
|
||||
// items(subjects.value.subList(1, subjects.value.lastIndex + 1)) {
|
||||
// Column {
|
||||
// Divider(modifier = Modifier.padding(10.dp, 0.dp))
|
||||
// SubjectEntry(subject = it)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
items(subjects.value) {
|
||||
SubjectEntry(subject = it)
|
||||
}
|
||||
}
|
||||
NewTaskSubjectButton(onClick = addSubject, R.string.new_subject)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun SubjectScreenPreview() {
|
||||
SubjectScreen(
|
||||
drawerActions = DrawerActions({}, {}, {}, {}, {}),
|
||||
navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}),
|
||||
{},
|
||||
) { flowOf() }
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package be.ugent.sel.studeez.screens.tasks
|
||||
|
||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||
import be.ugent.sel.studeez.domain.LogService
|
||||
import be.ugent.sel.studeez.domain.SubjectDAO
|
||||
import be.ugent.sel.studeez.screens.StudeezViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class SubjectViewModel @Inject constructor(
|
||||
private val subjectDAO: SubjectDAO,
|
||||
logService: LogService,
|
||||
) : StudeezViewModel(logService) {
|
||||
fun addSubject() {
|
||||
subjectDAO.saveSubject(
|
||||
Subject(
|
||||
name = "Test Subject",
|
||||
tasks = listOf(),
|
||||
time = 0,
|
||||
argb_color = 0xFFF44336,
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun getSubjects(): Flow<List<Subject>> {
|
||||
return subjectDAO.getSubjects()
|
||||
}
|
||||
}
|
|
@ -1,86 +1,34 @@
|
|||
package be.ugent.sel.studeez.screens.tasks
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material.Divider
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import be.ugent.sel.studeez.R
|
||||
import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton
|
||||
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
|
||||
import be.ugent.sel.studeez.common.composable.SubjectEntry
|
||||
import be.ugent.sel.studeez.common.composable.drawer.DrawerActions
|
||||
import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions
|
||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||
import be.ugent.sel.studeez.resources
|
||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
|
||||
@Composable
|
||||
fun TaskRoute(
|
||||
open: (String) -> Unit,
|
||||
viewModel: TaskViewModel,
|
||||
drawerActions: DrawerActions,
|
||||
navigationBarActions: NavigationBarActions,
|
||||
) {
|
||||
TaskScreen(
|
||||
drawerActions = drawerActions,
|
||||
navigationBarActions = navigationBarActions,
|
||||
addSubject = { viewModel.addSubject() },
|
||||
) { viewModel.getSubjects() }
|
||||
addTask = viewModel::addTask,
|
||||
getTasks = viewModel::getTasks,
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun TaskScreen(
|
||||
drawerActions: DrawerActions,
|
||||
navigationBarActions: NavigationBarActions,
|
||||
addSubject: () -> Unit,
|
||||
getSubjects: () -> Flow<List<Subject>>,
|
||||
addTask: () -> Unit,
|
||||
getTasks: () -> Flow<List<Task>>,
|
||||
) {
|
||||
PrimaryScreenTemplate(
|
||||
title = resources().getString(R.string.tasks),
|
||||
drawerActions = drawerActions,
|
||||
navigationBarActions = navigationBarActions,
|
||||
barAction = {},
|
||||
) {
|
||||
val subjects = getSubjects().collectAsState(initial = emptyList())
|
||||
Column(
|
||||
modifier = Modifier.padding(top = 5.dp)
|
||||
) {
|
||||
LazyColumn {
|
||||
// if (subjects.value.isNotEmpty()) {
|
||||
// item {
|
||||
// SubjectEntry(subject = subjects.value[0])
|
||||
// }
|
||||
// }
|
||||
// if (subjects.value.size > 1) {
|
||||
// items(subjects.value.subList(1, subjects.value.lastIndex + 1)) {
|
||||
// Column {
|
||||
// Divider(modifier = Modifier.padding(10.dp, 0.dp))
|
||||
// SubjectEntry(subject = it)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
items(subjects.value) {
|
||||
SubjectEntry(subject = it)
|
||||
}
|
||||
}
|
||||
NewTaskSubjectButton(onClick = addSubject, R.string.new_subject)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
fun TaskScreenPreview() {
|
||||
TaskScreen(
|
||||
drawerActions = DrawerActions({}, {}, {}, {}, {}),
|
||||
navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}),
|
||||
{},
|
||||
) { flowOf() }
|
||||
addTask = {},
|
||||
getTasks = { flowOf() }
|
||||
)
|
||||
}
|
|
@ -1,30 +1,33 @@
|
|||
package be.ugent.sel.studeez.screens.tasks
|
||||
|
||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||
import be.ugent.sel.studeez.domain.LogService
|
||||
import be.ugent.sel.studeez.domain.SubjectDAO
|
||||
import be.ugent.sel.studeez.domain.TaskDAO
|
||||
import be.ugent.sel.studeez.screens.StudeezViewModel
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOf
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class TaskViewModel @Inject constructor(
|
||||
private val subjectDAO: SubjectDAO,
|
||||
private val taskDAO: TaskDAO,
|
||||
logService: LogService,
|
||||
) : StudeezViewModel(logService) {
|
||||
fun addSubject() {
|
||||
subjectDAO.saveSubject(
|
||||
Subject(
|
||||
name = "Test Subject",
|
||||
tasks = listOf(),
|
||||
time = 0,
|
||||
argb_color = 0xFFF44336,
|
||||
)
|
||||
)
|
||||
fun addTask() {
|
||||
|
||||
}
|
||||
|
||||
fun getSubjects(): Flow<List<Subject>> {
|
||||
return subjectDAO.getSubjects()
|
||||
fun getTasks() : Flow<List<Task>> {
|
||||
return flowOf(listOf(
|
||||
Task(
|
||||
name = "Test Task",
|
||||
completed = false,
|
||||
),
|
||||
Task(
|
||||
name = "Test Task 2",
|
||||
completed = true,
|
||||
)
|
||||
))
|
||||
}
|
||||
}
|
Reference in a new issue