-
Notifications
You must be signed in to change notification settings - Fork 137
[HACK][POS] Prepopulate orders cache after opening POS #15066
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 11 commits
17b2c58
cf2cd9d
3fce5e4
e4013ee
d327366
adf0d5d
4f4c0e6
ff4d446
6e6e753
21bc1b6
38b7c6e
be96ae1
ddfae60
71ce979
350dc8a
e825f05
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,11 +14,13 @@ import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent.SearchEvent. | |
| import com.woocommerce.android.ui.woopos.home.ParentToChildrenEvent.SearchEvent.RecentSearchSelected | ||
| import com.woocommerce.android.ui.woopos.home.WooPosHomeState.DialogState | ||
| import com.woocommerce.android.ui.woopos.home.WooPosHomeState.ScreenPositionState | ||
| import com.woocommerce.android.ui.woopos.orders.WooPosOrdersDataSource | ||
| import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent | ||
| import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsEvent.Event.BackToCartTapped | ||
| import com.woocommerce.android.ui.woopos.util.analytics.WooPosAnalyticsTracker | ||
| import com.woocommerce.android.viewmodel.getStateFlow | ||
| import dagger.hilt.android.lifecycle.HiltViewModel | ||
| import kotlinx.coroutines.delay | ||
| import kotlinx.coroutines.flow.MutableSharedFlow | ||
| import kotlinx.coroutines.flow.SharedFlow | ||
| import kotlinx.coroutines.flow.StateFlow | ||
|
|
@@ -31,8 +33,13 @@ class WooPosHomeViewModel @Inject constructor( | |
| private val parentToChildrenEventSender: WooPosParentToChildrenEventSender, | ||
| private val analyticsTracker: WooPosAnalyticsTracker, | ||
| private val soundHelper: WooPosSoundHelper, | ||
| private val ordersDataSource: WooPosOrdersDataSource, | ||
| savedStateHandle: SavedStateHandle, | ||
| ) : ViewModel() { | ||
| companion object { | ||
samiuelson marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| private const val ORDERS_CACHE_WARMUP_DELAY_MS = 5000L | ||
| } | ||
|
|
||
| private val _state = savedStateHandle.getStateFlow( | ||
| scope = viewModelScope, | ||
| key = "home_state", | ||
|
|
@@ -54,6 +61,7 @@ class WooPosHomeViewModel @Inject constructor( | |
| viewModelScope.launch { | ||
| soundHelper.preloadChaChing() | ||
| } | ||
| prepopulateOrdersCache() | ||
samiuelson marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| override fun onCleared() { | ||
|
|
@@ -255,6 +263,15 @@ class WooPosHomeViewModel @Inject constructor( | |
| } | ||
| } | ||
|
|
||
| private fun prepopulateOrdersCache() { | ||
| viewModelScope.launch { | ||
| delay(ORDERS_CACHE_WARMUP_DELAY_MS) | ||
|
||
| ordersDataSource.loadOrders( | ||
|
||
| pageSize = WooPosOrdersDataSource.POS_ORDERS_CACHE_PREPOPULATION_SIZE | ||
| ).collect {} | ||
| } | ||
| } | ||
|
|
||
| private fun handleOrderCreated(event: ChildToParentEvent.OrderCreated) { | ||
| sendEventToChildren( | ||
| OrderCreated( | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -51,17 +51,18 @@ class WooPosOrdersDataSource @Inject constructor( | |
|
|
||
| companion object { | ||
| const val POS_ORDERS_PAGE_SIZE = 25 | ||
| const val POS_ORDERS_CACHE_PREPOPULATION_SIZE = 5 | ||
| private const val UNKNOWN_ERROR = "Unknown error" | ||
| } | ||
|
|
||
| fun loadOrders(): Flow<LoadOrdersResult> = flow { | ||
| fun loadOrders(pageSize: Int = POS_ORDERS_PAGE_SIZE): Flow<LoadOrdersResult> = flow { | ||
|
||
| val cached = ordersCache.getAll() | ||
| if (cached.isNotEmpty()) { | ||
| val cachedWithRefunds = fetchRefundsForOrders(cached) | ||
| emit(LoadOrdersResult.SuccessCache(cachedWithRefunds)) | ||
| } | ||
|
|
||
| val result = loadFirstPage() | ||
| val result = loadFirstPage(pageSize = pageSize) | ||
| result.onSuccess { orders -> | ||
| ordersCache.setAll(orders) | ||
| val ordersWithRefunds = fetchRefundsForOrders(orders) | ||
|
|
@@ -123,18 +124,24 @@ class WooPosOrdersDataSource @Inject constructor( | |
| ordersCache.setAll(updated) | ||
| } | ||
|
|
||
| private suspend fun loadFirstPage(searchQuery: String? = null): Result<List<Order>> { | ||
| private suspend fun loadFirstPage( | ||
| searchQuery: String? = null, | ||
| pageSize: Int = POS_ORDERS_PAGE_SIZE | ||
| ): Result<List<Order>> { | ||
| page.set(1) | ||
| canLoadMore.set(false) | ||
| return fetchAndMap(searchQuery) | ||
| return fetchAndMap(searchQuery, pageSize) | ||
| } | ||
|
|
||
| private suspend fun loadNextPage(searchQuery: String? = null): Result<List<Order>> { | ||
| return fetchAndMap(searchQuery) | ||
| } | ||
|
|
||
| private suspend fun fetchAndMap(searchQuery: String? = null): Result<List<Order>> { | ||
| val result = fetchOrdersFromRemote(page.get(), searchQuery) | ||
| private suspend fun fetchAndMap( | ||
|
||
| searchQuery: String? = null, | ||
| pageSize: Int = POS_ORDERS_PAGE_SIZE | ||
| ): Result<List<Order>> { | ||
| val result = fetchOrdersFromRemote(page.get(), searchQuery, pageSize) | ||
| return if (result.isError) { | ||
| Result.failure(result.error.toThrowable()) | ||
| } else { | ||
|
|
@@ -146,10 +153,11 @@ class WooPosOrdersDataSource @Inject constructor( | |
|
|
||
| private suspend fun fetchOrdersFromRemote( | ||
| page: Int, | ||
| searchQuery: String? | ||
| searchQuery: String?, | ||
| count: Int = POS_ORDERS_PAGE_SIZE | ||
| ) = restClient.fetchOrders( | ||
| site = selectedSite.get(), | ||
| count = POS_ORDERS_PAGE_SIZE, | ||
| count = count, | ||
| page = page, | ||
| orderBy = OrderBy.DATE, | ||
| sortOrder = OrderRestClient.SortOrder.DESCENDING, | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -445,7 +445,10 @@ class WooPosOrdersViewModel @Inject constructor( | |
| searchInputState = WooPosSearchInputState.Closed | ||
| ) | ||
| } else { | ||
| replaceOrders(result.ordersWithRefunds) | ||
| replaceOrders( | ||
|
||
| ordersWithRefunds = result.ordersWithRefunds, | ||
| paginationState = WooPosPaginationState.Loading | ||
| ) | ||
| } | ||
| } | ||
|
|
||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.