diff --git a/packages/desktop-client/src/components/Modals.tsx b/packages/desktop-client/src/components/Modals.tsx
index 59af5cd24a..f5e3dec940 100644
--- a/packages/desktop-client/src/components/Modals.tsx
+++ b/packages/desktop-client/src/components/Modals.tsx
@@ -51,6 +51,7 @@ import { ImportYNAB5Modal } from './modals/manager/ImportYNAB5Modal';
import { ManageRulesModal } from './modals/ManageRulesModal';
import { MergeUnusedPayeesModal } from './modals/MergeUnusedPayeesModal';
import { NotesModal } from './modals/NotesModal';
+import { OutOfSyncMigrationsModal } from './modals/OutOfSyncMigrationsModal';
import { PayeeAutocompleteModal } from './modals/PayeeAutocompleteModal';
import { ScheduledTransactionMenuModal } from './modals/ScheduledTransactionMenuModal';
import { SelectLinkedAccountsModal } from './modals/SelectLinkedAccountsModal';
@@ -591,15 +592,8 @@ export function Modals() {
return ;
case 'import-actual':
return ;
- case 'manager-load-backup':
- return (
-
- );
+ case 'out-of-sync-migrations':
+ return ;
default:
throw new Error('Unknown modal');
diff --git a/packages/desktop-client/src/components/modals/OutOfSyncMigrationsModal.tsx b/packages/desktop-client/src/components/modals/OutOfSyncMigrationsModal.tsx
new file mode 100644
index 0000000000..60bd9fc054
--- /dev/null
+++ b/packages/desktop-client/src/components/modals/OutOfSyncMigrationsModal.tsx
@@ -0,0 +1,91 @@
+import React from 'react';
+import { Trans, useTranslation } from 'react-i18next';
+import { useDispatch } from 'react-redux';
+
+import { closeBudget } from 'loot-core/client/actions';
+
+import { Button } from '../common/Button2';
+import { Link } from '../common/Link';
+import { Modal, ModalHeader, ModalTitle } from '../common/Modal';
+import { Paragraph } from '../common/Paragraph';
+import { Text } from '../common/Text';
+import { View } from '../common/View';
+
+export function OutOfSyncMigrationsModal() {
+ const dispatch = useDispatch();
+
+ const { t } = useTranslation();
+
+ const closeBudgetAndModal = (close: () => void) => {
+ dispatch(closeBudget());
+ close();
+ };
+
+ return (
+
+ {({ state: { close } }) => (
+ <>
+ }
+ />
+
+
+
+
+ It looks like you're using an outdated version of the
+ Actual client. Your budget data has been updated by another
+ client, but this client is still on the old verison. For the
+ best experience, please update Actual to the latest version.
+
+
+
+
+
+
+ If you can't update Actual at this time you can find the
+ latest release at{' '}
+
+ app.actualbudget.org
+
+ . You can use it until your client is updated.
+
+
+
+
+
+
+
+ >
+ )}
+
+ );
+}
diff --git a/packages/loot-core/src/client/actions/budgets.ts b/packages/loot-core/src/client/actions/budgets.ts
index 0fdcd5dafa..96dc92434a 100644
--- a/packages/loot-core/src/client/actions/budgets.ts
+++ b/packages/loot-core/src/client/actions/budgets.ts
@@ -57,7 +57,9 @@ export function loadBudget(id: string, options = {}) {
if (error) {
const message = getSyncError(error, id);
- if (error === 'out-of-sync-migrations' || error === 'out-of-sync-data') {
+ if (error === 'out-of-sync-migrations') {
+ dispatch(pushModal('out-of-sync-migrations'));
+ } else if (error === 'out-of-sync-data') {
// confirm is not available on iOS
if (typeof window.confirm !== 'undefined') {
const showBackups = window.confirm(
diff --git a/packages/loot-core/src/client/state-types/modals.d.ts b/packages/loot-core/src/client/state-types/modals.d.ts
index c7ccf14f23..3cdbd3819f 100644
--- a/packages/loot-core/src/client/state-types/modals.d.ts
+++ b/packages/loot-core/src/client/state-types/modals.d.ts
@@ -86,6 +86,8 @@ type FinanceModals = {
'import-actual': null;
+ 'out-of-sync-migrations': null;
+
'files-settings': null;
'confirm-change-document-dir': {
diff --git a/upcoming-release-notes/3600.md b/upcoming-release-notes/3600.md
new file mode 100644
index 0000000000..70cf5dbf62
--- /dev/null
+++ b/upcoming-release-notes/3600.md
@@ -0,0 +1,6 @@
+---
+category: Enhancements
+authors: [MikesGlitch]
+---
+
+Add a guidance modal for when migrations are out of sync