stream-chat-react-native-core
Version:
The official React Native and Expo components for Stream Chat, a service for building chat applications
93 lines (77 loc) • 2.42 kB
text/typescript
import type { ChannelAPIResponse, ChannelMemberResponse } from 'stream-chat';
import { upsertDraft } from './upsertDraft';
import { upsertLocation } from './upsertLocation';
import { upsertMembers } from './upsertMembers';
import { upsertMessages } from './upsertMessages';
import { upsertReads } from './upsertReads';
import { mapChannelDataToStorable } from '../mappers/mapChannelDataToStorable';
import { createUpsertQuery } from '../sqlite-utils/createUpsertQuery';
import { SqliteClient } from '../SqliteClient';
import type { PreparedQueries } from '../types';
export const upsertChannels = async ({
channels,
execute = true,
isLatestMessagesSet,
}: {
channels: ChannelAPIResponse[];
execute?: boolean;
isLatestMessagesSet?: boolean;
}) => {
// Update the database only if the query is provided.
let queries: PreparedQueries[] = [];
const channelIds = channels.map((channel) => channel.channel.cid);
SqliteClient.logger?.('info', 'upsertChannels', {
channelIds,
});
for (const channel of channels) {
queries.push(createUpsertQuery('channels', mapChannelDataToStorable(channel.channel)));
const { active_live_locations, draft, members, membership, messages, read } = channel;
if (
membership &&
!members.includes((m: ChannelMemberResponse) => m.user?.id === membership.user?.id)
) {
members.push({ ...membership, user_id: membership.user?.id });
}
if (active_live_locations && active_live_locations.length > 0) {
active_live_locations.forEach(async (location) => {
queries = queries.concat(
await upsertLocation({
execute: false,
location,
}),
);
});
}
if (draft) {
queries = queries.concat(await upsertDraft({ draft, execute: false }));
}
queries = queries.concat(
await upsertMembers({
cid: channel.channel.cid,
execute: false,
members,
}),
);
if (read) {
queries = queries.concat(
await upsertReads({
cid: channel.channel.cid,
execute: false,
reads: read,
}),
);
}
if (isLatestMessagesSet) {
queries = queries.concat(
await upsertMessages({
execute: false,
messages,
}),
);
}
}
if (execute) {
await SqliteClient.executeSqlBatch(queries);
}
return queries;
};