Skip to content

web: refactor progress backdrop query tracking #2958

Merged
dgdavid merged 3 commits intoapi-v2from
api-v2-move-progress-tracking
Dec 18, 2025
Merged

web: refactor progress backdrop query tracking #2958
dgdavid merged 3 commits intoapi-v2from
api-v2-move-progress-tracking

Conversation

@dgdavid
Copy link
Copy Markdown
Contributor

@dgdavid dgdavid commented Dec 18, 2025

Initially, internal ProgressBackdrop component at core/Page, relied on a global event system to detect when proposal-related queries finished refetching in order to consider an ongoing progress in the given scope was finished (check #2947). While this worked on the storage page, it failed on other pages becuae the central useProposalChanges hook is invalidating an storage-related query, which is not refetched until navigating to a storage-related page. As a result, the progress backdrop could remain stuck on unrelated storage pages.

This commit refactors the tracking mechanism to make it more flexible and page-aware:

  • Start exporting query keys as constants (COMMON_PROPOSAL_KEYS, STORAGE_MODEL_KEY, etc.) from their respective modules

  • Add the additionalProgressKeys prop to Page, allowing pages to specify extra query keys to track alongside the common proposal-related queries

  • Use useTrackQueriesRefetch directly into ProgressBackdrop, dropping the need for a custom global event system

  • Remove the proposal:updated event infrastructure (onProposalUpdated, dispatchProposalUpdated), which is no longer required

With this change, pages can explicitly declare which additional queries must complete refetching before the UI is unblocked. For example, the storage ProposalPage now waits for the storageModel query in addition to the common proposal queries.

While requiring pages to be explicit about the queries they depend on is not ideal, this preserves common proposal tracking as the default while preventing the UI from remaining blocked due to unrelated query invalidations.

Initially, core/Page/ProgressBackdrop relied on a global event system to
detect when proposal-related queries finished refetching. While this
worked on the storage page, it failed on other pages: the
ProposalChanged event is invalidating an storage-related query, which is
not refetched until navigating to a storage-related page. As a result,
the progress backdrop could remain stuck on unrelated storage pages.

This commit refactors the tracking mechanism to make it more flexible
and page-aware:

 * Start exporting query keys as constants (COMMON_PROPOSAL_KEYS,
   STORAGE_MODEL_KEY, etc.) from their respective modules

 * Add the `additionalProgressKeys` prop to Page, allowing pages to
   specify extra query keys to track alongside the common proposal-related
   queries

 * Use `useTrackQueriesRefetch` directly into ProgressBackdrop,
   dropping the need for a custom global event system

 * Remove the proposal:updated event infrastructure (onProposalUpdated,
   dispatchProposalUpdated), which is no longer required

With this change, pages can explicitly declare which additional queries
must complete refetching before the UI is unblocked. For example, the
storage `ProposalPage` now waits for the `storageModel` query in
addition to the common proposal queries.

While requiring pages to be explicit about the queries they depend on is
not ideal, this preserves common proposal tracking as the default while
preventing the UI from remaining blocked due to unrelated query
invalidations.
@dgdavid dgdavid force-pushed the api-v2-move-progress-tracking branch from 10c94fc to 408ae4f Compare December 18, 2025 14:14

return (
<Page progressScope="storage">
<Page progressScope="storage" additionalProgressKeys={STORAGE_MODEL_KEY}>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

np: Is a "Key" or a "Query"? I know it is a "query key", but it refers to a query.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right... I tried to keep the prop shorter but I've another idea in mind for next iteration that might help. Stay tuned 😉

Similar to the react-router mocks, useStatus mocking is now centralized
and initialized with sensible defaults. This avoids having to mock it in
every test of components making use of Page where it is not directly
relevant, preventing these test output from being swallowed by an
unmocked useStatus used internally by core/Page.
@dgdavid dgdavid merged commit 10bf61a into api-v2 Dec 18, 2025
10 of 11 checks passed
@dgdavid dgdavid deleted the api-v2-move-progress-tracking branch December 18, 2025 16:25
imobachgs added a commit that referenced this pull request Jan 10, 2026
Merge the new HTTP API. Each PR has been already reviewed, so it should
be safe to merge it.

* #1829
* #2508
* #2772
* #2826
* #2848
* #2860
* #2863
* #2866
* #2867
* #2869
* #2870
* #2871
* #2872
* #2873
* #2874
* #2875
* #2876
* #2877
* #2880
* #2881
* #2882
* #2884
* #2885
* #2886
* #2891
* #2892
* #2893
* #2894
* #2895
* #2896
* #2897
* #2898
* #2899
* #2900
* #2901
* #2902
* #2903
* #2904
* #2908
* #2909
* #2910
* #2912
* #2913
* #2914
* #2915
* #2916
* #2917
* #2918
* #2920
* #2921
* #2923
* #2924
* #2926
* #2928
* #2929
* #2930
* #2933
* #2934
* #2935
* #2936
* #2938
* #2939
* #2942
* #2943
* #2944
* #2945
* #2946
* #2947
* #2948
* #2950
* #2951
* #2952
* #2954
* #2955
* #2956
* #2957
* #2958
* #2959
* #2960
* #2961
* #2963
* #2964
* #2965
* #2967
* #2968
* #2969
* #2970
* #2971
* #2972
* #2974
* #2975
* #2977
* #2978
* #2980
* #2982
* #2983
* #2984
* #2988
* #2989
* #2991
* #2992
* #2993
* #2994
* #2995
* #2996
* #2997
* #2999
@imobachgs imobachgs mentioned this pull request Mar 17, 2026
imobachgs added a commit that referenced this pull request Mar 17, 2026
Prepare to release version 19.

* #1829
* #2508
* #2772
* #2818
* #2826
* #2848
* #2860
* #2863
* #2864
* #2866
* #2867
* #2869
* #2870
* #2871
* #2872
* #2873
* #2874
* #2875
* #2876
* #2877
* #2880
* #2881
* #2882
* #2884
* #2885
* #2886
* #2891
* #2892
* #2893
* #2894
* #2895
* #2896
* #2897
* #2898
* #2899
* #2900
* #2901
* #2902
* #2903
* #2904
* #2908
* #2909
* #2910
* #2912
* #2913
* #2914
* #2915
* #2916
* #2917
* #2918
* #2920
* #2921
* #2923
* #2924
* #2926
* #2928
* #2929
* #2930
* #2933
* #2934
* #2935
* #2936
* #2937
* #2938
* #2939
* #2942
* #2943
* #2944
* #2945
* #2946
* #2947
* #2948
* #2949
* #2950
* #2951
* #2952
* #2954
* #2955
* #2956
* #2957
* #2958
* #2959
* #2960
* #2961
* #2963
* #2964
* #2965
* #2967
* #2968
* #2969
* #2970
* #2971
* #2972
* #2974
* #2975
* #2977
* #2978
* #2980
* #2981
* #2982
* #2983
* #2984
* #2988
* #2989
* #2990
* #2991
* #2992
* #2993
* #2994
* #2995
* #2996
* #2997
* #2998
* #2999
* #3000
* #3001
* #3002
* #3004
* #3005
* #3006
* #3007
* #3008
* #3009
* #3011
* #3012
* #3013
* #3014
* #3015
* #3016
* #3018
* #3019
* #3020
* #3021
* #3022
* #3023
* #3024
* #3025
* #3026
* #3027
* #3028
* #3029
* #3030
* #3031
* #3033
* #3034
* #3035
* #3036
* #3037
* #3039
* #3040
* #3041
* #3042
* #3043
* #3044
* #3045
* #3046
* #3047
* #3048
* #3049
* #3050
* #3051
* #3052
* #3053
* #3054
* #3055
* #3056
* #3057
* #3058
* #3060
* #3061
* #3062
* #3063
* #3064
* #3065
* #3066
* #3067
* #3068
* #3069
* #3070
* #3071
* #3072
* #3073
* #3074
* #3075
* #3076
* #3077
* #3078
* #3079
* #3086
* #3087
* #3088
* #3089
* #3090
* #3091
* #3092
* #3093
* #3094
* #3095
* #3096
* #3097
* #3098
* #3099
* #3100
* #3101
* #3102
* #3103
* #3104
* #3105
* #3106
* #3107
* #3108
* #3109
* #3110
* #3112
* #3113
* #3114
* #3115
* #3116
* #3117
* #3118
* #3119
* #3120
* #3122
* #3123
* #3124
* #3127
* #3128
* #3129
* #3130
* #3131
* #3133
* #3134
* #3135
* #3136
* #3137
* #3138
* #3139
* #3140
* #3141
* #3142
* #3143
* #3144
* #3145
* #3146
* #3147
* #3148
* #3149
* #3150
* #3151
* #3152
* #3153
* #3154
* #3155
* #3157
* #3158
* #3159
* #3160
* #3161
* #3162
* #3163
* #3164
* #3165
* #3166
* #3167
* #3168
* #3169
* #3170
* #3174
* #3175
* #3176
* #3177
* #3178
* #3179
* #3181
* #3182
* #3184
* #3185
* #3186
* #3188
* #3189
* #3190
* #3191
* #3192
* #3194
* #3195
* #3196
* #3197
* #3198
* #3199
* #3200
* #3201
* #3202
* #3203
* #3205
* #3206
* #3208
* #3209
* #3210
* #3213
* #3214
* #3215
* #3216
* #3217
* #3218
* #3219
* #3220
* #3222
* #3223
* #3224
* #3225
* #3226
* #3227
* #3228
* #3229
* #3230
* #3231
* #3232
* #3233
* #3234
* #3235
* #3236
* #3237
* #3238
* #3239
* #3240
* #3241
* #3242
* #3243
* #3244
* #3246
* #3247
* #3248
* #3250
* #3251
* #3252
* #3253
* #3254
* #3255
* #3256
* #3257
* #3258
* #3259
* #3260
* #3261
* #3262
* #3263
* #3265
* #3266
* #3267
* #3268
* #3269
* #3270
* #3271
* #3272
* #3273
* #3274
* #3275
* #3276
* #3277
* #3278
* #3279
* #3280
* #3281
* #3282
* #3283
* #3284
* #3285
* #3286
* #3287
* #3288
* #3289
* #3290
* #3291
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants