Skip to content

Commit d002b58

Browse files
committed
Updated the projects filter code
1 parent a6e8d4b commit d002b58

File tree

7 files changed

+80
-126
lines changed

7 files changed

+80
-126
lines changed

app/src/main/java/com/mumbicodes/projectie/data/repository/ProjectsRepositoryImpl.kt

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@ import com.mumbicodes.projectie.domain.model.Project
99
import com.mumbicodes.projectie.domain.model.ProjectName
1010
import com.mumbicodes.projectie.domain.relations.ProjectWithMilestones
1111
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
12-
import com.mumbicodes.projectie.domain.util.OrderType
13-
import com.mumbicodes.projectie.domain.util.ProjectsOrder
1412
import kotlinx.coroutines.flow.Flow
15-
import kotlinx.coroutines.flow.map
1613

1714
class ProjectsRepositoryImpl(
1815
private val projectsDao: ProjectsDao,
@@ -45,28 +42,8 @@ class ProjectsRepositoryImpl(
4542
*
4643
* By default, the order is the date added
4744
* */
48-
override suspend fun getAllProjects(projectOrder: ProjectsOrder): DataResult<Flow<List<Project>>> =
49-
safeTransaction {
50-
projectsDao.getAllProjects().map { projects ->
51-
when (projectOrder.orderType) {
52-
is OrderType.Ascending -> {
53-
when (projectOrder) {
54-
is ProjectsOrder.Name -> projects.sortedBy { it.projectName.lowercase() }
55-
is ProjectsOrder.Deadline -> projects.sortedBy { it.projectDeadline }
56-
is ProjectsOrder.DateAdded -> projects.sortedBy { it.timeStamp }
57-
}
58-
}
59-
60-
is OrderType.Descending -> {
61-
when (projectOrder) {
62-
is ProjectsOrder.Name -> projects.sortedByDescending { it.projectName.lowercase() }
63-
is ProjectsOrder.Deadline -> projects.sortedByDescending { it.projectDeadline }
64-
is ProjectsOrder.DateAdded -> projects.sortedByDescending { it.timeStamp }
65-
}
66-
}
67-
}
68-
}
69-
}.toDataResult()
45+
override suspend fun getAllProjects(): DataResult<Flow<List<Project>>> =
46+
safeTransaction { projectsDao.getAllProjects() }.toDataResult()
7047

7148
override suspend fun getProjectNameAndId(): DataResult<Flow<List<ProjectName>>> =
7249
safeTransaction { projectsDao.getProjectNameAndId() }.toDataResult()

app/src/main/java/com/mumbicodes/projectie/domain/repository/ProjectsRepository.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import com.mumbicodes.projectie.domain.model.DataResult
44
import com.mumbicodes.projectie.domain.model.Project
55
import com.mumbicodes.projectie.domain.model.ProjectName
66
import com.mumbicodes.projectie.domain.relations.ProjectWithMilestones
7-
import com.mumbicodes.projectie.domain.util.ProjectsOrder
87
import kotlinx.coroutines.flow.Flow
98

109
interface ProjectsRepository {
@@ -17,7 +16,7 @@ interface ProjectsRepository {
1716

1817
suspend fun getProjectByIdWithMilestones(projectId: Int): DataResult <Flow<ProjectWithMilestones?>>
1918

20-
suspend fun getAllProjects(projectOrder: ProjectsOrder): DataResult<Flow<List<Project>>>
19+
suspend fun getAllProjects(): DataResult<Flow<List<Project>>>
2120

2221
suspend fun getProjectNameAndId(): DataResult<Flow<List<ProjectName>>>
2322

app/src/main/java/com/mumbicodes/projectie/domain/use_case/projects/GetProjectsUseCase.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@ package com.mumbicodes.projectie.domain.use_case.projects
33
import com.mumbicodes.projectie.domain.model.DataResult
44
import com.mumbicodes.projectie.domain.model.Project
55
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
6-
import com.mumbicodes.projectie.domain.util.OrderType
7-
import com.mumbicodes.projectie.domain.util.ProjectsOrder
86
import kotlinx.coroutines.flow.Flow
97

108
class GetProjectsUseCase(
119
private val repository: ProjectsRepository,
1210
) {
13-
suspend operator fun invoke(
14-
projectOrder: ProjectsOrder = ProjectsOrder.DateAdded(OrderType.Descending),
15-
): DataResult<Flow<List<Project>>> =
16-
repository.getAllProjects(projectOrder = projectOrder)
11+
suspend operator fun invoke(): DataResult<Flow<List<Project>>> =
12+
repository.getAllProjects()
1713
}

app/src/main/java/com/mumbicodes/projectie/domain/workers/CheckProjectDeadlineIsInTwoDaysWorker.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ import com.mumbicodes.projectie.R
99
import com.mumbicodes.projectie.domain.model.DataResult
1010
import com.mumbicodes.projectie.domain.model.Project
1111
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
12-
import com.mumbicodes.projectie.domain.util.OrderType
13-
import com.mumbicodes.projectie.domain.util.ProjectsOrder
1412
import com.mumbicodes.projectie.presentation.util.toLocalDate
1513
import dagger.assisted.Assisted
1614
import dagger.assisted.AssistedInject
17-
import kotlinx.coroutines.*
15+
import kotlinx.coroutines.CoroutineScope
16+
import kotlinx.coroutines.Dispatchers
17+
import kotlinx.coroutines.async
18+
import kotlinx.coroutines.delay
1819
import kotlinx.coroutines.flow.collectLatest
20+
import kotlinx.coroutines.launch
21+
import kotlinx.coroutines.withContext
1922
import java.time.LocalDate
2023

2124
private const val TAG = "ProjectWorkerInTwoDays"
@@ -34,9 +37,7 @@ class CheckProjectDeadlineIsInTwoDaysWorker @AssistedInject constructor(
3437
return@withContext try {
3538
Log.e("Reached 3", "It has been reached - 2 days ")
3639

37-
val allProjects = projectsRepository.getAllProjects(
38-
projectOrder = ProjectsOrder.DateAdded(OrderType.Descending)
39-
)
40+
val allProjects = projectsRepository.getAllProjects()
4041

4142
CoroutineScope(Dispatchers.IO).launch {
4243
when (allProjects) {

app/src/main/java/com/mumbicodes/projectie/domain/workers/CheckProjectDeadlineWorker.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import com.mumbicodes.projectie.R
99
import com.mumbicodes.projectie.domain.model.DataResult
1010
import com.mumbicodes.projectie.domain.model.Project
1111
import com.mumbicodes.projectie.domain.repository.ProjectsRepository
12-
import com.mumbicodes.projectie.domain.util.OrderType
13-
import com.mumbicodes.projectie.domain.util.ProjectsOrder
1412
import com.mumbicodes.projectie.presentation.util.toLocalDate
1513
import dagger.assisted.Assisted
1614
import dagger.assisted.AssistedInject
17-
import kotlinx.coroutines.*
15+
import kotlinx.coroutines.CoroutineScope
16+
import kotlinx.coroutines.Dispatchers
17+
import kotlinx.coroutines.async
1818
import kotlinx.coroutines.flow.collectLatest
19+
import kotlinx.coroutines.launch
20+
import kotlinx.coroutines.withContext
1921
import java.time.LocalDate
2022

2123
private const val TAG = "ProjectWorkerIsToday"
@@ -30,11 +32,7 @@ class CheckProjectDeadlineWorker @AssistedInject constructor(
3032

3133
return withContext(Dispatchers.IO) {
3234
return@withContext try {
33-
val allProjects = projectsRepository.getAllProjects(
34-
projectOrder = ProjectsOrder.DateAdded(
35-
OrderType.Descending
36-
)
37-
)
35+
val allProjects = projectsRepository.getAllProjects()
3836

3937
CoroutineScope(Dispatchers.IO).launch {
4038
when (allProjects) {

app/src/main/java/com/mumbicodes/projectie/presentation/screens/allProjects/AllProjectsStates.kt

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,65 @@ import com.mumbicodes.projectie.domain.model.Project
44
import com.mumbicodes.projectie.domain.util.OrderType
55
import com.mumbicodes.projectie.domain.util.ProjectsOrder
66
import com.mumbicodes.projectie.presentation.util.state.ListState
7+
import com.mumbicodes.projectie.presentation.util.state.SuccessState
78

89
/**
9-
* @param selectedProjectOrder Holds the user selection until they press filter
10-
*
11-
* There is the empty state when there is nothing created -- Screen Empty -- the db is empty
12-
* There is loading of the screen -- Initial state
13-
* There is data -- Screen data
14-
*
15-
* Projects - Error, Loading, Success (Empty, Data)
16-
* The overall data
17-
* The search results -- within the same data
18-
*
19-
*
20-
* - projects - The projects we are showing (default and search results)-- All projects - have the states
21-
* - filters - name and selected state @param filtersStatus,
22-
* @param filtersStatus and @param selectedProjectStatus
23-
*
24-
* - Projects Order
25-
* - showFilterBottomSheet
26-
* - has requested Notification
27-
* - selected project order
28-
* - Search param
29-
* -
30-
*
10+
* @param projectsOrder This is the actual projects order after the user updates the filters
11+
* @param selectedProjectOrder Holds the user selection until they press filter
3112
* */
3213
data class AllProjectsStates(
3314
val projects: ListState<List<Project>> = ListState.Loading,
34-
val filteredProjects: ListState<List<Project>> = ListState.Loading,
3515
val projectsOrder: ProjectsOrder = ProjectsOrder.DateAdded(OrderType.Descending),
3616
val filtersStatus: List<String> = filters,
3717
val selectedProjectStatus: String = filters.first(),
3818
val isFilterBottomSheetVisible: Boolean = false,
3919
val hasRequestedNotificationPermission: Boolean = false,
4020
val selectedProjectOrder: ProjectsOrder = projectsOrder,
4121
val searchParam: String = "",
42-
)
22+
) {
23+
24+
val filteredProjects: ListState<List<Project>>
25+
get() = if (projects is ListState.Success) {
26+
if (projects.data is SuccessState.Data) {
27+
val allProjects = projects.data.data
28+
val filteredList = allProjects
29+
.filter {
30+
if (selectedProjectStatus == filters.first()) true
31+
else selectedProjectStatus == it.projectStatus
32+
}
33+
.filter {
34+
if (searchParam.isNotBlank()) it.projectName.contains(searchParam)
35+
else true
36+
}
37+
.let { projectsList ->
38+
when (selectedProjectOrder.orderType) {
39+
is OrderType.Ascending -> {
40+
when (selectedProjectOrder) {
41+
is ProjectsOrder.Name -> projectsList.sortedBy { it.projectName.lowercase() }
42+
is ProjectsOrder.Deadline -> projectsList.sortedBy { it.projectDeadline }
43+
is ProjectsOrder.DateAdded -> projectsList.sortedBy { it.timeStamp }
44+
}
45+
}
46+
47+
is OrderType.Descending -> {
48+
when (selectedProjectOrder) {
49+
is ProjectsOrder.Name -> projectsList.sortedByDescending { it.projectName.lowercase() }
50+
is ProjectsOrder.Deadline -> projectsList.sortedByDescending { it.projectDeadline }
51+
is ProjectsOrder.DateAdded -> projectsList.sortedByDescending { it.timeStamp }
52+
}
53+
}
54+
}
55+
}
56+
57+
if (filteredList.isEmpty()) ListState.Success(SuccessState.Empty)
58+
else ListState.Success(SuccessState.Data(data = filteredList))
59+
} else {
60+
projects
61+
}
62+
} else {
63+
projects
64+
}
65+
}
4366

4467
val filters = listOf(
4568
"All",

app/src/main/java/com/mumbicodes/projectie/presentation/screens/allProjects/AllProjectsViewModel.kt

Lines changed: 15 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.compose.runtime.MutableState
66
import androidx.compose.runtime.mutableStateOf
77
import androidx.lifecycle.ViewModel
88
import androidx.lifecycle.viewModelScope
9-
import com.mumbicodes.projectie.R
109
import com.mumbicodes.projectie.domain.model.DataResult
1110
import com.mumbicodes.projectie.domain.model.Project
1211
import com.mumbicodes.projectie.domain.use_case.notifications.NotificationUseCases
@@ -43,7 +42,7 @@ class AllProjectsViewModel @Inject constructor(
4342
private var getProjectsJob: Job? = null
4443

4544
init {
46-
getProjects(ProjectsOrder.DateAdded(OrderType.Descending), "All")
45+
getProjects(ProjectsOrder.DateAdded(OrderType.Descending))
4746
if (state is ScreenState.Data<*>) {
4847
readNotPromptState()
4948
}
@@ -58,17 +57,18 @@ class AllProjectsViewModel @Inject constructor(
5857
) {
5958
return
6059
}
61-
getProjects(
62-
(state.value as ScreenState.Data).data.selectedProjectOrder,
63-
(state.value as ScreenState.Data).data.selectedProjectStatus
60+
_state.value = ScreenState.Data(
61+
data = (state.value as ScreenState.Data<AllProjectsStates>).data.copy(
62+
projectsOrder = (state.value as ScreenState.Data).data.selectedProjectOrder
63+
)
6464
)
6565
}
6666

6767
is AllProjectsEvent.ResetProjectsOrder -> {
68-
69-
getProjects(
70-
projectsEvent.projectsOrder,
71-
(state.value as ScreenState.Data).data.selectedProjectStatus
68+
_state.value = ScreenState.Data(
69+
data = (state.value as ScreenState.Data<AllProjectsStates>).data.copy(
70+
selectedProjectOrder = projectsEvent.projectsOrder
71+
)
7272
)
7373
}
7474

@@ -90,9 +90,10 @@ class AllProjectsViewModel @Inject constructor(
9090
if ((state.value as ScreenState.Data).data.selectedProjectStatus == projectsEvent.projectStatus) {
9191
return
9292
}
93-
(((state.value as ScreenState.Data).data.projects as ListState.Success).data as SuccessState.Data).data.filterProjects(
94-
projectStatus = projectsEvent.projectStatus,
95-
searchParam = (state.value as ScreenState.Data).data.searchParam
93+
_state.value = ScreenState.Data(
94+
data = (state.value as ScreenState.Data<AllProjectsStates>).data.copy(
95+
selectedProjectStatus = projectsEvent.projectStatus
96+
)
9697
)
9798
}
9899

@@ -110,10 +111,6 @@ class AllProjectsViewModel @Inject constructor(
110111
searchParam = projectsEvent.searchParam
111112
)
112113
)
113-
(((state.value as ScreenState.Data).data.projects as ListState.Success).data as SuccessState.Data).data.filterProjects(
114-
projectStatus = (state.value as ScreenState.Data<AllProjectsStates>).data.selectedProjectStatus,
115-
searchParam = projectsEvent.searchParam,
116-
)
117114
}
118115

119116
is AllProjectsEvent.UpdateProjectOrder -> {
@@ -129,12 +126,12 @@ class AllProjectsViewModel @Inject constructor(
129126
/**
130127
* Whenever called, a new flow is emitted. Hence cancel the old coroutine that's observing db
131128
* */
132-
private fun getProjects(projectsOrder: ProjectsOrder, projectStatus: String) {
129+
private fun getProjects(projectsOrder: ProjectsOrder) {
133130
viewModelScope.launch {
134131

135132
getProjectsJob?.cancel()
136133
getProjectsJob =
137-
when (val results = projectsUseCases.getProjectsUseCase(projectsOrder)) {
134+
when (val results = projectsUseCases.getProjectsUseCase()) {
138135
is DataResult.Error -> {
139136
// Doing this in a viewModelScope as we need to return a job
140137
viewModelScope.launch {
@@ -163,10 +160,6 @@ class AllProjectsViewModel @Inject constructor(
163160
projectsOrder = projectsOrder,
164161
),
165162
)
166-
projects.filterProjects(
167-
projectStatus,
168-
(state.value as ScreenState.Data<AllProjectsStates>).data.searchParam
169-
)
170163
}
171164
}
172165
.launchIn(viewModelScope)
@@ -175,39 +168,6 @@ class AllProjectsViewModel @Inject constructor(
175168
}
176169
}
177170

178-
private fun List<Project>.filterProjects(
179-
projectStatus: String,
180-
searchParam: String,
181-
) {
182-
_state.value = ScreenState.Data(
183-
data = (state.value as ScreenState.Data).data.copy(
184-
filteredProjects = ListState.Success
185-
(
186-
data = when (
187-
this.filter { projectStatus == appContext.getString(R.string.all) || it.projectStatus == projectStatus }
188-
.filter {
189-
it.projectName.contains(searchParam)
190-
}.isEmpty()
191-
) {
192-
true -> {
193-
SuccessState.Empty
194-
}
195-
196-
false -> {
197-
SuccessState.Data(
198-
this.filter { projectStatus == appContext.getString(R.string.all) || it.projectStatus == projectStatus }
199-
.filter {
200-
it.projectName.contains(searchParam)
201-
}
202-
)
203-
}
204-
}
205-
),
206-
selectedProjectStatus = projectStatus,
207-
)
208-
)
209-
}
210-
211171
private fun readNotPromptState() {
212172
viewModelScope.launch {
213173
notificationUseCases.readNotificationPromptStateUseCase.invoke().collect { isPrompted ->

0 commit comments

Comments
 (0)