fix(signature-timeout-alert): derive parse message with useMemo instead of setState-in-effect - #353
Merged
1 commit merged intoAug 31, 2026
Conversation
…ad of setState-in-effect CI's lint step has been red since Goldii-locks#283/Goldii-locks#284/Goldii-locks#287: ESLint's react-hooks/set-state-in-effect rule flags the effect that called setParseMessage synchronously right after checking activeTransactionXdr. The value is purely derived from activeTransactionXdr, so compute it with useMemo during render instead of scheduling a second render via an effect.
|
Hey @otsimaofficial! 👋 It looks like this PR isn't linked to any issue. If this PR is for one of the issues assigned to you as part of a Wave, please link it to ensure your contribution is tracked properly. You can do this by adding a keyword to the PR description (e.g.,
|
cd1848a
Biokes
pushed a commit
to Biokes/escrow-frontend
that referenced
this pull request
Aug 31, 2026
CI has been failing at the Install step, so no run has reached lint, typecheck, tests or build in some time. Four separate problems were hiding behind that. 1. npm ci could not run at all: package.json and package-lock.json were out of sync (missing typescript@4.9.5 and @noble/hashes@2.4.0). The lockfile is regenerated so `npm ci --ignore-scripts` resolves. No dependency versions changed - @stellar/freighter-api stays on 6.0.0. 2. WalletBadge.tsx held two complete implementations concatenated by a bad merge, with two `export default`s and an unclosed brace, so the file did not parse. Both prop shapes are genuinely live: Navbar drives the badge with isConnecting/providerName/networkMismatch, while the design-token call sites drive it with an explicit status. The merged component takes the union and dispatches on `status`, so all three test files (46 assertions) pass against one component. 3. Two identifiers had been lost from their modules - useToast in FreighterConnector and a `short()` address helper in Navbar. The latter is replaced by the existing formatAddress export. 4. Tests: @stellar/freighter-api is CommonJS and reaches the app through @creit.tech/stellar-wallets-kit, so every suite rendering a context-dependent component died on a named-export error. Both are now inlined for the dep optimizer. The multi-sig hook tests fed base64 of "aaaa..." to a real Stellar parser while claiming to parse "a well-formed envelope"; they now build and sign a real envelope. One loader test asserted before React had flushed a subscription update, and is wrapped in act(). Lint, typecheck, 1352 tests across 88 files, and build all pass. One lint error remains in SignatureTimeoutAlert (setState in effect); it is left alone because open PR Goldii-locks#353 fixes it properly with useMemo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
CI's Lint step has been failing on every merge to
mainsince at least #283/#284/#287 (checked the last 5CIruns onmain— all red). The cause is ESLint'sreact-hooks/set-state-in-effectrule flaggingSignatureTimeoutAlert.tsx: an effect that calledsetParseMessage(...)synchronously right after checkingactiveTransactionXdr.This isn't related to any specific feature — it's blocking a clean CI signal for every future PR, including a batch of
loading_spinner_skeletonissues (#275, #276, #278, #279) I'm opening alongside this one.Fix
parseMessageis purely derived fromactiveTransactionXdr(parse it, capture the error message if parsing fails) — no external system, no subscription. Replaced theuseState+useEffectpair with a singleuseMemo, computed synchronously during render instead of scheduling a second render via an effect. Behavior is unchanged;__tests__/signature_timeout_alert.test.tsx'swaitForassertion on the malformed-XDR case still passes (it now resolves on the first check instead of after an effect flush).Testing
npm run lint→ 0 errors (previously 1 error / 4 warnings; the 4 pre-existing unrelated warnings remain).npx tsc --noEmitpasses.npm run buildpasses.npm run test: full suite run: no failures traced to this file/change. The suite does have some pre-existing flakiness under load (a rotating subset of unrelated tests — multisig XDR fixtures, a couple of 5s test timeouts) that reproduces identically on a cleanmaincheckout with this change stashed out, so it's unrelated to this fix.🤖 Generated with Claude Code