fix: resolve double-click and redownload issues

- Use `e.detail === 2` for double clicks in `DownloadTable.tsx`
- Add `user-select: none` to list items in `index.css`
- Delete existing assets before enqueueing in `redownload` action
- Remove redundant `onDoubleClick` props from `DownloadItem.tsx`
This commit is contained in:
NimBold
2026-06-25 14:01:42 +03:30
parent 8eb1a55e72
commit b4ff14805b
4 changed files with 25 additions and 47 deletions
-3
View File
@@ -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<DownloadItemProps>(({
setContextMenu,
handlePause,
handleResume,
handleDoubleClick,
getCategoryIcon,
isSelected,
onClick,
@@ -90,7 +88,6 @@ export const DownloadItem = React.memo<DownloadItemProps>(({
e.preventDefault();
setContextMenu({ x: e.clientX, y: e.clientY, id: download.id });
}}
onDoubleClick={() => handleDoubleClick(download)}
>
<div className="download-file-cell">
<span className="shrink-0 text-text-muted">
+4 -1
View File
@@ -189,6 +189,10 @@ export const DownloadTable: React.FC<DownloadTableProps> = ({ 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<DownloadTableProps> = ({ filter }) => {
setContextMenu={handleContextMenu}
handlePause={handlePause}
handleResume={handleResume}
handleDoubleClick={handleDownloadDoubleClick}
getCategoryIcon={getCategoryIcon}
isSelected={selectedIds.has(d.id)}
onClick={handleItemClick}
+2
View File
@@ -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,
+19 -43
View File
@@ -470,55 +470,31 @@ export const useDownloadStore = create<DownloadState>((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) => {