From dd1f02a13b8a96eba1a5ea5757050a7ee4751a25 Mon Sep 17 00:00:00 2001 From: Fredrik Burmester Date: Tue, 1 Oct 2024 14:16:02 +0200 Subject: [PATCH] fix: manual download button --- components/downloads/ActiveDownloads.tsx | 92 +++++++++++++++--------- providers/DownloadProvider.tsx | 54 ++++++++++---- 2 files changed, 99 insertions(+), 47 deletions(-) diff --git a/components/downloads/ActiveDownloads.tsx b/components/downloads/ActiveDownloads.tsx index 9d2d3e50..15b1557c 100644 --- a/components/downloads/ActiveDownloads.tsx +++ b/components/downloads/ActiveDownloads.tsx @@ -18,11 +18,12 @@ import { ViewProps, } from "react-native"; import { toast } from "sonner-native"; +import { Button } from "../Button"; interface Props extends ViewProps {} export const ActiveDownloads: React.FC = ({ ...props }) => { - const { processes } = useDownload(); + const { processes, startDownload } = useDownload(); if (processes?.length === 0) return ( @@ -48,6 +49,7 @@ interface DownloadCardProps extends TouchableOpacityProps { } const DownloadCard = ({ process, ...props }: DownloadCardProps) => { + const { processes, startDownload } = useDownload(); const router = useRouter(); const { removeProcess, setProcesses } = useDownload(); const [settings] = useSettings(); @@ -99,43 +101,67 @@ const DownloadCard = ({ process, ...props }: DownloadCardProps) => { className="relative bg-neutral-900 border border-neutral-800 rounded-2xl overflow-hidden" {...props} > - - - - {process.item.Name} - {process.item.Type} - - {process.progress.toFixed(0)}% - {process.speed && ( - {process.speed?.toFixed(2)}x - )} - {eta(process) && ( - + style={{ + width: process.progress + ? `${Math.max(5, process.progress)}%` + : "5%", + }} + > + )} + + + + {process.item.Type} + {process.item.Name} + + {process.item.ProductionYear} + + + {process.progress === 0 ? ( + + ) : ( + {process.progress.toFixed(0)}% + )} + {process.speed && ( + {process.speed?.toFixed(2)}x + )} + {eta(process) && ( ETA {eta(process)} - + )} + + + + {process.status} + + + cancelJobMutation.mutate(process.id)} + > + {cancelJobMutation.isPending ? ( + + ) : ( + )} - - - {process.status} - + - cancelJobMutation.mutate(process.id)} - > - {cancelJobMutation.isPending ? ( - - ) : ( - - )} - + {process.status === "completed" && ( + + + + )} ); diff --git a/providers/DownloadProvider.tsx b/providers/DownloadProvider.tsx index 568faae1..0246cab5 100644 --- a/providers/DownloadProvider.tsx +++ b/providers/DownloadProvider.tsx @@ -129,22 +129,21 @@ function useDownloadProvider() { useEffect(() => { const checkIfShouldStartDownload = async () => { - if (!processes) return; - for (let i = 0; i < processes.length; i++) { - const job = processes[i]; + const tasks = await checkForExistingDownloads(); + // for (let i = 0; i < processes.length; i++) { + // const job = processes[i]; - if (job.status === "completed") { - // Check if the download is already in progress - const tasks = await checkForExistingDownloads(); - if (tasks.find((task) => task.id === job.id)) continue; - await startDownload(job); - continue; - } - } + // if (job.status === "completed") { + // // Check if the download is already in progress + // if (tasks.find((task) => task.id === job.id)) continue; + // await startDownload(job); + // continue; + // } + // } }; checkIfShouldStartDownload(); - }, [processes]); + }, []); /******************** * Background task @@ -208,6 +207,19 @@ function useDownloadProvider() { async (process: JobStatus) => { if (!process?.item.Id || !authHeader) throw new Error("No item id"); + setProcesses((prev) => + prev.map((p) => + p.id === process.id + ? { + ...p, + speed: undefined, + status: "downloading", + progress: 0, + } + : p + ) + ); + setConfig({ isLogsEnabled: true, progressInterval: 500, @@ -256,9 +268,11 @@ function useDownloadProvider() { }) .done(async () => { await saveDownloadedItemInfo(process.item); - removeProcess(process.id); - completeHandler(process.id); toast.success(`Download completed for ${process.item.Name}`); + setTimeout(() => { + completeHandler(process.id); + removeProcess(process.id); + }, 1000); }) .error(async (error) => { removeProcess(process.id); @@ -267,9 +281,20 @@ function useDownloadProvider() { if (error.errorCode === 1000) { errorMsg = "No space left"; } + if (error.errorCode === 404) { + errorMsg = "File not found on server"; + } toast.error(`Download failed for ${process.item.Name} - ${errorMsg}`); writeToLog("ERROR", `Download failed for ${process.item.Name}`, { error, + processDetails: { + id: process.id, + itemName: process.item.Name, + itemId: process.item.Id, + }, + }); + console.error("Error details:", { + errorCode: error.errorCode, }); }); }, @@ -463,6 +488,7 @@ function useDownloadProvider() { saveDownloadedItemInfo, removeProcess, setProcesses, + startDownload, }; }