[PR #7523] [MERGED] fix potentially inconsistent state updates #33152

Closed
opened 2026-04-18 09:04:18 -05:00 by GiteaMirror · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/actualbudget/actual/pull/7523
Author: @matt-fidd
Created: 4/15/2026
Status: Merged
Merged: 4/16/2026
Merged by: @matt-fidd

Base: masterHead: inconsistent-state


📝 Commits (2)

📊 Changes

2 files changed (+45 additions, -36 deletions)

View changed files

📝 packages/desktop-client/src/components/accounts/Account.tsx (+39 -36)
upcoming-release-notes/7523.md (+6 -0)

📄 Description

Description

The below taken directly from the GitHub code quality page, all I've done is to check through and make the changes

Potentially inconsistent state update
React component state updates using setState may asynchronously update this.props and this.state, thus it is not safe to use either of the two when calculating the new state passed to setState.

Recommendation
Use the callback-based variant of setState: instead of calculating the new state directly and passing it to setState, pass a callback function that calculates the new state when the update is about to be performed.

Example
The following example uses setState to update the counter property of this.state, relying on the current (potentially stale) value of that property:

JavaScript

this.setState({
  counter: this.state.counter + 1
});

Instead, the callback form of setState should be used:

JavaScript

this.setState(prevState => ({
  counter: prevState.counter + 1
}));

Testing

Checklist

  • Release notes added (see link above)
  • No obvious regressions in affected areas
  • Self-review has been performed - I understand what each change in the code does and why it is needed

Bundle Stats

Bundle Files count Total bundle size % Changed
desktop-client 34 12.92 MB → 12.92 MB (+69 B) +0.00%
loot-core 1 4.85 MB 0%
api 1 3.88 MB 0%
cli 1 7.91 MB 0%
View detailed bundle stats

desktop-client

Total

Files count Total bundle size % Changed
34 12.92 MB → 12.92 MB (+69 B) +0.00%
Changeset
File Δ Size
src/components/accounts/Account.tsx 📈 +69 B (+0.15%) 43.9 kB → 43.97 kB
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger

Asset File Size % Changed
static/js/index.js 1.85 MB → 1.85 MB (+69 B) +0.00%

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
static/js/BackgroundImage.js 121.09 kB 0%
static/js/FormulaEditor.js 814.39 kB 0%
static/js/PayeeRuleCountLabel.js 52.12 kB 0%
static/js/ReportRouter.js 1.18 MB 0%
static/js/ScheduleEditForm.js 136.13 kB 0%
static/js/TransactionEdit.js 185.13 kB 0%
static/js/TransactionList.js 82.8 kB 0%
static/js/Value.js 4.34 MB 0%
static/js/ca.js 191.72 kB 0%
static/js/chart-theme.js 705.55 kB 0%
static/js/client.js 450.92 kB 0%
static/js/da.js 104.4 kB 0%
static/js/de.js 174.12 kB 0%
static/js/en-GB.js 8.2 kB 0%
static/js/en.js 176.5 kB 0%
static/js/es.js 181.54 kB 0%
static/js/extends.js 486.5 kB 0%
static/js/fr.js 176.79 kB 0%
static/js/indexeddb-main-thread-worker-e59fee74.js 13.46 kB 0%
static/js/it.js 165.68 kB 0%
static/js/narrow.js 363.68 kB 0%
static/js/nb-NO.js 151.58 kB 0%
static/js/nl.js 108.66 kB 0%
static/js/pl.js 88.34 kB 0%
static/js/pt-BR.js 177.18 kB 0%
static/js/resize-observer.js 18.06 kB 0%
static/js/th.js 178.91 kB 0%
static/js/theme.js 30.79 kB 0%
static/js/uk.js 212.28 kB 0%
static/js/useFormatList.js 9.86 kB 0%
static/js/wide.js 292 B 0%
static/js/workbox-window.prod.es5.js 7.33 kB 0%
static/js/zh-Hans.js 110.19 kB 0%

loot-core

Total

Files count Total bundle size % Changed
1 4.85 MB 0%
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
kcab.worker.Dtv5lNQw.js 4.85 MB 0%

api

Total

Files count Total bundle size % Changed
1 3.88 MB 0%
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
index.js 3.88 MB 0%

cli

Total

Files count Total bundle size % Changed
1 7.91 MB 0%
View detailed bundle breakdown

Added
No assets were added

Removed
No assets were removed

Bigger
No assets were bigger

Smaller
No assets were smaller

Unchanged

Asset File Size % Changed
cli.js 7.91 MB 0%

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/actualbudget/actual/pull/7523 **Author:** [@matt-fidd](https://github.com/matt-fidd) **Created:** 4/15/2026 **Status:** ✅ Merged **Merged:** 4/16/2026 **Merged by:** [@matt-fidd](https://github.com/matt-fidd) **Base:** `master` ← **Head:** `inconsistent-state` --- ### 📝 Commits (2) - [`a429d30`](https://github.com/actualbudget/actual/commit/a429d301daa876a24546ad8742d008dcc5711b6b) fix potentially inconsistent state updates - [`6dfa7d2`](https://github.com/actualbudget/actual/commit/6dfa7d2b09b8475c1b20480877a466173881037a) note ### 📊 Changes **2 files changed** (+45 additions, -36 deletions) <details> <summary>View changed files</summary> 📝 `packages/desktop-client/src/components/accounts/Account.tsx` (+39 -36) ➕ `upcoming-release-notes/7523.md` (+6 -0) </details> ### 📄 Description <!-- Thank you for submitting a pull request! Make sure to follow the instructions to write release notes for your PR — it should only take a minute or two: https://github.com/actualbudget/docs#writing-good-release-notes. Try running yarn generate:release-notes *before* pushing your PR for an interactive experience. --> ## Description <!-- What does this PR do? Why is it needed? Please give context on the "why?": why do we need this change? What problem is it solving for you?--> The below taken directly from the GitHub code quality page, all I've done is to check through and make the changes > Potentially inconsistent state update > React component state updates using setState may asynchronously update this.props and this.state, thus it is not safe to use either of the two when calculating the new state passed to setState. > > Recommendation > Use the callback-based variant of setState: instead of calculating the new state directly and passing it to setState, pass a callback function that calculates the new state when the update is about to be performed. > > Example > The following example uses setState to update the counter property of this.state, relying on the current (potentially stale) value of that property: > > JavaScript > > ``` > this.setState({ > counter: this.state.counter + 1 > }); > ``` > > Instead, the callback form of setState should be used: > > JavaScript > > ``` > this.setState(prevState => ({ > counter: prevState.counter + 1 > })); > ``` ## Related issue(s) <!-- e.g. Fixes #123, Relates to #456 --> ## Testing <!-- What did you test? How can we reproduce the issue you are fixing or how can we test the feature you built? --> ## Checklist - [x] Release notes added (see link above) - [x] No obvious regressions in affected areas - [x] Self-review has been performed - I understand what each change in the code does and why it is needed <!--- actual-bot-sections ---> <!--- bundlestats-action-comment key:combined start ---> ### Bundle Stats Bundle | Files count | Total bundle size | % Changed ------ | ----------- | ----------------- | --------- desktop-client | 34 | 12.92 MB → 12.92 MB (+69 B) | +0.00% loot-core | 1 | 4.85 MB | 0% api | 1 | 3.88 MB | 0% cli | 1 | 7.91 MB | 0% <details> <summary>View detailed bundle stats</summary> #### desktop-client **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 34 | 12.92 MB → 12.92 MB (+69 B) | +0.00% <details> <summary>Changeset</summary> File | Δ | Size ---- | - | ---- `src/components/accounts/Account.tsx` | 📈 +69 B (+0.15%) | 43.9 kB → 43.97 kB </details> <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** Asset | File Size | % Changed ----- | --------- | --------- static/js/index.js | 1.85 MB → 1.85 MB (+69 B) | +0.00% **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- static/js/BackgroundImage.js | 121.09 kB | 0% static/js/FormulaEditor.js | 814.39 kB | 0% static/js/PayeeRuleCountLabel.js | 52.12 kB | 0% static/js/ReportRouter.js | 1.18 MB | 0% static/js/ScheduleEditForm.js | 136.13 kB | 0% static/js/TransactionEdit.js | 185.13 kB | 0% static/js/TransactionList.js | 82.8 kB | 0% static/js/Value.js | 4.34 MB | 0% static/js/ca.js | 191.72 kB | 0% static/js/chart-theme.js | 705.55 kB | 0% static/js/client.js | 450.92 kB | 0% static/js/da.js | 104.4 kB | 0% static/js/de.js | 174.12 kB | 0% static/js/en-GB.js | 8.2 kB | 0% static/js/en.js | 176.5 kB | 0% static/js/es.js | 181.54 kB | 0% static/js/extends.js | 486.5 kB | 0% static/js/fr.js | 176.79 kB | 0% static/js/indexeddb-main-thread-worker-e59fee74.js | 13.46 kB | 0% static/js/it.js | 165.68 kB | 0% static/js/narrow.js | 363.68 kB | 0% static/js/nb-NO.js | 151.58 kB | 0% static/js/nl.js | 108.66 kB | 0% static/js/pl.js | 88.34 kB | 0% static/js/pt-BR.js | 177.18 kB | 0% static/js/resize-observer.js | 18.06 kB | 0% static/js/th.js | 178.91 kB | 0% static/js/theme.js | 30.79 kB | 0% static/js/uk.js | 212.28 kB | 0% static/js/useFormatList.js | 9.86 kB | 0% static/js/wide.js | 292 B | 0% static/js/workbox-window.prod.es5.js | 7.33 kB | 0% static/js/zh-Hans.js | 110.19 kB | 0% </div> </details> --- #### loot-core **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 4.85 MB | 0% <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- kcab.worker.Dtv5lNQw.js | 4.85 MB | 0% </div> </details> --- #### api **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 3.88 MB | 0% <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- index.js | 3.88 MB | 0% </div> </details> --- #### cli **Total** Files count | Total bundle size | % Changed ----------- | ----------------- | --------- 1 | 7.91 MB | 0% <details> <summary>View detailed bundle breakdown</summary> <div> **Added** No assets were added **Removed** No assets were removed **Bigger** No assets were bigger **Smaller** No assets were smaller **Unchanged** Asset | File Size | % Changed ----- | --------- | --------- cli.js | 7.91 MB | 0% </div> </details> </details> <!--- bundlestats-action-comment key:combined end ---> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
GiteaMirror added the pull-request label 2026-04-18 09:04:18 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/actual#33152