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