@amityco/ts-sdk-react-native
Version:
Amity Social Cloud Typescript SDK
90 lines (79 loc) • 2.64 kB
text/typescript
import { getActiveClient } from '~/client/api';
import { pullFromCache, upsertInCache } from '~/cache/api';
import { fireEvent } from '~/core/events';
import { LinkedObject } from '~/utils/linkedObject';
import { prepareMessagePayload } from '../utils';
/**
* ```js
* import { deleteMessage } from '@amityco/ts-sdk-react-native'
* const success = await deleteMessage('foobar')
* ```
*
* Delete a {@link Amity.Message}
*
* @param messageId the ID of the {@link Amity.Message} to delete
* @return A success boolean if the {@link Amity.Message} was deleted
*
* @category Message API
* @async
*/
export const deleteMessage = async (
messageId: Amity.Message['messageId'],
): Promise<Amity.Message> => {
const client = getActiveClient();
client.log('message/deleteMessage', messageId);
if (messageId.includes('LOCAL_')) {
const message = pullFromCache<Amity.InternalMessage>(['message', 'get', messageId])?.data;
if (!message) throw Error('messageId not found');
const deletedMessage = {
...message,
isDeleted: true,
};
fireEvent('local.message.deleted', {
messages: [deletedMessage],
});
return LinkedObject.message(deletedMessage);
}
// API-FIX: This endpoint has not been implemented yet.
const { data: deleted } = await client.http.delete<Amity.MessagePayload>(
`/api/v5/messages/${encodeURIComponent(messageId)}`,
);
const payload = await prepareMessagePayload(deleted);
fireEvent('local.message.deleted', {
messages: [payload.messages[0]],
});
return LinkedObject.message(payload.messages[0]);
};
/**
* ```js
* import { deleteMessage } from '@amityco/ts-sdk-react-native'
* const success = deleteMessage.optimistically('foobar')
* ```
*
* Deletes a {@link Amity.Message}
*
* @param messageId The {@link Amity.Message} ID to delete
* @return A success boolean if the {@link Amity.Message} was deleted
*
* @category Message API
*/
deleteMessage.optimistically = (
messageId: Amity.Message['messageId'],
): Amity.Cached<Amity.Message> | undefined => {
const client = getActiveClient();
client.log('message/deleteMessage.optimistically', messageId);
const message = pullFromCache<Amity.InternalMessage>(['message', 'get', messageId]);
if (!message) return;
const cachedAt = -1;
const deleted: Amity.InternalMessage = {
...message.data,
isDeleted: true,
updatedAt: new Date().toISOString(),
};
upsertInCache(['message', 'get', messageId], deleted, { cachedAt });
fireEvent('local.message.deleted', { messages: [deleted] });
return {
data: LinkedObject.message(deleted),
cachedAt,
};
};