diff --git a/src/components/DownloadItem.tsx b/src/components/DownloadItem.tsx index 9c2b172..e28c91f 100644 --- a/src/components/DownloadItem.tsx +++ b/src/components/DownloadItem.tsx @@ -13,7 +13,6 @@ interface DownloadItemProps { setContextMenu: (menu: { x: number; y: number; id: string }) => void; handlePause: (id: string) => void; handleResume: (item: DownloadItemType) => void; - handleDoubleClick: (item: DownloadItemType) => void; getCategoryIcon: (category: string) => React.ReactNode; isSelected: boolean; onClick: (e: React.MouseEvent, item: DownloadItemType) => void; @@ -26,7 +25,6 @@ export const DownloadItem = React.memo(({ setContextMenu, handlePause, handleResume, - handleDoubleClick, getCategoryIcon, isSelected, onClick, @@ -90,7 +88,6 @@ export const DownloadItem = React.memo(({ e.preventDefault(); setContextMenu({ x: e.clientX, y: e.clientY, id: download.id }); }} - onDoubleClick={() => handleDoubleClick(download)} >
diff --git a/src/components/DownloadTable.tsx b/src/components/DownloadTable.tsx index d2cc107..38686d9 100644 --- a/src/components/DownloadTable.tsx +++ b/src/components/DownloadTable.tsx @@ -189,6 +189,10 @@ export const DownloadTable: React.FC = ({ filter }) => { ? [...filteredDownloads].sort((left, right) => (left.queuePosition ?? 0) - (right.queuePosition ?? 0)) : filteredDownloads; const handleItemClick = (e: React.MouseEvent, item: DownloadItem) => { + if (e.detail === 2) { + handleDownloadDoubleClick(item); + return; + } if (e.metaKey || e.ctrlKey) { const newSelected = new Set(selectedIds); if (newSelected.has(item.id)) { @@ -372,7 +376,6 @@ export const DownloadTable: React.FC = ({ filter }) => { setContextMenu={handleContextMenu} handlePause={handlePause} handleResume={handleResume} - handleDoubleClick={handleDownloadDoubleClick} getCategoryIcon={getCategoryIcon} isSelected={selectedIds.has(d.id)} onClick={handleItemClick} diff --git a/src/index.css b/src/index.css index 5421f3a..dfc0653 100644 --- a/src/index.css +++ b/src/index.css @@ -1497,6 +1497,8 @@ border-radius: 6px; color: hsl(var(--text-primary)); font-size: 12px; + user-select: none; + -webkit-user-select: none; } html[data-list-density="compact"] .download-row, diff --git a/src/store/useDownloadStore.ts b/src/store/useDownloadStore.ts index fa8fdf2..386fc6c 100644 --- a/src/store/useDownloadStore.ts +++ b/src/store/useDownloadStore.ts @@ -470,55 +470,31 @@ export const useDownloadStore = create((set, get) => ({ } const url = targetItem.url?.trim(); - if (!url) { - throw new Error('Cannot redownload: original URL is missing.'); + if (!url) throw new Error('Cannot redownload: original URL is missing.'); + + // Remove from backend to clear its state and delete the existing file so we can overwrite + try { + await invoke('remove_download', { id, deleteAssets: true }); + get().unregisterBackendIds([id]); + } catch (e) { + console.warn("Could not remove old download from backend", e); } - const filename = targetItem.fileName?.trim(); - if (!filename) { - throw new Error('Cannot redownload: original filename is missing.'); - } - - const mediaFormatSelector = targetItem.mediaFormatSelector?.trim(); - - const settings = useSettingsStore.getState(); - const destPath = targetItem.destination || - await resolveCategoryDestination(settings, targetItem.category); - - if (!destPath.trim()) { - throw new Error('Cannot redownload: destination folder is missing.'); - } - - const redownloadItem: DownloadItem = { - id: crypto.randomUUID(), - url, - fileName: filename, + get().updateDownload(id, { status: 'queued', - category: targetItem.category, - dateAdded: new Date().toISOString(), - connections: targetItem.connections, - speedLimit: targetItem.speedLimit, - username: targetItem.username, - password: targetItem.password, - headers: targetItem.headers, - checksum: targetItem.checksum, - cookies: targetItem.cookies, - mirrors: targetItem.mirrors, - destination: destPath, - isMedia: targetItem.isMedia, - mediaFormatSelector, - queueId: targetItem.queueId || MAIN_QUEUE_ID, - hasBeenDispatched: false - }; + fraction: 0, + speed: '-', + eta: '-', + hasBeenDispatched: false, + dateAdded: Date.now().toString() + }); - set((state) => ({ - downloads: [...state.downloads, redownloadItem] - })); - - if (!await dispatchItem(redownloadItem.id)) { + if (!await dispatchItem(id)) { console.error("Failed to enqueue redownload"); + get().updateDownload(id, { status: 'failed' }); } else { - info(`Download ${id} redownload requested as ${redownloadItem.id} (queued)`); + get().updateDownload(id, { hasBeenDispatched: true }); + info(`Download ${id} redownloaded (queued)`); } }, resumeDownload: async (id) => {