Skip to content

fix(voting): reset the following dialogs on reopen - #591

Open
yhabib wants to merge 1 commit into
mainfrom
fix/following-dialog-reset
Open

yhabib wants to merge 1 commit into
mainfrom
fix/following-dialog-reset

Conversation

@yhabib

@yhabib yhabib commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator

Motivation

FolloweePicker and SimpleFollowingModal reset their state only in a timer after the close. If the dialog opens again within DIALOG_RESET_DELAY_MS, the timer is cleared, so the old step, selection, or search stays in the reopened dialog. MutationDialog and StakingWizardModal already handle this case with a reset on open.

Changes

  • Added a reset on open to FolloweePicker and SimpleFollowingModal, and kept the delayed reset for the close animation.
  • Moved the reset in SimpleFollowingModal to useEffectEvent, so the effect depends only on open.
  • Added reopen tests for both dialogs.
  • Added a test that a follow in progress keeps its state while the dialog stays open.

FolloweePicker and SimpleFollowingModal reset only in a timer after the
close. A reopen within DIALOG_RESET_DELAY_MS cleared that timer, so the
old state stayed in the dialog. Reset on open as well.
@yhabib
yhabib requested a review from a team as a code owner November 7, 2026 07:32
Copilot AI balanced review requested due to automatic review settings November 7, 2026 07:32
@zeropath-ai

zeropath-ai Bot commented Nov 7, 2026

Copy link
Copy Markdown

✅ No security or compliance issues detected. Reviewed everything up to 395caf2.

Security Overview
Detected Code Changes
Change Type Relevant files
Enhancement ► src/governance-app-frontend/src/features/voting/components/FolloweePicker.tsx
    Modify reset/close behavior with useEffectEvent and delayed reset logic
► src/governance-app-frontend/src/features/voting/components/FolloweePicker.test.tsx
    Update tests to accommodate new reset behavior and timer handling
Enhancement ► src/governance-app-frontend/src/features/voting/components/SimpleFollowingModal.tsx
    Introduce useEffectEvent-based reset for modal state on close/open transitions
Enhancement ► src/governance-app-frontend/src/features/voting/components/SimpleFollowingModal.tsx
    Replace previous reset on close with timer-based delayed reset and cancellation on reopen

@github-actions

github-actions Bot commented Nov 7, 2026

Copy link
Copy Markdown

📊 Build Bundle Stats

The latest build generated the following assets:

dist/index.html                                           6.12 kB │ gzip:   1.72 kB
dist/assets/index-DHR8rj0Y.css                          150.06 kB │ gzip:  24.02 kB
dist/assets/icpLedger-qGVV3eQh.js                         0.23 kB │ gzip:   0.21 kB
dist/assets/useNowInSeconds-BAiJeSIf.js                   0.43 kB │ gzip:   0.31 kB
dist/assets/Skeleton-CHgKrSJh.js                          0.44 kB │ gzip:   0.32 kB
dist/assets/webhid-D0yio6wG.js                            0.53 kB │ gzip:   0.32 kB
dist/assets/advancedFeatures-_PSXKphq.js                  0.53 kB │ gzip:   0.27 kB
dist/assets/useTvlValue-Dhp5kO72.js                       0.60 kB │ gzip:   0.41 kB
dist/assets/webVitals-CWkSnXdy.js                         0.63 kB │ gzip:   0.46 kB
dist/assets/nnsDapp-B1MZUm1z.js                           0.68 kB │ gzip:   0.25 kB
dist/assets/SkeletonPageHeader-CLJmsEib.js                0.76 kB │ gzip:   0.47 kB
dist/assets/PageHeader-jXzaR6sL.js                        0.77 kB │ gzip:   0.45 kB
dist/assets/CertifiedBadge-DfViAKYn.js                    0.81 kB │ gzip:   0.48 kB
dist/assets/SkeletonStatCard-BDCjYg3x.js                  0.81 kB │ gzip:   0.50 kB
dist/assets/Separator-BrdlJrwN.js                         0.83 kB │ gzip:   0.50 kB
dist/assets/useForecastPeriod-CTjKtWQ5.js                 1.00 kB │ gzip:   0.60 kB
dist/assets/utils-7zHDtTEX.js                             1.02 kB │ gzip:   0.59 kB
dist/assets/useIcpIndex-CjNP_Bof.js                       1.09 kB │ gzip:   0.64 kB
dist/assets/useSubaccountsMetadata-B3MWmeaJ.js            1.10 kB │ gzip:   0.62 kB
dist/assets/numbers-DqMnxSgM.js                           1.15 kB │ gzip:   0.57 kB
dist/assets/routeLoaders-Cil_JOH7.js                      1.19 kB │ gzip:   0.56 kB
dist/assets/rolldown-runtime-DAXXjFlN.js                  1.26 kB │ gzip:   0.70 kB
dist/assets/useHardwareWalletsMetadata-Xe8Dhv8g.js        1.39 kB │ gzip:   0.69 kB
dist/assets/events-B29pasdV.js                            1.66 kB │ gzip:   0.86 kB
dist/assets/SkeletonListRows-Ct2M_kkc.js                  1.69 kB │ gzip:   0.53 kB
dist/assets/useLedgerNeuronCall-Fp9aV-7P.js               1.90 kB │ gzip:   1.04 kB
dist/assets/errors-C_oENL0S.js                            1.95 kB │ gzip:   0.97 kB
dist/assets/AnimatedNumber-CtciF_kq.js                    1.98 kB │ gzip:   1.13 kB
dist/assets/useCommandPaletteSettings-BgYlAOUI.js         2.12 kB │ gzip:   1.06 kB
dist/assets/addressBook-CXUhtzyS.js                       2.14 kB │ gzip:   1.20 kB
dist/assets/useIcpIndexTransactionsPolling-Bouj2s24.js    2.17 kB │ gzip:   1.16 kB
dist/assets/useGovernanceAppCanister-1zC646dE.js          2.41 kB │ gzip:   1.07 kB
dist/assets/useShortcutSettings-X0iv1eMv.js               2.41 kB │ gzip:   1.19 kB
dist/assets/useAddHotkey-C2ftqoDH.js                      2.61 kB │ gzip:   1.35 kB
dist/assets/governance-Cn1EAuo5.js                        2.99 kB │ gzip:   1.15 kB
dist/assets/ToggleGroup-DKwUtc4k.js                       3.09 kB │ gzip:   1.41 kB
dist/assets/useClaimPendingDeviceStakes-B1WuwIp3.js       3.12 kB │ gzip:   1.42 kB
dist/assets/SkeletonText-CUlodKTM.js                      3.71 kB │ gzip:   1.29 kB
dist/assets/useAccounts-CI3Qzg8Y.js                       4.98 kB │ gzip:   2.20 kB
dist/assets/tickers-BAQlYmV7.js                           6.54 kB │ gzip:   2.73 kB
dist/assets/AlertDialog-BZtgsfz6.js                       7.73 kB │ gzip:   2.72 kB
dist/assets/DeviceActionDetail-CzN5-4HK.js                8.45 kB │ gzip:   3.03 kB
dist/assets/TopicFollowingAccordion-Cq0meB0G.js           8.55 kB │ gzip:   3.42 kB
dist/assets/routes-BEG-lrQS.js                            8.96 kB │ gzip:   3.07 kB
dist/assets/ledgerIdentity-CbGbEww2.js                   10.16 kB │ gzip:   3.70 kB
dist/assets/MutationDialog-OyeAL9ja.js                   11.55 kB │ gzip:   4.04 kB
dist/assets/spamFilter-CSUZxw_z.js                       11.77 kB │ gzip:   5.02 kB
dist/assets/ResponsiveDialog-CryQzt1M.js                 14.56 kB │ gzip:   4.06 kB
dist/assets/_id-DkUG0sh6.js                              16.61 kB │ gzip:   5.32 kB
dist/assets/AmountInput-C2bdgiPr.js                      16.96 kB │ gzip:   6.77 kB
dist/assets/_auth-BKtO2i60.js                            22.49 kB │ gzip:   8.29 kB
dist/assets/HideBalancesToggle-BCvORTGT.js               22.99 kB │ gzip:   8.58 kB
dist/assets/vendor-buffer-EX-AqChq.js                    26.95 kB │ gzip:   8.18 kB
dist/assets/accounts-BbW8zGaP.js                         32.08 kB │ gzip:  10.90 kB
dist/assets/SendICPButton-D5zkgIv6.js                    37.11 kB │ gzip:  13.54 kB
dist/assets/settings-BBIctF7-.js                         54.47 kB │ gzip:  15.55 kB
dist/assets/dashboard-C6C04m7G.js                        57.76 kB │ gzip:  19.10 kB
dist/assets/voting-BKenNFCG.js                           69.55 kB │ gzip:  21.82 kB
dist/assets/index-DHfrIcAH.js                            69.56 kB │ gzip:  20.56 kB
dist/assets/vendor-md-DQa12sMs.js                        73.29 kB │ gzip:  19.98 kB
dist/assets/button-CHXe5_EQ.js                           86.42 kB │ gzip:  29.03 kB
dist/assets/neurons-DdhjwQOr.js                          90.51 kB │ gzip:  27.15 kB
dist/assets/DisburseModal-Hq8BESTl.js                   101.47 kB │ gzip:  29.63 kB
dist/assets/vendor-tanstack-D12Yy7ks.js                 120.02 kB │ gzip:  39.22 kB
dist/assets/vendor-jsqr-CjiBYtfG.js                     129.98 kB │ gzip:  47.50 kB
dist/assets/vendor-core-react-bRRjyX41.js               189.81 kB │ gzip:  59.76 kB
dist/assets/vendor-recharts-DQ8kALIQ.js                 280.26 kB │ gzip:  76.83 kB
dist/assets/vendor-ledger-Bz6feAP8.js                   403.26 kB │ gzip:  98.84 kB
dist/assets/vendor-icp-e5O_ocwA.js                      468.31 kB │ gzip: 117.84 kB
dist/assets/vendor-libs-BjQATLf3.js                     587.62 kB │ gzip: 189.56 kB

Copilot AI left a comment

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.

🟢 Approved

No active review issues remain for the voting-dialog state reset changes.

No open issues 🎉

What changed in this PR

Fixes stale state in the voting dialogs when they reopen before the delayed close reset runs, while preserving the delay for close animations.

Changes:

  • Resets FolloweePicker and SimpleFollowingModal immediately on open.
  • Uses useEffectEvent so reset effects depend only on open.
  • Adds regression tests for rapid reopening and preserving an in-progress follow while the modal stays open.
File Description
src/​governance-app-frontend/​src/​features/​voting/​components/​SimpleFollowingModal.tsx Resets on open and retains the delayed close reset.
src/​governance-app-frontend/​src/​features/​voting/​components/​SimpleFollowingModal.test.tsx Tests search and confirmation resets on reopen, plus in-progress follow state.
src/​governance-app-frontend/​src/​features/​voting/​components/​FolloweePicker.tsx Resets wizard state on open while preserving the close-animation delay.
src/​governance-app-frontend/​src/​features/​voting/​components/​FolloweePicker.test.tsx Tests that rapid reopening returns to the first step with cleared selections.

Review effort: Balanced

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