import { ApiResponse } from '../../services/api/apisauce' export const TRANSIENT_PROBLEMS = new Set([ 'NETWORK_ERROR', 'TIMEOUT_ERROR', 'CONNECTION_ERROR', ]) export const RETRY_BACKOFF_MS = [0, 800, 2400] const sleep = (ms: number) => ms <= 0 ? Promise.resolve() : new Promise(r => setTimeout(r, ms)) // Retry transient network errors so a brief drop on a flaky mobile connection // doesn't surface as a save failure. Non-transient errors return immediately. // Exported for unit testing. export async function retryTransient( fn: () => Promise>, ): Promise> { let last: ApiResponse | undefined for (let attempt = 0; attempt < RETRY_BACKOFF_MS.length; attempt++) { await sleep(RETRY_BACKOFF_MS[attempt]) last = await fn() if (last.ok) return last if (!last.problem || !TRANSIENT_PROBLEMS.has(last.problem)) return last } return last as ApiResponse }