UNPKG

@amityco/ts-sdk-react-native

Version:

Amity Social Cloud Typescript SDK

113 lines (98 loc) 3.13 kB
import { getActiveClient } from '~/client/api'; import { ingestInCache } from '~/cache/api/ingestInCache'; import { fireEvent } from '~/core/events'; import { getPost } from '~/postRepository/api/getPost'; import { LinkedObject } from '~/utils/linkedObject'; import { pullFromCache } from '~/cache/api'; import { STORY_KEY_CACHE } from '~/storyRepository/constants'; /* begin_public_function id: comment.create */ /** * ```js * import { CommentRepository } from '@amityco/ts-sdk-react-native' * const newComment = await CommentRepository.createComment(bundle) * ``` * * Creates an {@link Amity.Comment} * * @param bundle The data necessary to create a new {@link Amity.Comment} * @returns The newly created {@link Amity.Comment} * * @category Comment API * @async */ export const createComment = async ( bundle: Pick< Amity.Comment<Amity.CommentContentType>, | 'data' | 'referenceType' | 'referenceId' | 'parentId' | 'metadata' | 'mentionees' | 'attachments' >, ): Promise<Amity.Cached<Amity.Comment>> => { const client = getActiveClient(); client.log('comment/createComment', bundle); const { data } = await client.http.post<Amity.CommentPayload>('/api/v3/comments', bundle); const { comments } = data; // BE always returns an array of comments If it got record 0 from BE it might have a problem on creation logic if (comments.length === 0) throw new Error('Comment not created'); const cachedAt = client.cache && Date.now(); if (client.cache) ingestInCache(data, { cachedAt }); if (['post', 'content'].includes(bundle.referenceType)) { const post = pullFromCache<Amity.InternalPost>(['post', 'get', bundle.referenceId])?.data; if (post) { post.commentsCount += 1; fireEvent('local.post.updated', { posts: [post], categories: [], comments: [], communities: [], communityUsers: data.communityUsers, feeds: [], files: data.files, postChildren: [], users: data.users, videoStreamings: [], }); } } else if (bundle.referenceType === 'story') { const storyIndex = pullFromCache<Amity.Story['referenceId']>([ STORY_KEY_CACHE.STORY_ID_TO_REFERENCE_ID, bundle.referenceId, ]); if (storyIndex?.data) { const cacheStory = pullFromCache<Amity.InternalStory>([ STORY_KEY_CACHE.STORY, 'get', storyIndex.data, ]); if (cacheStory?.data) { fireEvent('story.updated', { stories: [ { ...cacheStory.data, commentsCount: cacheStory.data.commentsCount + 1, comments: [...new Set([...cacheStory.data.comments, comments[0].commentId])], }, ], categories: [], comments, communities: [], communityUsers: data.communityUsers, files: data.files, users: data.users, }); } } } fireEvent('local.comment.created', data); return { data: LinkedObject.comment(comments[0]), cachedAt, }; }; /* end_public_function */