Skip to content

Commit 2476eac

Browse files
committed
disabled close modal while fwuploader operations are in progress
1 parent 99eaecc commit 2476eac

File tree

4 files changed

+73
-10
lines changed

4 files changed

+73
-10
lines changed

Diff for: arduino-ide-extension/src/browser/dialogs/certificate-uploader/certificate-uploader-dialog.tsx

+31-5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export class UploadCertificateDialogWidget extends ReactWidget {
3939
protected updatableFqbns: string[] = [];
4040
protected availableBoards: AvailableBoard[] = [];
4141

42+
public busyCallback = (busy: boolean) => {
43+
return;
44+
};
45+
4246
constructor() {
4347
super();
4448
}
@@ -97,11 +101,14 @@ export class UploadCertificateDialogWidget extends ReactWidget {
97101
address: string,
98102
urls: string[]
99103
): Promise<any> {
100-
return this.commandRegistry.executeCommand('arduino-certificate-upload', {
101-
fqbn,
102-
address,
103-
urls,
104-
});
104+
this.busyCallback(true);
105+
return this.commandRegistry
106+
.executeCommand('arduino-certificate-upload', {
107+
fqbn,
108+
address,
109+
urls,
110+
})
111+
.finally(() => this.busyCallback(false));
105112
}
106113

107114
protected render(): React.ReactNode {
@@ -126,6 +133,8 @@ export class UploadCertificateDialog extends AbstractDialog<void> {
126133
@inject(UploadCertificateDialogWidget)
127134
protected readonly widget: UploadCertificateDialogWidget;
128135

136+
private busy = false;
137+
129138
constructor(
130139
@inject(UploadCertificateDialogProps)
131140
protected readonly props: UploadCertificateDialogProps
@@ -144,6 +153,7 @@ export class UploadCertificateDialog extends AbstractDialog<void> {
144153
Widget.detach(this.widget);
145154
}
146155
Widget.attach(this.widget, this.contentNode);
156+
this.widget.busyCallback = this.busyCallback.bind(this);
147157
super.onAfterAttach(msg);
148158
this.update();
149159
}
@@ -161,4 +171,20 @@ export class UploadCertificateDialog extends AbstractDialog<void> {
161171
protected handleEnter(event: KeyboardEvent): boolean | void {
162172
return false;
163173
}
174+
175+
close(): void {
176+
if (this.busy) {
177+
return;
178+
}
179+
super.close();
180+
}
181+
182+
busyCallback(busy: boolean): void {
183+
this.busy = busy;
184+
if (busy) {
185+
this.closeCrossNode.classList.add('disabled');
186+
} else {
187+
this.closeCrossNode.classList.remove('disabled');
188+
}
189+
}
164190
}

Diff for: arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-component.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ export const FirmwareUploaderComponent = ({
1313
availableBoards,
1414
firmwareUploader,
1515
updatableFqbns,
16+
flashFirmware,
1617
}: {
1718
availableBoards: AvailableBoard[];
1819
firmwareUploader: ArduinoFirmwareUploader;
1920
updatableFqbns: string[];
21+
flashFirmware: (firmware: FirmwareInfo, port: string) => Promise<any>;
2022
}): React.ReactElement => {
2123
// boolean states for buttons
2224
const [firmwaresFetching, setFirmwaresFetching] = React.useState(false);
@@ -73,10 +75,7 @@ export const FirmwareUploaderComponent = ({
7375
const installStatus =
7476
!!firmwareToFlash &&
7577
!!selectedBoard?.port &&
76-
(await firmwareUploader.flash(
77-
firmwareToFlash,
78-
selectedBoard?.port.address
79-
));
78+
(await flashFirmware(firmwareToFlash, selectedBoard?.port.address));
8079

8180
setInstallFeedback((installStatus && 'ok') || 'fail');
8281
} catch {

Diff for: arduino-ide-extension/src/browser/dialogs/firmware-uploader/firmware-uploader-dialog.tsx

+35-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import {
88
AvailableBoard,
99
BoardsServiceProvider,
1010
} from '../../boards/boards-service-provider';
11-
import { ArduinoFirmwareUploader } from '../../../common/protocol/arduino-firmware-uploader';
11+
import {
12+
ArduinoFirmwareUploader,
13+
FirmwareInfo,
14+
} from '../../../common/protocol/arduino-firmware-uploader';
1215
import { FirmwareUploaderComponent } from './firmware-uploader-component';
1316
import { UploadFirmware } from '../../contributions/upload-firmware';
1417

@@ -23,6 +26,10 @@ export class UploadFirmwareDialogWidget extends ReactWidget {
2326
protected updatableFqbns: string[] = [];
2427
protected availableBoards: AvailableBoard[] = [];
2528

29+
public busyCallback = (busy: boolean) => {
30+
return;
31+
};
32+
2633
constructor() {
2734
super();
2835
}
@@ -40,12 +47,20 @@ export class UploadFirmwareDialogWidget extends ReactWidget {
4047
});
4148
}
4249

50+
protected flashFirmware(firmware: FirmwareInfo, port: string): Promise<any> {
51+
this.busyCallback(true);
52+
return this.arduinoFirmwareUploader
53+
.flash(firmware, port)
54+
.finally(() => this.busyCallback(false));
55+
}
56+
4357
protected render(): React.ReactNode {
4458
return (
4559
<form>
4660
<FirmwareUploaderComponent
4761
availableBoards={this.availableBoards}
4862
firmwareUploader={this.arduinoFirmwareUploader}
63+
flashFirmware={this.flashFirmware.bind(this)}
4964
updatableFqbns={this.updatableFqbns}
5065
/>
5166
</form>
@@ -61,6 +76,8 @@ export class UploadFirmwareDialog extends AbstractDialog<void> {
6176
@inject(UploadFirmwareDialogWidget)
6277
protected readonly widget: UploadFirmwareDialogWidget;
6378

79+
private busy = false;
80+
6481
constructor(
6582
@inject(UploadFirmwareDialogProps)
6683
protected readonly props: UploadFirmwareDialogProps
@@ -79,6 +96,7 @@ export class UploadFirmwareDialog extends AbstractDialog<void> {
7996
Widget.detach(this.widget);
8097
}
8198
Widget.attach(this.widget, this.contentNode);
99+
this.widget.busyCallback = this.busyCallback.bind(this);
82100
super.onAfterAttach(msg);
83101
this.update();
84102
}
@@ -96,4 +114,20 @@ export class UploadFirmwareDialog extends AbstractDialog<void> {
96114
protected handleEnter(event: KeyboardEvent): boolean | void {
97115
return false;
98116
}
117+
118+
close(): void {
119+
if (this.busy) {
120+
return;
121+
}
122+
super.close();
123+
}
124+
125+
busyCallback(busy: boolean): void {
126+
this.busy = busy;
127+
if (busy) {
128+
this.closeCrossNode.classList.add('disabled');
129+
} else {
130+
this.closeCrossNode.classList.remove('disabled');
131+
}
132+
}
99133
}

Diff for: arduino-ide-extension/src/browser/style/dialogs.css

+4
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,8 @@
5050
.status-icon {
5151
margin-right: 6px;
5252
font-size: 17px;
53+
}
54+
55+
.fa.disabled {
56+
opacity: .4;
5357
}

0 commit comments

Comments
 (0)