UNPKG

@sendbird/uikit-utils

Version:

A collection of utility functions and constants for building chat UI components with Sendbird UIKit.

214 lines (213 loc) 8.04 kB
import { MessageSearchOrder } from '@sendbird/chat/message'; import { getFileExtension, getFileType, parseMimeType } from '../shared/file'; import { getMessageTimeFormat } from '../ui-format/common'; export function isNewMessage(msg, currentUserId) { const myMessage = isMyMessage(msg, currentUserId); if (myMessage) return false; if (msg.isAdminMessage()) return false; return msg.updatedAt === 0; } export function isSendableMessage(msg) { return msg !== undefined && msg !== null && 'sendingStatus' in msg; } export function isMyMessage(msg, currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##') { var _msg$sender; if (!isSendableMessage(msg)) return false; return ((_msg$sender = msg.sender) === null || _msg$sender === void 0 ? void 0 : _msg$sender.userId) === currentUserId; } export function messageKeyExtractor(message) { return getMessageUniqId(message); } // |-------------------|-------------------|-----------------|-------------------| // | sending status | reqId | messageId | createdAt | // |-------------------|-------------------|-----------------|-------------------| // | pending | timestamp(A) | 0 | timestamp(B) | // | canceled | timestamp(A) | 0 | ? | // | failed | timestamp(A) | 0 | ? | // | succeeded | timestamp(A) / '' | id from DB | timestamp(C) | // |-------------------|-------------------|-----------------|-------------------| export function messageComparator(a, b) { let aStatusOffset = 0; let bStatusOffset = 0; if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = Number.MAX_SAFE_INTEGER; if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = Number.MAX_SAFE_INTEGER; return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset); } export function hasSameSender(a, b) { var _a$sender, _b$sender; if (!a || !b) return false; if ('sender' in a && 'sender' in b) return ((_a$sender = a.sender) === null || _a$sender === void 0 ? void 0 : _a$sender.userId) === ((_b$sender = b.sender) === null || _b$sender === void 0 ? void 0 : _b$sender.userId); return false; } export function calcMessageGrouping(groupEnabled, curr, prev, next, isReplyThreadType, hasParentMessageUI) { const getPrev = () => { if (!groupEnabled) return false; if (!prev) return false; if (curr.isAdminMessage()) return false; if (!hasSameSender(curr, prev)) return false; if (hasParentMessageUI && curr.parentMessageId) return false; if (isReplyThreadType && curr.threadInfo) return false; if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false; return true; }; const getNext = () => { if (!groupEnabled) return false; if (!next) return false; if (curr.isAdminMessage()) return false; if (!hasSameSender(curr, next)) return false; if (hasParentMessageUI && curr.parentMessageId) return false; if (isReplyThreadType && curr.threadInfo) return false; if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false; return true; }; return { groupWithPrev: getPrev(), groupWithNext: getNext() }; } export function getMessageUniqId(msg) { if (msg.isUserMessage() || msg.isFileMessage()) { if (msg.sendingStatus === 'succeeded') return String(msg.messageId); return msg.reqId; } return String(msg.messageId); } export function getThumbnailUriFromFileMessage(message) { if (message.thumbnails && message.thumbnails.length > 0) { return message.thumbnails[0].url; } return getAvailableUriFromFileMessage(message); } export function getAvailableUriFromFileMessage(message) { var _message$messageParam; if (!message.url && (_message$messageParam = message.messageParams) !== null && _message$messageParam !== void 0 && _message$messageParam.file && 'uri' in message.messageParams.file) { return message.messageParams.file.uri; } return message.url; } export function isSendbirdNotification(dataPayload) { if (!dataPayload) return false; return Boolean(dataPayload['sendbird']); } export function parseSendbirdNotification(dataPayload) { return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird; } export function shouldRenderParentMessage(message, hide = false) { var _message$parentMessag, _message$parentMessag2; if (hide) return false; return !!((message.isFileMessage() || message.isUserMessage()) && ((_message$parentMessag = message.parentMessage) !== null && _message$parentMessag !== void 0 && _message$parentMessag.isFileMessage() || (_message$parentMessag2 = message.parentMessage) !== null && _message$parentMessag2 !== void 0 && _message$parentMessag2.isUserMessage())); } export function shouldRenderReaction(channel, reactionEnabled) { if (channel.isOpenChannel()) { return false; } if (channel.isGroupChannel()) { if (channel.isBroadcast) return false; if (channel.isEphemeral) return false; if (channel.isChatNotification) return false; } return reactionEnabled; } export function getReactionCount(reaction) { return reaction.count; } const fileIconMapper = { 'audio': 'file-audio', 'image': 'photo', 'video': 'play', 'file': 'file-document' }; export function getFileTypeFromMessage(message) { return getFileType(message.type || getFileExtension(message.name)); } export const convertFileTypeToMessageType = (fileType = 'file') => { switch (fileType) { case 'audio': case 'image': case 'video': return `file.${fileType}`; case 'file': return fileType; } }; export const getFileIconFromMessageType = messageType => { switch (messageType) { case 'file': return fileIconMapper['file']; case 'file.image': return fileIconMapper['image']; case 'file.video': return fileIconMapper['video']; case 'file.audio': return fileIconMapper['audio']; default: return fileIconMapper['file']; } }; export const getFileIconFromMessage = message => { const fileType = getFileTypeFromMessage(message); const messageType = convertFileTypeToMessageType(fileType); return getFileIconFromMessageType(messageType); }; export function getMessageType(message) { if (message.isAdminMessage()) { return 'admin'; } if (message.isUserMessage()) { if (message.ogMetaData) { return 'user.opengraph'; } return 'user'; } if (message.isFileMessage()) { if (isVoiceMessage(message)) { return 'file.voice'; } const fileType = getFileTypeFromMessage(message); switch (fileType) { case 'image': case 'video': { return `file.${fileType}`; } case 'audio': { return `file.${fileType}`; } default: { return 'file'; } } } return 'unknown'; } export function getDefaultMessageSearchQueryParams(channel, keyword) { return { keyword, channelUrl: channel.url, messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt), order: MessageSearchOrder.TIMESTAMP }; } const SBU_MIME_PARAM_KEY = 'sbu_type'; const SBU_MIME_PARAM_VOICE_MESSAGE_VALUE = 'voice'; export function isVoiceMessage(message) { if (!message.isFileMessage()) return false; const { parameters } = parseMimeType(message.type); return !!parameters[SBU_MIME_PARAM_KEY] && parameters[SBU_MIME_PARAM_KEY] === SBU_MIME_PARAM_VOICE_MESSAGE_VALUE; } export function getVoiceMessageFileObject(uri, extension = 'm4a') { return { uri, type: getVoiceMessageMimeType(extension), name: `Voice_message.${extension}`, size: 0 }; } export function getVoiceMessageMimeType(extension = 'm4a') { return `audio/${extension};${SBU_MIME_PARAM_KEY}=${SBU_MIME_PARAM_VOICE_MESSAGE_VALUE}`; } //# sourceMappingURL=message.js.map