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.
Summary
DownloadTrackArchiveDrawer.tsxignores theisTimedOutflag 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):Web (
packages/web/src/components/download-track-archive-modal/DownloadTrackArchiveModal.tsx:84):useGetStemsArchiveJobStatusreturns{ ...query, isTimedOut }and enforces a 15-minuteSTEMS_ARCHIVE_POLL_TIMEOUT_MS. Mobile destructures onlydata, so bothisTimedOutandisErrorare 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
isErrorandisTimedOutfrom the hook and fold them intohasError, matching web.