import { nls } from '@theia/core/lib/common/nls'; import React from '@theia/core/shared/react'; import Tippy from '@tippyjs/react'; import type { BoardList } from '../../../common/protocol/board-list'; import { boardIdentifierEquals, portIdentifierEquals, } from '../../../common/protocol/boards-service'; import { CertificateAddComponent } from './certificate-add-new'; import { CertificateListComponent } from './certificate-list'; import { BoardOptionValue, SelectBoardComponent, } from './select-board-components'; export const CertificateUploaderComponent = ({ boardList, certificates, addCertificate, updatableFqbns, uploadCertificates, openContextMenu, }: { boardList: BoardList; certificates: string[]; addCertificate: (cert: string) => void; updatableFqbns: string[]; uploadCertificates: ( fqbn: string, address: string, urls: string[] ) => Promise; openContextMenu: (x: number, y: number, cert: string) => void; }): React.ReactElement => { const [installFeedback, setInstallFeedback] = React.useState< 'ok' | 'fail' | 'installing' | null >(null); const [showAdd, setShowAdd] = React.useState(false); const [selectedCerts, setSelectedCerts] = React.useState([]); const [selectedItem, setSelectedItem] = React.useState(null); const installCertificates = async () => { if (!selectedItem) { return; } const board = selectedItem.board; if (!board.fqbn) { return; } setInstallFeedback('installing'); try { await uploadCertificates( board.fqbn, selectedItem.port.address, selectedCerts ); setInstallFeedback('ok'); } catch { setInstallFeedback('fail'); } }; const onItemSelect = React.useCallback( (item: BoardOptionValue | null) => { if (!item) { setSelectedItem(null); return; } const board = item.board; const port = item.port; const selectedBoard = selectedItem?.board; const selectedPort = selectedItem?.port; if ( !boardIdentifierEquals(board, selectedBoard) || !portIdentifierEquals(port, selectedPort) ) { setInstallFeedback(null); setSelectedItem(item); } }, [selectedItem] ); return ( <>
{nls.localize( 'arduino/certificate/selectCertificateToUpload', '1. Select certificate to upload' )} { addCertificate(cert); setShowAdd(false); }} /> } placement="bottom-end" onClickOutside={() => setShowAdd(false)} visible={showAdd} interactive={true} >
{nls.localize( 'arduino/certificate/selectDestinationBoardToUpload', '2. Select destination board and upload certificate' )}
{installFeedback === 'installing' && (
{nls.localize( 'arduino/certificate/uploadingCertificates', 'Uploading certificates.' )}
)} {installFeedback === 'ok' && (
{nls.localize( 'arduino/certificate/certificatesUploaded', 'Certificates uploaded.' )}
)} {installFeedback === 'fail' && (
{nls.localize( 'arduino/certificate/uploadFailed', 'Upload failed. Please try again.' )}
)}
); };