export interface UserIdentity { id: number; name: string; avatar: string; } export interface AniListAuthorisation { tokenType: string; accessToken: string; expiresIn: number; refreshToken: string; } export const userIdentity = async ( anilistAuthorisation: AniListAuthorisation, ): Promise => { const userIdResponse = await ( await fetch("https://graphql.anilist.co", { method: "POST", headers: { Authorization: `${anilistAuthorisation.tokenType} ${anilistAuthorisation.accessToken}`, "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify({ query: `{ Viewer { id name avatar { large } } }`, }), }) ).json(); return { id: userIdResponse.data.Viewer.id, name: userIdResponse.data.Viewer.name, avatar: userIdResponse.data.Viewer.avatar.large, }; }; export const safeUserIdentity = async ( anilistAuthorisation: AniListAuthorisation, ): Promise => { try { const identity = await userIdentity(anilistAuthorisation); if (!identity.id || !identity.name || !identity.avatar) return null; return identity; } catch { return null; } };