import type { User } from './follow'; import { user } from './user'; export interface Thread { id: number; title: string; createdAt: number; mediaCategories: { coverImage: { extraLarge: string; medium: string; }; }[]; categories: { name: string; }[]; } export interface ThreadPage { data: { Page: { threads: Thread[]; pageInfo: { hasNextPage: boolean; currentPage: number; }; }; }; } const threadPage = async (page: number, userId: number): Promise => await ( await fetch('https://graphql.anilist.co', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ query: `{ Page(perPage: 50, page: ${page}) { threads(userId: ${userId}) { id title createdAt mediaCategories { coverImage { extraLarge medium } } categories { name } } pageInfo { hasNextPage } } }` }) }) ).json(); export const threads = async (username: string): Promise => { const allThreads = []; const userData = await user(username); if (!userData) throw new Error(`User not found: ${username}`); const userId = userData.id; let page = 1; let currentPage = await threadPage(page, userId); for (const thread of currentPage.data.Page.threads) allThreads.push(thread); while (currentPage.data.Page.pageInfo.hasNextPage) { page += 1; currentPage = await threadPage(page, userId); for (const thread of currentPage.data.Page.threads) allThreads.push(thread); } return allThreads; }; export const threadLikes = async (id: number): Promise[]> => { const activityResponse = await ( await fetch('https://graphql.anilist.co', { method: 'POST', headers: { 'Content-Type': 'application/json', Accept: 'application/json' }, body: JSON.stringify({ query: `{ Thread(id: ${id}) { likes { name avatar { large } } } }` }) }) ).json(); return activityResponse['data']['Thread']['likes']; };