From da3305cb42e3ad558992da1bafb92414de41545b Mon Sep 17 00:00:00 2001 From: Opender Singh Date: Thu, 4 Mar 2021 07:43:17 +1300 Subject: [PATCH] Validate migration directories exist (#3137) --- .../app/ui/components/wrapper-migration.js | 40 ++++++++++++++++--- .../insomnia-app/app/ui/css/layout/base.less | 4 ++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/packages/insomnia-app/app/ui/components/wrapper-migration.js b/packages/insomnia-app/app/ui/components/wrapper-migration.js index 36edeca09b..af49529a8f 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-migration.js +++ b/packages/insomnia-app/app/ui/components/wrapper-migration.js @@ -11,6 +11,7 @@ import OnboardingContainer from './onboarding-container'; import { goToNextActivity } from '../redux/modules/global'; import HelpTooltip from './help-tooltip'; import { trackEvent } from '../../common/analytics'; +import fs from 'fs'; type Step = 'options' | 'migrating' | 'results'; @@ -18,22 +19,31 @@ type SettingProps = { label: string, name: $Keys, options: MigrationOptions, - help?: string, }; type TextSettingProps = SettingProps & { handleChange: (SyntheticEvent) => void, + errorMessage?: string, }; -const TextSetting = ({ handleChange, label, name, options }: TextSettingProps) => { +const TextSetting = ({ handleChange, label, name, options, errorMessage }: TextSettingProps) => { if (!options.hasOwnProperty(name)) { throw new Error(`Invalid text setting name ${name}`); } + const hasError = !!errorMessage; + return (
); @@ -41,6 +51,7 @@ const TextSetting = ({ handleChange, label, name, options }: TextSettingProps) = type BooleanSettingProps = SettingProps & { handleChange: (boolean, Object, string) => void, + help?: string, }; const BooleanSetting = ({ handleChange, label, name, options, help }: BooleanSettingProps) => { if (!options.hasOwnProperty(name)) { @@ -79,14 +90,29 @@ const Options = ({ start, cancel }: OptionsProps) => { })); const handleInputChange = React.useCallback((e: SyntheticEvent) => { - setOptions(prevOpts => ({ ...prevOpts, [e.currentTarget.name]: e.currentTarget.value })); + const { name, value } = e.currentTarget; + setOptions(prevOpts => ({ ...prevOpts, [name]: value })); }, []); const handleSwitchChange = React.useCallback((checked: boolean, event: Object, id: string) => { setOptions(prevOpts => ({ ...prevOpts, [id]: checked })); }, []); - const canStart = options.useDesignerSettings || options.copyWorkspaces || options.copyPlugins; + const { + coreDataDir, + designerDataDir, + useDesignerSettings, + copyWorkspaces, + copyPlugins, + } = options; + + const coreExists = React.useMemo(() => fs.existsSync(coreDataDir), [coreDataDir]); + + const designerExists = React.useMemo(() => fs.existsSync(designerDataDir), [designerDataDir]); + + const hasSomethingToMigrate = useDesignerSettings || copyWorkspaces || copyPlugins; + const dirsExist = coreExists && designerExists; + const canStart = hasSomethingToMigrate && dirsExist; return ( <> @@ -100,7 +126,7 @@ const Options = ({ start, cancel }: OptionsProps) => { options={options} handleChange={handleSwitchChange} help={ - 'This includes all resources linked to a workspace (eg. requests, proto files, environments, etc)' + 'This includes all resources linked to a workspace (eg. requests, proto files, api specs, environments, etc)' } /> { name="designerDataDir" options={options} handleChange={handleInputChange} + errorMessage={!designerExists && 'Directory does not exist'} /> diff --git a/packages/insomnia-app/app/ui/css/layout/base.less b/packages/insomnia-app/app/ui/css/layout/base.less index bc674dfcc7..713c1f73cf 100644 --- a/packages/insomnia-app/app/ui/css/layout/base.less +++ b/packages/insomnia-app/app/ui/css/layout/base.less @@ -609,6 +609,10 @@ i.fa.fa--fixed-width { margin-bottom: 0.3em; } +.space-top { + margin-top: 0.3em; +} + .space-right { margin-right: 0.3em; }