import "./DownloadButton.css"; import type { MediaFile, Directory } from "music-server-shared/types"; import { deleteFile, download, getDownloadStatus } from "../offline"; import { createMemo, type Accessor, type ResourceActions } from "solid-js"; import type { AppOptions } from "../types"; import { formatBytes, joinPath } from "../utils"; import { DeleteSVG, RefreshSVG, SyncSVG } from "./SVG"; import { LoadingSpinner } from "./LoadingScreen"; import type { FlatFileListing } from "../App"; interface DownloadButtonProps { fileName: string; item: MediaFile | Directory; fetchFiles: ResourceActions; isOffline: Accessor; currentDir: Accessor; options: AppOptions; } export function DownloadButton(props: DownloadButtonProps) { const fullPath = joinPath(props.currentDir(), props.fileName); return (
{ event.stopPropagation(); if (!props.isOffline()) download(props.fileName, props.item, props.currentDir(), props.currentDir, props.options, props.fetchFiles); else deleteFile(props.fileName, props.item, props.currentDir(), props.fetchFiles); }} > {(() => { //memo needed so progress amount doesn't cause rerenders type ButtonType = "Spinner" | "Delete" | "Sync" | "Refresh" | { bytes: number }; const progressMemo = createMemo(() => { const progress = getDownloadStatus(fullPath)[0](); if (typeof progress === "object" && "amount" in progress) return "Spinner"; if (props.isOffline()) return "Delete"; if (progress === undefined) return "Sync"; if (progress === "Synced") return "Refresh"; if ("bytes" in progress) return { bytes: progress.bytes }; throw new Error(`Unexpected: ${progress}`); }); const progress = progressMemo(); if (progress === "Spinner") return ; if (progress === "Delete") { return ( ); } if (progress === "Sync") { return ( ); } if (progress === "Refresh") { return ( ); } if ("bytes" in progress) return {progress.bytes === 0 ? "Queued..." : formatBytes(progress.bytes)}; console.error("Unexpected", progress); })()}
); }