// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { I18n, Logger } from '@aws-amplify/core'; import { Storage } from '@aws-amplify/storage'; import { useState } from 'react'; import Alert from 'react-bootstrap/Alert'; import Breadcrumb from 'react-bootstrap/Breadcrumb'; import Button from 'react-bootstrap/Button'; import Card from 'react-bootstrap/Card'; import Col from 'react-bootstrap/Col'; import Container from 'react-bootstrap/Container'; import Jumbotron from 'react-bootstrap/Jumbotron'; import Row from 'react-bootstrap/Row'; import Table from 'react-bootstrap/Table'; import { useNavigate } from 'react-router-dom'; import MessageModal from '../../components/MessageModal'; import EmptyCol from '../../components/EmptyCol'; import EmptyRow from '../../components/EmptyRow'; import { LoadingProgressBar } from '../../components/Loading'; import { requestApi } from '../../util/apis'; import { CreatedBy, GreengrassCoreDeviceControl, GreengrassCoreDevicePostResponse, ListGreengrassCoreDevicesItem, MessageModalType, OsPlatform, PaginationType } from '../../util/types'; import { getErrorMessage } from '../../util/utils'; import { GreengrassCoreDevicesHook } from '../../hooks/GreengrassCoreDeviceHook'; const logger = new Logger('GreengrassCoreDevicesDashboard'); /** * Renders the Greengrass core devices dashboard. * @returns The Greengrass core devices dashboard */ export default function GreengrassCoreDevicesDashboard(): JSX.Element { const navigate = useNavigate(); const [greengrassCoreDeviceCreatedBy, setGreengrassCoreDeviceCreatedBy] = useState(); const [greengrassCoreDeviceName, setGreengrassCoreDeviceName] = useState(); const [greengrassCoreOsPlatform, setGreengrassCoreOsPlatform] = useState(); const [loading, setLoading] = useState(false); const [message, setMessage] = useState(''); const [showDeregisterConfirmMessageModal, setShowDeregisterConfirmMessageModal] = useState(false); const [showMessageModal, setShowMessageModal] = useState(false); const { getGreengrassCoreDevices, greengrassCoreDevices, pageIndex, pageToken } = GreengrassCoreDevicesHook({ setLoading, setMessage, setShowMessageModal }); /** * Renders the empty Greengrass core device message. * @returns Empty Greengrass core device component */ function EmptyGreengrassCoreDevice(): JSX.Element { return (

{I18n.get('info.message.no.greengrass.core.device')}

); } /** * Renders Greengrass core device table row. * @param greengrassCoreDevice Greengrass core device * @returns Greengrass core device row */ function GreengrassCoreDevice(greengrassCoreDevice: ListGreengrassCoreDevicesItem): JSX.Element { const { name, createdBy, numberOfConnections, osPlatform } = greengrassCoreDevice; return ( {name} {createdBy} {numberOfConnections} {osPlatform} {createdBy === CreatedBy.SYSTEM && ( <> )} ); } /** * Handles to delete a Greengrass core device. * @param params The Greengrass core device name and created by */ function handleDeleteGreengrassCoreDevice(params: Omit): void { setGreengrassCoreDeviceCreatedBy(params.createdBy); setGreengrassCoreDeviceName(params.name); setGreengrassCoreOsPlatform(params.osPlatform); setShowDeregisterConfirmMessageModal(true); } /** * Downloads a Greengrass install script. * @param name The Greengrass core device name * @param osPlatform */ async function downloadInstallScript(name: string, osPlatform: string): Promise { try { const scriptName = osPlatform == OsPlatform.LINUX ? `${name}.sh` : `${name}.ps1`; const url = await Storage.get(scriptName, { expires: 10 }); window.open(url, '_blank'); setMessage({I18n.get('info.message.download.greengrass.core.device.install.script')}); } catch (error) { const errorMessage = getErrorMessage(error); logger.error(errorMessage); setMessage( {I18n.get('error.message.download.greengrass.core.device.install.script')}
{I18n.get('error')}: {JSON.stringify(errorMessage)}
); } setShowMessageModal(true); } /** * Deletes a Greengrass core device. */ async function deleteGreengrassCoreDevice(): Promise { setLoading(true); try { const response = (await requestApi({ method: 'post', path: '/greengrass', options: { body: { name: greengrassCoreDeviceName, control: GreengrassCoreDeviceControl.DELETE, createdBy: greengrassCoreDeviceCreatedBy, osPlatform: greengrassCoreOsPlatform } } })) as GreengrassCoreDevicePostResponse; setMessage({response.message}); getGreengrassCoreDevices(); } catch (error) { const errorMessage = getErrorMessage(error); logger.error(errorMessage); setMessage( {I18n.get('error.message.deregister.greengrass.core.device')}
{I18n.get('error')}: {JSON.stringify(errorMessage)}
); setLoading(false); } setGreengrassCoreDeviceCreatedBy(undefined); setGreengrassCoreDeviceName(undefined); setShowMessageModal(true); } return ( {I18n.get('manage.greengrass.core.devices')} {I18n.get('manage.greengrass.core.devices')} {!loading && greengrassCoreDevices.length === 0 && } {!loading && greengrassCoreDevices.length > 0 && ( <> {greengrassCoreDevices.map((greengrassCoreDevice: ListGreengrassCoreDevicesItem) => ( ))}
{I18n.get('name')} {I18n.get('created.by')} {I18n.get('number.of.connections')} {I18n.get('os.platform')} {I18n.get('action')}
)}
setShowDeregisterConfirmMessageModal(false)} message={I18n.get('warning.message.deregister.greengrass.core.device').replace('{}', greengrassCoreDeviceName)} modalType={MessageModalType.CONFIRM} confirmAction={() => deleteGreengrassCoreDevice()} /> setShowMessageModal(false)} message={message} modalType={MessageModalType.MESSAGE} />
); }