From a210d59c4f7037311f0f2310d3664012ec77fc06 Mon Sep 17 00:00:00 2001 From: Alexander Date: Fri, 14 Feb 2025 09:49:34 +0100 Subject: [PATCH] Improve activity loading to avoid sitations when activity tab becomes empty after auto-refresh or app backgrounding (#21988) --- .../wallet/common/activity_tab/events.cljs | 35 ++++++++++--------- .../wallet/common/activity_tab/view.cljs | 11 +++++- src/status_im/contexts/wallet/events.cljs | 9 +++-- 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/status_im/contexts/wallet/common/activity_tab/events.cljs b/src/status_im/contexts/wallet/common/activity_tab/events.cljs index e2d037c91a..5dcd6ba661 100644 --- a/src/status_im/contexts/wallet/common/activity_tab/events.cljs +++ b/src/status_im/contexts/wallet/common/activity_tab/events.cljs @@ -35,13 +35,12 @@ chain-ids (chain/chain-ids db) params [[address] chain-ids (create-default-filters) limit-per-request]] {: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] assoc - :address address - :loading? true - :initial-request? true)) + :address address + :loading? true + :remove-all-previous-activites? true)) :fx [[:json-rpc/call [{:method "wallet_startActivityFilterSessionV2" :params params @@ -69,7 +68,8 @@ has-more? (get-in db [:wallet :ui :activity-tab :request :has-more?]) params [session-id limit-per-request]] (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" :params params :on-error [:wallet/log-rpc-error @@ -80,7 +80,7 @@ :wallet/reset-activities-filter-session (fn [{:keys [db]}] (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 [{:method "wallet_resetActivityFilterSession" :params [session-id limit-per-request] @@ -91,21 +91,22 @@ (rf/reg-event-fx :wallet/activity-filtering-for-current-account-done (fn [{:keys [db]} [{:keys [message]}]] - (let [{:keys [address initial-request?]} (get-in db [:wallet :ui :activity-tab :request]) - {:keys [activities offset hasMore]} (transforms/json->clj message) - new-activities (->> activities - (cske/transform-keys transforms/->kebab-case-keyword) - (collection/index-by :key)) - existing-activities (get-in db [:wallet :activities address]) - updated-activities (if initial-request? - new-activities - (nested-merge existing-activities new-activities))] + (let [{:keys [address + remove-all-existing-activities?]} (get-in db [:wallet :ui :activity-tab :request]) + {:keys [activities offset hasMore]} (transforms/json->clj message) + new-activities (->> activities + (cske/transform-keys + transforms/->kebab-case-keyword) + (collection/index-by :key)) + existing-activities (get-in db [:wallet :activities address]) + updated-activities (if remove-all-existing-activities? + new-activities + (nested-merge existing-activities new-activities))] {:db (-> db (assoc-in [:wallet :activities address] updated-activities) (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 :loading?] false) - (assoc-in [:wallet :ui :activity-tab :request :initial-request?] false))}))) + (assoc-in [:wallet :ui :activity-tab :request :loading?] false))}))) (rf/reg-event-fx :wallet/activities-filtering-entries-updated diff --git a/src/status_im/contexts/wallet/common/activity_tab/view.cljs b/src/status_im/contexts/wallet/common/activity_tab/view.cljs index 1eb7b944c2..8bcf38eb19 100644 --- a/src/status_im/contexts/wallet/common/activity_tab/view.cljs +++ b/src/status_im/contexts/wallet/common/activity_tab/view.cljs @@ -31,11 +31,20 @@ on-end-reached (rn/use-callback #(rf/dispatch [: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 {:title (i18n/label :t/no-activity) :description (i18n/label :t/empty-tab-description) :image (resources/get-themed-image :no-activity theme)}] + + :else [rn/section-list {:sections activity-list :sticky-section-headers-enabled false diff --git a/src/status_im/contexts/wallet/events.cljs b/src/status_im/contexts/wallet/events.cljs index 7d857d04e8..30093cab4a 100644 --- a/src/status_im/contexts/wallet/events.cljs +++ b/src/status_im/contexts/wallet/events.cljs @@ -57,11 +57,10 @@ (rf/reg-event-fx :wallet/select-account-tab (fn [{:keys [db]} [tab]] - (let [activity-tab-selected? (= tab :activity)] - {:db (assoc-in db [:wallet :ui :account-page :active-tab] tab) - :fx [(if activity-tab-selected? - [:dispatch [:wallet/fetch-activities-for-current-account]] - [:dispatch [:wallet/stop-activity-filter-session]])]}))) + {:db (assoc-in db [:wallet :ui :account-page :active-tab] tab) + :fx [(if (= tab :activity) + [:dispatch [:wallet/fetch-activities-for-current-account]] + [:dispatch [:wallet/stop-activity-filter-session]])]})) (rf/reg-event-fx :wallet/select-home-tab (fn [{:keys [db]} [tab]]