Created
March 30, 2019 15:01
-
-
Save gotmayonase/113fab50ef33fb1a01b528f368953a0b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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<any>): 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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment