1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
import { ApisauceInstance, create, ApiResponse } from 'apisauce'
import { getGeneralApiProblem } from './api-problem'
import { ApiConfig, DEFAULT_API_CONFIG } from './api-config'
import * as Types from './api.types'
/**
* Manages all requests to the API.
*/
export class Api {
/**
* The underlying apisauce instance which performs the requests.
*/
apisauce: ApisauceInstance
/**
* Configurable options.
*/
config: ApiConfig
/**
* Creates the api.
*
* @param config The configuration to use.
*/
constructor(config: ApiConfig = DEFAULT_API_CONFIG) {
this.config = config
}
/**
* Sets up the API. This will be called during the bootup
* sequence and will happen before the first React component
* is mounted.
*
* Be as quick as possible in here.
*/
setup() {
// construct the apisauce instance
this.apisauce = create({
baseURL: this.config.url,
timeout: this.config.timeout,
headers: {
Accept: 'application/json',
},
})
}
/**
* Gets a list of users.
*/
async getUsers(): Promise<Types.GetUsersResult> {
// make the api call
const response: ApiResponse<any> = await this.apisauce.get(`/users`)
// the typical ways to die when calling an api
if (!response.ok) {
const problem = getGeneralApiProblem(response)
if (problem) return problem
}
const convertUser = (raw) => {
return {
id: raw.id,
name: raw.name,
}
}
// transform the data into the format we are expecting
try {
const rawUsers = response.data
const resultUsers: Types.User[] = rawUsers.map(convertUser)
return { kind: 'ok', users: resultUsers }
} catch {
return { kind: 'bad-data' }
}
}
/**
* Gets a single user by ID
*/
async getUser(id: string): Promise<Types.GetUserResult> {
// make the api call
const response: ApiResponse<any> = await this.apisauce.get(`/users/${id}`)
// the typical ways to die when calling an api
if (!response.ok) {
const problem = getGeneralApiProblem(response)
if (problem) return problem
}
// transform the data into the format we are expecting
try {
const resultUser: Types.User = {
id: response.data.id,
name: response.data.name,
}
return { kind: 'ok', user: resultUser }
} catch {
return { kind: 'bad-data' }
}
}
}
|