From d535bdac8ffde226a4bb02fdd6960e3a3cb98a64 Mon Sep 17 00:00:00 2001 From: NimBold Date: Sun, 21 Jun 2026 14:57:21 +0330 Subject: [PATCH] fix: resolve queue management and metadata fetch bugs - Reset isRemoving state in DeleteConfirmationModal on open and close to prevent UI freeze - Filter sidebar queue count to exclude completed downloads - Return fully resolved URL from backend metadata fetch to avoid 403s on one-time tokens --- src-tauri/src/lib.rs | 3 ++- src/bindings/MetadataResponse.ts | 2 +- src/components/AddDownloadsModal.tsx | 2 +- src/components/DeleteConfirmationModal.tsx | 10 +++++++++- src/components/Sidebar.tsx | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 24305ab..3110d39 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -16,6 +16,7 @@ use std::time::{Duration, Instant}; #[derive(Serialize, TS)] #[ts(export, export_to = "../../src/bindings/")] pub struct MetadataResponse { + url: String, filename: String, size: String, #[ts(type = "number")] @@ -849,7 +850,7 @@ async fn fetch_metadata(url: String, user_agent: Option, username: Optio } } - Ok(MetadataResponse { filename, size: size_str, size_bytes }) + Ok(MetadataResponse { url: current_url, filename, size: size_str, size_bytes }) } const MEDIA_METADATA_CACHE_TTL: Duration = Duration::from_secs(60); diff --git a/src/bindings/MetadataResponse.ts b/src/bindings/MetadataResponse.ts index d6cbc3e..5514d6d 100644 --- a/src/bindings/MetadataResponse.ts +++ b/src/bindings/MetadataResponse.ts @@ -1,3 +1,3 @@ // This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually. -export type MetadataResponse = { filename: string, size: string, size_bytes: number, }; +export type MetadataResponse = { url: string, filename: string, size: string, size_bytes: number, }; diff --git a/src/components/AddDownloadsModal.tsx b/src/components/AddDownloadsModal.tsx index 7b25cd1..78567a7 100644 --- a/src/components/AddDownloadsModal.tsx +++ b/src/components/AddDownloadsModal.tsx @@ -264,7 +264,7 @@ export const AddDownloadsModal = () => { password: keychainPassword }); updatedItems[i] = { - url, + url: meta.url || url, file: lines.length === 1 && pendingAddFilename ? pendingAddFilename : meta.filename, size: meta.size, sizeBytes: meta.size_bytes, diff --git a/src/components/DeleteConfirmationModal.tsx b/src/components/DeleteConfirmationModal.tsx index fedfaec..caf4610 100644 --- a/src/components/DeleteConfirmationModal.tsx +++ b/src/components/DeleteConfirmationModal.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { useDownloadStore } from '../store/useDownloadStore'; import { AlertTriangle } from 'lucide-react'; @@ -7,6 +7,13 @@ export const DeleteConfirmationModal: React.FC = () => { const [errorMessage, setErrorMessage] = useState(''); const [isRemoving, setIsRemoving] = useState(false); + useEffect(() => { + if (deleteModalState.isOpen) { + setIsRemoving(false); + setErrorMessage(''); + } + }, [deleteModalState.isOpen]); + if (!deleteModalState.isOpen) return null; const handleCancel = () => { @@ -38,6 +45,7 @@ export const DeleteConfirmationModal: React.FC = () => { setIsRemoving(false); return; } + setIsRemoving(false); closeDeleteModal(); }; diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 22eac10..1880d0d 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -54,7 +54,7 @@ export const Sidebar: React.FC = (props) => { const getCount = (filter: SidebarFilter) => { if (filter.startsWith('queue:')) { const qid = filter.replace('queue:', ''); - return downloads.filter(d => d.queueId === qid).length; + return downloads.filter(d => d.queueId === qid && d.status !== 'completed').length; } switch (filter) { case 'all': return downloads.length;