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 ; param config constructor ( config = 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 ( ) { this . apisauce = create ( { baseURL : this . config . url , timeout : this . config . timeout , headers : { Accept : "application/json" , } , } ) ; } /**
     * Gets a list of users.
     */ async getUsers ( ) { const response = await this . apisauce . get ( `/users` ) ; if ( ! response . ok ) { const problem = getGeneralApiProblem ( response ) ; if ( problem ) return problem ; } const convertUser = ( raw ) => { return { id : raw . id , name : raw . name , } ; } ; try { const rawUsers = response . data ; const resultUsers = rawUsers . map ( convertUser ) ; return { kind : "ok" , users : resultUsers } ; } catch { return { kind : "bad-data" } ; } } /**
     * Gets a single user by ID
     */ async getUser ( id ) { const response = await this . apisauce . get ( `/users/${ id }` ) ; if ( ! response . ok ) { const problem = getGeneralApiProblem ( response ) ; if ( problem ) return problem ; } try { const resultUser = { id : response . data . id , name : response . data . name , } ; return { kind : "ok" , user : resultUser } ; } catch { return { kind : "bad-data" } ; } } }