diff options
Diffstat (limited to 'app_expo/services/api/api-problem.ts')
-rw-r--r-- | app_expo/services/api/api-problem.ts | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/app_expo/services/api/api-problem.ts b/app_expo/services/api/api-problem.ts new file mode 100644 index 0000000..15ca850 --- /dev/null +++ b/app_expo/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 +} |