import React, { useState } from 'react'; import { ServerBackup } from '@/api/server/backups/getServerBackups'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faArchive } from '@fortawesome/free-solid-svg-icons/faArchive'; import format from 'date-fns/format'; import distanceInWordsToNow from 'date-fns/distance_in_words_to_now'; import Spinner from '@/components/elements/Spinner'; import { faCloudDownloadAlt } from '@fortawesome/free-solid-svg-icons/faCloudDownloadAlt'; import Modal, { RequiredModalProps } from '@/components/elements/Modal'; import { bytesToHuman } from '@/helpers'; import Can from '@/components/elements/Can'; import useServer from '@/plugins/useServer'; import getBackupDownloadUrl from '@/api/server/backups/getBackupDownloadUrl'; import SpinnerOverlay from '@/components/elements/SpinnerOverlay'; import useFlash from '@/plugins/useFlash'; import { httpErrorToHuman } from '@/api/http'; import useWebsocketEvent from '@/plugins/useWebsocketEvent'; import { ServerContext } from '@/state/server'; interface Props { backup: ServerBackup; className?: string; } const DownloadModal = ({ checksum, ...props }: RequiredModalProps & { checksum: string }) => (

Verify file checksum

The SHA256 checksum of this file is:

            {checksum}
        
); export default ({ backup, className }: Props) => { const { uuid } = useServer(); const { addError, clearFlashes } = useFlash(); const [ loading, setLoading ] = useState(false); const [ visible, setVisible ] = useState(false); const appendBackup = ServerContext.useStoreActions(actions => actions.backups.appendBackup); useWebsocketEvent(`backup completed:${backup.uuid}`, data => { try { const parsed = JSON.parse(data); appendBackup({ ...backup, sha256Hash: parsed.sha256_hash || '', bytes: parsed.file_size || 0, completedAt: new Date(), }); } catch (e) { console.warn(e); } }); const getBackupLink = () => { setLoading(true); clearFlashes('backups'); getBackupDownloadUrl(uuid, backup.uuid) .then(url => { // @ts-ignore window.location = url; setVisible(true); }) .catch(error => { console.error(error); addError({ key: 'backups', message: httpErrorToHuman(error) }); }) .then(() => setLoading(false)); }; return (
{visible && setVisible(false)} checksum={backup.sha256Hash} /> }
{backup.completedAt ? : }

{backup.name} {backup.completedAt && {bytesToHuman(backup.bytes)} }

{backup.uuid}

{distanceInWordsToNow(backup.createdAt, { includeSeconds: true, addSuffix: true })}

Created

{!backup.completedAt ?
: }
); };