diff --git a/CHANGELOG.md b/CHANGELOG.md index edcb7bba..5a2a5ef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Changed - (**Migration**) Show "abort" button during active bulk migration search +- (**Migration**) Keep the migration page open when aborting during the actual migration execution ### Fixed diff --git a/src/features/migration/Migration.constants.ts b/src/features/migration/Migration.constants.ts index 83bb28ea..89657532 100644 --- a/src/features/migration/Migration.constants.ts +++ b/src/features/migration/Migration.constants.ts @@ -44,6 +44,7 @@ export const DEFAULT_MIGRATION_STATE: MigrationState = { startedAt: null, lastUpdatedAt: null, groupExpandState: {}, + isAborted: false, }; export const ENTRY_STATUS_TRANSLATION: Record = { diff --git a/src/features/migration/Migration.types.ts b/src/features/migration/Migration.types.ts index 266a749b..714d49ba 100644 --- a/src/features/migration/Migration.types.ts +++ b/src/features/migration/Migration.types.ts @@ -128,6 +128,7 @@ export interface MigrationState { startedAt: number | null; lastUpdatedAt: number | null; groupExpandState: Partial>; + isAborted: boolean; } export interface SourceItem extends SourceIdInfo, SourceNameInfo, SourceLanguageInfo, SourceIconInfo, SourceMetaInfo {} diff --git a/src/features/migration/MigrationManager.ts b/src/features/migration/MigrationManager.ts index cbeb3f84..2085f78e 100644 --- a/src/features/migration/MigrationManager.ts +++ b/src/features/migration/MigrationManager.ts @@ -209,8 +209,9 @@ export class MigrationManager { ); case MigrationPhase.MIGRATING: return ( + MigrationManager.getState().isAborted || MigrationManager.getState().migrationProgress.completed === - MigrationManager.getState().migrationProgress.total + MigrationManager.getState().migrationProgress.total ); default: return false; @@ -470,13 +471,27 @@ export class MigrationManager { } } - static async abort(reason: unknown = 'abort'): Promise { + static async stop(reason: unknown = 'stopped'): Promise { if (!(await MigrationManager.confirmAbort())) { return false; } MigrationManager.abortAndResetAbortController(reason); + MigrationManager.updateState((draft) => { + draft.isAborted = true; + }); + + return true; + } + + static async abort(reason: unknown = 'abort'): Promise { + if (!MigrationManager.getState().isAborted && !(await MigrationManager.confirmAbort())) { + return false; + } + + MigrationManager.abortAndResetAbortController(reason); + MigrationManager.reset(); ReactRouter.navigate(AppRoutes.browse.path(BrowseTab.MIGRATE)); diff --git a/src/features/migration/screens/MigrationExecute.tsx b/src/features/migration/screens/MigrationExecute.tsx index 1ab18ab7..54aeadf8 100644 --- a/src/features/migration/screens/MigrationExecute.tsx +++ b/src/features/migration/screens/MigrationExecute.tsx @@ -23,9 +23,21 @@ export const MigrationExecute = () => { const entries = MigrationManager.useEntries(); const progress = MigrationManager.useMigrationProgress(); - useAppTitleAndAction(MigrationManager.isPhaseComplete() ? t`Migration complete` : t`Migrating`, undefined, [ - MigrationManager.isPhaseComplete(), - ]); + useAppTitleAndAction( + (() => { + if (MigrationManager.getState().isAborted) { + return t`Aborted`; + } + + if (MigrationManager.isPhaseComplete()) { + return t`Migration complete`; + } + + return t`Migrating`; + })(), + undefined, + [MigrationManager.isPhaseComplete()], + ); const entryList = useMemo(() => Object.values(entries), [entries]); const migratingEntries = useMemo( @@ -140,7 +152,7 @@ export const MigrationExecute = () => { - MigrationManager.isPhaseComplete() ? MigrationManager.reset() : MigrationManager.abort() + MigrationManager.isPhaseComplete() ? MigrationManager.reset() : MigrationManager.stop() } /> diff --git a/src/i18n/locales/en.po b/src/i18n/locales/en.po index e0ec3e81..430517f8 100644 --- a/src/i18n/locales/en.po +++ b/src/i18n/locales/en.po @@ -333,6 +333,10 @@ msgstr "Abort" msgid "Abort migration" msgstr "Abort migration" +#: src/features/migration/screens/MigrationExecute.tsx +msgid "Aborted" +msgstr "Aborted" + #: src/features/navigation-bar/NavigationBar.constants.ts #: src/features/settings/screens/About.tsx msgid "About"