summaryrefslogtreecommitdiff
path: root/app/services/api/api-problem.ts
diff options
context:
space:
mode:
authorThomas F. K. Jorna <[email protected]>2021-07-14 15:10:31 +0200
committerThomas F. K. Jorna <[email protected]>2021-07-14 15:10:31 +0200
commite5021187e96b78b53203bd95d08d6818aea47d17 (patch)
tree37ec45d00eb963db53cd4bb4f04a770414b351cc /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.ts74
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
+}