import { nls } from '@theia/core/lib/common'; import * as React from '@theia/core/shared/react'; import { Port } from '../../../common/protocol'; import { ArduinoFirmwareUploader, FirmwareInfo, } from '../../../common/protocol/arduino-firmware-uploader'; import { AvailableBoard } from '../../boards/boards-service-provider'; import { ArduinoSelect } from '../../widgets/arduino-select'; import { SelectBoardComponent } from '../certificate-uploader/select-board-components'; type FirmwareOption = { value: string; label: string }; export const FirmwareUploaderComponent = ({ availableBoards, firmwareUploader, updatableFqbns, flashFirmware, isOpen, }: { availableBoards: AvailableBoard[]; firmwareUploader: ArduinoFirmwareUploader; updatableFqbns: string[]; flashFirmware: (firmware: FirmwareInfo, port: Port) => Promise; isOpen: any; }): React.ReactElement => { // boolean states for buttons const [firmwaresFetching, setFirmwaresFetching] = React.useState(false); const [installFeedback, setInstallFeedback] = React.useState< 'ok' | 'fail' | 'installing' | null >(null); const [selectedBoard, setSelectedBoard] = React.useState(null); const [availableFirmwares, setAvailableFirmwares] = React.useState< FirmwareInfo[] >([]); React.useEffect(() => { setAvailableFirmwares([]); }, [isOpen]); const [selectedFirmware, setSelectedFirmware] = React.useState(null); const [firmwareOptions, setFirmwareOptions] = React.useState< FirmwareOption[] >([]); const fetchFirmwares = React.useCallback(async () => { setInstallFeedback(null); setFirmwaresFetching(true); if (!selectedBoard) { return; } // fetch the firmwares for the selected board const firmwaresForFqbn = await firmwareUploader.availableFirmwares( selectedBoard.fqbn || '' ); setAvailableFirmwares(firmwaresForFqbn); const firmwaresOpts = firmwaresForFqbn.map((f) => ({ label: f.firmware_version, value: f.firmware_version, })); setFirmwareOptions(firmwaresOpts); if (firmwaresForFqbn.length > 0) setSelectedFirmware(firmwaresOpts[0]); setFirmwaresFetching(false); }, [firmwareUploader, selectedBoard]); const installFirmware = React.useCallback(async () => { setInstallFeedback('installing'); const firmwareToFlash = availableFirmwares.find( (firmware) => firmware.firmware_version === selectedFirmware?.value ); try { const installStatus = !!firmwareToFlash && !!selectedBoard?.port && (await flashFirmware(firmwareToFlash, selectedBoard?.port)); setInstallFeedback((installStatus && 'ok') || 'fail'); } catch { setInstallFeedback('fail'); } }, [firmwareUploader, selectedBoard, selectedFirmware, availableFirmwares]); const onBoardSelect = React.useCallback( (board: AvailableBoard) => { const newFqbn = (board && board.fqbn) || null; const prevFqbn = (selectedBoard && selectedBoard.fqbn) || null; if (newFqbn !== prevFqbn) { setInstallFeedback(null); setAvailableFirmwares([]); setSelectedBoard(board); } }, [selectedBoard] ); return ( <>
{availableFirmwares.length > 0 && ( <>
{ if (value) { setInstallFeedback(null); setSelectedFirmware(value); } }} />
{installFeedback === null && (
{nls.localize( 'arduino/firmware/overwriteSketch', 'Installation will overwrite the Sketch on the board.' )}
)} {installFeedback === 'installing' && (
{nls.localize( 'arduino/firmware/installingFirmware', 'Installing firmware.' )}
)} {installFeedback === 'ok' && (
{nls.localize( 'arduino/firmware/successfullyInstalled', 'Firmware successfully installed.' )}
)} {installFeedback === 'fail' && (
{nls.localize( 'arduino/firmware/failedInstall', 'Installation failed. Please try again.' )}
)}
)} ); };