import React, { Ref, useRef } from 'react'; import { Modal, ModalOverlay, ModalContent, ModalBody, useBoolean, Center, Spinner, FormControl, FormLabel, Switch, Heading, Text, } from '@chakra-ui/react'; import { Formik, FormikProps } from 'formik'; import { useTranslation } from 'react-i18next'; import { v4 as uuid } from 'uuid'; import ConfirmIgnoreCommand from '../ConfirmIgnoreCommand'; import FirmwareList from './FirmwareList'; import { CloseButton } from 'components/Buttons/CloseButton'; import { ModalHeader } from 'components/Containers/Modal/ModalHeader'; import { SignatureField } from 'components/Form/Fields/SignatureField'; import { useGetDevice } from 'hooks/Network/Devices'; import { useGetAvailableFirmware, useUpdateDeviceFirmware } from 'hooks/Network/Firmware'; import useCommandModal from 'hooks/useCommandModal'; import { ModalProps } from 'models/Modal'; export type FirmwareUpgradeModalProps = { modalProps: ModalProps; serialNumber: string; }; export const FirmwareUpgradeModal = ({ modalProps: { isOpen, onClose }, serialNumber }: FirmwareUpgradeModalProps) => { const { t } = useTranslation(); const [showDevFirmware, { toggle: toggleDev }] = useBoolean(); const [formKey, setFormKey] = React.useState(uuid()); const ref = useRef< | FormikProps<{ signature?: string | undefined; }> | undefined >(); const [isRedirector, { toggle }] = useBoolean(false); const { data: device, isFetching: isFetchingDevice } = useGetDevice({ serialNumber, onClose }); const { data: firmware, isFetching: isFetchingFirmware } = useGetAvailableFirmware({ deviceType: device?.compatible ?? '', }); const { mutateAsync: upgrade, isLoading: isUpgrading } = useUpdateDeviceFirmware({ serialNumber, onClose, }); const { isConfirmOpen, closeConfirm, closeModal, closeCancelAndForm } = useCommandModal({ isLoading: isUpgrading, onModalClose: onClose, }); const submit = (uri: string) => { upgrade({ keepRedirector: isRedirector, uri, signature: device?.restrictedDevice && !device?.restrictionDetails?.developer ? ref.current?.values?.signature : undefined, }); }; React.useEffect(() => { setFormKey(uuid()); }, [isOpen]); return ( {t('controller.firmware.show_dev_releases')} } /> {isUpgrading || isFetchingDevice || isFetchingFirmware ? (
) : ( <> {t('devices.current_firmware')}: {device?.firmware} {t('commands.keep_redirector')} {device?.restrictedDevice && !device?.restrictionDetails?.developer && ( innerRef={ref as Ref> | undefined} key={formKey} enableReinitialize initialValues={{ signature: undefined, }} onSubmit={() => {}} > )} {firmware?.firmwares && ( showDevFirmware || !firmw.revision.includes('devel'))} upgrade={submit} isLoading={isUpgrading} /> )} )}
{}, onClose: closeConfirm }} confirm={closeCancelAndForm} cancel={closeConfirm} />
); };