import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; import { pokeApiAllPagesCustomBaseQuery, pokeApiFullListFetchArgs, } from './paginationBaseQuery'; import { PokemonListResponseData, PokemonResponseData, RegionListResponseData, RegionResponseData, TypeListResponseData, TypeResponseData, } from './types/api'; const pokeApiBaseQuery = async ( args: pokeApiFullListFetchArgs, api: any, extra: any, ) => { const baseUrl = 'https://pokeapi.co/api/v2/'; if (args.fetchAllPages) { return pokeApiAllPagesCustomBaseQuery(args, api, extra, baseUrl); } else { return fetchBaseQuery({ baseUrl })(args, api, extra); } }; export const pokedexApi = createApi({ reducerPath: 'pokedexApi', baseQuery: pokeApiBaseQuery, endpoints: builder => ({ getPokemonList: builder.query({ query: () => ({ url: `pokemon`, fetchAllPages: true }), }), getRegionList: builder.query({ query: () => ({ url: 'region', fetchAllPages: true }), }), getTypeList: builder.query({ query: () => ({ url: 'type', fetchAllPages: true }), transformResponse: (response: RegionListResponseData) => { return { ...response, results: [{ name: 'All Types', url: '' }, ...response.results], }; }, }), getPokemon: builder.query({ query: IdOrName => ({ url: `pokemon/${IdOrName}` }), }), getRegion: builder.query({ query: IdOrName => ({ url: `region/${IdOrName}` }), }), getType: builder.query({ query: IdOrName => ({ url: `type/${IdOrName}` }), }), }), }); export const { useGetPokemonListQuery, useGetRegionListQuery, useGetTypeListQuery, useGetPokemonQuery, useGetRegionQuery, useGetTypeQuery, } = pokedexApi;