import api, { apiRequest, getLinks, apiRequestGet, apiRequestPost, } from 'mastodon/api'; import type { ApiNotificationGroupsResultJSON, ApiNotificationGroupJSON, ApiNotificationRequestJSON, ApiNotificationJSON, } from 'mastodon/api_types/notifications'; import type { ApiStatusJSON } from 'mastodon/api_types/statuses'; const exceptInvalidNotifications = ( notifications: ApiNotificationGroupJSON[], ) => { return notifications.filter((n) => { if ('status' in n) { return (n.status as ApiStatusJSON | null) !== null; } return true; }); }; export const apiFetchNotifications = async ( params?: { account_id?: string; since_id?: string; }, url?: string, ) => { const response = await api().request({ method: 'GET', url: url ?? '/api/v1/notifications', params, }); return { notifications: response.data, links: getLinks(response), }; }; export const apiFetchNotificationGroups = async (params?: { url?: string; grouped_types?: string[]; exclude_types?: string[]; max_id?: string; since_id?: string; }) => { const response = await api().request({ method: 'GET', url: '/api/v2/notifications', params, }); const { statuses, accounts, notification_groups } = response.data; return { statuses, accounts, notifications: exceptInvalidNotifications(notification_groups), links: getLinks(response), }; }; export const apiClearNotifications = () => apiRequest('POST', 'v1/notifications/clear'); export const apiFetchNotificationRequests = async ( params?: { since_id?: string; }, url?: string, ) => { const response = await api().request({ method: 'GET', url: url ?? '/api/v1/notifications/requests', params, }); return { requests: response.data, links: getLinks(response), }; }; export const apiFetchNotificationRequest = async (id: string) => { return apiRequestGet( `v1/notifications/requests/${id}`, ); }; export const apiAcceptNotificationRequest = async (id: string) => { return apiRequestPost(`v1/notifications/requests/${id}/accept`); }; export const apiDismissNotificationRequest = async (id: string) => { return apiRequestPost(`v1/notifications/requests/${id}/dismiss`); }; export const apiAcceptNotificationRequests = async (id: string[]) => { return apiRequestPost('v1/notifications/requests/accept', { id }); }; export const apiDismissNotificationRequests = async (id: string[]) => { return apiRequestPost('v1/notifications/requests/dismiss', { id }); };