import type { MastodonAccount } from './account'; import type { MastodonObject } from './base'; import { reorderAndFilterPleromaReplies } from './pleroma_fixes'; import { fetchAPI, MastodonAPIError, type InstanceInfo } from './util'; export interface MastodonMediaAttachment { type: string; url: string; description: string; preview_url: string; } export interface MastodonStatus extends MastodonObject { account: MastodonAccount; content: string; spoiler_text: string; url: string; in_reply_to_id: string | null; media_attachments: MastodonMediaAttachment[]; tags: { name: string; url: string; }[]; mentions: { acct: string; id: string; username: string; url: string; }[]; } export interface MastodonStatusContext { ancestors: MastodonStatus[]; descendants: MastodonStatus[]; } export function linkStatus(status: MastodonStatus) { return '/post/' + status.id; } export async function fetchStatus(instance: InstanceInfo, id: string): Promise { return await fetchAPI(instance, '/api/v1/statuses/' + id) .then((r) => r.json()) .then((b) => b as MastodonStatus); } export async function fetchStatusContext( instance: InstanceInfo, status: MastodonStatus ): Promise { const context = await fetchAPI(instance, `/api/v1/statuses/${status.id}/context`) .then((r) => r.json()) .then((r) => r as MastodonStatusContext); if ('pleroma' in status) { return reorderAndFilterPleromaReplies(status, context); } return context; }