UNPKG

@amityco/ts-sdk-react-native

Version:

Amity Social Cloud Typescript SDK

130 lines (108 loc) 3.52 kB
import { getActiveClient } from '~/client/api/activeClient'; import { ingestInCache } from '~/cache/api/ingestInCache'; import { pullFromCache, pushToCache } from '~/cache/api'; import { getResolver } from '~/core/model'; import { prepareMembershipPayload } from '~/group/utils'; import { LinkedObject } from '~/utils/linkedObject'; import { prepareCommunityPayload } from '~/communityRepository/utils'; /* begin_public_function id: feed.query.global_feed */ /** * * @deprecated This function will to be deprecated. Please use getGlobalFeed instead. * * ```js * import { queryGlobalFeed } from '@amityco/ts-sdk-react-native' * const posts = await queryGlobalFeed() * ``` * * Queries a paginable list of {@link Amity.Post} objects * * @param query The query parameters * @returns A page of {@link Amity.Post} objects * * @category Feed API * @async * */ export const queryGlobalFeed = async ( query?: Amity.QueryGlobalFeed, ): Promise< Omit<Amity.Cached<Amity.Paged<Amity.Post> & Amity.Pagination>, 'nextPage' | 'prevPage'> > => { const client = getActiveClient(); client.log('feed/queryGlobalFeed', query); const { queryToken, dataTypes, resolveParent, ...params } = query ?? {}; const options = (() => { if (queryToken) return { token: queryToken }; return undefined; })(); const { data: queryPayload } = await client.http.get<Amity.PostPayload & Amity.Pagination>( `/api/v4/me/global-feeds`, { params: { ...params, dataTypes, resolveParent: resolveParent ?? true, options, }, }, ); const { paging, ...payload } = queryPayload; const data = prepareMembershipPayload(payload, 'communityUsers'); const { posts } = data; const { communities: processedCommunity } = prepareCommunityPayload(data); const cachedAt = client.cache && Date.now(); if (client.cache) { ingestInCache({ ...data, communitis: processedCommunity }); const cacheKey = ['globalFeed', 'query', { ...params, options } as Amity.Serializable]; pushToCache(cacheKey, { posts: posts.map(getResolver('post')), paging }); } return { data: posts.map(LinkedObject.post), cachedAt, paging, }; }; /* end_public_function */ /** * ```js * import { queryGlobalFeed } from '@amityco/ts-sdk-react-native' * const posts = await queryGlobalFeed.locally() * ``` * * Queries a paginable list of {@link Amity.Post} objects from cache * * @param query The query parameters * @returns A page of {@link Amity.Post} objects * * @category Feed API * @async * */ queryGlobalFeed.locally = ( query?: Parameters<typeof queryGlobalFeed>[0], ): | Omit<Amity.Cached<Amity.Paged<Amity.Post> & Amity.Pagination>, 'nextPage' | 'prevPage'> | undefined => { const client = getActiveClient(); client.log('post/queryGlobalFeed.locally', query); if (!client.cache) return; const { ...params } = query ?? {}; const queryKey = ['globalFeed', 'query', { ...params } as Amity.Serializable]; const { data, cachedAt } = pullFromCache<{ posts: Amity.Post['postId'][] } & Amity.Pagination>(queryKey) ?? {}; if (!data?.posts.length) return; const posts: Amity.Post[] = data.posts .map(postId => pullFromCache<Amity.InternalPost>(['post', 'get', postId])!) .filter(Boolean) .map(({ data }) => data) .map(LinkedObject.post); const { paging } = data; return posts.length === data?.posts?.length ? { data: posts, cachedAt, paging, } : undefined; };