Source: app/config/migrationRouteRequirements.js

import RouteRequirement from '../util/route-requirements/RouteRequirement';
import Pages from '../data/enum/Pages';
import { MigrationState, MigrationErrorStateToString } from '../data/enum/MigrationState';
import { createPath } from '../util/routeUtils';

/**
 * Bare bones user created, let's see if the user passed the security question state
 *
 * @type {RouteRequirement}
 */
export const passSecurityAnswerNotSet = new RouteRequirement(
  'passSecurityAnswerNotSet',
  [],
  ({ getState }) => getState().migration?.migrationState === MigrationState.SECURITY_ANSWER_SET,
  ({}, { redirect }) => redirect(Pages.MIGRATION_LOADING),
);

/**
 * User confirmed & approved to get the legacy data
 *
 * @type {RouteRequirement}
 */
export const passLegacyUserLockAccepted = new RouteRequirement(
  'passLegacyUserLockAccepted',
  [],
  ({ getState }) =>
    [MigrationState.LOCKING_LEGACY_MEMBER, MigrationState.LOADING_LEGACY_DATA].includes(
      getState().migration?.migrationState,
    ),
  // LEGACY_DATA_LOADED => MIGRATION_DATA_CHECK
  ({}, { redirect }) => redirect(Pages.MIGRATION_DATA_CHECK),
);

/**
 * Legacy data loaded
 *
 * @type {RouteRequirement}
 */
export const passLegacyDataLoaded = new RouteRequirement(
  'passLegacyDataLoaded',
  [],
  ({ getState }) =>
    [
      MigrationState.LEGACY_DATA_LOADED,
      MigrationState.IMPORTING,
      MigrationState.COMPLETED,
    ].includes(getState().migration?.migrationState),
  // LOAD_LEGACY_DATA_FAILED => MIGRATION_ERROR
  ({ getState }, { redirect }) => {
    const migrationState = getState().migration?.migrationState;
    if (Object.keys(MigrationErrorStateToString).includes(migrationState)) {
      return redirect(createPath(Pages.MIGRATION_ERROR, { errorState: migrationState }));
    }

    return redirect(Pages.MIGRATION);
  },
);