import { PlApiBaseClient, type PlApiClientConstructorOpts } from '@/client-base'; import { accounts } from '@/client/accounts'; import { admin } from '@/client/admin'; import { announcements } from '@/client/announcements'; import { antennas } from '@/client/antennas'; import { apps } from '@/client/apps'; import { asyncRefreshes } from '@/client/async-refreshes'; import { chats } from '@/client/chats'; import { circles } from '@/client/circles'; import { drive } from '@/client/drive'; import { emails } from '@/client/emails'; import { events } from '@/client/events'; import { experimental } from '@/client/experimental'; import { filtering } from '@/client/filtering'; import { groupedNotifications } from '@/client/grouped-notifications'; import { instance } from '@/client/instance'; import { interactionRequests } from '@/client/interaction-requests'; import { lists } from '@/client/lists'; import { media } from '@/client/media'; import { myAccount } from '@/client/my-account'; import { notifications } from '@/client/notifications'; import { oauth } from '@/client/oauth'; import { oembed } from '@/client/oembed'; import { polls } from '@/client/polls'; import { pushNotifications } from '@/client/push-notifications'; import { rssFeedSubscriptions } from '@/client/rss-feed-subscriptions'; import { scheduledStatuses } from '@/client/scheduled-statuses'; import { search } from '@/client/search'; import { settings } from '@/client/settings'; import { shoutbox } from '@/client/shoutbox'; import { statuses } from '@/client/statuses'; import { stories } from '@/client/stories'; import { streaming } from '@/client/streaming'; import { subscriptions } from '@/client/subscriptions'; import { timelines } from '@/client/timelines'; import { trends } from '@/client/trends'; import { utils } from '@/client/utils'; import { ICESHRIMP_NET } from '@/features'; import type { Instance } from '@/entities/instance'; interface PlApiClientFullConstructorOpts extends PlApiClientConstructorOpts { /** Fetch instance after constructing */ fetchInstance?: boolean; /** Abort signal which can be used to cancel the callbacks */ fetchInstanceSignal?: AbortSignal; /** Executed after the initial instance fetch */ onInstanceFetchSuccess?: (instance: Instance) => void; /** Executed when the initial instance fetch failed */ onInstanceFetchError?: (error?: any) => void; } /** * Mastodon API client with all categories. * @category Clients */ class PlApiClient extends PlApiBaseClient { readonly accounts = accounts(this); readonly admin = admin(this); readonly announcements = announcements(this); readonly antennas = antennas(this); readonly apps = apps(this); readonly asyncRefreshes = asyncRefreshes(this); readonly chats = chats(this); readonly circles = circles(this); readonly drive = drive(this); readonly emails = emails(this); readonly events = events(this); readonly experimental = experimental(this); readonly filtering = filtering(this); readonly groupedNotifications = groupedNotifications(this); readonly instance = instance(this); readonly interactionRequests = interactionRequests(this); readonly lists = lists(this); readonly media = media(this); readonly myAccount = myAccount(this); readonly notifications = notifications(this); readonly oauth = oauth(this); readonly oembed = oembed(this); readonly polls = polls(this); readonly pushNotifications = pushNotifications(this); readonly rssFeedSubscriptions = rssFeedSubscriptions(this); readonly scheduledStatuses = scheduledStatuses(this); readonly search = search(this); readonly settings = settings(this); readonly shoutbox = shoutbox(this); readonly statuses = statuses(this); readonly stories = stories(this); readonly streaming = streaming(this); readonly subscriptions = subscriptions(this); readonly timelines = timelines(this); readonly trends = trends(this); readonly utils = utils(this); constructor( baseURL: string, accessToken?: string, { fetchInstance, fetchInstanceSignal, onInstanceFetchSuccess, onInstanceFetchError, ...opts }: PlApiClientFullConstructorOpts = {}, ) { super(baseURL, accessToken, opts); if (fetchInstance) { this.instance .getInstance() .then((instance) => { if (fetchInstanceSignal?.aborted) return; return onInstanceFetchSuccess?.(instance); }) .catch((error) => { if (fetchInstanceSignal?.aborted) return; onInstanceFetchError?.(error); }); } } override getIceshrimpAccessToken = async (): Promise => { if (this.iceshrimpAccessToken) return; if (this.features.version.software === ICESHRIMP_NET) { this.setIceshrimpAccessToken(await this.settings.authorizeIceshrimp()); } }; } export { PlApiClient as default }; export { accounts, admin, announcements, antennas, apps, asyncRefreshes, chats, circles, drive, emails, events, experimental, filtering, groupedNotifications, instance, interactionRequests, lists, media, myAccount, notifications, oauth, oembed, polls, pushNotifications, rssFeedSubscriptions, scheduledStatuses, search, settings, shoutbox, statuses, stories, streaming, subscriptions, timelines, trends, utils, };