118 lines
3.9 KiB
TypeScript
118 lines
3.9 KiB
TypeScript
import * as v from 'valibot';
|
|
|
|
import { chatMessageSchema, chatSchema } from '../entities';
|
|
|
|
import type { PlApiBaseClient } from '../client-base';
|
|
import type {
|
|
CreateChatMessageParams,
|
|
GetChatMessagesParams,
|
|
GetChatsParams,
|
|
} from '../params/chats';
|
|
|
|
/** @see {@link https://docs.pleroma.social/backend/development/API/chats} */
|
|
const chats = (client: PlApiBaseClient) => ({
|
|
/**
|
|
* create or get an existing Chat for a certain recipient
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#creating-or-getting-a-chat}
|
|
*/
|
|
createChat: async (accountId: string) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/by-account-id/${accountId}`, {
|
|
method: 'POST',
|
|
});
|
|
|
|
return v.parse(chatSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#creating-or-getting-a-chat}
|
|
*/
|
|
getChat: async (chatId: string) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/${chatId}`);
|
|
|
|
return v.parse(chatSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Marking a chat as read
|
|
* mark a number of messages in a chat up to a certain message as read
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#marking-a-chat-as-read}
|
|
*/
|
|
markChatAsRead: async (chatId: string, last_read_id: string) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/${chatId}/read`, {
|
|
method: 'POST',
|
|
body: { last_read_id },
|
|
});
|
|
|
|
return v.parse(chatSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Marking a single chat message as read
|
|
* To set the `unread` property of a message to `false`
|
|
* https://docs.pleroma.social/backend/development/API/chats/#marking-a-single-chat-message-as-read
|
|
*/
|
|
markChatMessageAsRead: async (chatId: string, chatMessageId: string) => {
|
|
const response = await client.request(
|
|
`/api/v1/pleroma/chats/${chatId}/messages/${chatMessageId}/read`,
|
|
{ method: 'POST' },
|
|
);
|
|
|
|
return v.parse(chatSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Getting a list of Chats
|
|
* This will return a list of chats that you have been involved in, sorted by their last update (so new chats will be at the top).
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#getting-a-list-of-chats}
|
|
*/
|
|
getChats: (params?: GetChatsParams) =>
|
|
client.paginatedGet('/api/v2/pleroma/chats', { params }, chatSchema),
|
|
|
|
/**
|
|
* Getting the messages for a Chat
|
|
* For a given Chat id, you can get the associated messages with
|
|
*/
|
|
getChatMessages: (chatId: string, params?: GetChatMessagesParams) =>
|
|
client.paginatedGet(`/api/v1/pleroma/chats/${chatId}/messages`, { params }, chatMessageSchema),
|
|
|
|
/**
|
|
* Posting a chat message
|
|
* Posting a chat message for given Chat id works like this:
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#posting-a-chat-message}
|
|
*/
|
|
createChatMessage: async (chatId: string, params: CreateChatMessageParams) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/${chatId}/messages`, {
|
|
method: 'POST',
|
|
body: params,
|
|
});
|
|
|
|
return v.parse(chatMessageSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Deleting a chat message
|
|
* Deleting a chat message for given Chat id works like this:
|
|
* @see {@link https://docs.pleroma.social/backend/development/API/chats/#deleting-a-chat-message}
|
|
*/
|
|
deleteChatMessage: async (chatId: string, messageId: string) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/${chatId}/messages/${messageId}`, {
|
|
method: 'DELETE',
|
|
});
|
|
|
|
return v.parse(chatMessageSchema, response.json);
|
|
},
|
|
|
|
/**
|
|
* Deleting a chat
|
|
*
|
|
* Requires features{@link Features.chatsDelete}.
|
|
*/
|
|
deleteChat: async (chatId: string) => {
|
|
const response = await client.request(`/api/v1/pleroma/chats/${chatId}`, { method: 'DELETE' });
|
|
|
|
return v.parse(chatSchema, response.json);
|
|
},
|
|
});
|
|
|
|
export { chats };
|