feat: expiry countdown, refresh links, CLI tabs, recently viewed #17

Merged
starkSV merged 3 commits from feat/ux-improvements into main 2026-05-22 21:56:08 +05:30
starkSV commented 2026-05-22 21:55:58 +05:30 (Migrated from github.com)

Summary

  • Expiry countdown — parses se param from signed URL; shows live countdown where available, falls back to static "24 hours" for consumer links (Microsoft doesn't include se in consumer CDN URLs)
  • Refresh links — ?force=true on /proxy bypasses cache and fetches fresh from Microsoft; Refresh button appears when link expires in <6h
  • CLI command tabs — wget / curl / aria2 tabs replace the old aria2-only tip on all pages (consumer + eval); selection persists in localStorage
  • Recently viewed — localStorage-only row on homepage; tracks both consumer and eval product pages; shows expiry countdown or expired state when link expiry is known
  • chore — .claude/ added to .gitignore; FileSize removed (Microsoft CDN does not return file size in API response)

Test plan

  • Consumer product page — fetch links, expiry shows "Links expire in 24 hours", CLI tabs switch and persist on refresh
  • Eval page — CLI tabs work, recently viewed tracked on homepage
  • Refresh button — tested with forced 5h expiry, fires force fetch, "Links refreshed!" toast, countdown resets
  • localStorage persistence — CLI tab selection survives hard refresh
  • Build passes with no TypeScript errors

Summary by CodeRabbit

  • New Features
    • Added link refresh functionality to bypass cache and fetch fresh download links.
    • Added CLI command tools (wget, curl, aria2) with clipboard copy functionality.
    • Added link expiry countdown display with auto-refresh button when links expire within 6 hours.
    • Added recently viewed products tracking with persistent list on the home page.
    • Tool selection preference now persists across sessions.

Review Change Stack

## Summary - **Expiry countdown** — parses `se` param from signed URL; shows live countdown where available, falls back to static "24 hours" for consumer links (Microsoft doesn't include `se` in consumer CDN URLs) - **Refresh links** — `?force=true` on `/proxy` bypasses cache and fetches fresh from Microsoft; Refresh button appears when link expires in <6h - **CLI command tabs** — wget / curl / aria2 tabs replace the old aria2-only tip on all pages (consumer + eval); selection persists in localStorage - **Recently viewed** — localStorage-only row on homepage; tracks both consumer and eval product pages; shows expiry countdown or expired state when link expiry is known - **chore** — `.claude/` added to `.gitignore`; `FileSize` removed (Microsoft CDN does not return file size in API response) ## Test plan - [x] Consumer product page — fetch links, expiry shows "Links expire in 24 hours", CLI tabs switch and persist on refresh - [x] Eval page — CLI tabs work, recently viewed tracked on homepage - [x] Refresh button — tested with forced 5h expiry, fires force fetch, "Links refreshed!" toast, countdown resets - [x] localStorage persistence — CLI tab selection survives hard refresh - [x] Build passes with no TypeScript errors <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added link refresh functionality to bypass cache and fetch fresh download links. * Added CLI command tools (wget, curl, aria2) with clipboard copy functionality. * Added link expiry countdown display with auto-refresh button when links expire within 6 hours. * Added recently viewed products tracking with persistent list on the home page. * Tool selection preference now persists across sessions. <!-- review_stack_entry_start --> [![Review Change Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/starkSV/windows-iso-downloader/pull/17?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack) <!-- review_stack_entry_end --> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
coderabbitai[bot] commented 2026-05-22 21:56:19 +05:30 (Migrated from github.com)

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c9218fed-bcfc-4be0-ba36-7b20b2b52d5a

📥 Commits

Reviewing files that changed from the base of the PR and between e3f34016c6 and b2c9e2d874.

📒 Files selected for processing (9)
  • .gitignore
  • CLAUDE.md
  • PROGRESS.md
  • backend/main.go
  • frontend/src/components/CliCommand.tsx
  • frontend/src/components/RecentlyViewed.tsx
  • frontend/src/pages/EvalDetailPage.tsx
  • frontend/src/pages/HomePage.tsx
  • frontend/src/pages/ProductDetailPage.tsx

📝 Walkthrough

Walkthrough

This PR implements frontend UX improvements for link refresh and product tracking. It adds backend support for cache-bypass refresh requests, introduces a CLI command component for multi-tool download commands with localStorage persistence, adds a recently-viewed product tracker, and integrates these across ProductDetailPage, EvalDetailPage, and HomePage. Documentation is updated to reflect in-progress status.

Changes

Frontend UX Improvements: Link Refresh, CLI Commands, and Recently Viewed Items

Layer / File(s) Summary
Backend force-refresh cache bypass
backend/main.go
The /proxy endpoint now accepts force=true parameter to skip cache reads and negative-cache checks. Singleflight key is namespaced with link:force: prefix during forced fetches. Logging distinguishes between forced and normal fetches with expiry time.
CLI command generation component
frontend/src/components/CliCommand.tsx
New component generates wget/curl/aria2 download commands with tool selection persisted in localStorage. Provides collapsible UI with tabs, copy-to-clipboard action, and transient feedback toast.
Recently Viewed product tracking
frontend/src/components/RecentlyViewed.tsx
New module provides localStorage-backed recently viewed entries with expiry countdown. Includes RecentEntry interface, persistence helpers, useCountdown hook, formatRemaining utility, and UI components for entry cards and grid display.
ProductDetailPage: expiry tracking and refresh flow
frontend/src/pages/ProductDetailPage.tsx
Parses se query parameter to extract expiry timestamp, manages countdown state with interval timer, replaces static expiry warning with dynamic row showing status and conditional refresh button (under 6 hours). New handleRefreshLinks fetches with force=true, re-parses expiry, updates recent entry, and shows toasts. Swaps Aria2Tip for CliCommand. Records product as recently viewed on load.
EvalDetailPage: CLI command and recent tracking
frontend/src/pages/EvalDetailPage.tsx
Adds useEffect to record product as recently viewed, imports and renders CliCommand component in place of Aria2Tip.
HomePage: recently viewed section
frontend/src/pages/HomePage.tsx
Imports and renders RecentlyViewed component immediately after StatsBar.
Progress and conventions documentation
.gitignore, CLAUDE.md, PROGRESS.md
.gitignore excludes Claude Code internal directory. CLAUDE.md adds testing reminder and marks UX features in-progress. PROGRESS.md documents expiry countdown, refresh-link UI threshold (6 hours), CLI tabs with localStorage, recently viewed tracking, and marks file-size as not feasible.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ProductDetailPage
  participant Backend
  participant RecentlyViewed
  participant localStorage

  User->>ProductDetailPage: Open product
  ProductDetailPage->>Backend: GET /proxy (first load)
  Backend-->>ProductDetailPage: Download links with se param
  ProductDetailPage->>ProductDetailPage: Parse expiry, start countdown
  ProductDetailPage->>RecentlyViewed: addRecentEntry(product)
  RecentlyViewed->>localStorage: Store product + expiry
  ProductDetailPage->>User: Show expiry countdown
  
  alt Expiry under 6 hours
    User->>ProductDetailPage: Click Refresh
    ProductDetailPage->>Backend: GET /proxy?force=true
    Backend-->>ProductDetailPage: Fresh links with new se
    ProductDetailPage->>ProductDetailPage: Re-parse expiry, reset countdown
    ProductDetailPage->>RecentlyViewed: updateRecentExpiry(id, timestamp)
    RecentlyViewed->>localStorage: Update expiry timestamp
    ProductDetailPage->>User: Show success toast
  end

  User->>ProductDetailPage: Click Copy (CliCommand)
  ProductDetailPage->>localStorage: Read tool preference
  ProductDetailPage->>User: Copy command to clipboard + toast

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Fresh links refresh with force applied,
CLI commands switch with pride,
Recently viewed in localStorage hide,
UX blooms brighter on every side!
✨

✨ 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/ux-improvements

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 golangci-lint (2.12.2)

level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies"


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

<!-- This is an auto-generated comment: summarize by coderabbit.ai --> <!-- This is an auto-generated comment: failure by coderabbit.ai --> > [!CAUTION] > ## Review failed > > The pull request is closed. <!-- end of auto-generated comment: failure by coderabbit.ai --> <details> <summary>ℹ️ Recent review info</summary> <details> <summary>⚙️ Run configuration</summary> **Configuration used**: defaults **Review profile**: CHILL **Plan**: Pro Plus **Run ID**: `c9218fed-bcfc-4be0-ba36-7b20b2b52d5a` </details> <details> <summary>📥 Commits</summary> Reviewing files that changed from the base of the PR and between e3f34016c6a4901253e702d4e0b29d4935a469aa and b2c9e2d874cd30b8c352fe9e1d1792a39e4748f8. </details> <details> <summary>📒 Files selected for processing (9)</summary> * `.gitignore` * `CLAUDE.md` * `PROGRESS.md` * `backend/main.go` * `frontend/src/components/CliCommand.tsx` * `frontend/src/components/RecentlyViewed.tsx` * `frontend/src/pages/EvalDetailPage.tsx` * `frontend/src/pages/HomePage.tsx` * `frontend/src/pages/ProductDetailPage.tsx` </details> </details> --- <!-- walkthrough_start --> <details> <summary>📝 Walkthrough</summary> ## Walkthrough This PR implements frontend UX improvements for link refresh and product tracking. It adds backend support for cache-bypass refresh requests, introduces a CLI command component for multi-tool download commands with localStorage persistence, adds a recently-viewed product tracker, and integrates these across ProductDetailPage, EvalDetailPage, and HomePage. Documentation is updated to reflect in-progress status. ## Changes **Frontend UX Improvements: Link Refresh, CLI Commands, and Recently Viewed Items** | Layer / File(s) | Summary | |---|---| | **Backend force-refresh cache bypass** <br> `backend/main.go` | The `/proxy` endpoint now accepts `force=true` parameter to skip cache reads and negative-cache checks. Singleflight key is namespaced with `link:force:` prefix during forced fetches. Logging distinguishes between forced and normal fetches with expiry time. | | **CLI command generation component** <br> `frontend/src/components/CliCommand.tsx` | New component generates wget/curl/aria2 download commands with tool selection persisted in localStorage. Provides collapsible UI with tabs, copy-to-clipboard action, and transient feedback toast. | | **Recently Viewed product tracking** <br> `frontend/src/components/RecentlyViewed.tsx` | New module provides localStorage-backed recently viewed entries with expiry countdown. Includes `RecentEntry` interface, persistence helpers, `useCountdown` hook, `formatRemaining` utility, and UI components for entry cards and grid display. | | **ProductDetailPage: expiry tracking and refresh flow** <br> `frontend/src/pages/ProductDetailPage.tsx` | Parses `se` query parameter to extract expiry timestamp, manages countdown state with interval timer, replaces static expiry warning with dynamic row showing status and conditional refresh button (under 6 hours). New `handleRefreshLinks` fetches with `force=true`, re-parses expiry, updates recent entry, and shows toasts. Swaps Aria2Tip for CliCommand. Records product as recently viewed on load. | | **EvalDetailPage: CLI command and recent tracking** <br> `frontend/src/pages/EvalDetailPage.tsx` | Adds useEffect to record product as recently viewed, imports and renders CliCommand component in place of Aria2Tip. | | **HomePage: recently viewed section** <br> `frontend/src/pages/HomePage.tsx` | Imports and renders RecentlyViewed component immediately after StatsBar. | | **Progress and conventions documentation** <br> `.gitignore`, `CLAUDE.md`, `PROGRESS.md` | .gitignore excludes Claude Code internal directory. CLAUDE.md adds testing reminder and marks UX features in-progress. PROGRESS.md documents expiry countdown, refresh-link UI threshold (6 hours), CLI tabs with localStorage, recently viewed tracking, and marks file-size as not feasible. | ## Sequence Diagram(s) ```mermaid sequenceDiagram participant User participant ProductDetailPage participant Backend participant RecentlyViewed participant localStorage User->>ProductDetailPage: Open product ProductDetailPage->>Backend: GET /proxy (first load) Backend-->>ProductDetailPage: Download links with se param ProductDetailPage->>ProductDetailPage: Parse expiry, start countdown ProductDetailPage->>RecentlyViewed: addRecentEntry(product) RecentlyViewed->>localStorage: Store product + expiry ProductDetailPage->>User: Show expiry countdown alt Expiry under 6 hours User->>ProductDetailPage: Click Refresh ProductDetailPage->>Backend: GET /proxy?force=true Backend-->>ProductDetailPage: Fresh links with new se ProductDetailPage->>ProductDetailPage: Re-parse expiry, reset countdown ProductDetailPage->>RecentlyViewed: updateRecentExpiry(id, timestamp) RecentlyViewed->>localStorage: Update expiry timestamp ProductDetailPage->>User: Show success toast end User->>ProductDetailPage: Click Copy (CliCommand) ProductDetailPage->>localStorage: Read tool preference ProductDetailPage->>User: Copy command to clipboard + toast ``` ## Estimated code review effort 🎯 3 (Moderate) | ⏱️ ~25 minutes ## Possibly related PRs - [starkSV/windows-iso-downloader#7](https://github.com/starkSV/windows-iso-downloader/pull/7): Modifies the `/proxy` endpoint cache/worker flow; this PR adds cache-bypass logic to the same endpoint. ## Poem > 🐰 Fresh links refresh with force applied, > CLI commands switch with pride, > Recently viewed in localStorage hide, > UX blooms brighter on every side! > ✨ </details> <!-- walkthrough_end --> <!-- finishing_touch_checkbox_start --> <details> <summary>✨ Finishing Touches</summary> <details> <summary>📝 Generate docstrings</summary> - [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> Create stacked PR - [ ] <!-- {"checkboxId": "3e1879ae-f29b-4d0d-8e06-d12b7ba33d98"} --> Commit on current branch </details> <details> <summary>🧪 Generate unit tests (beta)</summary> - [ ] <!-- {"checkboxId": "f47ac10b-58cc-4372-a567-0e02b2c3d479", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Create PR with unit tests - [ ] <!-- {"checkboxId": "6ba7b810-9dad-11d1-80b4-00c04fd430c8", "radioGroupId": "utg-output-choice-group-unknown_comment_id"} --> Commit unit tests in branch `feat/ux-improvements` </details> </details> <!-- finishing_touch_checkbox_end --> <!-- This is an auto-generated comment: all tool run failures by coderabbit.ai --> > [!WARNING] > There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. > > <details> > <summary>🔧 golangci-lint (2.12.2)</summary> > > level=error msg="[linters_context] typechecking error: pattern ./...: directory prefix . does not contain main module or its selected dependencies" > > > > > </details> <!-- end of auto-generated comment: all tool run failures by coderabbit.ai --> <!-- tips_start --> --- <sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub> <!-- tips_end --> <!-- internal state start --> <!-- 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 --> <!-- internal state end -->
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: shekhar/windows-iso-downloader#17
No description provided.