import { useGlobal } from '@/providers/GlobalProvider' import prettyBytes from 'pretty-bytes' import ProgressBar from '@/components/ProgressBar' import { formatEtaSmart } from '@/lib/util' import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import { faCancel, faPause, faPlay, faTrash } from '@fortawesome/free-solid-svg-icons' import { invoke } from '@tauri-apps/api/core' import { notifyUser } from '@/lib/notifications' import { getCurrentWindow, UserAttentionType } from '@tauri-apps/api/window' export default function DownloadsPopup () { const { downloadProgress, setDownloadProgress, downloadQueue, setDownloadQueue, versionsList, modsList, versions, serverVersionList } = useGlobal() return ( <>

Downloads

{downloadProgress.map((v, i) => { const queuePosition = downloadQueue.indexOf(v.version) return (
{(v.downloading || v.paused) && ( <>
{ if (v.downloading) { await invoke('cancel_download', { name: v.version }) } else { setDownloadProgress(prev => { const i = prev.findIndex( d => d.version === v.version ) if (i === -1) return prev const copy = [...prev] copy[i] = { ...copy[i], paused: false, downloading: true } return copy }) const res = await invoke('download', { url: v.url, name: v.version, hash: v.hash, downloadType: v.type, modId: String(v.modId ?? '') }) if (res === '1') { setDownloadProgress(prev => prev.filter(d => d.version !== v.version) ) if (v.type != 1) { if (v.type == 2) { await versions?.set('mods', { ...modsList, [v.modGame! + '-' + v.modId!]: { [v.modVersion!]: Date.now() } }) } else { await versions?.set('list', { ...versionsList, [v.version]: Date.now() }) } } } else if (res == '0') { setDownloadProgress(prev => { const i = prev.findIndex( d => d.version === v.version ) if (i === -1) return prev if (prev[i].canceled) { return prev.filter((_, idx) => idx !== i) } const copy = [...prev] copy[i] = { ...copy[i], downloading: false, paused: true, failed: false } return copy }) } else if (res == '-1') { setDownloadProgress(prev => prev.map(d => d.version === v.version ? { ...d, queued: false, failed: true, progress: 0 } : d ) ) await notifyUser( 'Download Failed', `The download for version ${ serverVersionList?.versions.find( vf => vf.id == v.version )?.displayName } has failed.` ) await getCurrentWindow().requestUserAttention( UserAttentionType.Critical ) } } }} >
{ if (!v.paused) { await invoke('cancel_download', { name: v.version }) setDownloadProgress(prev => { const i = prev.findIndex( d => d.version === v.version ) if (i === -1) return prev const copy = [...prev] copy[i] = { ...copy[i], canceled: true } return copy }) } else { setDownloadProgress(prev => { const i = prev.findIndex( d => d.version === v.version ) if (i === -1) return prev return prev.filter((_, idx) => idx !== i) }) } }} >
)} {(v.failed || v.queued) && (
{ setDownloadQueue(prev => prev.filter(id => id !== v.version) ) setDownloadProgress(prev => prev.filter(d => d.version !== v.version) ) }} >
)}

{v.type == 1 ? 'Mod loader for ' : v.type == 2 ? 'Mod for ' : null}{' '} { serverVersionList?.versions.find(vf => vf.id == v.version) ?.displayName }

{v.failed || v.queued ? (
{v.failed ? 'Download failed' : queuePosition === 0 ? 'Starting soon...' : `Queued (Position ${queuePosition + 1})`}
) : v.hash_checking ? ( Verifying file integrity... ) : v.unzipping ? (
Unzipped {v.unzipped} / {v.unzipTotal} files
) : (
Downloaded{' '} {prettyBytes(v.progressBytes, { minimumFractionDigits: 1, maximumFractionDigits: 1 })}{' '} of{' '} {prettyBytes(v.size, { minimumFractionDigits: 1, maximumFractionDigits: 1 })}{' '} (ETA: {formatEtaSmart(v.etaSecs)} • Speed:{' '} {prettyBytes(v.speed, { minimumFractionDigits: 1, maximumFractionDigits: 1 })} /s)
)}
) })}
) }