import { createEffect, createSignal, For, onMount, Show, untrack, type Accessor, type Setter } from "solid-js"; import "./DownloadManager.css"; import "./Dialog.css"; import "toastify-js/src/toastify.css"; import { formatBytes } from "../utils"; import { ClearSVG, RefreshSVG, StopSVG } from "./SVG"; import { downloadStatusMap, setDownloadStatusMap, type Progress } from "../offline"; import { createStore } from "solid-js/store"; interface DownloadManagerProps { showDownloadManager: Accessor; setShowDownloadManager: Setter; } export default function DownloadManager(props: DownloadManagerProps) { let dialogElement!: HTMLDialogElement; createEffect(() => { if (props.showDownloadManager()) { dialogElement.showModal(); } }); function handleClose() { dialogElement.close(); props.setShowDownloadManager(false); } const [downloadItems, setDownloadItems] = createStore>({}); createEffect(() => { const paths = Object.keys(downloadStatusMap); untrack(() => { // Update the downloadItems store with the current status of each path for (const path of paths) { const status = downloadStatusMap[path]; if (typeof status === "object" && "status" in status) setDownloadItems(path, status); else setDownloadItems(path, undefined); } // Remove any paths that no longer exist in downloadStatusMap for (const path of Object.keys(downloadItems)) { if (!Object.keys(downloadStatusMap).includes(path)) { setDownloadItems(path, undefined); } } }); }); return ( e.target.nodeName === "DIALOG" && handleClose()} >
Download

{([path, status]) => { if (!status) return; const [showReason, setShowReason] = createSignal(false); return (
{path}
{status && typeof status.status === "number" ? ( <> {formatBytes(status.status)} ) : ( <> {(status.status === "Failed" && ( )) || "Aborted"} )}
{"reason" in status && status.reason}
); }}
); }