summaryrefslogtreecommitdiff
path: root/app_expo/services/api/character-api.ts
blob: e28ec482a36c780d80f3d8e28ab86928a576aae0 (about) (plain)
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
import { ApiResponse } from 'apisauce'
import { Api } from './api'
import { GetCharactersResult } from './api.types'
import { getGeneralApiProblem } from './api-problem'

const API_PAGE_SIZE = 50

export class CharacterApi {
  private api: Api

  constructor(api: Api) {
    this.api = api
  }

  async getCharacters(): Promise<GetCharactersResult> {
    try {
      // make the api call
      const response: ApiResponse<any> = await this.api.apisauce.get(
        'https://raw.githubusercontent.com/infinitered/ignite/master/data/rick-and-morty.json',
        { amount: API_PAGE_SIZE },
      )

      // the typical ways to die when calling an api
      if (!response.ok) {
        const problem = getGeneralApiProblem(response)
        if (problem) return problem
      }

      const characters = response.data.results

      return { kind: 'ok', characters }
    } catch (e) {
      __DEV__ && console.tron.log(e.message)
      return { kind: 'bad-data' }
    }
  }
}