export interface Character { name: { full: string; }; id: number; image: { large: string; medium: string; }; } export interface CharactersPage { data: { Page: { characters: Character[]; pageInfo: { hasNextPage: boolean; currentPage: number; }; }; }; } const charactersPage = async (page: number): Promise => await ( await fetch('https://graphql.anilist.co', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ query: `{ Page(page: ${page}, perPage: 50) { characters(isBirthday: true) { name { full } id image { large medium } } pageInfo { hasNextPage currentPage } } }` }) }) ).json(); export const todaysCharacterBirthdays = async (): Promise => { const characters = []; let page = 1; let currentPage = await charactersPage(page); for (const character of currentPage['data']['Page']['characters']) characters.push({ id: character['id'], name: { full: character['name']['full'] }, image: { large: character['image']['large'], medium: character['image']['medium'] } }); while (currentPage['data']['Page']['pageInfo']['hasNextPage']) { for (const character of currentPage['data']['Page']['characters']) characters.push({ id: character['id'], name: { full: character['name']['full'] }, image: { large: character['image']['large'], medium: character['image']['medium'] } }); page += 1; currentPage = await charactersPage(page); } for (const character of currentPage['data']['Page']['characters']) characters.push({ id: character['id'], name: { full: character['name']['full'] }, image: { large: character['image']['large'], medium: character['image']['medium'] } }); return characters; };