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; };