Skip to content

Per-file error state + retry button (part 1; part 2 shipped in #398) #352

Open

Description

@AminDhouib

Split out of #298 (the rest of that audit is superseded by the v3 redesign). Two residual UI gaps, verified against the current tree:

  1. Per-file error state and per-file retry. Retry/Resume is run-level only (packages/react/src/components/FileList.tsx footer). No component renders a per-file FAILED state: FileRow, FilePreview, and FileHero track only SUCCESSFUL / UPLOADING / PROCESSING. The plumbing already exists and is unused by the UI: core.retry(fileId) (packages/core/src/core.ts:701) and retryUpload(fileId) (packages/react/src/hooks/useUploaderController.ts:507). Rendering a failed badge + retry affordance per file is UI-only work, but lands as a cross-framework batch (React canon first, five ports, parity-fixture regen).

  2. Compact list row hides its progress bar at 0%. ProgressBar itself renders whenever the run is active (ProgressBar.tsx:29), and FileHero / FilePreview / FileList use it unconditionally — but FileRow.tsx:166 still gates on {!!progress && …}, so the compact row shows nothing until the first byte moves. One-line fix plus the same gate check in the other frameworks' row templates.

Both are 3.2 candidates alongside the existing cross-framework batch (credit-link target-size, DriveAuthFallback pending state, etc.).

Activity

  1. added a commit that references this issue on Sep 11, 2026
  2. AminDhouib commented on Sep 11, 2026

    @AminDhouib
    MemberAuthor

    Part 2 (compact FileRow hides progress at 0%) landed in #398: the redundant !!progress wrapper was deleted in react/vue/svelte/angular/vanilla; each port's ProgressBar already self-gates on !!progress || isUploadActive(status), so nothing renders at rest and no parity fixture moved.

    Part 1 (per-file failed badge + retry) stays open, with corrected scope from a fresh read of dev:

    • core.retry(fileId) is at packages/core/src/core.ts:909 (not 701); retryUpload(fileId?) is on the controller commands via orchestrator/uploader-orchestrator.ts:115. Core does set per-file FAILED (onFileError → updateFile(id, { status: FAILED }) and markUnsuccessfulFilesFailed).
    • Nothing renders it: FileRow/FileHero/FilePreview only branch on SUCCESSFUL/UPLOADING/PROCESSING. Every FAILED read in the UI packages is run-level (FileList/UploaderPanel).
    • Two items the original body omits: a per-file error message needs a core type addition (UploadFile has no error field), which hits the public-API and type pins; and runRetry flips run-level status to UPLOADING even for a single-file retry, so the footer visibly leaves its failed state. Decide whether that reads acceptably before building the button.
    • A deterministic FAILED state already exists in all six storybooks (packages/storybook-config/src/testing/state-stories.ts:61-64), so verification is cheap.
    • Size M (React canon + five ports, one new testid/slot pair). Deferred past the 3.3.1 release because run-level Retry already re-sends every failed file, so nobody is stuck.
  3. changed the title [-]Per-file error state + retry button; compact FileRow hides progress at 0%[/-] [+]Per-file error state + retry button (part 1; part 2 shipped in #398)[/+] on Sep 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions