fix: improve bank sync UX with accurate queue counts#6474
fix: improve bank sync UX with accurate queue counts#6474robertlestak wants to merge 40 commits intoactualbudget:masterfrom
Conversation
- Fix notification banner to show accurate account counts during sync - For individual accounts: displays total queued requests (1, 2, 3...) - For 'Sync All': displays total accounts being synced Fixes sync queue notification counts that were always showing '1 account remaining' and improves overall bank sync UX consistency.
✅ Deploy Preview for actualbudget-website ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
✅ Deploy Preview for actualbudget ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Bundle Statsdesktop-clientTotal
Changeset
View detailed bundle breakdownAdded
Removed
Bigger
Smaller Unchanged
loot-coreTotal
View detailed bundle breakdownAdded Removed Bigger Smaller Unchanged
apiTotal
View detailed bundle breakdownAdded Removed Bigger Smaller Unchanged
|
📝 WalkthroughWalkthroughAdds a queue-based account synchronization system with Changes
Sequence DiagramsequenceDiagram
participant UI as Desktop/Mobile UI
participant Redux as accountsSlice (state)
participant Processor as processQueue (thunk)
participant Worker as processSingleSync (thunk)
participant SyncSvc as Sync Service/API
UI->>Redux: dispatch syncAccounts({}) or syncAccounts({ids})
Redux->>Redux: addToSyncQueue(enqueue request(s))
Redux->>Processor: trigger processQueue (if not processing)
activate Processor
Processor->>Redux: setProcessingQueue(true)
loop per queued request
Processor->>Worker: dispatch processSingleSync(request)
activate Worker
alt SimpleFin batch
Worker->>SyncSvc: simplefin-batch-sync
SyncSvc-->>Worker: batch results
else Special-ID handling
Worker->>SyncSvc: sync special account(s)
SyncSvc-->>Worker: results
else Per-account flow
Worker->>SyncSvc: sync single account
SyncSvc-->>Worker: results
end
Worker->>Redux: update newTransactions/matchedTransactions/updatedAccounts
Worker->>Redux: removeFromSyncQueue(request.id)
Worker-->>Processor: success or failure
deactivate Worker
end
Processor->>Redux: clearSyncQueue()
Processor->>Redux: setProcessingQueue(false)
deactivate Processor
Redux->>UI: updated state (accountsSyncing, syncQueue, isProcessingQueue)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (8)
packages/desktop-client/src/components/banksync/index.tsx (3)
14-23: Import order does not follow coding guidelines.Per the coding guidelines, the import order should be: React → external packages → loot-core → parent/sibling/index imports → @desktop-client imports. The relative imports (
AccountsHeader,AccountsList) should come before the@desktop-clientimports.Suggested import reorder
import { AccountsHeader } from './AccountsHeader'; import { AccountsList } from './AccountsList'; -import { syncAccounts } from '@desktop-client/accounts/accountsSlice'; -import { MOBILE_NAV_HEIGHT } from '@desktop-client/components/mobile/MobileNavTabs'; -import { Page } from '@desktop-client/components/Page'; -import { useAccounts } from '@desktop-client/hooks/useAccounts'; -import { useGlobalPref } from '@desktop-client/hooks/useGlobalPref'; -import { pushModal } from '@desktop-client/modals/modalsSlice'; -import { useDispatch, useSelector } from '@desktop-client/redux'; + +import { syncAccounts } from '@desktop-client/accounts/accountsSlice'; +import { MOBILE_NAV_HEIGHT } from '@desktop-client/components/mobile/MobileNavTabs'; +import { Page } from '@desktop-client/components/Page'; +import { useAccounts } from '@desktop-client/hooks/useAccounts'; +import { useGlobalPref } from '@desktop-client/hooks/useGlobalPref'; +import { pushModal } from '@desktop-client/modals/modalsSlice'; +import { useDispatch, useSelector } from '@desktop-client/redux';
156-171: Use theme variables instead of hardcoded CSS custom properties.Per coding guidelines: "Never import colors directly - use theme instead." The hardcoded
var(--n1)andvar(--n6)should be replaced with theme tokens (e.g.,theme.pageText,theme.pageTextSubdued) for consistency with the mobile implementation and theming support.Proposed fix using theme
First, import theme at the top:
+import { theme } from '@actual-app/components/theme';Then update the Button styles:
<Button variant="bare" onPress={handleSyncAll} isDisabled={isProcessingQueue} style={{ - color: isProcessingQueue ? 'var(--n6)' : 'var(--n1)', + color: isProcessingQueue ? theme.pageTextSubdued : theme.pageText, textDecoration: 'underline', textDecorationColor: isProcessingQueue - ? 'var(--n6)' - : 'var(--n1)', + ? theme.pageTextSubdued + : theme.pageText, padding: 0, minHeight: 'auto', }} >And the Text color:
-<Text style={{ color: 'var(--n6)' }}> +<Text style={{ color: theme.pageTextSubdued }}>
172-182: Redundant condition check.The
linkedAccounts.length > 0condition on line 172 is redundant since the parentViewis already conditionally rendered only whenlinkedAccounts.length > 0(line 147).Proposed simplification
- {linkedAccounts.length > 0 && ( - <Text style={{ color: 'var(--n6)' }}> + <Text style={{ color: theme.pageTextSubdued }}> {isProcessingQueue ? t('Processing {{count}} linked accounts', { count: linkedAccounts.length, }) : t('{{count}} linked accounts', { count: linkedAccounts.length, })} - </Text> - )} + </Text>packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx (2)
15-23: Import order does not follow coding guidelines.Same issue as the desktop counterpart: relative imports should come before
@desktop-clientimports.Suggested import reorder
import { BankSyncAccountsList } from './BankSyncAccountsList'; -import { syncAccounts } from '@desktop-client/accounts/accountsSlice'; -import { Search } from '@desktop-client/components/common/Search'; + +import { syncAccounts } from '@desktop-client/accounts/accountsSlice'; +import { Search } from '@desktop-client/components/common/Search';
56-65: Consider extracting shared Sync All logic.The
linkedAccountsmemo andhandleSyncAllcallback are nearly identical between desktop (banksync/index.tsx) and mobile (MobileBankSyncPage.tsx). Consider extracting this into a shared custom hook (e.g.,useSyncAllAccounts) to reduce duplication and ensure consistent behavior.packages/desktop-client/src/accounts/accountsSlice.ts (3)
482-488: Replace console. with logger.*Per coding guidelines: "Never use 'console.*' - use logger instead (enforced by ESLint rule 'actual/prefer-logger-over-console')."
Proposed fix
Import the logger and replace console calls:
+import { logger } from 'loot-core/platform/client/logger'; - } catch (error) { - console.error(`Sync failed for ${request.id}:`, error); + } catch (error) { + logger.error(`Sync failed for ${request.id}:`, error);- } catch (error) { - console.error('Queue processing error:', error); + } catch (error) { + logger.error('Queue processing error:', error);
554-556: Replace console.log with logger.Per coding guidelines, use logger instead of console.*.
Proposed fix
- console.log('Using SimpleFin batch sync'); + logger.info('Using SimpleFin batch sync');
628-630: Replace console.error with logger.Proposed fix
- } catch (error) { - console.error('Sync error:', error); + } catch (error) { + logger.error('Sync error:', error);
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
packages/desktop-client/src/accounts/accountsSlice.tspackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: Use TypeScript for all code
Use descriptive variable names with auxiliary verbs (e.g., 'isLoaded', 'hasError')
Use named exports for components and utilities; avoid default exports except in specific cases
Use functional and declarative programming patterns - avoid classes
Use the 'function' keyword for pure functions
Structure files with: exported component/page, helpers, static content, types
Organize imports in the following order: React imports, built-in Node.js modules, external packages, Actual packages, parent imports, sibling imports, index imports, with newlines between groups
Never use 'console.*' - use logger instead (enforced by ESLint rule 'actual/prefer-logger-over-console')
Never import from 'uuid' without destructuring - use 'import { v4 as uuidv4 } from 'uuid''
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Prefer 'type' over 'interface' for defining types in TypeScript
Avoid 'enum' - use objects or maps instead
Avoid 'any' or 'unknown' unless absolutely necessary
Avoid type assertions ('as', '!') - prefer 'satisfies' for type narrowing
Use inline type imports: 'import { type MyType } from '...''
Look for existing type definitions in 'packages/loot-core/src/types/' before creating new types
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{tsx,jsx}: Create new components in their own files
Don't use 'React.FunctionComponent' or 'React.FC' - type props directly
Don't use 'React.*' patterns - use named imports instead
Use '' instead of '' tags in React components
Avoid unstable nested components
Use 'satisfies' for type narrowing in React components
Use declarative JSX that is minimal and readable; avoid unnecessary curly braces in conditionals
Prefer explicit expressions ('condition && ') in JSX
Never import colors directly - use theme instead
Use 'Trans' component instead of 't()' function when possible for internationalization
All user-facing strings must be translated using i18n
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
packages/desktop-client/src/**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
packages/desktop-client/src/**/*.{tsx,jsx}: Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧠 Learnings (28)
📓 Common learnings
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
📚 Learning: 2024-10-24T17:05:41.415Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2024-11-09T20:18:28.468Z
Learnt from: csenel
Repo: actualbudget/actual PR: 3810
File: packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx:150-161
Timestamp: 2024-11-09T20:18:28.468Z
Learning: In `packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx`, prefer to keep the implementation of checks consistent with similar patterns elsewhere in the codebase, even if alternative implementations are more concise.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-09-27T14:15:46.637Z
Learnt from: jfdoming
Repo: actualbudget/actual PR: 3402
File: packages/desktop-client/src/components/accounts/Account.tsx:8-8
Timestamp: 2024-09-27T14:15:46.637Z
Learning: In the `AllTransactions` component of `Account.tsx`, the `useLayoutEffect` hook is appropriately used to dispatch an action that closes splits for parent transactions when `prependTransactions` changes, ensuring this occurs synchronously before the component is painted.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-01-29T19:44:02.950Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 4253
File: packages/desktop-client/src/components/banksync/EditSyncAccount.tsx:154-160
Timestamp: 2025-01-29T19:44:02.950Z
Learning: In EditSyncAccount.tsx, mappings state is initialized with defaultMappings (containing both 'payment' and 'deposit' directions) if no saved mappings exist, so direction maps are guaranteed to exist.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2024-10-04T05:13:58.322Z
Learnt from: tlesicka
Repo: actualbudget/actual PR: 3554
File: packages/desktop-client/src/components/sidebar/Accounts.tsx:60-64
Timestamp: 2024-10-04T05:13:58.322Z
Learning: The `onReorder` function in `Accounts.tsx` was moved from `Sidebar.tsx`, and the `targetId` parameter remains typed as `unknown` intentionally.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsx
📚 Learning: 2024-11-04T00:34:13.035Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3581
File: packages/loot-core/src/client/actions/account.ts:180-194
Timestamp: 2024-11-04T00:34:13.035Z
Learning: In `packages/loot-core/src/client/actions/account.ts`, within the `syncAccounts` function, the batch sync request for SimpleFin accounts handles errors by returning error objects instead of throwing exceptions. Therefore, wrapping this block in a try-catch is unnecessary.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2025-11-04T00:47:00.968Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 6065
File: packages/desktop-client/src/components/transactions/TransactionList.tsx:197-205
Timestamp: 2025-11-04T00:47:00.968Z
Learning: In packages/desktop-client/src/components/transactions/TransactionList.tsx and similar schedule creation code, when using schedule/create with conditions and then updating the rule's actions, it's correct to filter rule.actions to keep only 'link-schedule' and append custom actions. Transactions created by schedules are defined by a mix of conditions (which create the base transaction with date, amount, payee, account) and actions (which apply additional modifications like category, notes, splits). The filtering pattern replaces any auto-generated actions with the desired custom actions.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2024-10-13T11:17:59.711Z
Learnt from: UnderKoen
Repo: actualbudget/actual PR: 3381
File: packages/desktop-client/src/components/budget/SidebarGroup.tsx:69-76
Timestamp: 2024-10-13T11:17:59.711Z
Learning: In the `SidebarGroup` component (`packages/desktop-client/src/components/budget/SidebarGroup.tsx`), context menu state management is handled in another file, ensuring that only one context menu is open at a time.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-10T02:29:05.655Z
Learnt from: tlesicka
Repo: actualbudget/actual PR: 3593
File: packages/desktop-client/src/components/sidebar/Sidebar.tsx:112-116
Timestamp: 2024-10-10T02:29:05.655Z
Learning: In `packages/desktop-client/src/components/sidebar/BudgetName.tsx`, the `BudgetName` component consists of three parts: `BudgetName`, `EditBudgetName`, and the Menu. Keeping `EditBudgetName` as a separate component helps maintain cleaner code by separating concerns.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-08T15:46:15.739Z
Learnt from: qedi-r
Repo: actualbudget/actual PR: 3527
File: packages/desktop-client/src/components/accounts/Header.jsx:0-0
Timestamp: 2024-10-08T15:46:15.739Z
Learning: In the Actual Budget project, importing `t` directly from 'i18next' is best avoided, and we should almost always prefer using the useTranslation hook if possible.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : Use 'Trans' component instead of 't()' function when possible for internationalization
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-02-11T18:44:28.613Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 0
File: :0-0
Timestamp: 2025-02-11T18:44:28.613Z
Learning: The Button2 component is deprecated. Use actual-app/components/button instead.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-01-17T12:11:23.669Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3840
File: packages/loot-core/src/server/budget/template-notes.ts:12-12
Timestamp: 2025-01-17T12:11:23.669Z
Learning: In server-side code or non-React contexts where React hooks cannot be used, prefer using `import { t } from 'i18next'` and directly using `t(string)` for translations, instead of using react-i18next hooks or other approaches.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-10-22T16:22:17.482Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5978
File: packages/desktop-client/src/components/mobile/banksync/BankSyncAccountsListItem.tsx:58-67
Timestamp: 2025-10-22T16:22:17.482Z
Learning: In react-i18next, the Trans component supports interpolation using the syntax `<Trans>Text {{ variable: value }}</Trans>` where the double curly braces are special syntax recognized by react-i18next for variable substitution. This is valid and should not be flagged as incorrect.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-22T05:34:56.976Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/mobile/accounts/AccountTransactions.tsx:261-277
Timestamp: 2024-10-22T05:34:56.976Z
Learning: In React components (TypeScript), avoid using hooks like `useCallback` inside callbacks or nested functions. Hooks must be called at the top level of functional components.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : All user-facing strings must be translated using i18n
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-06-21T04:04:01.231Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5206
File: packages/desktop-client/src/components/Titlebar.tsx:63-63
Timestamp: 2025-06-21T04:04:01.231Z
Learning: In react-i18next Trans components, double curly braces `{{ }}` are the correct syntax for interpolation placeholders, not JSX object literals. For example: `<Trans count={value}>{{ value }} items</Trans>` is the proper way to interpolate values within translation strings.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-10-22T05:32:30.530Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/schedules/index.tsx:37-39
Timestamp: 2024-10-22T05:32:30.530Z
Learning: In our React function components, we should include `dispatch` in the dependency array of `useCallback` hooks to comply with ESLint rules, even though `dispatch` is a stable function.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-16T21:27:47.818Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 6428
File: eslint.config.mjs:249-278
Timestamp: 2025-12-16T21:27:47.818Z
Learning: Enforce the specified import order for all TypeScript/JavaScript files under packages/desktop-client: React imports, then built-in Node.js modules, then external packages, then loot-core packages, then parent imports, then sibling imports, then index imports, and finally desktop-client imports (desktop-client imports come after relative imports, not before). Apply this rule to all relevant files in that directory (extensions: .ts, .tsx, .js, .mjs).
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/BankSyncStatus.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsxpackages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2024-11-04T14:14:10.698Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3581
File: packages/loot-core/src/types/models/bank-sync.d.ts:11-21
Timestamp: 2024-11-04T14:14:10.698Z
Learning: In `packages/loot-core/src/types/models/bank-sync.d.ts`, when defining TypeScript types for data received from the server, maintain the field names as they are in the server response, even if they don't follow TypeScript naming conventions.
Applied to files:
packages/desktop-client/src/components/BankSyncStatus.tsx
📚 Learning: 2025-10-24T21:29:26.090Z
Learnt from: csenel
Repo: actualbudget/actual PR: 5991
File: packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx:82-89
Timestamp: 2025-10-24T21:29:26.090Z
Learning: Notification messages in BudgetCell.tsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Applied to files:
packages/desktop-client/src/components/BankSyncStatus.tsx
📚 Learning: 2025-09-30T19:23:01.635Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5821
File: packages/desktop-client/src/components/accounts/BalanceHistoryGraph.tsx:76-91
Timestamp: 2025-09-30T19:23:01.635Z
Learning: In the Actual Budget codebase, `query.transactions(undefined)` correctly handles the "all accounts" view and is the proper way to query all transactions, as opposed to using `q('transactions')` with filters directly.
Applied to files:
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-10-21T02:24:38.823Z
Learnt from: jfdoming
Repo: actualbudget/actual PR: 3699
File: packages/loot-core/src/client/actions/app.ts:56-74
Timestamp: 2024-10-21T02:24:38.823Z
Learning: The team has decided to handle the `/accounts` route in the default case within the `getPageDocs` function in `packages/loot-core/src/client/actions/app.ts`, as discussed in a previous PR.
Applied to files:
packages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2024-10-09T20:17:46.493Z
Learnt from: UnderKoen
Repo: actualbudget/actual PR: 3619
File: packages/loot-core/src/server/accounts/transaction-rules.ts:551-0
Timestamp: 2024-10-09T20:17:46.493Z
Learning: When finalizing transactions that involve inserting or retrieving payees, avoid using `Promise.all` as it may result in duplicate payees due to concurrent operations. Sequential processing ensures payees are correctly handled without duplication.
Applied to files:
packages/desktop-client/src/accounts/accountsSlice.ts
📚 Learning: 2025-12-19T20:22:15.654Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 6450
File: packages/crdt/src/crdt/merkle.ts:10-10
Timestamp: 2025-12-19T20:22:15.654Z
Learning: In TypeScript reviews, differentiate between type-only imports and runtime identifiers. If an import is only used in type annotations, type positions (parameters, return types, type aliases) should verify it's truly type-only and not causing runtime imports. Do not conflate a type name (e.g., Timestamp) with a nearby lowercased variable (e.g., timestamp) that is used at runtime. This distinction should be checked across .ts files (e.g., packages/**/src/**/*.ts) to ensure type-only imports do not introduce runtime dependencies or ambiguity.
Applied to files:
packages/desktop-client/src/accounts/accountsSlice.ts
🧬 Code graph analysis (3)
packages/desktop-client/src/components/banksync/index.tsx (2)
packages/desktop-client/src/redux/index.ts (1)
useSelector(19-19)packages/desktop-client/src/accounts/accountsSlice.ts (1)
syncAccounts(413-438)
packages/desktop-client/src/components/BankSyncStatus.tsx (1)
packages/desktop-client/src/redux/index.ts (1)
useSelector(19-19)
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx (4)
packages/desktop-client/src/redux/index.ts (1)
useSelector(19-19)packages/desktop-client/src/accounts/accountsSlice.ts (1)
syncAccounts(413-438)packages/component-library/src/View.tsx (1)
View(14-33)packages/component-library/src/Text.tsx (1)
Text(19-28)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (23)
- GitHub Check: Redirect rules - actualbudget-website
- GitHub Check: Header rules - actualbudget-website
- GitHub Check: Pages changed - actualbudget-website
- GitHub Check: api
- GitHub Check: web
- GitHub Check: build (windows-latest)
- GitHub Check: build (macos-latest)
- GitHub Check: build (ubuntu-22.04)
- GitHub Check: Analyze
- GitHub Check: compare
- GitHub Check: Functional (shard 1/5)
- GitHub Check: test
- GitHub Check: validate-cli
- GitHub Check: Visual regression (shard 2/5)
- GitHub Check: Functional (shard 4/5)
- GitHub Check: Functional (shard 3/5)
- GitHub Check: Visual regression (shard 5/5)
- GitHub Check: Functional Desktop App
- GitHub Check: Visual regression (shard 4/5)
- GitHub Check: Functional (shard 2/5)
- GitHub Check: Functional (shard 5/5)
- GitHub Check: Visual regression (shard 3/5)
- GitHub Check: Visual regression (shard 1/5)
🔇 Additional comments (5)
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx (1)
170-213: LGTM!The mobile Sync All button implementation correctly uses theme tokens and follows i18n patterns with the
t()function for translations.packages/desktop-client/src/components/BankSyncStatus.tsx (1)
18-26: LGTM on the queue count logic.The logic correctly distinguishes between "Sync All" (uses
accountsSyncing.lengthfor actual accounts being processed) and individual account syncs (usessyncQueue.lengthfor queued requests). This addresses the PR objective of preventing double-counting.packages/desktop-client/src/accounts/accountsSlice.ts (3)
440-496: Queue processing logic looks solid.The implementation correctly:
- Uses atomic check-and-set via Redux state to prevent concurrent processing
- Processes items sequentially in FIFO order
- Removes items from queue after processing (success or failure)
- Always resets
isProcessingQueuein thefinallyblockOne minor observation: if sync requests are added faster than they're processed, the queue will grow, but this is acceptable given the sequential processing requirement for bank syncs.
116-137: LGTM on queue management reducers.The reducers correctly handle:
- Duplicate prevention in
addToSyncQueue- Proper filtering in
removeFromSyncQueue- Clean state reset in
clearSyncQueue
561-591: LGTM on progressive SimpleFin batch processing.The implementation correctly updates
accountsSyncingprogressively as each SimpleFin account completes, which addresses the PR objective of avoiding abrupt count disappearance during "Sync All" operations.
|
🤖 Auto-generated Release Notes Hey @robertlestak! I've automatically created a release notes file based on CodeRabbit's analysis: Category: Enhancements If you're happy with this release note, you can add it to your pull request. If not, you'll need to add your own before a maintainer can review your change. |
- Fix import order to follow project guidelines (React → external → loot-core → relative → @desktop-client) - Replace hardcoded CSS variables with theme tokens for consistency - Remove redundant condition check in desktop sync status display - Keep console.* calls as ESLint rule only applies to server-side code
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
- packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: Use TypeScript for all code
Use descriptive variable names with auxiliary verbs (e.g., 'isLoaded', 'hasError')
Use named exports for components and utilities; avoid default exports except in specific cases
Use functional and declarative programming patterns - avoid classes
Use the 'function' keyword for pure functions
Structure files with: exported component/page, helpers, static content, types
Organize imports in the following order: React imports, built-in Node.js modules, external packages, Actual packages, parent imports, sibling imports, index imports, with newlines between groups
Never use 'console.*' - use logger instead (enforced by ESLint rule 'actual/prefer-logger-over-console')
Never import from 'uuid' without destructuring - use 'import { v4 as uuidv4 } from 'uuid''
Files:
packages/desktop-client/src/components/banksync/index.tsx
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Prefer 'type' over 'interface' for defining types in TypeScript
Avoid 'enum' - use objects or maps instead
Avoid 'any' or 'unknown' unless absolutely necessary
Avoid type assertions ('as', '!') - prefer 'satisfies' for type narrowing
Use inline type imports: 'import { type MyType } from '...''
Look for existing type definitions in 'packages/loot-core/src/types/' before creating new types
Files:
packages/desktop-client/src/components/banksync/index.tsx
**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{tsx,jsx}: Create new components in their own files
Don't use 'React.FunctionComponent' or 'React.FC' - type props directly
Don't use 'React.*' patterns - use named imports instead
Use '' instead of '' tags in React components
Avoid unstable nested components
Use 'satisfies' for type narrowing in React components
Use declarative JSX that is minimal and readable; avoid unnecessary curly braces in conditionals
Prefer explicit expressions ('condition && ') in JSX
Never import colors directly - use theme instead
Use 'Trans' component instead of 't()' function when possible for internationalization
All user-facing strings must be translated using i18n
Files:
packages/desktop-client/src/components/banksync/index.tsx
packages/desktop-client/src/**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
packages/desktop-client/src/**/*.{tsx,jsx}: Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Files:
packages/desktop-client/src/components/banksync/index.tsx
🧠 Learnings (19)
📓 Common learnings
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
Learnt from: csenel
Repo: actualbudget/actual PR: 5991
File: packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx:82-89
Timestamp: 2025-10-24T21:29:26.090Z
Learning: Notification messages in BudgetCell.tsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Learnt from: misu-dev
Repo: actualbudget/actual PR: 5167
File: packages/desktop-client/src/components/spreadsheet/useFormat.ts:64-72
Timestamp: 2025-06-16T17:45:40.807Z
Learning: The user misu-dev prefers strict type checking for financial format types in useFormat.ts as a long-term goal, but acknowledges that creating follow-up issues for cleanup should wait until after the current PR is merged, not during the development phase.
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3581
File: packages/loot-core/src/client/actions/account.ts:180-194
Timestamp: 2024-11-04T00:34:13.035Z
Learning: In `packages/loot-core/src/client/actions/account.ts`, within the `syncAccounts` function, the batch sync request for SimpleFin accounts handles errors by returning error objects instead of throwing exceptions. Therefore, wrapping this block in a try-catch is unnecessary.
📚 Learning: 2024-10-24T17:05:41.415Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-09-27T14:15:46.637Z
Learnt from: jfdoming
Repo: actualbudget/actual PR: 3402
File: packages/desktop-client/src/components/accounts/Account.tsx:8-8
Timestamp: 2024-09-27T14:15:46.637Z
Learning: In the `AllTransactions` component of `Account.tsx`, the `useLayoutEffect` hook is appropriately used to dispatch an action that closes splits for parent transactions when `prependTransactions` changes, ensuring this occurs synchronously before the component is painted.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-11-09T20:18:28.468Z
Learnt from: csenel
Repo: actualbudget/actual PR: 3810
File: packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx:150-161
Timestamp: 2024-11-09T20:18:28.468Z
Learning: In `packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx`, prefer to keep the implementation of checks consistent with similar patterns elsewhere in the codebase, even if alternative implementations are more concise.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-11-04T00:34:13.035Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3581
File: packages/loot-core/src/client/actions/account.ts:180-194
Timestamp: 2024-11-04T00:34:13.035Z
Learning: In `packages/loot-core/src/client/actions/account.ts`, within the `syncAccounts` function, the batch sync request for SimpleFin accounts handles errors by returning error objects instead of throwing exceptions. Therefore, wrapping this block in a try-catch is unnecessary.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-11-04T00:47:00.968Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 6065
File: packages/desktop-client/src/components/transactions/TransactionList.tsx:197-205
Timestamp: 2025-11-04T00:47:00.968Z
Learning: In packages/desktop-client/src/components/transactions/TransactionList.tsx and similar schedule creation code, when using schedule/create with conditions and then updating the rule's actions, it's correct to filter rule.actions to keep only 'link-schedule' and append custom actions. Transactions created by schedules are defined by a mix of conditions (which create the base transaction with date, amount, payee, account) and actions (which apply additional modifications like category, notes, splits). The filtering pattern replaces any auto-generated actions with the desired custom actions.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-01-29T19:44:02.950Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 4253
File: packages/desktop-client/src/components/banksync/EditSyncAccount.tsx:154-160
Timestamp: 2025-01-29T19:44:02.950Z
Learning: In EditSyncAccount.tsx, mappings state is initialized with defaultMappings (containing both 'payment' and 'deposit' directions) if no saved mappings exist, so direction maps are guaranteed to exist.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-08T15:46:15.739Z
Learnt from: qedi-r
Repo: actualbudget/actual PR: 3527
File: packages/desktop-client/src/components/accounts/Header.jsx:0-0
Timestamp: 2024-10-08T15:46:15.739Z
Learning: In the Actual Budget project, importing `t` directly from 'i18next' is best avoided, and we should almost always prefer using the useTranslation hook if possible.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : Use 'Trans' component instead of 't()' function when possible for internationalization
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-01-17T12:11:23.669Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3840
File: packages/loot-core/src/server/budget/template-notes.ts:12-12
Timestamp: 2025-01-17T12:11:23.669Z
Learning: In server-side code or non-React contexts where React hooks cannot be used, prefer using `import { t } from 'i18next'` and directly using `t(string)` for translations, instead of using react-i18next hooks or other approaches.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-02-11T18:44:28.613Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 0
File: :0-0
Timestamp: 2025-02-11T18:44:28.613Z
Learning: The Button2 component is deprecated. Use actual-app/components/button instead.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : All user-facing strings must be translated using i18n
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-10-22T16:22:17.482Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5978
File: packages/desktop-client/src/components/mobile/banksync/BankSyncAccountsListItem.tsx:58-67
Timestamp: 2025-10-22T16:22:17.482Z
Learning: In react-i18next, the Trans component supports interpolation using the syntax `<Trans>Text {{ variable: value }}</Trans>` where the double curly braces are special syntax recognized by react-i18next for variable substitution. This is valid and should not be flagged as incorrect.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-22T05:32:30.530Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/schedules/index.tsx:37-39
Timestamp: 2024-10-22T05:32:30.530Z
Learning: In our React function components, we should include `dispatch` in the dependency array of `useCallback` hooks to comply with ESLint rules, even though `dispatch` is a stable function.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-22T05:34:56.976Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/mobile/accounts/AccountTransactions.tsx:261-277
Timestamp: 2024-10-22T05:34:56.976Z
Learning: In React components (TypeScript), avoid using hooks like `useCallback` inside callbacks or nested functions. Hooks must be called at the top level of functional components.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-04T05:13:58.322Z
Learnt from: tlesicka
Repo: actualbudget/actual PR: 3554
File: packages/desktop-client/src/components/sidebar/Accounts.tsx:60-64
Timestamp: 2024-10-04T05:13:58.322Z
Learning: The `onReorder` function in `Accounts.tsx` was moved from `Sidebar.tsx`, and the `targetId` parameter remains typed as `unknown` intentionally.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-12-16T21:27:47.818Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 6428
File: eslint.config.mjs:249-278
Timestamp: 2025-12-16T21:27:47.818Z
Learning: Enforce the specified import order for all TypeScript/JavaScript files under packages/desktop-client: React imports, then built-in Node.js modules, then external packages, then loot-core packages, then parent imports, then sibling imports, then index imports, and finally desktop-client imports (desktop-client imports come after relative imports, not before). Apply this rule to all relevant files in that directory (extensions: .ts, .tsx, .js, .mjs).
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (19)
- GitHub Check: build (ubuntu-22.04)
- GitHub Check: build (macos-latest)
- GitHub Check: build (windows-latest)
- GitHub Check: Visual regression (shard 5/5)
- GitHub Check: Visual regression (shard 2/5)
- GitHub Check: Visual regression (shard 4/5)
- GitHub Check: Functional (shard 4/5)
- GitHub Check: Functional (shard 3/5)
- GitHub Check: Functional (shard 5/5)
- GitHub Check: Functional (shard 2/5)
- GitHub Check: Visual regression (shard 3/5)
- GitHub Check: Functional Desktop App
- GitHub Check: Functional (shard 1/5)
- GitHub Check: Visual regression (shard 1/5)
- GitHub Check: web
- GitHub Check: test
- GitHub Check: Analyze
- GitHub Check: validate-cli
- GitHub Check: compare
- Convert status text strings to use Trans component with interpolation
- Follow project guidelines to prefer Trans over t() function when possible
- Use correct react-i18next syntax: <Trans count={value}>Text {{ count: value }}</Trans>
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (1)
packages/desktop-client/src/components/banksync/index.tsx (1)
51-67: LGTM!State selection and the
handleSyncAllcallback are correctly implemented. The pattern mirrors the mobile implementation appropriately.Consider extracting the shared
linkedAccountscomputation andhandleSyncAllcallback into a reusable hook (e.g.,useSyncAll) since both this file andMobileBankSyncPage.tsximplement identical logic. This would improve maintainability and ensure consistent behavior across desktop and mobile.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,js,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx,js,jsx}: Use TypeScript for all code
Use descriptive variable names with auxiliary verbs (e.g., 'isLoaded', 'hasError')
Use named exports for components and utilities; avoid default exports except in specific cases
Use functional and declarative programming patterns - avoid classes
Use the 'function' keyword for pure functions
Structure files with: exported component/page, helpers, static content, types
Organize imports in the following order: React imports, built-in Node.js modules, external packages, Actual packages, parent imports, sibling imports, index imports, with newlines between groups
Never use 'console.*' - use logger instead (enforced by ESLint rule 'actual/prefer-logger-over-console')
Never import from 'uuid' without destructuring - use 'import { v4 as uuidv4 } from 'uuid''
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
**/*.{ts,tsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{ts,tsx}: Prefer 'type' over 'interface' for defining types in TypeScript
Avoid 'enum' - use objects or maps instead
Avoid 'any' or 'unknown' unless absolutely necessary
Avoid type assertions ('as', '!') - prefer 'satisfies' for type narrowing
Use inline type imports: 'import { type MyType } from '...''
Look for existing type definitions in 'packages/loot-core/src/types/' before creating new types
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.{tsx,jsx}: Create new components in their own files
Don't use 'React.FunctionComponent' or 'React.FC' - type props directly
Don't use 'React.*' patterns - use named imports instead
Use '' instead of '' tags in React components
Avoid unstable nested components
Use 'satisfies' for type narrowing in React components
Use declarative JSX that is minimal and readable; avoid unnecessary curly braces in conditionals
Prefer explicit expressions ('condition && ') in JSX
Never import colors directly - use theme instead
Use 'Trans' component instead of 't()' function when possible for internationalization
All user-facing strings must be translated using i18n
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
packages/desktop-client/src/**/*.{tsx,jsx}
📄 CodeRabbit inference engine (AGENTS.md)
packages/desktop-client/src/**/*.{tsx,jsx}: Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧠 Learnings (24)
📓 Common learnings
Learnt from: csenel
Repo: actualbudget/actual PR: 5991
File: packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx:82-89
Timestamp: 2025-10-24T21:29:26.090Z
Learning: Notification messages in BudgetCell.tsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 4181
File: packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx:252-254
Timestamp: 2025-01-18T20:08:55.203Z
Learning: Notification messages in BudgetTable.jsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Learnt from: misu-dev
Repo: actualbudget/actual PR: 5167
File: packages/desktop-client/src/components/spreadsheet/useFormat.ts:64-72
Timestamp: 2025-06-16T17:45:40.807Z
Learning: The user misu-dev prefers strict type checking for financial format types in useFormat.ts as a long-term goal, but acknowledges that creating follow-up issues for cleanup should wait until after the current PR is merged, not during the development phase.
📚 Learning: 2024-10-24T17:05:41.415Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/accounts/Account.tsx:655-665
Timestamp: 2024-10-24T17:05:41.415Z
Learning: The Account component in 'packages/desktop-client/src/components/accounts/Account.tsx' is being rewritten in a separate PR.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-09-27T14:15:46.637Z
Learnt from: jfdoming
Repo: actualbudget/actual PR: 3402
File: packages/desktop-client/src/components/accounts/Account.tsx:8-8
Timestamp: 2024-09-27T14:15:46.637Z
Learning: In the `AllTransactions` component of `Account.tsx`, the `useLayoutEffect` hook is appropriately used to dispatch an action that closes splits for parent transactions when `prependTransactions` changes, ensuring this occurs synchronously before the component is painted.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-11-09T20:18:28.468Z
Learnt from: csenel
Repo: actualbudget/actual PR: 3810
File: packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx:150-161
Timestamp: 2024-11-09T20:18:28.468Z
Learning: In `packages/desktop-client/src/components/transactions/SelectedTransactionsButton.tsx`, prefer to keep the implementation of checks consistent with similar patterns elsewhere in the codebase, even if alternative implementations are more concise.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-11-04T00:47:00.968Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 6065
File: packages/desktop-client/src/components/transactions/TransactionList.tsx:197-205
Timestamp: 2025-11-04T00:47:00.968Z
Learning: In packages/desktop-client/src/components/transactions/TransactionList.tsx and similar schedule creation code, when using schedule/create with conditions and then updating the rule's actions, it's correct to filter rule.actions to keep only 'link-schedule' and append custom actions. Transactions created by schedules are defined by a mix of conditions (which create the base transaction with date, amount, payee, account) and actions (which apply additional modifications like category, notes, splits). The filtering pattern replaces any auto-generated actions with the desired custom actions.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-11-04T00:34:13.035Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3581
File: packages/loot-core/src/client/actions/account.ts:180-194
Timestamp: 2024-11-04T00:34:13.035Z
Learning: In `packages/loot-core/src/client/actions/account.ts`, within the `syncAccounts` function, the batch sync request for SimpleFin accounts handles errors by returning error objects instead of throwing exceptions. Therefore, wrapping this block in a try-catch is unnecessary.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : All user-facing strings must be translated using i18n
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to **/*.{tsx,jsx} : Use 'Trans' component instead of 't()' function when possible for internationalization
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-10-24T21:29:26.090Z
Learnt from: csenel
Repo: actualbudget/actual PR: 5991
File: packages/desktop-client/src/components/mobile/budget/BudgetCell.tsx:82-89
Timestamp: 2025-10-24T21:29:26.090Z
Learning: Notification messages in BudgetCell.tsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-01-18T20:08:55.203Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 4181
File: packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx:252-254
Timestamp: 2025-01-18T20:08:55.203Z
Learning: Notification messages in BudgetTable.jsx will be translated in a separate PR to handle all translations together, as there are multiple messages to go through.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-11-22T17:03:41.876Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 6158
File: packages/desktop-client/src/hooks/useScheduleEdit.ts:163-172
Timestamp: 2025-11-22T17:03:41.876Z
Learning: In packages/desktop-client/src/hooks/useScheduleEdit.ts around lines 163-172, the 'set-transactions' case uses a single-argument sort comparator (`transactions.sort(a => { return action.transactionId === a.id ? -1 : 1; })`), which is not symmetric and can produce unstable ordering. The correct approach is to use a two-argument comparator that returns -1/0/1 based on whether a or b matches action.transactionId. MatissJanis prefers to fix this in a future PR when this code is modified again.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-08T15:46:15.739Z
Learnt from: qedi-r
Repo: actualbudget/actual PR: 3527
File: packages/desktop-client/src/components/accounts/Header.jsx:0-0
Timestamp: 2024-10-08T15:46:15.739Z
Learning: In the Actual Budget project, importing `t` directly from 'i18next' is best avoided, and we should almost always prefer using the useTranslation hook if possible.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-01-17T12:11:23.669Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 3840
File: packages/loot-core/src/server/budget/template-notes.ts:12-12
Timestamp: 2025-01-17T12:11:23.669Z
Learning: In server-side code or non-React contexts where React hooks cannot be used, prefer using `import { t } from 'i18next'` and directly using `t(string)` for translations, instead of using react-i18next hooks or other approaches.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-02-11T18:44:28.613Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 0
File: :0-0
Timestamp: 2025-02-11T18:44:28.613Z
Learning: The Button2 component is deprecated. Use actual-app/components/button instead.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use custom hooks from 'src/hooks' instead of react-router directly (e.g., 'useNavigate()' from 'src/hooks')
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-10-22T16:22:17.482Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5978
File: packages/desktop-client/src/components/mobile/banksync/BankSyncAccountsListItem.tsx:58-67
Timestamp: 2025-10-22T16:22:17.482Z
Learning: In react-i18next, the Trans component supports interpolation using the syntax `<Trans>Text {{ variable: value }}</Trans>` where the double curly braces are special syntax recognized by react-i18next for variable substitution. This is valid and should not be flagged as incorrect.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-04T19:58:16.062Z
Learnt from: CR
Repo: actualbudget/actual PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-04T19:58:16.062Z
Learning: Applies to packages/desktop-client/src/**/*.{tsx,jsx} : Use 'useDispatch()', 'useSelector()', 'useStore()' from 'src/redux' instead of react-redux
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-22T05:32:30.530Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/schedules/index.tsx:37-39
Timestamp: 2024-10-22T05:32:30.530Z
Learning: In our React function components, we should include `dispatch` in the dependency array of `useCallback` hooks to comply with ESLint rules, even though `dispatch` is a stable function.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2024-10-22T05:34:56.976Z
Learnt from: joel-jeremy
Repo: actualbudget/actual PR: 3685
File: packages/desktop-client/src/components/mobile/accounts/AccountTransactions.tsx:261-277
Timestamp: 2024-10-22T05:34:56.976Z
Learning: In React components (TypeScript), avoid using hooks like `useCallback` inside callbacks or nested functions. Hooks must be called at the top level of functional components.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2024-10-04T05:13:58.322Z
Learnt from: tlesicka
Repo: actualbudget/actual PR: 3554
File: packages/desktop-client/src/components/sidebar/Accounts.tsx:60-64
Timestamp: 2024-10-04T05:13:58.322Z
Learning: The `onReorder` function in `Accounts.tsx` was moved from `Sidebar.tsx`, and the `targetId` parameter remains typed as `unknown` intentionally.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsx
📚 Learning: 2025-01-29T19:44:02.950Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 4253
File: packages/desktop-client/src/components/banksync/EditSyncAccount.tsx:154-160
Timestamp: 2025-01-29T19:44:02.950Z
Learning: In EditSyncAccount.tsx, mappings state is initialized with defaultMappings (containing both 'payment' and 'deposit' directions) if no saved mappings exist, so direction maps are guaranteed to exist.
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-12-16T21:27:47.818Z
Learnt from: MatissJanis
Repo: actualbudget/actual PR: 6428
File: eslint.config.mjs:249-278
Timestamp: 2025-12-16T21:27:47.818Z
Learning: Enforce the specified import order for all TypeScript/JavaScript files under packages/desktop-client: React imports, then built-in Node.js modules, then external packages, then loot-core packages, then parent imports, then sibling imports, then index imports, and finally desktop-client imports (desktop-client imports come after relative imports, not before). Apply this rule to all relevant files in that directory (extensions: .ts, .tsx, .js, .mjs).
Applied to files:
packages/desktop-client/src/components/banksync/index.tsxpackages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-06-21T04:04:01.231Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5206
File: packages/desktop-client/src/components/Titlebar.tsx:63-63
Timestamp: 2025-06-21T04:04:01.231Z
Learning: In react-i18next Trans components, double curly braces `{{ }}` are the correct syntax for interpolation placeholders, not JSX object literals. For example: `<Trans count={value}>{{ value }} items</Trans>` is the proper way to interpolate values within translation strings.
Applied to files:
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
📚 Learning: 2025-09-30T19:23:01.635Z
Learnt from: matt-fidd
Repo: actualbudget/actual PR: 5821
File: packages/desktop-client/src/components/accounts/BalanceHistoryGraph.tsx:76-91
Timestamp: 2025-09-30T19:23:01.635Z
Learning: In the Actual Budget codebase, `query.transactions(undefined)` correctly handles the "all accounts" view and is the proper way to query all transactions, as opposed to using `q('transactions')` with filters directly.
Applied to files:
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx
🧬 Code graph analysis (2)
packages/desktop-client/src/components/banksync/index.tsx (3)
packages/desktop-client/src/redux/index.ts (1)
useSelector(19-19)packages/loot-core/src/types/models/account.ts (1)
AccountEntity(1-9)packages/desktop-client/src/accounts/accountsSlice.ts (1)
syncAccounts(413-438)
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx (2)
packages/desktop-client/src/redux/index.ts (1)
useSelector(19-19)packages/desktop-client/src/accounts/accountsSlice.ts (1)
syncAccounts(413-438)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (19)
- GitHub Check: build (ubuntu-22.04)
- GitHub Check: build (windows-latest)
- GitHub Check: build (macos-latest)
- GitHub Check: Analyze
- GitHub Check: Functional (shard 4/5)
- GitHub Check: Functional (shard 3/5)
- GitHub Check: Functional (shard 5/5)
- GitHub Check: web
- GitHub Check: Visual regression (shard 1/5)
- GitHub Check: Functional (shard 1/5)
- GitHub Check: Visual regression (shard 5/5)
- GitHub Check: Functional (shard 2/5)
- GitHub Check: Visual regression (shard 4/5)
- GitHub Check: Visual regression (shard 2/5)
- GitHub Check: Visual regression (shard 3/5)
- GitHub Check: Functional Desktop App
- GitHub Check: validate-cli
- GitHub Check: test
- GitHub Check: compare
🔇 Additional comments (6)
packages/desktop-client/src/components/mobile/banksync/MobileBankSyncPage.tsx (4)
4-23: Import ordering follows guidelines correctly.The imports are properly organized: React imports first (lines 1-2), then external packages from
@actual-app(lines 4-8), thenloot-coretypes (lines 10-13), then sibling imports (line 15), and finally@desktop-clientimports (lines 17-23). This aligns with the coding guidelines.
48-49: LGTM!Correctly uses the typed
useSelectorfrom@desktop-client/reduxas per coding guidelines, and properly destructures the queue state.
56-65: LGTM!The
linkedAccountsmemo correctly filters for syncable accounts, andhandleSyncAllproperly dispatchessyncAccounts({})to trigger the ALL_ACCOUNTS queue flow. UsinglinkedAccounts.lengthin the dependency array is an appropriate optimization since only the count matters for the conditional.
170-221: LGTM!The Sync All UI block is well-implemented:
- Conditional rendering based on
linkedAccounts.length > 0- Button correctly disabled during queue processing
Transcomponent withcountprop follows react-i18next pluralization patterns- Status text appropriately differentiates between ALL_ACCOUNTS sync and individual account syncs
The
{{ count: linkedAccounts.length }}syntax is valid react-i18next interpolation. Based on learnings, this double curly brace syntax is recognized by react-i18next for variable substitution.packages/desktop-client/src/components/banksync/index.tsx (2)
4-24: LGTM!Imports are correctly organized following the coding guidelines: React imports, external packages, loot-core types, sibling imports, and finally @desktop-client imports. The use of
useDispatchanduseSelectorfrom@desktop-client/reduxis correct per guidelines.
146-194: LGTM - Pluralization approach updated correctly.The status text now uses the
Transcomponent with thecountprop, which is the correct approach for pluralization in react-i18next. This addresses the previous review feedback about improper pluralization witht().The
<Trans count={linkedAccounts.length}>{{ count: linkedAccounts.length }} linked accounts</Trans>syntax properly enables i18n pluralization when the translation files define_oneand_othervariants.
- Add release notes file for PR #6474 - Categorize as Enhancement with user-facing description - Follow project release notes format and guidelines
- Create reusable useSyncAll hook to share logic between desktop and mobile - Extract linkedAccounts computation and handleSyncAll callback - Improve maintainability and ensure consistent behavior across platforms - Address CodeRabbit nitpick comment about code duplication
- Change 'Processing X account' to 'Processing X accounts' for proper i18n pluralization - Trans component with count prop automatically handles singular/plural forms - Ensures consistent text display regardless of sync queue size
…actual into feature/sync-queue
- Replace hardcoded 'Syncing... X account(s) remaining' with Trans component - Import Trans from react-i18next for proper i18n support - Use count prop for automatic pluralization handling - Removes manual pluralization logic in favor of i18n system
fixed in latest commit, thanks for reviewing! |
|
Great! The last issue I reported was addressed. Thank you so much for being so patient with me. Unfortunately I found one more bug.
|
Fixed a bug where accounts would show as pending (yellow dot) even after sync completed. This occurred when triggering multiple sync operations (e.g., sync on-budget accounts, then sync all accounts while first sync is still running). Root causes: 1. processQueue only processed an initial snapshot of the queue, leaving items added during processing orphaned 2. addToSyncQueue didn't check if accounts were currently syncing, allowing already-synced accounts to be re-added to the queue Fixes: 1. Changed processQueue to use a while loop that continues until the queue is completely empty, ensuring all accounts are processed 2. Enhanced addToSyncQueue to check both the queue AND currently syncing accounts before adding, preventing duplicates This ensures the pending status indicator (yellow dot) accurately reflects the actual sync state of all accounts.
| // An account is pending if it's in the sync queue or currently syncing | ||
| const pendingAccountIds = new Set([ | ||
| ...syncingAccountIds, | ||
| ...syncQueue.map(req => req.id), | ||
| ]); |
There was a problem hiding this comment.
💬 suggestion: this seems to be duplicated in many places. Can we not rely on only syncQueue? And then remove an item from the queue after the sync for it is finished.
That should help us reduce the duplication.
There was a problem hiding this comment.
I see you introduced a utility that is shared among all the places, but the suggestion was to exclusively rely on syncQueue to get the pending account ids. Thus removing the need to use new Set() and the utility that was introduced.
This commit addresses all feedback from the latest code review: 1. SimpleFin batch sync: Implemented proper batching of SimpleFin accounts in the queue processor to avoid rate limits. SimpleFin accounts are now detected and batched together, calling simplefin-batch-sync API instead of syncing individually. 2. Safer loop pattern: Changed while(true) to while(queue.length > 0) for explicit exit condition, making the code less prone to infinite loops. 3. Removed unused code: Deleted the clearSyncQueue reducer that was never called or exported. 4. Reduced duplication: Created getPendingAccountIds selector to eliminate duplicated logic across Accounts.tsx, AccountsPage.tsx, and Account.tsx. 5. Fixed yellow dot bug: Restructured sync state management to set accountsSyncing before async operations and use try/finally blocks to ensure proper cleanup, preventing accounts from showing as pending after sync completes.
- Remove getPendingAccountIds utility function as requested by maintainer - Update all UI components to use only syncQueue for pending status - Convert to Set where .has() method is used - Fix while loop condition to use currentQueue.length for safer iteration Addresses maintainer feedback to exclusively rely on syncQueue for determining pending account IDs, simplifying the codebase and eliminating potential race conditions.
|
👋 did you mean to close the PR? |
Summary
This PR fixes UX issues with the bank sync queue system, specifically addressing inaccurate notification counts when syncing multiple accounts.
Changes Made
1. Fixed Notification Banner Count Logic
Technical Details
Testing
Screenshots/Demo
The notification banner now correctly shows:
Fixes the issue where counts were always showing "1 account remaining" regardless of actual queue size.
Note: This PR was created with AI assistance and should be labeled accordingly.
Summary by CodeRabbit
New Features
Improvements
Bug Fixes
✏️ Tip: You can customize this high-level summary in your review settings.
Bundle Stats
View detailed bundle stats
desktop-client
Total
Changeset
src/accounts/accountsSlice.tssrc/components/mobile/accounts/AccountPage.tsxsrc/components/mobile/accounts/AccountsPage.tsxsrc/components/accounts/Account.tsxsrc/components/transactions/SelectedTransactionsButton.tsxsrc/components/BankSyncStatus.tsxsrc/components/sidebar/Accounts.tsxView detailed bundle breakdown
Added
No assets were added
Removed
No assets were removed
Bigger
Smaller
No assets were smaller
Unchanged
loot-core
Total
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
api
Total
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