#99 fix subjectentry to use flows for computed values
This commit is contained in:
parent
b53e3cdc5a
commit
de25ed85b5
6 changed files with 40 additions and 36 deletions
|
@ -31,9 +31,13 @@ import be.ugent.sel.studeez.R.string as AppText
|
|||
fun SubjectEntry(
|
||||
subject: Subject,
|
||||
onViewSubject: () -> Unit,
|
||||
getTaskCount: () -> Flow<Int>,
|
||||
getCompletedTaskCount: () -> Flow<Int>,
|
||||
getStudyTime: () -> Flow<Int>,
|
||||
) {
|
||||
val studytime by getStudyTime().collectAsState(initial = 0)
|
||||
val taskCount by getTaskCount().collectAsState(initial = 0)
|
||||
val completedTaskCount by getCompletedTaskCount().collectAsState(initial = 0)
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
|
@ -80,7 +84,7 @@ fun SubjectEntry(
|
|||
imageVector = Icons.Default.List,
|
||||
contentDescription = stringResource(id = AppText.tasks)
|
||||
)
|
||||
Text(text = "${subject.taskCompletedCount}/${subject.taskCount}")
|
||||
Text(text = "${completedTaskCount}/${taskCount}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -104,11 +108,11 @@ fun SubjectEntryPreview() {
|
|||
subject = Subject(
|
||||
name = "Test Subject",
|
||||
argb_color = 0xFFFFD200,
|
||||
taskCount = 5,
|
||||
taskCompletedCount = 2,
|
||||
),
|
||||
onViewSubject = {},
|
||||
getStudyTime = { flowOf() }
|
||||
getTaskCount = { flowOf() },
|
||||
getCompletedTaskCount = { flowOf() },
|
||||
getStudyTime = { flowOf() },
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -121,6 +125,8 @@ fun OverflowSubjectEntryPreview() {
|
|||
argb_color = 0xFFFFD200,
|
||||
),
|
||||
onViewSubject = {},
|
||||
getStudyTime = { flowOf() }
|
||||
getTaskCount = { flowOf() },
|
||||
getCompletedTaskCount = { flowOf() },
|
||||
getStudyTime = { flowOf() },
|
||||
)
|
||||
}
|
|
@ -8,10 +8,6 @@ data class Subject(
|
|||
val name: String = "",
|
||||
val argb_color: Long = 0,
|
||||
var archived: Boolean = false,
|
||||
@get:Exclude @set:Exclude
|
||||
var taskCount: Int = 0,
|
||||
@get:Exclude @set:Exclude
|
||||
var taskCompletedCount: Int = 0,
|
||||
)
|
||||
|
||||
object SubjectDocument {
|
||||
|
|
|
@ -13,8 +13,8 @@ interface SubjectDAO {
|
|||
|
||||
fun updateSubject(newSubject: Subject)
|
||||
|
||||
suspend fun getTaskCount(subject: Subject): Int
|
||||
suspend fun getCompletedTaskCount(subject: Subject): Int
|
||||
fun getTaskCount(subject: Subject): Flow<Int>
|
||||
fun getCompletedTaskCount(subject: Subject): Flow<Int>
|
||||
fun getStudyTime(subject: Subject): Flow<Int>
|
||||
|
||||
suspend fun getSubject(subjectId: String): Subject?
|
||||
|
|
|
@ -2,10 +2,10 @@ package be.ugent.sel.studeez.domain.implementation
|
|||
|
||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||
import be.ugent.sel.studeez.data.local.models.task.SubjectDocument
|
||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||
import be.ugent.sel.studeez.domain.AccountDAO
|
||||
import be.ugent.sel.studeez.domain.SubjectDAO
|
||||
import be.ugent.sel.studeez.domain.TaskDAO
|
||||
import com.google.firebase.firestore.AggregateSource
|
||||
import com.google.firebase.firestore.CollectionReference
|
||||
import com.google.firebase.firestore.FirebaseFirestore
|
||||
import com.google.firebase.firestore.Query
|
||||
|
@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.Flow
|
|||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.tasks.await
|
||||
import javax.inject.Inject
|
||||
import kotlin.collections.count
|
||||
|
||||
class FireBaseSubjectDAO @Inject constructor(
|
||||
private val firestore: FirebaseFirestore,
|
||||
|
@ -26,13 +27,6 @@ class FireBaseSubjectDAO @Inject constructor(
|
|||
.subjectNotArchived()
|
||||
.snapshots()
|
||||
.map { it.toObjects(Subject::class.java) }
|
||||
.map { subjects ->
|
||||
subjects.map { subject ->
|
||||
subject.taskCount = getTaskCount(subject)
|
||||
subject.taskCompletedCount = getCompletedTaskCount(subject)
|
||||
subject
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getSubject(subjectId: String): Subject? {
|
||||
|
@ -51,23 +45,14 @@ class FireBaseSubjectDAO @Inject constructor(
|
|||
currentUserSubjectsCollection().document(newSubject.id).set(newSubject)
|
||||
}
|
||||
|
||||
override suspend fun getTaskCount(subject: Subject): Int {
|
||||
return subjectTasksCollection(subject)
|
||||
.taskNotArchived()
|
||||
.count()
|
||||
.get(AggregateSource.SERVER)
|
||||
.await()
|
||||
.count.toInt()
|
||||
override fun getTaskCount(subject: Subject): Flow<Int> {
|
||||
return taskDAO.getTasks(subject)
|
||||
.map(List<Task>::count)
|
||||
}
|
||||
|
||||
override suspend fun getCompletedTaskCount(subject: Subject): Int {
|
||||
return subjectTasksCollection(subject)
|
||||
.taskNotArchived()
|
||||
.taskNotCompleted()
|
||||
.count()
|
||||
.get(AggregateSource.SERVER)
|
||||
.await()
|
||||
.count.toInt()
|
||||
override fun getCompletedTaskCount(subject: Subject): Flow<Int> {
|
||||
return taskDAO.getTasks(subject)
|
||||
.map { tasks -> tasks.count { it.completed && !it.archived } }
|
||||
}
|
||||
|
||||
override fun getStudyTime(subject: Subject): Flow<Int> {
|
||||
|
|
|
@ -36,6 +36,8 @@ fun SubjectRoute(
|
|||
navigationBarActions = navigationBarActions,
|
||||
onAddSubject = { viewModel.onAddSubject(open) },
|
||||
onViewSubject = { viewModel.onViewSubject(it, open) },
|
||||
getTaskCount = viewModel::getTaskCount,
|
||||
getCompletedTaskCount = viewModel::getCompletedTaskCount,
|
||||
getStudyTime = viewModel::getStudyTime,
|
||||
uiState,
|
||||
)
|
||||
|
@ -47,6 +49,8 @@ fun SubjectScreen(
|
|||
navigationBarActions: NavigationBarActions,
|
||||
onAddSubject: () -> Unit,
|
||||
onViewSubject: (Subject) -> Unit,
|
||||
getTaskCount: (Subject) -> Flow<Int>,
|
||||
getCompletedTaskCount: (Subject) -> Flow<Int>,
|
||||
getStudyTime: (Subject) -> Flow<Int>,
|
||||
uiState: SubjectUiState,
|
||||
) {
|
||||
|
@ -76,6 +80,8 @@ fun SubjectScreen(
|
|||
SubjectEntry(
|
||||
subject = it,
|
||||
onViewSubject = { onViewSubject(it) },
|
||||
getTaskCount = { getTaskCount(it) },
|
||||
getCompletedTaskCount = { getCompletedTaskCount(it) },
|
||||
getStudyTime = { getStudyTime(it) },
|
||||
)
|
||||
}
|
||||
|
@ -94,13 +100,14 @@ fun SubjectScreenPreview() {
|
|||
navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}),
|
||||
onAddSubject = {},
|
||||
onViewSubject = {},
|
||||
getTaskCount = { flowOf() },
|
||||
getCompletedTaskCount = { flowOf() },
|
||||
getStudyTime = { flowOf() },
|
||||
uiState = SubjectUiState.Succes(
|
||||
listOf(
|
||||
Subject(
|
||||
name = "Test Subject",
|
||||
argb_color = 0xFFFFD200,
|
||||
taskCount = 5, taskCompletedCount = 2,
|
||||
)
|
||||
)
|
||||
)
|
||||
|
@ -115,7 +122,9 @@ fun SubjectScreenLoadingPreview() {
|
|||
navigationBarActions = NavigationBarActions({ false }, {}, {}, {}, {}, {}, {}, {}),
|
||||
onAddSubject = {},
|
||||
onViewSubject = {},
|
||||
getTaskCount = { flowOf() },
|
||||
getCompletedTaskCount = { flowOf() },
|
||||
getStudyTime = { flowOf() },
|
||||
uiState = SubjectUiState.Loading
|
||||
uiState = SubjectUiState.Loading,
|
||||
)
|
||||
}
|
|
@ -30,6 +30,14 @@ class SubjectViewModel @Inject constructor(
|
|||
open(StudeezDestinations.ADD_SUBJECT_FORM)
|
||||
}
|
||||
|
||||
fun getTaskCount(subject: Subject): Flow<Int> {
|
||||
return subjectDAO.getTaskCount(subject)
|
||||
}
|
||||
|
||||
fun getCompletedTaskCount(subject: Subject): Flow<Int> {
|
||||
return subjectDAO.getCompletedTaskCount(subject)
|
||||
}
|
||||
|
||||
fun getStudyTime(subject: Subject): Flow<Int> {
|
||||
return subjectDAO.getStudyTime(subject)
|
||||
}
|
||||
|
|
Reference in a new issue