@@ -24,14 +24,11 @@ class WooPosOrdersViewModel @Inject constructor(
2424 private var orders: List <Order > = emptyList()
2525 private var selectedId: Long? = null
2626
27- init {
28- loadOrders()
29- }
27+ init { loadOrders() }
3028
3129 fun onOrderSelected (orderId : Long ) {
3230 selectedId = orderId
33- val s = _state .value
34- if (s is WooPosOrdersState .Content ) {
31+ (state.value as ? WooPosOrdersState .Content )?.let { s ->
3532 _state .value = s.copy(
3633 items = orders.toOrderItems(selectedId),
3734 selectedOrderId = selectedId
@@ -40,8 +37,7 @@ class WooPosOrdersViewModel @Inject constructor(
4037 }
4138
4239 fun refresh () {
43- val s = _state .value
44- _state .value = when (s) {
40+ _state .value = when (val s = _state .value) {
4541 is WooPosOrdersState .Content -> s.copy(pullToRefreshState = WooPosPullToRefreshState .Refreshing )
4642 else -> WooPosOrdersState .Loading
4743 }
@@ -53,50 +49,61 @@ class WooPosOrdersViewModel @Inject constructor(
5349 viewModelScope.launch {
5450 ordersDataSource.loadOrders().collect { result ->
5551 when (result) {
56- is LoadOrdersResult .Error -> {
57- _state .value = WooPosOrdersState .Error (message = result.message)
58- }
59-
60- is LoadOrdersResult .SuccessCache ,
61- is LoadOrdersResult .SuccessRemote -> {
62- val newOrders = when (result) {
63- is LoadOrdersResult .SuccessCache -> result.orders
64- is LoadOrdersResult .SuccessRemote -> result.orders
65- else -> emptyList()
66- }
67-
68- orders = newOrders
69- selectedId = chooseSelectedId(selectedId, newOrders)
70-
71- _state .value = if (newOrders.isEmpty()) {
72- toStateForEmpty(result)
73- } else {
74- WooPosOrdersState .Content (
75- items = newOrders.toOrderItems(selectedId),
76- selectedOrderId = selectedId,
77- pullToRefreshState = WooPosPullToRefreshState .Enabled ,
78- paginationState = WooPosPaginationState .None ,
79- listError = null
80- )
81- }
82- }
52+ is LoadOrdersResult .Error ->
53+ handleError(result.message)
54+
55+ is LoadOrdersResult .SuccessCache ->
56+ handleSuccess(result.orders, isCache = true )
57+
58+ is LoadOrdersResult .SuccessRemote ->
59+ handleSuccess(result.orders, isCache = false )
8360 }
8461 }
8562 }
8663 }
8764
88- private fun chooseSelectedId (
89- current : Long? ,
90- newOrders : List <Order >
91- ): Long? {
92- return current?.takeIf { id -> newOrders.any { it.id == id } }
93- ? : newOrders.firstOrNull()?.id
65+ private fun handleError (message : String ) {
66+ _state .value = WooPosOrdersState .Error (message)
9467 }
9568
96- private fun toStateForEmpty (result : LoadOrdersResult ): WooPosOrdersState = when (result) {
97- is LoadOrdersResult .SuccessCache -> WooPosOrdersState .Loading
98- is LoadOrdersResult .SuccessRemote -> WooPosOrdersState .Empty
99- is LoadOrdersResult .Error -> WooPosOrdersState .Error (result.message)
69+ private fun handleSuccess (newOrders : List <Order >, isCache : Boolean ) {
70+ applySelection(newOrders)
71+
72+ if (newOrders.isEmpty()) {
73+ handleEmpty(isCache)
74+ } else {
75+ setContent(newOrders)
76+ }
77+ }
78+
79+ private fun handleEmpty (isCache : Boolean ) {
80+ if (isCache && isRefreshing() && _state .value is WooPosOrdersState .Content ) {
81+ return
82+ }
83+ _state .value = if (isCache) WooPosOrdersState .Loading else WooPosOrdersState .Empty
84+ }
85+
86+ private fun setContent (newOrders : List <Order >) {
87+ _state .value = WooPosOrdersState .Content (
88+ items = newOrders.toOrderItems(selectedId),
89+ selectedOrderId = selectedId,
90+ pullToRefreshState = WooPosPullToRefreshState .Enabled ,
91+ paginationState = WooPosPaginationState .None
92+ )
93+ }
94+
95+ private fun applySelection (newOrders : List <Order >) {
96+ orders = newOrders
97+ selectedId = chooseSelectedId(selectedId, newOrders)
98+ }
99+
100+ private fun isRefreshing (): Boolean =
101+ (state.value as ? WooPosOrdersState .Content )
102+ ?.pullToRefreshState == WooPosPullToRefreshState .Refreshing
103+
104+ private fun chooseSelectedId (current : Long? , newOrders : List <Order >): Long? {
105+ return current?.takeIf { id -> newOrders.any { it.id == id } }
106+ ? : newOrders.firstOrNull()?.id
100107 }
101108}
102109
0 commit comments