template_0205
This commit is contained in:
82
RN_TEMPLATE/app/services/api/index.ts
Normal file
82
RN_TEMPLATE/app/services/api/index.ts
Normal file
@@ -0,0 +1,82 @@
|
||||
/**
|
||||
* This Api class lets you define an API endpoint and methods to request
|
||||
* data and process it.
|
||||
*
|
||||
* See the [Backend API Integration](https://docs.infinite.red/ignite-cli/boilerplate/app/services/#backend-api-integration)
|
||||
* documentation for more details.
|
||||
*/
|
||||
import { ApiResponse, ApisauceInstance, create } from "apisauce"
|
||||
|
||||
import Config from "@/config"
|
||||
import type { EpisodeItem } from "@/services/api/types"
|
||||
|
||||
import { GeneralApiProblem, getGeneralApiProblem } from "./apiProblem"
|
||||
import type { ApiConfig, ApiFeedResponse } from "./types"
|
||||
|
||||
/**
|
||||
* Configuring the apisauce instance.
|
||||
*/
|
||||
export const DEFAULT_API_CONFIG: ApiConfig = {
|
||||
url: Config.API_URL,
|
||||
timeout: 10000,
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages all requests to the API. You can use this class to build out
|
||||
* various requests that you need to call from your backend API.
|
||||
*/
|
||||
export class Api {
|
||||
apisauce: ApisauceInstance
|
||||
config: ApiConfig
|
||||
|
||||
/**
|
||||
* Set up our API instance. Keep this lightweight!
|
||||
*/
|
||||
constructor(config: ApiConfig = DEFAULT_API_CONFIG) {
|
||||
this.config = config
|
||||
this.apisauce = create({
|
||||
baseURL: this.config.url,
|
||||
timeout: this.config.timeout,
|
||||
headers: {
|
||||
Accept: "application/json",
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a list of recent React Native Radio episodes.
|
||||
*/
|
||||
async getEpisodes(): Promise<{ kind: "ok"; episodes: EpisodeItem[] } | GeneralApiProblem> {
|
||||
// make the api call
|
||||
const response: ApiResponse<ApiFeedResponse> = await this.apisauce.get(
|
||||
`api.json?rss_url=https%3A%2F%2Ffeeds.simplecast.com%2FhEI_f9Dx`,
|
||||
)
|
||||
|
||||
// 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 rawData = response.data
|
||||
|
||||
// This is where we transform the data into the shape we expect for our model.
|
||||
const episodes: EpisodeItem[] =
|
||||
rawData?.items.map((raw) => ({
|
||||
...raw,
|
||||
})) ?? []
|
||||
|
||||
return { kind: "ok", episodes }
|
||||
} catch (e) {
|
||||
if (__DEV__ && e instanceof Error) {
|
||||
console.error(`Bad data: ${e.message}\n${response.data}`, e.stack)
|
||||
}
|
||||
return { kind: "bad-data" }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Singleton instance of the API for convenience
|
||||
export const api = new Api()
|
||||
Reference in New Issue
Block a user