diff options
author | Thomas F. K. Jorna <[email protected]> | 2021-07-14 15:10:31 +0200 |
---|---|---|
committer | Thomas F. K. Jorna <[email protected]> | 2021-07-14 15:10:31 +0200 |
commit | e5021187e96b78b53203bd95d08d6818aea47d17 (patch) | |
tree | 37ec45d00eb963db53cd4bb4f04a770414b351cc /app/services/api/api-problem.ts |
New Ignite 7.0.6 app
Diffstat (limited to 'app/services/api/api-problem.ts')
-rw-r--r-- | app/services/api/api-problem.ts | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app/services/api/api-problem.ts b/app/services/api/api-problem.ts new file mode 100644 index 0000000..9c2aa49 --- /dev/null +++ b/app/services/api/api-problem.ts @@ -0,0 +1,74 @@ +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 +} |