@amityco/ts-sdk-react-native
Version:
Amity Social Cloud Typescript SDK
106 lines (86 loc) • 3.31 kB
text/typescript
import { getActiveClient } from '~/client/api/activeClient';
import { queryCache } from '~/cache/api';
import { ingestInCache } from '~/cache/api/ingestInCache';
import { checkIfShouldGoesToTombstone } from '~/cache/utils';
import { pushToTombstone } from '~/cache/api/pushToTombstone';
import { prepareChannelPayload } from '../utils';
import { fireEvent } from '~/core/events';
import { prepareUnreadCountInfo } from '../utils/prepareUnreadCountInfo';
/**
* ```js
* import { getChannelByIds } from '@amityco/ts-sdk'
* const channels = await getChannelByIds(['foo', 'bar'])
* ```
*
* Fetches a collection of {@link Amity.Channel} objects
*
* @param channelIds the IDs of the {@link Amity.Channel} to fetch
* @returns the associated collection of {@link Amity.Channel} objects
*
* @category Channel API
* @async
*/
export const getChannelByIds = async (
channelIds: Amity.Channel['channelPublicId'][],
): Promise<Amity.Cached<Amity.StaticInternalChannel[]>> => {
const client = getActiveClient();
client.log('channel/getChannelByIds', channelIds);
const encodedChannelIds = channelIds.map(channelId => encodeURIComponent(channelId));
let payload: Amity.ChannelPayload;
try {
// API-FIX: endpoint should not be /list, parameters should be querystring.
const response = await client.http.get<Amity.ChannelPayload>(`/api/v3/channels/list`, {
params: { channelIds: encodedChannelIds },
});
payload = response.data;
} catch (error) {
channelIds.forEach(channelId => {
if (checkIfShouldGoesToTombstone((error as Amity.ErrorResponse)?.code)) {
// NOTE: use channelPublicId as tombstone cache key since we cannot get the channelPrivateId that come along with channel data from server
pushToTombstone('channel', channelId);
}
});
throw error;
}
const data = await prepareChannelPayload(payload);
if (client.isUnreadCountEnabled && client.getMarkerSyncConsistentMode()) {
await prepareUnreadCountInfo(payload);
}
const cachedAt = client.cache && Date.now();
if (client.cache) ingestInCache(data, { cachedAt });
fireEvent('local.channel.fetched', data.channels);
return {
data: data.channels,
cachedAt,
};
};
/**
* ```js
* import { getChannelByIds } from '@amityco/ts-sdk'
* const channels = getChannelByIds.locally(['foo', 'bar']) ?? []
* ```
*
* Fetches a collection of {@link Amity.Channel} objects from cache
*
* @param channelIds the IDs of the {@link Amity.Channel} to fetch
* @returns the associated collection of {@link Amity.Channel} objects
*
* @category Channel API
*/
getChannelByIds.locally = (
channelIds: Amity.Channel['channelPublicId'][],
): Amity.Cached<Amity.StaticInternalChannel[]> | undefined => {
const client = getActiveClient();
client.log('channel/getChannelByIds.locally', channelIds);
if (!client.cache) return;
const cached = queryCache<Amity.StaticInternalChannel>(['channel', 'get'])?.filter(({ data }) => {
return channelIds.includes(data.channelPublicId);
});
if (!cached || cached?.length < channelIds.length) return;
const channels = cached.map(({ data }) => data);
const oldest = cached.sort((a, b) => (a.cachedAt! < b.cachedAt! ? -1 : 1))?.[0];
return {
data: channels,
cachedAt: oldest.cachedAt,
};
};