@amityco/ts-sdk-react-native
Version:
Amity Social Cloud Typescript SDK
74 lines (57 loc) • 2.58 kB
text/typescript
import { ingestInCache } from '~/cache/api/ingestInCache';
import { getSubChannelMarkers } from '~/marker/api';
import { convertFromRaw as convertMessageFromRaw } from '~/messageRepository/utils/prepareMessagePayload';
import { convertFromRaw as convertSubChannelFromRaw } from './convertSubChannelFromRaw';
import { updateSubChannelMessagePreviewCache } from '../../messagePreview/utils/updateSubChannelMessagePreviewCache';
import { convertRawUserToInternalUser } from '~/userRepository/utils/convertRawUserToInternalUser';
export const MARKER_INCLUDED_SUB_CHANNEL_TYPE = ['broadcast', 'conversation', 'community'];
/**
* Filter sub channel by type. Only conversation, community and broadcast type are included.
*/
export const isUnreadCountSupport = ({ channelType }: Pick<Amity.RawSubChannel, 'channelType'>) =>
MARKER_INCLUDED_SUB_CHANNEL_TYPE.includes(channelType);
export const preUpdateSubChannelCache = (rawPayload: Amity.SubChannelPayload) => {
ingestInCache({
messageFeeds: rawPayload.messageFeeds.map(messageFeed => convertSubChannelFromRaw(messageFeed)),
});
};
export const prepareSubChannelPayload = async (
rawPayload: Amity.SubChannelPayload,
): Promise<Amity.ProcessedSubChannelPayload> => {
const markerIds = rawPayload.messageFeeds
.filter(isUnreadCountSupport)
.map(({ messageFeedId }) => messageFeedId);
if (markerIds.length > 0) {
// since the get markers method requires a channel cache to function with the reducer.
preUpdateSubChannelCache(rawPayload);
try {
await getSubChannelMarkers(markerIds);
} catch (e) {
// empty block (from the spec, allow marker fetch to fail without having to do anything)
}
}
updateSubChannelMessagePreviewCache(rawPayload);
// attach marker to sub channel
const messageFeeds = rawPayload.messageFeeds.map(convertSubChannelFromRaw);
const messages = rawPayload.messages.map(m => convertMessageFromRaw(m));
const user = rawPayload.users.map(convertRawUserToInternalUser);
return {
...rawPayload,
messageFeeds,
messages,
users: user,
};
};
type RawQuerySubChannels = Omit<Amity.QuerySubChannels, 'excludeDefaultSubChannel'> & {
excludeDefaultMessageFeed?: Amity.QuerySubChannels['excludeDefaultSubChannel'];
};
export function convertQueryParams({
excludeDefaultSubChannel,
...rest
}: Amity.QuerySubChannels): RawQuerySubChannels {
const out: RawQuerySubChannels = { ...rest };
if (excludeDefaultSubChannel !== undefined) {
out.excludeDefaultMessageFeed = excludeDefaultSubChannel;
}
return out;
}