UNPKG

stream-chat-react

Version:

React components to create chat conversations or livestream style chat

91 lines (90 loc) β€’ 3.52 kB
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);