1
1
package com.finals.foodrunner.ui.activity
2
2
3
- import androidx.lifecycle.LiveData
4
- import androidx.lifecycle.ViewModel
5
- import androidx.lifecycle.asLiveData
6
- import androidx.lifecycle.viewModelScope
3
+ import androidx.lifecycle.*
4
+ import com.finals.foodrunner.objects.OrderHistoryElement
7
5
import com.finals.foodrunner.objects.Restaurant
6
+ import com.finals.foodrunner.objects.User
8
7
import com.finals.foodrunner.room.RestaurantDatabase
9
8
import com.finals.foodrunner.util.ConnectivityManager
10
9
import com.finals.foodrunner.util.SORT_SCHEME
10
+ import com.finals.foodrunner.volley.OrderHistoryResponseInterface
11
11
import com.finals.foodrunner.volley.RestaurantResponseInterface
12
12
import com.finals.foodrunner.volley.VolleySingleton
13
13
import com.finals.foodrunner.volley.getAllRestaurants
14
14
import kotlinx.coroutines.CoroutineScope
15
15
import kotlinx.coroutines.SupervisorJob
16
16
import kotlinx.coroutines.channels.Channel
17
- import kotlinx.coroutines.flow.receiveAsFlow
17
+ import kotlinx.coroutines.flow.*
18
18
import kotlinx.coroutines.launch
19
19
20
20
class ActivityViewModel (
21
21
private val volleySingleton : VolleySingleton ,
22
22
private val connectivityManager : ConnectivityManager ,
23
23
restaurantDatabase : RestaurantDatabase ,
24
- ) : ViewModel(), HomeViewModel,FavouriteViewModel {
24
+ ) : ViewModel(), HomeViewModel, FavouriteViewModel, OrderHistoryViewModel, ProfileViewModel {
25
25
private val homeEventChannel = Channel <Event >()
26
- val homeEvents = homeEventChannel.receiveAsFlow().asLiveData()
27
26
val restaurantDao = restaurantDatabase.restaurantDao()
28
- val allRestaurant = restaurantDao.getAllRestaurants(" " , SORT_SCHEME .SORT_BY_RATING ).asLiveData()
29
- val favouriteRestaurants = restaurantDao.getFavouriteRestaurants().asLiveData()
27
+ private val searchQueryHome = MutableStateFlow (" " )
28
+ private val sortOrderHome = MutableStateFlow (SORT_SCHEME .SORT_BY_RATING )
29
+ private val allRestaurantFlow =
30
+ combine(searchQueryHome, sortOrderHome) { searchQuery, sortOrder ->
31
+ Pair (searchQuery, sortOrder)
32
+ }.flatMapLatest { (query, sortOrder) ->
33
+ restaurantDao.getAllRestaurants(query, sortOrder)
34
+ }
35
+ private val allRestaurant = allRestaurantFlow.asLiveData()
36
+
37
+ private val searchQueryFav = MutableStateFlow (" " )
38
+ private val sortOrderFav = MutableStateFlow (SORT_SCHEME .SORT_BY_RATING )
39
+ private val favouriteRestaurantFlow =
40
+ combine(searchQueryFav, sortOrderFav) { searchQueryFav, sortOrder ->
41
+ Pair (searchQueryFav, sortOrder)
42
+ }.flatMapLatest {(query,sortOrder)->
43
+ restaurantDao.getFavRestaurants(query,sortOrder)
44
+ }
45
+ private val favouriteRestaurants = favouriteRestaurantFlow.asLiveData()
46
+ val orderHistory = MutableLiveData <List <OrderHistoryElement >>()
47
+ val orderHistoryEvent = Channel <Event >()
48
+ private val currentUser = MutableLiveData <User >()
49
+ val user: LiveData <User > = currentUser
50
+
51
+
52
+ // ------------------------------------------------------------------------
30
53
31
54
init {
32
55
viewModelScope.launch {
33
- restaurantDao.deleteAllRestaurants ()
56
+ restaurantDao.deleteUnFavouriteRestaurants ()
34
57
fetchAllRestaurants()
58
+ fetchOrderHistory()
35
59
}
36
60
}
37
61
@@ -64,7 +88,31 @@ class ActivityViewModel(
64
88
}
65
89
}
66
90
67
- override fun getRestaurants (): LiveData <List <Restaurant >> = allRestaurant
91
+ override suspend fun setCurrentUser (user : User ) {
92
+ this .currentUser.postValue(user)
93
+ }
94
+
95
+ override fun setHomeSearchQuery (query : String ) {
96
+ this .searchQueryHome.value = query
97
+ }
98
+
99
+ override suspend fun currentUser () = user
100
+ override fun setFavSortOrder (sortScheme : SORT_SCHEME ) {
101
+ this .sortOrderFav.value= sortScheme
102
+ }
103
+
104
+ override fun getFavSortOrder ()= this .sortOrderFav.value
105
+ override fun setFavSearchQuery (query : String ) {
106
+ searchQueryFav.value= query
107
+ }
108
+
109
+ override fun getRestaurants (): LiveData <List <Restaurant >> = allRestaurant
110
+ override fun getHomeEvents (): Flow <Event > = homeEventChannel.receiveAsFlow()
111
+ override fun setHomeSortOrder (sortScheme : SORT_SCHEME ) {
112
+ sortOrderHome.value = sortScheme
113
+ }
114
+
115
+ override fun getHomeSortOrder () = sortOrderHome.value
68
116
69
117
override fun changeFavouriteStatus (restaurant : Restaurant ) {
70
118
viewModelScope.launch {
@@ -73,13 +121,46 @@ class ActivityViewModel(
73
121
}
74
122
}
75
123
76
- enum class Event {
77
- LOADED , LOADING , OFFLINE
78
- }
79
124
80
125
override fun getFavRestaurants (): LiveData <List <Restaurant >> = favouriteRestaurants
81
126
82
127
override fun unFavStatus (restaurant : Restaurant ) {
83
128
changeFavouriteStatus(restaurant)
84
129
}
85
- }
130
+
131
+
132
+ override suspend fun fetchOrderHistory () {
133
+ if (connectivityManager.isOnline() && connectivityManager.checkConnectivity()) {
134
+ orderHistoryEvent.send(Event .LOADING )
135
+ com.finals.foodrunner.volley.getOrderHistory(
136
+ userId = user.value?.user_id.toString(),
137
+ volleySingleton = volleySingleton,
138
+ object : OrderHistoryResponseInterface {
139
+ override fun onResponse (orderHistoryElements : List <OrderHistoryElement >) {
140
+ viewModelScope.launch {
141
+ orderHistoryEvent.send(Event .LOADED )
142
+ orderHistory.postValue(orderHistoryElements)
143
+ }
144
+ }
145
+
146
+ override fun onError (message : String ) {
147
+ viewModelScope.launch {
148
+ orderHistoryEvent.send(Event .LOADED )
149
+ }
150
+ }
151
+
152
+ })
153
+ } else {
154
+ orderHistoryEvent.send(Event .OFFLINE )
155
+ }
156
+
157
+ }
158
+
159
+ override fun getOrderHistory (): LiveData <List <OrderHistoryElement >> = orderHistory
160
+ override fun getEvents (): LiveData <Event > = orderHistoryEvent.receiveAsFlow().asLiveData()
161
+
162
+
163
+ enum class Event {
164
+ LOADED , LOADING , OFFLINE
165
+ }
166
+ }
0 commit comments