import { ApiResponse } from "apisauce" export type GeneralApiProblem = /** * Times up. */ | { kind: "timeout"; temporary: true } /** * Cannot connect to the server for some reason. */ | { kind: "cannot-connect"; temporary: true } /** * The server experienced a problem. Any 5xx error. */ | { kind: "server" } /** * We're not allowed because we haven't identified ourself. This is 401. */ | { kind: "unauthorized" } /** * We don't have access to perform that request. This is 403. */ | { kind: "forbidden" } /** * Unable to find that resource. This is a 404. */ | { kind: "not-found" } /** * All other 4xx series errors. */ | { kind: "rejected" } /** * Something truly unexpected happened. Most likely can try again. This is a catch all. */ | { kind: "unknown"; temporary: true } /** * The data we received is not in the expected format. */ | { kind: "bad-data" } /** * Attempts to get a common cause of problems from an api response. * * @param response The api response. */ export function getGeneralApiProblem(response: ApiResponse): GeneralApiProblem | void { switch (response.problem) { case "CONNECTION_ERROR": return { kind: "cannot-connect", temporary: true } case "NETWORK_ERROR": return { kind: "cannot-connect", temporary: true } case "TIMEOUT_ERROR": return { kind: "timeout", temporary: true } case "SERVER_ERROR": return { kind: "server" } case "UNKNOWN_ERROR": return { kind: "unknown", temporary: true } case "CLIENT_ERROR": switch (response.status) { case 401: return { kind: "unauthorized" } case 403: return { kind: "forbidden" } case 404: return { kind: "not-found" } default: return { kind: "rejected" } } case "CANCEL_ERROR": return null } return null }