Skip to content

Stems archive: mobile drawer ignores isTimedOut, so a stalled job spins forever #14536

Description

@dylanjeffers

Summary

DownloadTrackArchiveDrawer.tsx ignores the isTimedOut flag that the shared hook already computes and returns, so on mobile a stalled stems archive spins forever with no error state.

Mobile (packages/mobile/src/components/download-track-archive-drawer/DownloadTrackArchiveDrawer.tsx:131):

const hasError =
  !isStartingDownload &&
  (downloadError || initiateDownloadFailed || jobState?.state === 'failed')

Web (packages/web/src/components/download-track-archive-modal/DownloadTrackArchiveModal.tsx:84):

const hasError =
  !isStartingDownload &&
  (initiateDownloadFailed ||
    jobStatus?.state === 'failed' ||
    (!!jobId && (isJobStatusError || isJobTimedOut)))

useGetStemsArchiveJobStatus returns { ...query, isTimedOut } and enforces a 15-minute STEMS_ARCHIVE_POLL_TIMEOUT_MS. Mobile destructures only data, so both isTimedOut and isError are dropped.

Impact

A job that never leaves waiting — the exact failure mode of the 2026-07-28 outage, which lasted ~7 hours — produces an infinite spinner on mobile. No error, no retry affordance, no way to tell it will never finish. Web users at least got an error and a retry link after 15 minutes.

Proposed fix

Destructure isError and isTimedOut from the hook and fold them into hasError, matching web.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions