mirror of
https://github.com/nimbold/Firelink.git
synced 2026-07-27 04:19:19 +00:00
7.6 KiB
7.6 KiB
Firelink interaction/functionality review
Date: 2026-06-19
Review method
Code-traced visible UI actions through React components, Zustand stores, typed IPC wrappers, registered Tauri commands, Rust side effects, and frontend update/error paths. Build and Rust tests were run after fixes.
Root causes found
-
The handwritten frontend IPC map had drifted from generated Rust bindings.
- Queue reordering sent
Up/Down, but Rust deserializesQueueDirectionas lowercaseup/down.
- Queue reordering sent
-
Some UI buttons were visually present but not wired.
- Add Download
Refresh Metadatahad no click handler.
- Add Download
-
Some UI promises did not match the backend side effect.
- Settings global speed limit was labeled KiB/s, but bare numeric input was passed as bytes/s.
- Download Properties allowed editing speed for active transfers even though no backend command applied a per-download active speed change.
-
Duplicate-resolution semantics were too broad.
- The duplicate dialog offered
Replacefor URL duplicates, but replacement only makes sense for destination-file conflicts.
- The duplicate dialog offered
-
File-path actions used inconsistent destination resolution.
Copy File Pathbypassed the same effective destination logic used by Open/Reveal.
-
Clipboard actions lacked visible error handling.
- Copy failures were previously silent.
Fixed
Main window
| Surface/action | Status after review | Notes |
|---|---|---|
| Start/resume paused or failed download | Works | Store enqueues through enqueue_download; existing aria2 GID resume path is handled by backend. |
| Pause active/queued/retrying download | Works | Frontend calls pause_download; backend removes pending task and pauses/removes active work as appropriate. |
| Remove download | Works | Frontend calls remove_download, then removes local persisted item. |
| Delete file with remove | Works | Uses trash_download_assets with backend ownership/path authorization. |
| Redownload | Works | Creates a new queued item with preserved metadata and enqueues through queue manager. |
| Open downloaded file | Works | Uses owned-path open_downloaded_file. |
| Show in Finder | Works for completed files/partials | Uses owned-path reveal_in_file_manager; non-completed double-click/menu behavior opens properties. |
| Copy URL/address | Fixed | Now reports clipboard errors. |
| Copy file path | Fixed | Now uses the same effective path resolution as file actions and reports clipboard errors. |
| Queue up/down ordering | Fixed | Sends lowercase up/down to match Rust-generated QueueDirection. |
| Double-click completed download | Works | Opens file; otherwise opens Properties. |
| Status/progress/speed/ETA updates | Works | Store listener handles progress/state events; existing media-size finalization behavior is preserved. |
| Column resize/layout | Works | Local UI-only state; no backend side effect. |
Add Download window
| Surface/action | Status after review | Notes |
|---|---|---|
| URL/multiple URL input | Works | Lines are parsed and invalid URLs surface per-item error state. |
| Paste/deep-link/extension prefill | Works | App-level paste/deep-link/extension handlers open the modal with URLs. |
| Metadata detection | Works | HTTP metadata and media metadata go through IPC. |
| Refresh Metadata | Fixed | Button now re-runs the existing parser/metadata flow. |
| Media format selection | Works | Selected format selector/ext is applied before enqueue. |
| File name/category/destination detection | Works | Category-specific destination routing is preserved. |
| Destination folder selection | Works | Uses Tauri directory picker. |
| Auth/site-login credentials | Works | Keychain-backed site-login password lookup is preserved. |
| Add paused / start queued | Works | Adds local item and enqueues when start is requested. |
| Duplicate URL conflict | Fixed | Replace is no longer offered for URL-only duplicates. |
| Duplicate file conflict | Works | Rename/replace/skip flows remain available for file conflicts. |
| Cancel/close | Works | Modal state is reset through store. |
Download Properties
| Surface/action | Status after review | Notes |
|---|---|---|
| Opens for queued/downloading/paused/failed/completed | Works | Selected item is read live from store. |
| Live progress/speed/ETA/size summary | Works | Summary uses current store item, not stale initial-only form state. |
| Save editable queued/paused/failed settings | Works | Updates local persisted item used by resume/redownload/enqueue paths. |
| Completed download settings for redownload | Works | Identity remains read-only; transfer settings can be saved for redownload. |
| Active-transfer speed controls | Fixed | Controls are locked while transfer is active; copy now states that current backend options remain active until pause/stop. |
| Browse destination | Works when not locked | Uses directory picker. |
Settings
| Tab/action | Status after review | Notes |
|---|---|---|
| Downloads tab settings | Fixed/Works | Bare global speed-limit values now normalize as KiB/s for live backend calls and newly queued downloads. |
| Look and feel tab | Works | Theme, font size, row density, dock badge, menu bar icon persist and drive app effects. |
| Network tab | Works | Proxy mode/host/port/user-agent values are used for enqueue payloads. |
| Locations tab | Works | Default/category paths persist; bulk category creation calls backend. |
| Site Logins tab | Works | Add/remove uses settings plus keychain password storage/deletion. |
| Power tab | Works | Prevent-sleep setting drives backend keep-awake effect. |
| Engine tab diagnostics | Works | Recheck calls registered engine status commands and surfaces errors/details. |
| Integrations tab | Works | Token copy/regenerate and extension pairing token updates are wired; token remains keychain-backed. |
| About tab updates | Works | Check Now calls update check and surfaces result via toast. |
Menus/context menus/dialog buttons
| Surface/action | Status after review | Notes |
|---|---|---|
| Download row context menu | Fixed/Works | Copy actions now resolve correctly and surface errors; start/pause/remove/redownload/properties remain wired. |
| Sidebar queue context menu | Works | Start/pause/rename/remove queues are wired through store. |
| Delete confirmation dialog | Works | Remove-only and remove+trash paths preserved. |
| Duplicate resolution dialog | Fixed | Replacement is now file-conflict-only. |
Backend IPC coverage
| Check | Status |
|---|---|
| Frontend IPC command names exist in Rust registration | Works |
| Queue direction argument casing | Fixed |
| Global speed-limit unit handling | Fixed in frontend and backend startup/live command handling |
| File open/reveal/trash path authorization | Preserved |
| Generic duplicate-check/delete path guards | Preserved; no security loosening introduced |
Not fixed / follow-up
- Full packaged GUI/manual click-through was not launched in this pass; validation was code-trace plus
npm run buildand Rust tests. - Existing generic
check_file_exists/delete_fileremain scoped byis_safe_path, but they are broader than ownership-based open/reveal/trash commands. I did not loosen them. A future hardening pass should replace duplicate-file replacement with an explicit user-selected-destination trash command or ownership-aware pre-registration flow. - Per-download speed changes for already-running transfers are not implemented because the current backend has no active-transfer per-item speed-limit IPC. The UI now stops promising that behavior.
Validation
npm run build: passcd src-tauri && cargo test --quiet: pass