-
Notifications
You must be signed in to change notification settings - Fork 723
/
Copy pathcommands-runner.tsx
121 lines (111 loc) · 3.21 KB
/
commands-runner.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import * as React from 'react';
import {
Button,
ButtonGroup,
ButtonProps,
Menu,
MenuItem,
Spinner,
} from '@blueprintjs/core';
import { Popover2 } from '@blueprintjs/popover2';
import { observer } from 'mobx-react';
import { InstallState, VersionSource } from '../../interfaces';
import { AppState } from '../state';
interface RunnerProps {
appState: AppState;
}
/**
* The runner component is responsible for actually launching the fiddle
* with Electron. It also renders the button that does so.
*/
export const Runner = observer(
class Runner extends React.Component<RunnerProps> {
public render() {
const { downloaded, downloading, missing, installing, installed } =
InstallState;
const {
isRunning,
isInstallingModules,
currentElectronVersion,
isOnline,
} = this.props.appState;
const { downloadProgress, source, state } = currentElectronVersion;
const props: ButtonProps = { disabled: true };
if ([downloading, missing].includes(state) && !isOnline) {
props.text = 'Offline';
props.icon = 'satellite';
return <Button id="button-run" {...props} type={undefined} />;
}
switch (state) {
case downloading: {
props.text = 'Downloading';
props.icon = <Spinner size={16} value={downloadProgress} />;
break;
}
case installing: {
props.text = 'Unzipping';
props.icon = <Spinner size={16} />;
break;
}
case downloaded:
case installed: {
props.disabled = false;
if (isRunning) {
props.active = true;
props.text = 'Stop';
props.onClick = window.app.runner.stop;
props.icon = 'stop';
} else if (isInstallingModules) {
props.text = 'Installing modules';
props.icon = <Spinner size={16} />;
} else {
props.text = 'Run';
props.onClick = () => {
window.app.runner.run({ runFromAsar: false });
};
props.icon = 'play';
}
break;
}
case missing: {
if (source === VersionSource.local) {
props.text = 'Unavailable';
props.icon = 'issue';
break;
}
}
default: {
props.text = 'Checking status';
props.icon = <Spinner size={16} />;
}
}
const isAsarDisabled: boolean =
props.disabled || isRunning || isInstallingModules;
return (
<ButtonGroup>
<Button id="button-run" {...props} type={undefined} />
<AsarButton disabled={isAsarDisabled} />
</ButtonGroup>
);
}
},
);
const AsarButton = ({ disabled }: { disabled: boolean }): JSX.Element => {
const asarButton = (
<Menu>
<MenuItem
text="Run from ASAR"
icon="play"
active={!disabled}
onClick={() => {
window.app.runner.run({ runFromAsar: true });
}}
/>
</Menu>
);
return (
<Popover2 fill={true} content={asarButton} placement="bottom">
<Button icon="caret-down" style={{ minWidth: 20 }} disabled={disabled} />
</Popover2>
);
};