62 lines
1.5 KiB
TypeScript
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;
|
|
}
|