import DownloadIcon from '@mui/icons-material/GetApp'; import { Typography, Button, Box } from '@mui/material'; import { useRequest } from 'alova'; import { useState, type FC } from 'react'; import { toast } from 'react-toastify'; import RestartMonitor from './RestartMonitor'; import * as SystemApi from 'api/system'; import { SectionContent, SingleUpload } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; import * as EMSESP from 'project/api'; const UploadFileForm: FC = () => { const { LL } = useI18nContext(); const [restarting, setRestarting] = useState(); const [md5, setMd5] = useState(); const { send: getSettings, onSuccess: onSuccessGetSettings } = useRequest(EMSESP.getSettings(), { immediate: false }); const { send: getCustomizations, onSuccess: onSuccessgetCustomizations } = useRequest(EMSESP.getCustomizations(), { immediate: false }); const { send: getEntities, onSuccess: onSuccessGetEntities } = useRequest(EMSESP.getEntities(), { immediate: false }); const { send: getSchedule, onSuccess: onSuccessGetSchedule } = useRequest(EMSESP.getSchedule(), { immediate: false }); const { send: getSystemAPI, onSuccess: onSystemAPI } = useRequest((data) => EMSESP.APIcall('system', data), { immediate: false }); const { loading: isUploading, uploading: progress, send: sendUpload, onSuccess: onSuccessUpload, abort: cancelUpload } = useRequest(SystemApi.uploadFile, { immediate: false, force: true }); onSuccessUpload(({ data }: any) => { if (data) { setMd5(data.md5); toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL()); } else { setRestarting(true); } }); const startUpload = async (files: File[]) => { await sendUpload(files[0]).catch((err) => { if (err.message === 'The user aborted a request') { toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED()); } else if (err.message === 'Network Error') { toast.warning('Invalid file extension or incompatible bin file'); } else { toast.error(err.message); } }); }; const saveFile = (json: any, endpoint: string) => { const anchor = document.createElement('a'); anchor.href = URL.createObjectURL( new Blob([JSON.stringify(json, null, 2)], { type: 'text/plain' }) ); anchor.download = 'emsesp_' + endpoint; anchor.click(); URL.revokeObjectURL(anchor.href); toast.info(LL.DOWNLOAD_SUCCESSFUL()); }; onSuccessGetSettings((event) => { saveFile(event.data, 'settings.json'); }); onSuccessgetCustomizations((event) => { saveFile(event.data, 'customizations.json'); }); onSuccessGetEntities((event) => { saveFile(event.data, 'entities.json'); }); onSuccessGetSchedule((event) => { saveFile(event.data, 'schedule.json'); }); onSystemAPI((event) => { saveFile(event.data, event.sendArgs[0].entity + '.txt'); }); const downloadSettings = async () => { await getSettings().catch((error) => { toast.error(error.message); }); }; const downloadCustomizations = async () => { await getCustomizations().catch((error) => { toast.error(error.message); }); }; const downloadEntities = async () => { await getEntities().catch((error) => { toast.error(error.message); }); }; const downloadSchedule = async () => { await getSchedule() .catch((error) => { toast.error(error.message); }) .finally(() => { toast.info(LL.DOWNLOAD_SUCCESSFUL()); }); }; const callSystemAPI = async (entity: string) => { await getSystemAPI({ entity, id: 0 }).catch((error) => { toast.error(error.message); }); }; const content = () => ( <> {LL.UPLOAD()} {LL.UPLOAD_TEXT()}.

{LL.RESTART_TEXT(1)}.
{md5 && ( {'MD5: ' + md5} )} {!isUploading && ( <> {LL.DOWNLOAD(0)} {LL.SUPPORT_INFORMATION(1)} {LL.HELP_INFORMATION_4()} {LL.DOWNLOAD(0)} {LL.SETTINGS(1)} {LL.DOWNLOAD_SETTINGS_TEXT()} {LL.DOWNLOAD_CUSTOMIZATION_TEXT()} {LL.DOWNLOAD_SCHEDULE_TEXT()} )} ); return ( {restarting ? : content()} ); }; export default UploadFileForm;