Improve activity loading to avoid sitations when activity tab becomes empty after auto-refresh or app backgrounding (#21988)

This commit is contained in:
Alexander 2025-02-14 09:49:34 +01:00 committed by GitHub
parent fe0c5c2da7
commit a210d59c4f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 32 additions and 23 deletions

View File

@ -35,13 +35,12 @@
chain-ids (chain/chain-ids db) chain-ids (chain/chain-ids db)
params [[address] chain-ids (create-default-filters) limit-per-request]] params [[address] chain-ids (create-default-filters) limit-per-request]]
{:db (-> db {:db (-> db
(update-in [:wallet :activities] dissoc address)
(update-in [:wallet :ui :activity-tab :request] dissoc :request-id) (update-in [:wallet :ui :activity-tab :request] dissoc :request-id)
(update-in [:wallet :ui :activity-tab :request] (update-in [:wallet :ui :activity-tab :request]
assoc assoc
:address address :address address
:loading? true :loading? true
:initial-request? true)) :remove-all-previous-activites? true))
:fx [[:json-rpc/call :fx [[:json-rpc/call
[{:method "wallet_startActivityFilterSessionV2" [{:method "wallet_startActivityFilterSessionV2"
:params params :params params
@ -69,7 +68,8 @@
has-more? (get-in db [:wallet :ui :activity-tab :request :has-more?]) has-more? (get-in db [:wallet :ui :activity-tab :request :has-more?])
params [session-id limit-per-request]] params [session-id limit-per-request]]
(when (and session-id has-more?) (when (and session-id has-more?)
{:fx [[:json-rpc/call {:db (assoc-in db [:wallet :ui :activity-tab :request :remove-all-existing-activities?] false)
:fx [[:json-rpc/call
[{:method "wallet_getMoreForActivityFilterSession" [{:method "wallet_getMoreForActivityFilterSession"
:params params :params params
:on-error [:wallet/log-rpc-error :on-error [:wallet/log-rpc-error
@ -80,7 +80,7 @@
:wallet/reset-activities-filter-session :wallet/reset-activities-filter-session
(fn [{:keys [db]}] (fn [{:keys [db]}]
(when-let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])] (when-let [session-id (get-in db [:wallet :ui :activity-tab :request :request-id])]
{:db (assoc-in db [:wallet :ui :activity-tab :request :initial-request?] true) {:db (assoc-in db [:wallet :ui :activity-tab :request :remove-all-existing-activities?] true)
:fx [[:json-rpc/call :fx [[:json-rpc/call
[{:method "wallet_resetActivityFilterSession" [{:method "wallet_resetActivityFilterSession"
:params [session-id limit-per-request] :params [session-id limit-per-request]
@ -91,21 +91,22 @@
(rf/reg-event-fx (rf/reg-event-fx
:wallet/activity-filtering-for-current-account-done :wallet/activity-filtering-for-current-account-done
(fn [{:keys [db]} [{:keys [message]}]] (fn [{:keys [db]} [{:keys [message]}]]
(let [{:keys [address initial-request?]} (get-in db [:wallet :ui :activity-tab :request]) (let [{:keys [address
remove-all-existing-activities?]} (get-in db [:wallet :ui :activity-tab :request])
{:keys [activities offset hasMore]} (transforms/json->clj message) {:keys [activities offset hasMore]} (transforms/json->clj message)
new-activities (->> activities new-activities (->> activities
(cske/transform-keys transforms/->kebab-case-keyword) (cske/transform-keys
transforms/->kebab-case-keyword)
(collection/index-by :key)) (collection/index-by :key))
existing-activities (get-in db [:wallet :activities address]) existing-activities (get-in db [:wallet :activities address])
updated-activities (if initial-request? updated-activities (if remove-all-existing-activities?
new-activities new-activities
(nested-merge existing-activities new-activities))] (nested-merge existing-activities new-activities))]
{:db (-> db {:db (-> db
(assoc-in [:wallet :activities address] updated-activities) (assoc-in [:wallet :activities address] updated-activities)
(assoc-in [:wallet :ui :activity-tab :request :offset] offset) (assoc-in [:wallet :ui :activity-tab :request :offset] offset)
(assoc-in [:wallet :ui :activity-tab :request :has-more?] hasMore) (assoc-in [:wallet :ui :activity-tab :request :has-more?] hasMore)
(assoc-in [:wallet :ui :activity-tab :request :loading?] false) (assoc-in [:wallet :ui :activity-tab :request :loading?] false))})))
(assoc-in [:wallet :ui :activity-tab :request :initial-request?] false))})))
(rf/reg-event-fx (rf/reg-event-fx
:wallet/activities-filtering-entries-updated :wallet/activities-filtering-entries-updated

View File

@ -31,11 +31,20 @@
on-end-reached (rn/use-callback on-end-reached (rn/use-callback
#(rf/dispatch #(rf/dispatch
[:wallet/get-more-for-activities-filter-session]))] [:wallet/get-more-for-activities-filter-session]))]
(if (and (and (some? loading?) (false? loading?)) (empty? activity-list)) (cond
(and (empty? activity-list) loading?)
[quo/skeleton-list
{:content :messages
:parent-height (:height (rn/get-window))
:animated? false}]
(and (empty? activity-list) (false? loading?))
[empty-tab/view [empty-tab/view
{:title (i18n/label :t/no-activity) {:title (i18n/label :t/no-activity)
:description (i18n/label :t/empty-tab-description) :description (i18n/label :t/empty-tab-description)
:image (resources/get-themed-image :no-activity theme)}] :image (resources/get-themed-image :no-activity theme)}]
:else
[rn/section-list [rn/section-list
{:sections activity-list {:sections activity-list
:sticky-section-headers-enabled false :sticky-section-headers-enabled false

View File

@ -57,11 +57,10 @@
(rf/reg-event-fx :wallet/select-account-tab (rf/reg-event-fx :wallet/select-account-tab
(fn [{:keys [db]} [tab]] (fn [{:keys [db]} [tab]]
(let [activity-tab-selected? (= tab :activity)]
{:db (assoc-in db [:wallet :ui :account-page :active-tab] tab) {:db (assoc-in db [:wallet :ui :account-page :active-tab] tab)
:fx [(if activity-tab-selected? :fx [(if (= tab :activity)
[:dispatch [:wallet/fetch-activities-for-current-account]] [:dispatch [:wallet/fetch-activities-for-current-account]]
[:dispatch [:wallet/stop-activity-filter-session]])]}))) [:dispatch [:wallet/stop-activity-filter-session]])]}))
(rf/reg-event-fx :wallet/select-home-tab (rf/reg-event-fx :wallet/select-home-tab
(fn [{:keys [db]} [tab]] (fn [{:keys [db]} [tab]]