rainbow-fe/src/lib/mastoapi/status.ts

62 lines
1.5 KiB
TypeScript

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<MastodonStatus> {
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<MastodonStatusContext> {
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;
}