stream-chat-react
Version:
React components to create chat conversations or livestream style chat
91 lines (90 loc) β’ 3.52 kB
JavaScript
import React from 'react';
import ReactMarkdown from 'react-markdown';
export const renderPreviewText = (text) => (React.createElement(ReactMarkdown, { skipHtml: true }, text));
const getLatestPollVote = (latestVotesByOption) => {
let latestVote;
for (const optionVotes of Object.values(latestVotesByOption)) {
optionVotes.forEach((vote) => {
if (latestVote && new Date(latestVote.updated_at) >= new Date(vote.created_at))
return;
latestVote = vote;
});
}
return latestVote;
};
export const getLatestMessagePreview = (channel, t, userLanguage = 'en', isMessageAIGenerated) => {
const latestMessage = channel.state.latestMessages[channel.state.latestMessages.length - 1];
const previewTextToRender = latestMessage?.i18n?.[`${userLanguage}_text`] ||
latestMessage?.text;
const poll = latestMessage?.poll;
if (!latestMessage) {
return t('Nothing yet...');
}
if (latestMessage.deleted_at) {
return t('Message deleted');
}
if (poll) {
if (!poll.vote_count) {
const createdBy = poll.created_by?.id === channel.getClient().userID
? t('You')
: (poll.created_by?.name ?? t('Poll'));
return t('π {{createdBy}} created: {{ pollName}}', {
createdBy,
pollName: poll.name,
});
}
else {
const latestVote = getLatestPollVote(poll.latest_votes_by_option);
const option = latestVote && poll.options.find((opt) => opt.id === latestVote.option_id);
if (option && latestVote) {
return t('π {{votedBy}} voted: {{pollOptionText}}', {
pollOptionText: option.text,
votedBy: latestVote?.user?.id === channel.getClient().userID
? t('You')
: (latestVote.user?.name ?? t('Poll')),
});
}
}
}
if (previewTextToRender) {
return isMessageAIGenerated?.(latestMessage)
? previewTextToRender
: renderPreviewText(previewTextToRender);
}
if (latestMessage.command) {
return `/${latestMessage.command}`;
}
if (latestMessage.attachments?.length) {
return t('π Attachment...');
}
if (latestMessage.shared_location) {
return t('πShared location');
}
return t('Empty message...');
};
export const getGroupChannelDisplayInfo = (channel) => {
const members = Object.values(channel.state.members);
if (members.length <= 2)
return;
const info = [];
for (let i = 0; i < members.length; i++) {
const { user } = members[i];
if (!user?.name && !user?.image)
continue;
info.push({ image: user.image, name: user.name });
if (info.length === 4)
break;
}
return info;
};
const getChannelDisplayInfo = (info, channel, currentUser) => {
if (channel.data?.[info])
return channel.data[info];
const members = Object.values(channel.state.members);
if (members.length !== 2)
return;
const otherMember = members.find((member) => member.user?.id !== currentUser?.id);
return otherMember?.user?.[info];
};
export const getDisplayTitle = (channel, currentUser) => getChannelDisplayInfo('name', channel, currentUser);
export const getDisplayImage = (channel, currentUser) => getChannelDisplayInfo('image', channel, currentUser);