diff --git a/src/renderer/components/commands-runner.tsx b/src/renderer/components/commands-runner.tsx index fe89978bc4..7e709ed7b6 100644 --- a/src/renderer/components/commands-runner.tsx +++ b/src/renderer/components/commands-runner.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { Button, ButtonProps, Spinner } from '@blueprintjs/core'; import { observer } from 'mobx-react'; -import { InstallState } from '../../interfaces'; +import { InstallState, VersionSource } from '../../interfaces'; import { AppState } from '../state'; interface RunnerProps { @@ -29,7 +29,7 @@ export const Runner = observer( isOnline, } = this.props.appState; - const state = currentElectronVersion?.state; + const { downloadProgress, source, state } = currentElectronVersion; const props: ButtonProps = { disabled: true }; if ([downloading, missing].includes(state) && !isOnline) { @@ -41,12 +41,7 @@ export const Runner = observer( switch (state) { case downloading: { props.text = 'Downloading'; - props.icon = ( - - ); + props.icon = ; break; } case installing: { @@ -72,6 +67,13 @@ export const Runner = observer( } break; } + case missing: { + if (source === VersionSource.local) { + props.text = 'Unavailable'; + props.icon = 'issue'; + break; + } + } default: { props.text = 'Checking status'; props.icon = ; diff --git a/src/renderer/components/version-select.tsx b/src/renderer/components/version-select.tsx index 752e3355db..12150386fb 100644 --- a/src/renderer/components/version-select.tsx +++ b/src/renderer/components/version-select.tsx @@ -66,8 +66,9 @@ const itemListRenderer: ItemListRenderer = ({ * @returns {string} */ export function getItemLabel({ source, state, name }: RunnableVersion): string { + // If a version is local, either it's there or it's not. if (source === VersionSource.local) { - return name || 'Local'; + return state === InstallState.missing ? 'Unavailable' : name || 'Local'; } const installStateLabels: Record = { @@ -87,7 +88,12 @@ export function getItemLabel({ source, state, name }: RunnableVersion): string { * @param {RunnableVersion} { state } * @returns {IconName} */ -export function getItemIcon({ state }: RunnableVersion): IconName { +export function getItemIcon({ source, state }: RunnableVersion): IconName { + // If a version is local, either it's there or it's not. + if (source === VersionSource.local) { + return state === InstallState.missing ? 'issue' : 'saved'; + } + const installStateIcons: Record = { missing: 'cloud', downloading: 'cloud-download', diff --git a/tests/renderer/components/version-select-spec.tsx b/tests/renderer/components/version-select-spec.tsx index 7741ea8b05..2795aa91c3 100644 --- a/tests/renderer/components/version-select-spec.tsx +++ b/tests/renderer/components/version-select-spec.tsx @@ -125,9 +125,10 @@ describe('VersionSelect component', () => { }); describe('getItemLabel()', () => { - it('returns the correct label for a local version', () => { + it('returns the correct label for an available local version', () => { const input: RunnableVersion = { ...mockVersion1, + state: installed, source: local, }; @@ -135,6 +136,16 @@ describe('VersionSelect component', () => { expect(getItemLabel({ ...input, name: 'Hi' })).toBe('Hi'); }); + it('returns the correct label for an unavailable local version', () => { + const input: RunnableVersion = { + ...mockVersion1, + state: missing, + source: local, + }; + + expect(getItemLabel(input)).toBe('Unavailable'); + }); + it('returns the correct label for a version not downloaded', () => { const input: RunnableVersion = { ...mockVersion1,