Skip to content

feat(download): add re-download action from Completed + History - #102

Merged
mpiton merged 2 commits into
mainfrom
feat/task-09-redownload
Apr 24, 2026
Merged

feat(download): add re-download action from Completed + History#102
mpiton merged 2 commits into
mainfrom
feat/task-09-redownload

Conversation

@mpiton

@mpiton mpiton commented Apr 24, 2026

Copy link
Copy Markdown
Owner

Summary

• IPC command download_redownload(sourceKind, sourceId, overwriteMode?) creates new Download from Completed row or History entry with fresh DownloadId
• Clones URL, filename, destination; Download source also preserves segments, priority, module_name, account_id
• Tagged outcome returns fileExists with pre-resolved rename suggestion via unique_destination helper — no second backend call needed
• Reusable <OverwriteDialog> component + useRedownload hook for frontend (DownloadsTable + HistoryView)
• Domain Download gains builder methods: with_segments_count, with_module_name, with_account_id
• i18n: new keys common.overwriteDialog.* + downloads.table.{actions.redownload, toast.redownload*} (en/fr)
• Invalidates download + history query keys on success for cache coherence
• Backend: 6 unit tests (command handler), Frontend: 10 RTL tests (component + integration)

Type

feat


Summary by cubic

Add a Re-download action to Completed and History so users can quickly re-add a past download with a simple overwrite/rename flow. Aligns with Task 09; only completed downloads are eligible, and file conflicts are handled without extra backend calls.

  • New Features

    • IPC download_redownload(sourceKind, sourceId, overwriteMode?) creates a new DownloadId and clones URL, filename, and destination; when cloning a download it also preserves segments, priority, module name, and account id.
    • Returns { kind: "created", id } or { kind: "fileExists", originalPath, suggestedPath } with the rename suggestion computed server-side.
    • Reusable OverwriteDialog and useRedownload, wired into Completed rows in DownloadsTable and into HistoryView; invalidates downloads and history queries on success.
    • Domain: with_segments_count, with_module_name, with_account_id; i18n: common.overwriteDialog.* and downloads.table.{actions.redownload,toast.redownload*} (en/fr).
  • Bug Fixes

    • Rejects re-download attempts for non-completed downloads with a validation error.
    • IPC now parses sourceId as a string to avoid 64‑bit precision issues; useRedownload and callers pass string IDs through.
    • OverwriteDialog prevents double-emitting decisions when closing via cancel actions.

Written for commit 1842f73. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Re-download completed downloads and history entries from the Downloads table and History view
    • File-conflict dialog to Overwrite, Keep both (rename), or Cancel
    • Success and error toasts for re-download actions
  • Localization

    • Added English and French strings for re-download actions, dialogs, and toasts
  • Tests

    • Added UI and unit tests covering the overwrite dialog and re-download flows
  • Documentation

    • CHANGELOG updated with the new re-download entry

… (task 09)

Cloning path: IPC command `download_redownload(sourceKind, sourceId, overwriteMode?)`
creates a brand-new `Download` (new DownloadId) seeded from the source — URL,
filename, destination, plus segments/priority/module/account when the source is
an existing Download. Tagged outcome returns `fileExists` with a pre-resolved
rename suggestion so the frontend can show the overwrite dialog without a second
backend round trip to compute the suggestion.

Frontend ships a reusable `<OverwriteDialog>` and a `useRedownload` hook mounted
in `DownloadsTable` (Completed rows only) and `HistoryView`; both invalidate the
download and history query keys on success.
@github-actions github-actions Bot added documentation Improvements or additions to documentation rust frontend ui labels Apr 24, 2026
@coderabbitai

coderabbitai Bot commented Apr 24, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Implements a full "re-download" flow: new Tauri IPC command, backend RedownloadCommand and handler, domain builder extensions, frontend hook and overwrite dialog, integration into Downloads/History views and tests, plus new i18n keys and a changelog entry.

Changes

Cohort / File(s) Summary
IPC & Handler Registration
src-tauri/src/adapters/driving/tauri_ipc.rs, src-tauri/src/lib.rs
Adds download_redownload Tauri command, public enums for source/overwrite/outcome, ID parsing, destination collision detection (suggested path), and registration in Tauri handler exports.
Application Commands
src-tauri/src/application/commands/mod.rs, src-tauri/src/application/commands/redownload.rs
Introduces RedownloadSource and RedownloadCommand; implements CommandBus::handle_redownload to build a new Download from a template, apply optional metadata, persist it, and publish DownloadCreated.
Domain Model
src-tauri/src/domain/model/download.rs
Adds builder methods with_segments_count, with_module_name, with_account_id and tests to allow preserving/applying optional metadata when recreating downloads.
Frontend Hook & IPC Wiring
src/hooks/useRedownload.tsx
New useRedownload hook invoking download_redownload, handling outcomes (created vs fileExists), managing overwrite dialog state, retrying with overwrite/rename, toasts, and query invalidation.
Overwrite Dialog Component & Tests
src/components/ui/OverwriteDialog.tsx, src/components/__tests__/OverwriteDialog.test.tsx
Adds controlled OverwriteDialog component with decisions (overwrite/rename/cancel) and tests verifying rendering and decision callbacks.
Downloads View Integration & Tests
src/views/DownloadsView/DownloadsTable.tsx, src/views/DownloadsView/__tests__/DownloadsTable.test.tsx
Adds a "Redownload" action for completed rows, wires useRedownload, renders the dialog, and updates tests to assert IPC invocation and action visibility.
History View Integration & Tests
src/views/HistoryView/HistoryView.tsx, src/views/HistoryView/__tests__/HistoryView.test.tsx
Replaces direct download-start calls with useRedownload for history entries, renders dialog, and adds tests for file-exists flows and IPC parameters.
Localization
src/i18n/locales/en.json, src/i18n/locales/fr.json
Adds downloads.table.actions.redownload, downloads.table.toast.redownloadSuccess, ...Error, and common.overwriteDialog strings for dialog and toast copy.
Changelog
CHANGELOG.md
Adds Unreleased entry documenting the re-download capability, IPC surface, backend wiring, frontend components, and translation keys.

Sequence Diagram

sequenceDiagram
    actor User
    participant Frontend as Frontend UI
    participant IPC as Tauri IPC
    participant QueryBus as Query Bus
    participant CommandBus as Command Bus
    participant Repo as Repository
    participant EventBus as Event Bus

    User->>Frontend: Click "Redownload"
    Frontend->>IPC: download_redownload(sourceKind, sourceId, overwriteMode=null)
    IPC->>QueryBus: Resolve download or history template
    QueryBus-->>IPC: Template data
    IPC->>IPC: Compute destination path & check filesystem
    alt collision detected
        IPC-->>Frontend: FileExists(originalPath, suggestedPath)
        Frontend->>Frontend: Show OverwriteDialog
        User->>Frontend: Choose overwrite/rename
        Frontend->>IPC: download_redownload(sourceKind, sourceId, overwriteMode)
    end
    IPC->>CommandBus: RedownloadCommand{source, destination_override}
    CommandBus->>CommandBus: Create new Download (new ID) and apply metadata
    CommandBus->>Repo: Save new Download
    CommandBus->>EventBus: Publish DownloadCreated
    EventBus-->>Frontend: Trigger query invalidation
    IPC-->>Frontend: Created{id}
    Frontend->>Frontend: Show success toast, close dialog
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly Related PRs

Poem

🐰 I hopped through code with nimble paws,
Recreated downloads without a pause.
When files collide, I offer two—
Overwrite or rename, the choice is you.
A joyful thump—new downloads bloom!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.64% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title clearly and concisely summarizes the main feature: adding a re-download action accessible from both Completed downloads and History entries.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/task-09-redownload

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps

greptile-apps Bot commented Apr 24, 2026

Copy link
Copy Markdown

Greptile Summary

This PR adds a re-download action to Completed rows in DownloadsTable and to HistoryView, backed by a new download_redownload IPC command that clones a prior download or history entry into a fresh DownloadId. File-conflict handling uses a two-call flow (fileExists → dialog → retry with overwriteMode), with the conflict path already flagged in earlier reviews (TOCTOU on the rename path; cache invalidation firing on fileExists as well as created). The Completed-state guard requested in a prior review has been added in this revision.

Confidence Score: 4/5

Safe to merge with minor open concerns; two P1 findings from prior reviews (TOCTOU on rename path, cache invalidation on fileExists) are still unresolved.

The implementation is solid and the previously-requested Completed-state guard has been added. The two remaining P1 concerns from earlier review rounds (TOCTOU where the user-confirmed suggested path can differ from the actual save path on a second unique_destination call; unnecessary query invalidation on fileExists) are carried forward unaddressed. All new findings in this pass are P2. Score is 4 rather than 5 because the TOCTOU is a present correctness issue where a user-confirmed path may silently diverge at write time.

src-tauri/src/adapters/driving/tauri_ipc.rs (TOCTOU on rename), src/hooks/useRedownload.tsx (cache invalidation on fileExists)

Important Files Changed

Filename Overview
src-tauri/src/adapters/driving/tauri_ipc.rs Adds download_redownload IPC: resolves source via query bus, checks file existence, calls unique_destination for rename suggestion/path. TOCTOU noted in previous review (suggested path computed twice, second call may return a different path).
src-tauri/src/application/commands/redownload.rs New command handler: loads template from Download (now with Completed-state guard) or HistoryEntry, clones into a new Download with fresh ID, saves and emits DownloadCreated. Six unit tests cover happy path, event emission, destination override, history source, non-completed rejection, and not-found cases.
src/hooks/useRedownload.tsx New hook wiring mutation → overwrite dialog → second mutation. invalidateKeys fires on both "created" and "fileExists" outcomes (noted in previous review). Returns a fresh object every render, causing instability in callers' dep arrays.
src/components/ui/OverwriteDialog.tsx Reusable dialog with decidedRef guard to prevent double-firing on Escape + button click. Clean implementation with correct i18n keys.
src/views/DownloadsView/DownloadsTable.tsx Adds redownload action for Completed rows; renders redownload.dialog above the table. rowActions useMemo lists the full redownload object as a dep instead of redownload.trigger, causing unnecessary context value churn on each render.
src/views/HistoryView/HistoryView.tsx Integrates useRedownload with custom history toast keys; renders dialog in return tree. handleRedownload useCallback dep on full redownload object instead of redownload.trigger causes unnecessary recreations.
src-tauri/src/domain/model/download.rs Adds three builder methods: with_segments_count, with_module_name, with_account_id. Straightforward field assignments with matching unit tests.

Sequence Diagram

sequenceDiagram
    participant UI as Frontend (trigger)
    participant IPC as download_redownload IPC
    participant QB as QueryBus
    participant FS as Filesystem
    participant CB as CommandBus

    UI->>IPC: download_redownload(sourceKind, sourceId, null)
    IPC->>QB: resolve source (GetDownloadDetail / GetHistoryEntry)
    QB-->>IPC: destination_path
    IPC->>FS: dest_path.exists()?
    alt file does not exist
        IPC->>CB: handle_redownload(source, None)
        CB-->>IPC: new DownloadId
        IPC-->>UI: { kind: created, id }
        UI->>UI: toast.success + invalidate queries
    else file exists, no overwriteMode
        FS-->>IPC: true
        IPC->>FS: unique_destination(dir, file_name)
        FS-->>IPC: suggestedPath
        IPC-->>UI: { kind: fileExists, originalPath, suggestedPath }
        UI->>UI: show OverwriteDialog
        UI->>IPC: download_redownload(sourceKind, sourceId, overwrite or rename)
        IPC->>FS: unique_destination again (rename path)
        IPC->>CB: handle_redownload(source, destination_override)
        CB-->>IPC: new DownloadId
        IPC-->>UI: { kind: created, id }
        UI->>UI: toast.success + invalidate queries
    end
Loading

Fix All in Claude Code

Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/views/DownloadsView/DownloadsTable.tsx
Line: 408

Comment:
The entire `redownload` object (a new reference on every render because the hook creates a fresh JSX `dialog` element inline) is listed as a dep of `rowActions`. This makes `rowActions` regenerate on every parent render, which means `RowActionsContext.value` is always a new object and every `useRowActions()` consumer re-renders unconditionally. For a virtualized table that re-renders frequently during active downloads, this produces continuous unnecessary work. Only the stable `trigger` function is actually used in the memo body, so narrowing the dep is both correct and sufficient.

```suggestion
    [pauseMut, resumeMut, retryMut, removeMut, priorityMut, openFileMut, openFolderMut, redownload.trigger],
```

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/views/HistoryView/HistoryView.tsx
Line: 72-77

Comment:
Same object-reference instability as in `DownloadsTable`: `redownload` is a new object every render, so `handleRedownload` (and through it `rowActions`) is recreated on every render. Only `redownload.trigger` is actually called inside, so it is the correct dep.

```suggestion
  const handleRedownload = useCallback(
    (entry: HistoryEntry) => {
      redownload.trigger("history", entry.entryId);
    },
    [redownload.trigger],
  );
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (2): Last reviewed commit: "fix(download): address PR #102 review co..." | Re-trigger Greptile

Comment thread src-tauri/src/application/commands/redownload.rs

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/views/HistoryView/__tests__/HistoryView.test.tsx (1)

62-66: ⚠️ Potential issue | 🟡 Minor

Stabilize locale-dependent assertions in test setup.
These tests rely on English UI labels but don’t force locale in beforeEach, which can make runs order-dependent.

Suggested test setup tweak
 beforeEach(() => {
+  window.localStorage.setItem("i18nextLng", "en");
   mockInvoke.mockReset();
   mockSave.mockReset();
   mockToastSuccess.mockClear();
 });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/views/HistoryView/__tests__/HistoryView.test.tsx` around lines 62 - 66,
The tests rely on English UI labels but don't force the locale, making them
order-dependent; update the beforeEach block to explicitly set the test locale
to English (for example by calling your i18n locale setter or mocking
navigator.language / Intl locale utilities) before resetting mocks so the UI
labels/assertions are stable; reference the existing beforeEach, mockInvoke,
mockSave, and mockToastSuccess to locate where to add the locale-forcing call.
🧹 Nitpick comments (1)
src/components/ui/OverwriteDialog.tsx (1)

31-44: Potential double onDecision("cancel") callback.

When the Cancel button is clicked, handle("cancel") calls onDecision("cancel") and then onOpenChange(false). This triggers the Dialog's onOpenChange callback (lines 39-44), which calls onDecision("cancel") again when next is false.

The current consumer (useRedownload) handles this gracefully because handleDecision checks if (!pending) return; and clears pending immediately, so the second call is a no-op. However, this is fragile coupling—future consumers may not expect a double callback.

Consider guarding against this by tracking whether a decision has been emitted:

♻️ Suggested guard to prevent double callback
 export function OverwriteDialog({
   open,
   onOpenChange,
   originalPath,
   suggestedPath,
   onDecision,
 }: OverwriteDialogProps) {
   const { t } = useTranslation();
+  const decidedRef = useRef(false);
+
+  // Reset decided state when dialog opens
+  useEffect(() => {
+    if (open) decidedRef.current = false;
+  }, [open]);

   const handle = (decision: OverwriteDecision) => {
+    if (decidedRef.current) return;
+    decidedRef.current = true;
     onDecision(decision);
     onOpenChange(false);
   };

   return (
     <Dialog
       open={open}
       onOpenChange={(next) => {
         if (!next) {
-          onDecision("cancel");
+          if (!decidedRef.current) {
+            decidedRef.current = true;
+            onDecision("cancel");
+          }
         }
         onOpenChange(next);
       }}
     >
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/ui/OverwriteDialog.tsx` around lines 31 - 44, The component
currently calls onDecision("cancel") both in handle and again in the Dialog
onOpenChange, causing a possible double emit; add a local guard (e.g., a ref or
state like decisionEmitted) and set it when calling onDecision from handle (or
from the onOpenChange path) and check that guard before calling onDecision
inside the Dialog onOpenChange callback so onDecision is only invoked once;
update the handle function and the Dialog onOpenChange closure (referencing
handle, onDecision, onOpenChange, and Dialog) to use that guard and reset it
appropriately if needed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/views/HistoryView/HistoryView.tsx`:
- Around line 72-76: The current handleRedownload uses Number(entry.entryId)
which can lose precision for 64-bit IDs; either (preferred) update the backend
command download_redownload to accept source_id: String (like
history_delete_entry) and parse to u64 server-side, or (frontend fallback) stop
converting to Number in handleRedownload and pass the ID as a string (invoke
redownload.trigger("history", entry.entryId)) after validating with BigInt/safer
checks to ensure it's a valid u64; reference handleRedownload,
redownload.trigger, entry.entryId, download_redownload, and history_delete_entry
when making the change.

---

Outside diff comments:
In `@src/views/HistoryView/__tests__/HistoryView.test.tsx`:
- Around line 62-66: The tests rely on English UI labels but don't force the
locale, making them order-dependent; update the beforeEach block to explicitly
set the test locale to English (for example by calling your i18n locale setter
or mocking navigator.language / Intl locale utilities) before resetting mocks so
the UI labels/assertions are stable; reference the existing beforeEach,
mockInvoke, mockSave, and mockToastSuccess to locate where to add the
locale-forcing call.

---

Nitpick comments:
In `@src/components/ui/OverwriteDialog.tsx`:
- Around line 31-44: The component currently calls onDecision("cancel") both in
handle and again in the Dialog onOpenChange, causing a possible double emit; add
a local guard (e.g., a ref or state like decisionEmitted) and set it when
calling onDecision from handle (or from the onOpenChange path) and check that
guard before calling onDecision inside the Dialog onOpenChange callback so
onDecision is only invoked once; update the handle function and the Dialog
onOpenChange closure (referencing handle, onDecision, onOpenChange, and Dialog)
to use that guard and reset it appropriately if needed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 4ae05f4e-e068-4905-940a-253508519d10

📥 Commits

Reviewing files that changed from the base of the PR and between d6d5281 and ef278a8.

📒 Files selected for processing (15)
  • CHANGELOG.md
  • src-tauri/src/adapters/driving/tauri_ipc.rs
  • src-tauri/src/application/commands/mod.rs
  • src-tauri/src/application/commands/redownload.rs
  • src-tauri/src/domain/model/download.rs
  • src-tauri/src/lib.rs
  • src/components/__tests__/OverwriteDialog.test.tsx
  • src/components/ui/OverwriteDialog.tsx
  • src/hooks/useRedownload.tsx
  • src/i18n/locales/en.json
  • src/i18n/locales/fr.json
  • src/views/DownloadsView/DownloadsTable.tsx
  • src/views/DownloadsView/__tests__/DownloadsTable.test.tsx
  • src/views/HistoryView/HistoryView.tsx
  • src/views/HistoryView/__tests__/HistoryView.test.tsx

Comment thread src/views/HistoryView/HistoryView.tsx

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 15 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/views/HistoryView/HistoryView.tsx">

<violation number="1" location="src/views/HistoryView/HistoryView.tsx:74">
P1: Converting `entry.entryId` (string u64) with `Number(...)` can lose precision and send an incorrect history ID to redownload.</violation>
</file>

<file name="src-tauri/src/application/commands/redownload.rs">

<violation number="1" location="src-tauri/src/application/commands/redownload.rs:57">
P2: Validate that `RedownloadSource::Download` is in `Completed` state before cloning; the new handler currently accepts any download state.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread src/views/HistoryView/HistoryView.tsx Outdated
Comment thread src-tauri/src/application/commands/redownload.rs
- Reject non-completed downloads in `handle_redownload` with `AppError::Validation`, mirroring `open_download_file` guard. Covered by new unit test.
- Change `download_redownload` IPC to accept `source_id: String` and parse it server-side (like `history_delete_entry`), eliminating precision loss on 64-bit IDs that would slip through `Number(entry.entryId)`.
- `useRedownload` trigger now takes `sourceId: string`; callers in `DownloadsTable` and `HistoryView` pass the ID through without `Number()` conversion.
- `OverwriteDialog` guards `onDecision` with a ref so Cancel via button + Radix close callback can't double-emit.
- HistoryView test forces `i18nextLng=en` in beforeEach for stable label matching.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
src/hooks/useRedownload.tsx (1)

35-44: JSDoc example is inconsistent with the actual type signature.

The JSDoc example at Line 43 shows trigger('download', Number(id)), but the actual trigger function signature at Line 83 expects sourceId: string. This could lead to confusion since callers might convert IDs to numbers when they should pass strings directly.

📝 Update JSDoc to match the string signature
 /**
  * Redownload trigger paired with the overwrite dialog.
  *
  * Usage:
  *   const { trigger, dialog } = useRedownload();
  *   // ... somewhere in JSX:
  *   <>{dialog}</>
  *   // ... somewhere in a handler:
- *   trigger('download', Number(id));
+ *   trigger('download', id);  // id should be a string
  */
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/hooks/useRedownload.tsx` around lines 35 - 44, The JSDoc example for
useRedownload is inconsistent with the trigger signature; update the example so
callers pass a string for sourceId (matching trigger(source: 'download' |
'upload', sourceId: string)) instead of Number(id) — e.g., use
trigger('download', id.toString()) or simply trigger('download', id) if id is
already a string; ensure the example shows useRedownload, trigger, and the
string sourceId to match the actual function signature.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/hooks/useRedownload.tsx`:
- Around line 35-44: The JSDoc example for useRedownload is inconsistent with
the trigger signature; update the example so callers pass a string for sourceId
(matching trigger(source: 'download' | 'upload', sourceId: string)) instead of
Number(id) — e.g., use trigger('download', id.toString()) or simply
trigger('download', id) if id is already a string; ensure the example shows
useRedownload, trigger, and the string sourceId to match the actual function
signature.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 654566d9-e25b-48f6-af4f-35c03028671a

📥 Commits

Reviewing files that changed from the base of the PR and between ef278a8 and 1842f73.

📒 Files selected for processing (8)
  • src-tauri/src/adapters/driving/tauri_ipc.rs
  • src-tauri/src/application/commands/redownload.rs
  • src/components/ui/OverwriteDialog.tsx
  • src/hooks/useRedownload.tsx
  • src/views/DownloadsView/DownloadsTable.tsx
  • src/views/DownloadsView/__tests__/DownloadsTable.test.tsx
  • src/views/HistoryView/HistoryView.tsx
  • src/views/HistoryView/__tests__/HistoryView.test.tsx
✅ Files skipped from review due to trivial changes (1)
  • src-tauri/src/application/commands/redownload.rs

@mpiton
mpiton merged commit 1962f97 into main Apr 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation frontend rust ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant