@sendbird/uikit-utils 3.5.4 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,12 +69,14 @@ function hasSameSender(a, b) {
69
69
  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);
70
70
  return false;
71
71
  }
72
- function calcMessageGrouping(groupEnabled, curr, prev, next) {
72
+ function calcMessageGrouping(groupEnabled, curr, prev, next, isReplyThreadType, hasParentMessageUI) {
73
73
  const getPrev = () => {
74
74
  if (!groupEnabled) return false;
75
75
  if (!prev) return false;
76
76
  if (curr.isAdminMessage()) return false;
77
77
  if (!hasSameSender(curr, prev)) return false;
78
+ if (hasParentMessageUI && curr.parentMessageId) return false;
79
+ if (isReplyThreadType && curr.threadInfo) return false;
78
80
  if ((0, _common.getMessageTimeFormat)(new Date(curr.createdAt)) !== (0, _common.getMessageTimeFormat)(new Date(prev.createdAt))) return false;
79
81
  return true;
80
82
  };
@@ -83,6 +85,8 @@ function calcMessageGrouping(groupEnabled, curr, prev, next) {
83
85
  if (!next) return false;
84
86
  if (curr.isAdminMessage()) return false;
85
87
  if (!hasSameSender(curr, next)) return false;
88
+ if (hasParentMessageUI && curr.parentMessageId) return false;
89
+ if (isReplyThreadType && curr.threadInfo) return false;
86
90
  if ((0, _common.getMessageTimeFormat)(new Date(curr.createdAt)) !== (0, _common.getMessageTimeFormat)(new Date(next.createdAt))) return false;
87
91
  return true;
88
92
  };
@@ -120,6 +124,8 @@ function parseSendbirdNotification(dataPayload) {
120
124
  }
121
125
  function shouldRenderParentMessage(message) {
122
126
  var _message$parentMessag, _message$parentMessag2;
127
+ let hide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
128
+ if (hide) return false;
123
129
  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()));
124
130
  }
125
131
  function shouldRenderReaction(channel, reactionEnabled) {
@@ -1 +1 @@
1
- {"version":3,"names":["_message","require","_file","_common","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","_msg$sender","arguments","length","sender","userId","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","sendingStatus","Number","MAX_SAFE_INTEGER","createdAt","hasSameSender","_a$sender","_b$sender","calcMessageGrouping","groupEnabled","curr","prev","next","getPrev","getMessageTimeFormat","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getThumbnailUriFromFileMessage","thumbnails","url","getAvailableUriFromFileMessage","_message$messageParam","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderParentMessage","_message$parentMessag","_message$parentMessag2","parentMessage","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isEphemeral","isChatNotification","getReactionCount","reaction","userIds","fileIconMapper","getFileTypeFromMessage","getFileType","type","getFileExtension","name","convertFileTypeToMessageType","fileType","exports","getFileIconFromMessageType","messageType","getFileIconFromMessage","getMessageType","ogMetaData","isVoiceMessage","getDefaultMessageSearchQueryParams","keyword","channelUrl","messageTimestampFrom","Math","max","joinedAt","invitedAt","order","MessageSearchOrder","TIMESTAMP","SBU_MIME_PARAM_KEY","SBU_MIME_PARAM_VOICE_MESSAGE_VALUE","parameters","parseMimeType","getVoiceMessageFileObject","extension","getVoiceMessageMimeType","size"],"sources":["message.ts"],"sourcesContent":["import { MessageSearchOrder } from '@sendbird/chat/message';\n\nimport { getFileExtension, getFileType, parseMimeType } from '../shared/file';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n SendbirdUserMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(\n msg?: SendbirdMessage | null,\n currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##',\n): msg is SendbirdSendableMessage {\n if (!isSendableMessage(msg)) return false;\n return msg.sender?.userId === currentUserId;\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = Number.MAX_SAFE_INTEGER;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = Number.MAX_SAFE_INTEGER;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getThumbnailUriFromFileMessage(message: SendbirdFileMessage) {\n if (message.thumbnails && message.thumbnails.length > 0) {\n return message.thumbnails[0].url;\n }\n\n return getAvailableUriFromFileMessage(message);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams?.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderParentMessage(message: SendbirdMessage): message is (\n | SendbirdUserMessage\n | SendbirdFileMessage\n) & {\n parentMessage: SendbirdUserMessage | SendbirdFileMessage;\n} {\n return !!(\n (message.isFileMessage() || message.isUserMessage()) &&\n (message.parentMessage?.isFileMessage() || message.parentMessage?.isUserMessage())\n );\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isEphemeral) return false;\n if (channel.isChatNotification) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\nexport type MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio' | 'voice'}`;\n\nexport type FileType = 'file' | 'image' | 'audio' | 'video';\n\nconst fileIconMapper = {\n 'audio': 'file-audio',\n 'image': 'photo',\n 'video': 'play',\n 'file': 'file-document',\n} as const;\n\ntype ValueOf<T> = T[keyof T];\nexport type FileIcon = ValueOf<typeof fileIconMapper>;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage): FileType {\n return getFileType(message.type || getFileExtension(message.name));\n}\nexport const convertFileTypeToMessageType = (fileType: FileType = 'file'): MessageType => {\n switch (fileType) {\n case 'audio':\n case 'image':\n case 'video':\n return `file.${fileType}`;\n case 'file':\n return fileType;\n }\n};\nexport const getFileIconFromMessageType = (messageType: MessageType): FileIcon => {\n switch (messageType) {\n case 'file':\n return fileIconMapper['file'];\n case 'file.image':\n return fileIconMapper['image'];\n case 'file.video':\n return fileIconMapper['video'];\n case 'file.audio':\n return fileIconMapper['audio'];\n default:\n return fileIconMapper['file'];\n }\n};\nexport const getFileIconFromMessage = (message: SendbirdFileMessage): FileIcon => {\n const fileType = getFileTypeFromMessage(message);\n const messageType = convertFileTypeToMessageType(fileType);\n return getFileIconFromMessageType(messageType);\n};\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n if (isVoiceMessage(message)) {\n return 'file.voice';\n }\n\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n\nexport function getDefaultMessageSearchQueryParams(channel: SendbirdGroupChannel, keyword: string) {\n return {\n keyword,\n channelUrl: channel.url,\n messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),\n order: MessageSearchOrder.TIMESTAMP,\n };\n}\n\nconst SBU_MIME_PARAM_KEY = 'sbu_type';\nconst SBU_MIME_PARAM_VOICE_MESSAGE_VALUE = 'voice';\n\nexport function isVoiceMessage(message: SendbirdMessage): message is SendbirdFileMessage {\n if (!message.isFileMessage()) return false;\n\n const { parameters } = parseMimeType(message.type);\n return !!parameters[SBU_MIME_PARAM_KEY] && parameters[SBU_MIME_PARAM_KEY] === SBU_MIME_PARAM_VOICE_MESSAGE_VALUE;\n}\n\nexport function getVoiceMessageFileObject(uri: string, extension = 'm4a') {\n return {\n uri,\n type: getVoiceMessageMimeType(extension),\n name: `Voice_message.${extension}`,\n size: 0,\n };\n}\n\nexport function getVoiceMessageMimeType(extension = 'm4a') {\n return `audio/${extension};${SBU_MIME_PARAM_KEY}=${SBU_MIME_PARAM_VOICE_MESSAGE_VALUE}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_message","require","_file","_common","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","_msg$sender","arguments","length","sender","userId","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","sendingStatus","Number","MAX_SAFE_INTEGER","createdAt","hasSameSender","_a$sender","_b$sender","calcMessageGrouping","groupEnabled","curr","prev","next","isReplyThreadType","hasParentMessageUI","getPrev","parentMessageId","threadInfo","getMessageTimeFormat","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getThumbnailUriFromFileMessage","thumbnails","url","getAvailableUriFromFileMessage","_message$messageParam","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderParentMessage","_message$parentMessag","_message$parentMessag2","hide","parentMessage","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isEphemeral","isChatNotification","getReactionCount","reaction","userIds","fileIconMapper","getFileTypeFromMessage","getFileType","type","getFileExtension","name","convertFileTypeToMessageType","fileType","exports","getFileIconFromMessageType","messageType","getFileIconFromMessage","getMessageType","ogMetaData","isVoiceMessage","getDefaultMessageSearchQueryParams","keyword","channelUrl","messageTimestampFrom","Math","max","joinedAt","invitedAt","order","MessageSearchOrder","TIMESTAMP","SBU_MIME_PARAM_KEY","SBU_MIME_PARAM_VOICE_MESSAGE_VALUE","parameters","parseMimeType","getVoiceMessageFileObject","extension","getVoiceMessageMimeType","size"],"sources":["message.ts"],"sourcesContent":["import { MessageSearchOrder } from '@sendbird/chat/message';\n\nimport { getFileExtension, getFileType, parseMimeType } from '../shared/file';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n SendbirdUserMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(\n msg?: SendbirdMessage | null,\n currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##',\n): msg is SendbirdSendableMessage {\n if (!isSendableMessage(msg)) return false;\n return msg.sender?.userId === currentUserId;\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = Number.MAX_SAFE_INTEGER;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = Number.MAX_SAFE_INTEGER;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n isReplyThreadType?: boolean,\n hasParentMessageUI?: boolean,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (hasParentMessageUI && curr.parentMessageId) return false;\n if (isReplyThreadType && curr.threadInfo) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (hasParentMessageUI && curr.parentMessageId) return false;\n if (isReplyThreadType && curr.threadInfo) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getThumbnailUriFromFileMessage(message: SendbirdFileMessage) {\n if (message.thumbnails && message.thumbnails.length > 0) {\n return message.thumbnails[0].url;\n }\n\n return getAvailableUriFromFileMessage(message);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams?.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderParentMessage(\n message: SendbirdMessage,\n hide = false,\n): message is (SendbirdUserMessage | SendbirdFileMessage) & {\n parentMessage: SendbirdUserMessage | SendbirdFileMessage;\n} {\n if (hide) return false;\n return !!(\n (message.isFileMessage() || message.isUserMessage()) &&\n (message.parentMessage?.isFileMessage() || message.parentMessage?.isUserMessage())\n );\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isEphemeral) return false;\n if (channel.isChatNotification) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\nexport type MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio' | 'voice'}`;\n\nexport type FileType = 'file' | 'image' | 'audio' | 'video';\n\nconst fileIconMapper = {\n 'audio': 'file-audio',\n 'image': 'photo',\n 'video': 'play',\n 'file': 'file-document',\n} as const;\n\ntype ValueOf<T> = T[keyof T];\nexport type FileIcon = ValueOf<typeof fileIconMapper>;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage): FileType {\n return getFileType(message.type || getFileExtension(message.name));\n}\nexport const convertFileTypeToMessageType = (fileType: FileType = 'file'): MessageType => {\n switch (fileType) {\n case 'audio':\n case 'image':\n case 'video':\n return `file.${fileType}`;\n case 'file':\n return fileType;\n }\n};\nexport const getFileIconFromMessageType = (messageType: MessageType): FileIcon => {\n switch (messageType) {\n case 'file':\n return fileIconMapper['file'];\n case 'file.image':\n return fileIconMapper['image'];\n case 'file.video':\n return fileIconMapper['video'];\n case 'file.audio':\n return fileIconMapper['audio'];\n default:\n return fileIconMapper['file'];\n }\n};\nexport const getFileIconFromMessage = (message: SendbirdFileMessage): FileIcon => {\n const fileType = getFileTypeFromMessage(message);\n const messageType = convertFileTypeToMessageType(fileType);\n return getFileIconFromMessageType(messageType);\n};\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n if (isVoiceMessage(message)) {\n return 'file.voice';\n }\n\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n\nexport function getDefaultMessageSearchQueryParams(channel: SendbirdGroupChannel, keyword: string) {\n return {\n keyword,\n channelUrl: channel.url,\n messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),\n order: MessageSearchOrder.TIMESTAMP,\n };\n}\n\nconst SBU_MIME_PARAM_KEY = 'sbu_type';\nconst SBU_MIME_PARAM_VOICE_MESSAGE_VALUE = 'voice';\n\nexport function isVoiceMessage(message: SendbirdMessage): message is SendbirdFileMessage {\n if (!message.isFileMessage()) return false;\n\n const { parameters } = parseMimeType(message.type);\n return !!parameters[SBU_MIME_PARAM_KEY] && parameters[SBU_MIME_PARAM_KEY] === SBU_MIME_PARAM_VOICE_MESSAGE_VALUE;\n}\n\nexport function getVoiceMessageFileObject(uri: string, extension = 'm4a') {\n return {\n uri,\n type: getVoiceMessageMimeType(extension),\n name: `Voice_message.${extension}`,\n size: 0,\n };\n}\n\nexport function getVoiceMessageMimeType(extension = 'm4a') {\n return `audio/${extension};${SBU_MIME_PARAM_KEY}=${SBU_MIME_PARAM_VOICE_MESSAGE_VALUE}`;\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.truncatedCount = exports.truncate = exports.millsToMSS = exports.millsToMMSS = exports.getMessageTimeFormat = exports.getMessagePreviewTitle = exports.getMessagePreviewTime = exports.getMessagePreviewBody = exports.getDateSeparatorFormat = void 0;
6
+ exports.truncatedCount = exports.truncate = exports.millsToMSS = exports.millsToMMSS = exports.getThreadParentMessageTimeFormat = exports.getReplyCountFormat = exports.getReadableFileSize = exports.getMessageTimeFormat = exports.getMessagePreviewTitle = exports.getMessagePreviewTime = exports.getMessagePreviewBody = exports.getDateSeparatorFormat = void 0;
7
7
  var _dateFns = require("date-fns");
8
8
  const defaultOpts = {
9
9
  mode: 'mid',
@@ -174,5 +174,53 @@ const millsToMSS = mills => {
174
174
  const ss = String(seconds).padStart(2, '0');
175
175
  return `${minutes}:${ss}`;
176
176
  };
177
+
178
+ /**
179
+ * Message reply count format
180
+ * If reply count is 1: 1 'reply'
181
+ * If the reply count is greater than 1 : '{count} replies'
182
+ * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'
183
+ * */
177
184
  exports.millsToMSS = millsToMSS;
185
+ const getReplyCountFormat = (replyCount, maxReplyCount) => {
186
+ if (maxReplyCount && replyCount > maxReplyCount) {
187
+ return `${maxReplyCount}+ replies`;
188
+ } else if (replyCount === 1) {
189
+ return `${replyCount} reply`;
190
+ } else if (replyCount > 1) {
191
+ return `${replyCount} replies`;
192
+ }
193
+ return '';
194
+ };
195
+
196
+ /**
197
+ * Thread parent message time format
198
+ *
199
+ * @param {Date} date
200
+ * @param {Locale} [locale]
201
+ * @returns {string}
202
+ * */
203
+ exports.getReplyCountFormat = getReplyCountFormat;
204
+ const getThreadParentMessageTimeFormat = (date, locale) => {
205
+ return (0, _dateFns.format)(date, "MMM dd 'at' h:mm a", {
206
+ locale
207
+ });
208
+ };
209
+
210
+ /**
211
+ * File size format
212
+ *
213
+ * @param {number} fileSize
214
+ * @returns {string}
215
+ * */
216
+ exports.getThreadParentMessageTimeFormat = getThreadParentMessageTimeFormat;
217
+ const getReadableFileSize = fileSize => {
218
+ if (fileSize <= 0) {
219
+ return '0 B';
220
+ }
221
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
222
+ const digitGroups = Math.floor(Math.log10(fileSize) / Math.log10(1024));
223
+ return `${(fileSize / Math.pow(1024, digitGroups)).toFixed(1)} ${units[digitGroups]}`;
224
+ };
225
+ exports.getReadableFileSize = getReadableFileSize;
178
226
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_dateFns","require","defaultOpts","mode","maxLen","separator","truncate","str","opts","arguments","length","undefined","options","slice","lead","Math","ceil","trail","floor","Error","exports","truncatedCount","count","MAX","MAX_SUFFIX","getDateSeparatorFormat","date","locale","isThisYear","format","getMessageTimeFormat","getMessagePreviewTitle","message","EMPTY_USERNAME","isFileMessage","isUserMessage","sender","nickname","isAdminMessage","getMessagePreviewBody","EMPTY_MESSAGE","extIdx","name","lastIndexOf","file","ext","getMessagePreviewTime","timestamp","isToday","isYesterday","millsToMMSS","mills","seconds","max","minutes","mm","String","padStart","ss","millsToMSS"],"sources":["common.ts"],"sourcesContent":["import type { Locale } from 'date-fns';\nimport { format, isThisYear, isToday, isYesterday } from 'date-fns';\n\nimport type { SendbirdBaseMessage } from '../types';\n\ntype TruncateMode = 'head' | 'mid' | 'tail';\ntype TruncateOption = { mode: TruncateMode; maxLen: number; separator: string };\nconst defaultOpts: TruncateOption = { mode: 'mid', maxLen: 40, separator: '...' };\n\n/**\n * String truncate util\n * @param {string} str\n * @param {Object} opts Options for truncate\n * @param {'head' | 'mid' | 'tail'} opts.mode default \"mid\"\n * @param {number} opts.maxLen default 40\n * @param {string} opts.separator default \"...\"\n * @returns {string}\n * */\nexport const truncate = (str: string, opts: Partial<TruncateOption> = defaultOpts): string => {\n const options = { ...defaultOpts, ...opts };\n const { maxLen, mode, separator } = options;\n\n if (str.length <= maxLen) return str;\n\n if (mode === 'head') {\n return separator + str.slice(-maxLen);\n }\n\n if (mode === 'mid') {\n const lead = Math.ceil(maxLen / 2);\n const trail = Math.floor(maxLen / 2);\n return str.slice(0, lead) + separator + str.slice(-trail);\n }\n\n if (mode === 'tail') {\n return str.slice(0, maxLen) + separator;\n }\n\n throw new Error('Invalid truncate mode: ' + mode);\n};\n\n/**\n * Count truncate util\n * If count exceed the limit, it comes in the form of \"MAX+\"\n *\n * @param {number} count\n * @param {number} MAX default 99\n * @param {string} MAX_SUFFIX default +\n * @returns {string}\n * */\nexport const truncatedCount = (count: number, MAX = 99, MAX_SUFFIX = '+') => {\n if (count >= MAX) return `${MAX}${MAX_SUFFIX}`;\n return `${count}`;\n};\n\n/**\n * Messages date separator format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getDateSeparatorFormat = (date: Date, locale?: Locale): string => {\n if (isThisYear(date)) return format(date, 'MMM dd, yyyy', { locale });\n return format(date, 'E, MMM dd', { locale });\n};\n\n/**\n * Message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, 'p', { locale });\n};\n\n/**\n * Message preview title text\n * */\nexport const getMessagePreviewTitle = (message: SendbirdBaseMessage, EMPTY_USERNAME = '(No name)') => {\n if (message.isFileMessage() || message.isUserMessage()) {\n return message.sender.nickname || EMPTY_USERNAME;\n }\n if (message.isAdminMessage()) {\n return 'Admin';\n }\n return EMPTY_USERNAME;\n};\n\n/**\n * Message preview body text\n * */\nexport const getMessagePreviewBody = (message: SendbirdBaseMessage, EMPTY_MESSAGE = '') => {\n if (message.isFileMessage()) {\n const extIdx = message.name.lastIndexOf('.');\n if (extIdx > -1) {\n const file = message.name.slice(0, extIdx);\n const ext = message.name.slice(extIdx);\n return file + ext;\n }\n\n return message.name;\n }\n\n if (message.isUserMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n if (message.isAdminMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n return EMPTY_MESSAGE;\n};\n\n/**\n * Message preview time format\n * */\nexport const getMessagePreviewTime = (timestamp: number, locale?: Locale) => {\n if (isToday(timestamp)) return format(timestamp, 'p', { locale });\n if (isYesterday(timestamp)) return 'Yesterday';\n if (isThisYear(timestamp)) return format(timestamp, 'MMM dd', { locale });\n\n return format(timestamp, 'yyyy/MM/dd', { locale });\n};\n\n/**\n * milliseconds to 00:00 format\n * */\nexport const millsToMMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n\n return `${mm}:${ss}`;\n};\n\n/**\n * milliseconds to 0:00 format\n * */\nexport const millsToMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const ss = String(seconds).padStart(2, '0');\n\n return `${minutes}:${ss}`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_dateFns","require","defaultOpts","mode","maxLen","separator","truncate","str","opts","arguments","length","undefined","options","slice","lead","Math","ceil","trail","floor","Error","exports","truncatedCount","count","MAX","MAX_SUFFIX","getDateSeparatorFormat","date","locale","isThisYear","format","getMessageTimeFormat","getMessagePreviewTitle","message","EMPTY_USERNAME","isFileMessage","isUserMessage","sender","nickname","isAdminMessage","getMessagePreviewBody","EMPTY_MESSAGE","extIdx","name","lastIndexOf","file","ext","getMessagePreviewTime","timestamp","isToday","isYesterday","millsToMMSS","mills","seconds","max","minutes","mm","String","padStart","ss","millsToMSS","getReplyCountFormat","replyCount","maxReplyCount","getThreadParentMessageTimeFormat","getReadableFileSize","fileSize","units","digitGroups","log10","pow","toFixed"],"sources":["common.ts"],"sourcesContent":["import type { Locale } from 'date-fns';\nimport { format, isThisYear, isToday, isYesterday } from 'date-fns';\n\nimport type { SendbirdBaseMessage } from '../types';\n\ntype TruncateMode = 'head' | 'mid' | 'tail';\ntype TruncateOption = { mode: TruncateMode; maxLen: number; separator: string };\nconst defaultOpts: TruncateOption = { mode: 'mid', maxLen: 40, separator: '...' };\n\n/**\n * String truncate util\n * @param {string} str\n * @param {Object} opts Options for truncate\n * @param {'head' | 'mid' | 'tail'} opts.mode default \"mid\"\n * @param {number} opts.maxLen default 40\n * @param {string} opts.separator default \"...\"\n * @returns {string}\n * */\nexport const truncate = (str: string, opts: Partial<TruncateOption> = defaultOpts): string => {\n const options = { ...defaultOpts, ...opts };\n const { maxLen, mode, separator } = options;\n\n if (str.length <= maxLen) return str;\n\n if (mode === 'head') {\n return separator + str.slice(-maxLen);\n }\n\n if (mode === 'mid') {\n const lead = Math.ceil(maxLen / 2);\n const trail = Math.floor(maxLen / 2);\n return str.slice(0, lead) + separator + str.slice(-trail);\n }\n\n if (mode === 'tail') {\n return str.slice(0, maxLen) + separator;\n }\n\n throw new Error('Invalid truncate mode: ' + mode);\n};\n\n/**\n * Count truncate util\n * If count exceed the limit, it comes in the form of \"MAX+\"\n *\n * @param {number} count\n * @param {number} MAX default 99\n * @param {string} MAX_SUFFIX default +\n * @returns {string}\n * */\nexport const truncatedCount = (count: number, MAX = 99, MAX_SUFFIX = '+') => {\n if (count >= MAX) return `${MAX}${MAX_SUFFIX}`;\n return `${count}`;\n};\n\n/**\n * Messages date separator format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getDateSeparatorFormat = (date: Date, locale?: Locale): string => {\n if (isThisYear(date)) return format(date, 'MMM dd, yyyy', { locale });\n return format(date, 'E, MMM dd', { locale });\n};\n\n/**\n * Message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, 'p', { locale });\n};\n\n/**\n * Message preview title text\n * */\nexport const getMessagePreviewTitle = (message: SendbirdBaseMessage, EMPTY_USERNAME = '(No name)') => {\n if (message.isFileMessage() || message.isUserMessage()) {\n return message.sender.nickname || EMPTY_USERNAME;\n }\n if (message.isAdminMessage()) {\n return 'Admin';\n }\n return EMPTY_USERNAME;\n};\n\n/**\n * Message preview body text\n * */\nexport const getMessagePreviewBody = (message: SendbirdBaseMessage, EMPTY_MESSAGE = '') => {\n if (message.isFileMessage()) {\n const extIdx = message.name.lastIndexOf('.');\n if (extIdx > -1) {\n const file = message.name.slice(0, extIdx);\n const ext = message.name.slice(extIdx);\n return file + ext;\n }\n\n return message.name;\n }\n\n if (message.isUserMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n if (message.isAdminMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n return EMPTY_MESSAGE;\n};\n\n/**\n * Message preview time format\n * */\nexport const getMessagePreviewTime = (timestamp: number, locale?: Locale) => {\n if (isToday(timestamp)) return format(timestamp, 'p', { locale });\n if (isYesterday(timestamp)) return 'Yesterday';\n if (isThisYear(timestamp)) return format(timestamp, 'MMM dd', { locale });\n\n return format(timestamp, 'yyyy/MM/dd', { locale });\n};\n\n/**\n * milliseconds to 00:00 format\n * */\nexport const millsToMMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n\n return `${mm}:${ss}`;\n};\n\n/**\n * milliseconds to 0:00 format\n * */\nexport const millsToMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const ss = String(seconds).padStart(2, '0');\n\n return `${minutes}:${ss}`;\n};\n\n/**\n * Message reply count format\n * If reply count is 1: 1 'reply'\n * If the reply count is greater than 1 : '{count} replies'\n * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'\n * */\nexport const getReplyCountFormat = (replyCount: number, maxReplyCount?: number) => {\n if (maxReplyCount && replyCount > maxReplyCount) {\n return `${maxReplyCount}+ replies`;\n } else if (replyCount === 1) {\n return `${replyCount} reply`;\n } else if (replyCount > 1) {\n return `${replyCount} replies`;\n }\n return '';\n};\n\n/**\n * Thread parent message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getThreadParentMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, \"MMM dd 'at' h:mm a\", { locale });\n};\n\n/**\n * File size format\n *\n * @param {number} fileSize\n * @returns {string}\n * */\nexport const getReadableFileSize = (fileSize: number): string => {\n if (fileSize <= 0) {\n return '0 B';\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const digitGroups = Math.floor(Math.log10(fileSize) / Math.log10(1024));\n return `${(fileSize / Math.pow(1024, digitGroups)).toFixed(1)} ${units[digitGroups]}`;\n};\n"],"mappings":"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"}
@@ -41,12 +41,14 @@ export function hasSameSender(a, b) {
41
41
  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);
42
42
  return false;
43
43
  }
44
- export function calcMessageGrouping(groupEnabled, curr, prev, next) {
44
+ export function calcMessageGrouping(groupEnabled, curr, prev, next, isReplyThreadType, hasParentMessageUI) {
45
45
  const getPrev = () => {
46
46
  if (!groupEnabled) return false;
47
47
  if (!prev) return false;
48
48
  if (curr.isAdminMessage()) return false;
49
49
  if (!hasSameSender(curr, prev)) return false;
50
+ if (hasParentMessageUI && curr.parentMessageId) return false;
51
+ if (isReplyThreadType && curr.threadInfo) return false;
50
52
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;
51
53
  return true;
52
54
  };
@@ -55,6 +57,8 @@ export function calcMessageGrouping(groupEnabled, curr, prev, next) {
55
57
  if (!next) return false;
56
58
  if (curr.isAdminMessage()) return false;
57
59
  if (!hasSameSender(curr, next)) return false;
60
+ if (hasParentMessageUI && curr.parentMessageId) return false;
61
+ if (isReplyThreadType && curr.threadInfo) return false;
58
62
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;
59
63
  return true;
60
64
  };
@@ -92,6 +96,8 @@ export function parseSendbirdNotification(dataPayload) {
92
96
  }
93
97
  export function shouldRenderParentMessage(message) {
94
98
  var _message$parentMessag, _message$parentMessag2;
99
+ let hide = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
100
+ if (hide) return false;
95
101
  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()));
96
102
  }
97
103
  export function shouldRenderReaction(channel, reactionEnabled) {
@@ -1 +1 @@
1
- {"version":3,"names":["MessageSearchOrder","getFileExtension","getFileType","parseMimeType","getMessageTimeFormat","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","_msg$sender","arguments","length","sender","userId","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","sendingStatus","Number","MAX_SAFE_INTEGER","createdAt","hasSameSender","_a$sender","_b$sender","calcMessageGrouping","groupEnabled","curr","prev","next","getPrev","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getThumbnailUriFromFileMessage","thumbnails","url","getAvailableUriFromFileMessage","_message$messageParam","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderParentMessage","_message$parentMessag","_message$parentMessag2","parentMessage","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isEphemeral","isChatNotification","getReactionCount","reaction","userIds","fileIconMapper","getFileTypeFromMessage","type","name","convertFileTypeToMessageType","fileType","getFileIconFromMessageType","messageType","getFileIconFromMessage","getMessageType","ogMetaData","isVoiceMessage","getDefaultMessageSearchQueryParams","keyword","channelUrl","messageTimestampFrom","Math","max","joinedAt","invitedAt","order","TIMESTAMP","SBU_MIME_PARAM_KEY","SBU_MIME_PARAM_VOICE_MESSAGE_VALUE","parameters","getVoiceMessageFileObject","extension","getVoiceMessageMimeType","size"],"sources":["message.ts"],"sourcesContent":["import { MessageSearchOrder } from '@sendbird/chat/message';\n\nimport { getFileExtension, getFileType, parseMimeType } from '../shared/file';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n SendbirdUserMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(\n msg?: SendbirdMessage | null,\n currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##',\n): msg is SendbirdSendableMessage {\n if (!isSendableMessage(msg)) return false;\n return msg.sender?.userId === currentUserId;\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = Number.MAX_SAFE_INTEGER;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = Number.MAX_SAFE_INTEGER;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getThumbnailUriFromFileMessage(message: SendbirdFileMessage) {\n if (message.thumbnails && message.thumbnails.length > 0) {\n return message.thumbnails[0].url;\n }\n\n return getAvailableUriFromFileMessage(message);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams?.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderParentMessage(message: SendbirdMessage): message is (\n | SendbirdUserMessage\n | SendbirdFileMessage\n) & {\n parentMessage: SendbirdUserMessage | SendbirdFileMessage;\n} {\n return !!(\n (message.isFileMessage() || message.isUserMessage()) &&\n (message.parentMessage?.isFileMessage() || message.parentMessage?.isUserMessage())\n );\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isEphemeral) return false;\n if (channel.isChatNotification) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\nexport type MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio' | 'voice'}`;\n\nexport type FileType = 'file' | 'image' | 'audio' | 'video';\n\nconst fileIconMapper = {\n 'audio': 'file-audio',\n 'image': 'photo',\n 'video': 'play',\n 'file': 'file-document',\n} as const;\n\ntype ValueOf<T> = T[keyof T];\nexport type FileIcon = ValueOf<typeof fileIconMapper>;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage): FileType {\n return getFileType(message.type || getFileExtension(message.name));\n}\nexport const convertFileTypeToMessageType = (fileType: FileType = 'file'): MessageType => {\n switch (fileType) {\n case 'audio':\n case 'image':\n case 'video':\n return `file.${fileType}`;\n case 'file':\n return fileType;\n }\n};\nexport const getFileIconFromMessageType = (messageType: MessageType): FileIcon => {\n switch (messageType) {\n case 'file':\n return fileIconMapper['file'];\n case 'file.image':\n return fileIconMapper['image'];\n case 'file.video':\n return fileIconMapper['video'];\n case 'file.audio':\n return fileIconMapper['audio'];\n default:\n return fileIconMapper['file'];\n }\n};\nexport const getFileIconFromMessage = (message: SendbirdFileMessage): FileIcon => {\n const fileType = getFileTypeFromMessage(message);\n const messageType = convertFileTypeToMessageType(fileType);\n return getFileIconFromMessageType(messageType);\n};\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n if (isVoiceMessage(message)) {\n return 'file.voice';\n }\n\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n\nexport function getDefaultMessageSearchQueryParams(channel: SendbirdGroupChannel, keyword: string) {\n return {\n keyword,\n channelUrl: channel.url,\n messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),\n order: MessageSearchOrder.TIMESTAMP,\n };\n}\n\nconst SBU_MIME_PARAM_KEY = 'sbu_type';\nconst SBU_MIME_PARAM_VOICE_MESSAGE_VALUE = 'voice';\n\nexport function isVoiceMessage(message: SendbirdMessage): message is SendbirdFileMessage {\n if (!message.isFileMessage()) return false;\n\n const { parameters } = parseMimeType(message.type);\n return !!parameters[SBU_MIME_PARAM_KEY] && parameters[SBU_MIME_PARAM_KEY] === SBU_MIME_PARAM_VOICE_MESSAGE_VALUE;\n}\n\nexport function getVoiceMessageFileObject(uri: string, extension = 'm4a') {\n return {\n uri,\n type: getVoiceMessageMimeType(extension),\n name: `Voice_message.${extension}`,\n size: 0,\n };\n}\n\nexport function getVoiceMessageMimeType(extension = 'm4a') {\n return `audio/${extension};${SBU_MIME_PARAM_KEY}=${SBU_MIME_PARAM_VOICE_MESSAGE_VALUE}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["MessageSearchOrder","getFileExtension","getFileType","parseMimeType","getMessageTimeFormat","isNewMessage","msg","currentUserId","myMessage","isMyMessage","isAdminMessage","updatedAt","isSendableMessage","undefined","_msg$sender","arguments","length","sender","userId","messageKeyExtractor","message","getMessageUniqId","messageComparator","a","b","aStatusOffset","bStatusOffset","sendingStatus","Number","MAX_SAFE_INTEGER","createdAt","hasSameSender","_a$sender","_b$sender","calcMessageGrouping","groupEnabled","curr","prev","next","isReplyThreadType","hasParentMessageUI","getPrev","parentMessageId","threadInfo","Date","getNext","groupWithPrev","groupWithNext","isUserMessage","isFileMessage","String","messageId","reqId","getThumbnailUriFromFileMessage","thumbnails","url","getAvailableUriFromFileMessage","_message$messageParam","messageParams","file","uri","isSendbirdNotification","dataPayload","Boolean","parseSendbirdNotification","sendbird","JSON","parse","shouldRenderParentMessage","_message$parentMessag","_message$parentMessag2","hide","parentMessage","shouldRenderReaction","channel","reactionEnabled","isOpenChannel","isGroupChannel","isBroadcast","isEphemeral","isChatNotification","getReactionCount","reaction","userIds","fileIconMapper","getFileTypeFromMessage","type","name","convertFileTypeToMessageType","fileType","getFileIconFromMessageType","messageType","getFileIconFromMessage","getMessageType","ogMetaData","isVoiceMessage","getDefaultMessageSearchQueryParams","keyword","channelUrl","messageTimestampFrom","Math","max","joinedAt","invitedAt","order","TIMESTAMP","SBU_MIME_PARAM_KEY","SBU_MIME_PARAM_VOICE_MESSAGE_VALUE","parameters","getVoiceMessageFileObject","extension","getVoiceMessageMimeType","size"],"sources":["message.ts"],"sourcesContent":["import { MessageSearchOrder } from '@sendbird/chat/message';\n\nimport { getFileExtension, getFileType, parseMimeType } from '../shared/file';\nimport type {\n SendbirdBaseChannel,\n SendbirdBaseMessage,\n SendbirdDataPayload,\n SendbirdFileMessage,\n SendbirdGroupChannel,\n SendbirdMessage,\n SendbirdReaction,\n SendbirdSendableMessage,\n SendbirdUserMessage,\n} from '../types';\nimport { getMessageTimeFormat } from '../ui-format/common';\n\nexport function isNewMessage(msg: SendbirdMessage, currentUserId?: string) {\n const myMessage = isMyMessage(msg, currentUserId);\n if (myMessage) return false;\n if (msg.isAdminMessage()) return false;\n return msg.updatedAt === 0;\n}\n\nexport function isSendableMessage(msg?: SendbirdMessage | null): msg is SendbirdSendableMessage {\n return msg !== undefined && msg !== null && 'sendingStatus' in msg;\n}\n\nexport function isMyMessage(\n msg?: SendbirdMessage | null,\n currentUserId = '##__USER_ID_IS_NOT_PROVIDED__##',\n): msg is SendbirdSendableMessage {\n if (!isSendableMessage(msg)) return false;\n return msg.sender?.userId === currentUserId;\n}\n\nexport function messageKeyExtractor(message: SendbirdMessage): string {\n return getMessageUniqId(message);\n}\n\n// |-------------------|-------------------|-----------------|-------------------|\n// | sending status | reqId | messageId | createdAt |\n// |-------------------|-------------------|-----------------|-------------------|\n// | pending | timestamp(A) | 0 | timestamp(B) |\n// | canceled | timestamp(A) | 0 | ? |\n// | failed | timestamp(A) | 0 | ? |\n// | succeeded | timestamp(A) / '' | id from DB | timestamp(C) |\n// |-------------------|-------------------|-----------------|-------------------|\nexport function messageComparator(a: SendbirdMessage, b: SendbirdMessage) {\n let aStatusOffset = 0;\n let bStatusOffset = 0;\n\n if (isSendableMessage(a) && a.sendingStatus !== 'succeeded') aStatusOffset = Number.MAX_SAFE_INTEGER;\n if (isSendableMessage(b) && b.sendingStatus !== 'succeeded') bStatusOffset = Number.MAX_SAFE_INTEGER;\n\n return b.createdAt + bStatusOffset - (a.createdAt + aStatusOffset);\n}\n\nexport function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage) {\n if (!a || !b) return false;\n if ('sender' in a && 'sender' in b) return a.sender?.userId === b.sender?.userId;\n return false;\n}\n\nexport function calcMessageGrouping(\n groupEnabled: boolean,\n curr: SendbirdMessage,\n prev?: SendbirdMessage,\n next?: SendbirdMessage,\n isReplyThreadType?: boolean,\n hasParentMessageUI?: boolean,\n) {\n const getPrev = () => {\n if (!groupEnabled) return false;\n if (!prev) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, prev)) return false;\n if (hasParentMessageUI && curr.parentMessageId) return false;\n if (isReplyThreadType && curr.threadInfo) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;\n return true;\n };\n\n const getNext = () => {\n if (!groupEnabled) return false;\n if (!next) return false;\n if (curr.isAdminMessage()) return false;\n if (!hasSameSender(curr, next)) return false;\n if (hasParentMessageUI && curr.parentMessageId) return false;\n if (isReplyThreadType && curr.threadInfo) return false;\n if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;\n return true;\n };\n\n return { groupWithPrev: getPrev(), groupWithNext: getNext() };\n}\n\nexport function getMessageUniqId(msg: SendbirdBaseMessage) {\n if (msg.isUserMessage() || msg.isFileMessage()) {\n if (msg.sendingStatus === 'succeeded') return String(msg.messageId);\n return msg.reqId;\n }\n\n return String(msg.messageId);\n}\n\nexport function getThumbnailUriFromFileMessage(message: SendbirdFileMessage) {\n if (message.thumbnails && message.thumbnails.length > 0) {\n return message.thumbnails[0].url;\n }\n\n return getAvailableUriFromFileMessage(message);\n}\n\nexport function getAvailableUriFromFileMessage(message: SendbirdFileMessage) {\n if (!message.url && message.messageParams?.file && 'uri' in message.messageParams.file) {\n return message.messageParams.file.uri;\n }\n\n return message.url;\n}\n\ntype RawSendbirdDataPayload = { sendbird: string | object };\nexport function isSendbirdNotification(dataPayload?: {\n [key: string]: string | object;\n}): dataPayload is RawSendbirdDataPayload {\n if (!dataPayload) return false;\n return Boolean(dataPayload['sendbird']);\n}\n\nexport function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload {\n return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;\n}\n\nexport function shouldRenderParentMessage(\n message: SendbirdMessage,\n hide = false,\n): message is (SendbirdUserMessage | SendbirdFileMessage) & {\n parentMessage: SendbirdUserMessage | SendbirdFileMessage;\n} {\n if (hide) return false;\n return !!(\n (message.isFileMessage() || message.isUserMessage()) &&\n (message.parentMessage?.isFileMessage() || message.parentMessage?.isUserMessage())\n );\n}\n\nexport function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean) {\n if (channel.isOpenChannel()) {\n return false;\n }\n\n if (channel.isGroupChannel()) {\n if (channel.isBroadcast) return false;\n if (channel.isEphemeral) return false;\n if (channel.isChatNotification) return false;\n }\n\n return reactionEnabled;\n}\n\nexport function getReactionCount(reaction: SendbirdReaction) {\n return reaction.userIds.length;\n}\n\nexport type MessageType =\n | 'user'\n | 'admin'\n | 'file'\n | 'unknown'\n | `user.${'opengraph'}`\n | `file.${'image' | 'video' | 'audio' | 'voice'}`;\n\nexport type FileType = 'file' | 'image' | 'audio' | 'video';\n\nconst fileIconMapper = {\n 'audio': 'file-audio',\n 'image': 'photo',\n 'video': 'play',\n 'file': 'file-document',\n} as const;\n\ntype ValueOf<T> = T[keyof T];\nexport type FileIcon = ValueOf<typeof fileIconMapper>;\n\nexport function getFileTypeFromMessage(message: SendbirdFileMessage): FileType {\n return getFileType(message.type || getFileExtension(message.name));\n}\nexport const convertFileTypeToMessageType = (fileType: FileType = 'file'): MessageType => {\n switch (fileType) {\n case 'audio':\n case 'image':\n case 'video':\n return `file.${fileType}`;\n case 'file':\n return fileType;\n }\n};\nexport const getFileIconFromMessageType = (messageType: MessageType): FileIcon => {\n switch (messageType) {\n case 'file':\n return fileIconMapper['file'];\n case 'file.image':\n return fileIconMapper['image'];\n case 'file.video':\n return fileIconMapper['video'];\n case 'file.audio':\n return fileIconMapper['audio'];\n default:\n return fileIconMapper['file'];\n }\n};\nexport const getFileIconFromMessage = (message: SendbirdFileMessage): FileIcon => {\n const fileType = getFileTypeFromMessage(message);\n const messageType = convertFileTypeToMessageType(fileType);\n return getFileIconFromMessageType(messageType);\n};\n\nexport function getMessageType(message: SendbirdMessage): MessageType {\n if (message.isAdminMessage()) {\n return 'admin';\n }\n\n if (message.isUserMessage()) {\n if (message.ogMetaData) {\n return 'user.opengraph';\n }\n return 'user';\n }\n\n if (message.isFileMessage()) {\n if (isVoiceMessage(message)) {\n return 'file.voice';\n }\n\n const fileType = getFileTypeFromMessage(message);\n switch (fileType) {\n case 'image':\n case 'video': {\n return `file.${fileType}`;\n }\n case 'audio': {\n return `file.${fileType}`;\n }\n default: {\n return 'file';\n }\n }\n }\n\n return 'unknown';\n}\n\nexport function getDefaultMessageSearchQueryParams(channel: SendbirdGroupChannel, keyword: string) {\n return {\n keyword,\n channelUrl: channel.url,\n messageTimestampFrom: Math.max(channel.joinedAt, channel.invitedAt),\n order: MessageSearchOrder.TIMESTAMP,\n };\n}\n\nconst SBU_MIME_PARAM_KEY = 'sbu_type';\nconst SBU_MIME_PARAM_VOICE_MESSAGE_VALUE = 'voice';\n\nexport function isVoiceMessage(message: SendbirdMessage): message is SendbirdFileMessage {\n if (!message.isFileMessage()) return false;\n\n const { parameters } = parseMimeType(message.type);\n return !!parameters[SBU_MIME_PARAM_KEY] && parameters[SBU_MIME_PARAM_KEY] === SBU_MIME_PARAM_VOICE_MESSAGE_VALUE;\n}\n\nexport function getVoiceMessageFileObject(uri: string, extension = 'm4a') {\n return {\n uri,\n type: getVoiceMessageMimeType(extension),\n name: `Voice_message.${extension}`,\n size: 0,\n };\n}\n\nexport function getVoiceMessageMimeType(extension = 'm4a') {\n return `audio/${extension};${SBU_MIME_PARAM_KEY}=${SBU_MIME_PARAM_VOICE_MESSAGE_VALUE}`;\n}\n"],"mappings":"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"}
@@ -160,4 +160,49 @@ export const millsToMSS = mills => {
160
160
  const ss = String(seconds).padStart(2, '0');
161
161
  return `${minutes}:${ss}`;
162
162
  };
163
+
164
+ /**
165
+ * Message reply count format
166
+ * If reply count is 1: 1 'reply'
167
+ * If the reply count is greater than 1 : '{count} replies'
168
+ * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'
169
+ * */
170
+ export const getReplyCountFormat = (replyCount, maxReplyCount) => {
171
+ if (maxReplyCount && replyCount > maxReplyCount) {
172
+ return `${maxReplyCount}+ replies`;
173
+ } else if (replyCount === 1) {
174
+ return `${replyCount} reply`;
175
+ } else if (replyCount > 1) {
176
+ return `${replyCount} replies`;
177
+ }
178
+ return '';
179
+ };
180
+
181
+ /**
182
+ * Thread parent message time format
183
+ *
184
+ * @param {Date} date
185
+ * @param {Locale} [locale]
186
+ * @returns {string}
187
+ * */
188
+ export const getThreadParentMessageTimeFormat = (date, locale) => {
189
+ return format(date, "MMM dd 'at' h:mm a", {
190
+ locale
191
+ });
192
+ };
193
+
194
+ /**
195
+ * File size format
196
+ *
197
+ * @param {number} fileSize
198
+ * @returns {string}
199
+ * */
200
+ export const getReadableFileSize = fileSize => {
201
+ if (fileSize <= 0) {
202
+ return '0 B';
203
+ }
204
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
205
+ const digitGroups = Math.floor(Math.log10(fileSize) / Math.log10(1024));
206
+ return `${(fileSize / Math.pow(1024, digitGroups)).toFixed(1)} ${units[digitGroups]}`;
207
+ };
163
208
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["format","isThisYear","isToday","isYesterday","defaultOpts","mode","maxLen","separator","truncate","str","opts","arguments","length","undefined","options","slice","lead","Math","ceil","trail","floor","Error","truncatedCount","count","MAX","MAX_SUFFIX","getDateSeparatorFormat","date","locale","getMessageTimeFormat","getMessagePreviewTitle","message","EMPTY_USERNAME","isFileMessage","isUserMessage","sender","nickname","isAdminMessage","getMessagePreviewBody","EMPTY_MESSAGE","extIdx","name","lastIndexOf","file","ext","getMessagePreviewTime","timestamp","millsToMMSS","mills","seconds","max","minutes","mm","String","padStart","ss","millsToMSS"],"sources":["common.ts"],"sourcesContent":["import type { Locale } from 'date-fns';\nimport { format, isThisYear, isToday, isYesterday } from 'date-fns';\n\nimport type { SendbirdBaseMessage } from '../types';\n\ntype TruncateMode = 'head' | 'mid' | 'tail';\ntype TruncateOption = { mode: TruncateMode; maxLen: number; separator: string };\nconst defaultOpts: TruncateOption = { mode: 'mid', maxLen: 40, separator: '...' };\n\n/**\n * String truncate util\n * @param {string} str\n * @param {Object} opts Options for truncate\n * @param {'head' | 'mid' | 'tail'} opts.mode default \"mid\"\n * @param {number} opts.maxLen default 40\n * @param {string} opts.separator default \"...\"\n * @returns {string}\n * */\nexport const truncate = (str: string, opts: Partial<TruncateOption> = defaultOpts): string => {\n const options = { ...defaultOpts, ...opts };\n const { maxLen, mode, separator } = options;\n\n if (str.length <= maxLen) return str;\n\n if (mode === 'head') {\n return separator + str.slice(-maxLen);\n }\n\n if (mode === 'mid') {\n const lead = Math.ceil(maxLen / 2);\n const trail = Math.floor(maxLen / 2);\n return str.slice(0, lead) + separator + str.slice(-trail);\n }\n\n if (mode === 'tail') {\n return str.slice(0, maxLen) + separator;\n }\n\n throw new Error('Invalid truncate mode: ' + mode);\n};\n\n/**\n * Count truncate util\n * If count exceed the limit, it comes in the form of \"MAX+\"\n *\n * @param {number} count\n * @param {number} MAX default 99\n * @param {string} MAX_SUFFIX default +\n * @returns {string}\n * */\nexport const truncatedCount = (count: number, MAX = 99, MAX_SUFFIX = '+') => {\n if (count >= MAX) return `${MAX}${MAX_SUFFIX}`;\n return `${count}`;\n};\n\n/**\n * Messages date separator format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getDateSeparatorFormat = (date: Date, locale?: Locale): string => {\n if (isThisYear(date)) return format(date, 'MMM dd, yyyy', { locale });\n return format(date, 'E, MMM dd', { locale });\n};\n\n/**\n * Message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, 'p', { locale });\n};\n\n/**\n * Message preview title text\n * */\nexport const getMessagePreviewTitle = (message: SendbirdBaseMessage, EMPTY_USERNAME = '(No name)') => {\n if (message.isFileMessage() || message.isUserMessage()) {\n return message.sender.nickname || EMPTY_USERNAME;\n }\n if (message.isAdminMessage()) {\n return 'Admin';\n }\n return EMPTY_USERNAME;\n};\n\n/**\n * Message preview body text\n * */\nexport const getMessagePreviewBody = (message: SendbirdBaseMessage, EMPTY_MESSAGE = '') => {\n if (message.isFileMessage()) {\n const extIdx = message.name.lastIndexOf('.');\n if (extIdx > -1) {\n const file = message.name.slice(0, extIdx);\n const ext = message.name.slice(extIdx);\n return file + ext;\n }\n\n return message.name;\n }\n\n if (message.isUserMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n if (message.isAdminMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n return EMPTY_MESSAGE;\n};\n\n/**\n * Message preview time format\n * */\nexport const getMessagePreviewTime = (timestamp: number, locale?: Locale) => {\n if (isToday(timestamp)) return format(timestamp, 'p', { locale });\n if (isYesterday(timestamp)) return 'Yesterday';\n if (isThisYear(timestamp)) return format(timestamp, 'MMM dd', { locale });\n\n return format(timestamp, 'yyyy/MM/dd', { locale });\n};\n\n/**\n * milliseconds to 00:00 format\n * */\nexport const millsToMMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n\n return `${mm}:${ss}`;\n};\n\n/**\n * milliseconds to 0:00 format\n * */\nexport const millsToMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const ss = String(seconds).padStart(2, '0');\n\n return `${minutes}:${ss}`;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["format","isThisYear","isToday","isYesterday","defaultOpts","mode","maxLen","separator","truncate","str","opts","arguments","length","undefined","options","slice","lead","Math","ceil","trail","floor","Error","truncatedCount","count","MAX","MAX_SUFFIX","getDateSeparatorFormat","date","locale","getMessageTimeFormat","getMessagePreviewTitle","message","EMPTY_USERNAME","isFileMessage","isUserMessage","sender","nickname","isAdminMessage","getMessagePreviewBody","EMPTY_MESSAGE","extIdx","name","lastIndexOf","file","ext","getMessagePreviewTime","timestamp","millsToMMSS","mills","seconds","max","minutes","mm","String","padStart","ss","millsToMSS","getReplyCountFormat","replyCount","maxReplyCount","getThreadParentMessageTimeFormat","getReadableFileSize","fileSize","units","digitGroups","log10","pow","toFixed"],"sources":["common.ts"],"sourcesContent":["import type { Locale } from 'date-fns';\nimport { format, isThisYear, isToday, isYesterday } from 'date-fns';\n\nimport type { SendbirdBaseMessage } from '../types';\n\ntype TruncateMode = 'head' | 'mid' | 'tail';\ntype TruncateOption = { mode: TruncateMode; maxLen: number; separator: string };\nconst defaultOpts: TruncateOption = { mode: 'mid', maxLen: 40, separator: '...' };\n\n/**\n * String truncate util\n * @param {string} str\n * @param {Object} opts Options for truncate\n * @param {'head' | 'mid' | 'tail'} opts.mode default \"mid\"\n * @param {number} opts.maxLen default 40\n * @param {string} opts.separator default \"...\"\n * @returns {string}\n * */\nexport const truncate = (str: string, opts: Partial<TruncateOption> = defaultOpts): string => {\n const options = { ...defaultOpts, ...opts };\n const { maxLen, mode, separator } = options;\n\n if (str.length <= maxLen) return str;\n\n if (mode === 'head') {\n return separator + str.slice(-maxLen);\n }\n\n if (mode === 'mid') {\n const lead = Math.ceil(maxLen / 2);\n const trail = Math.floor(maxLen / 2);\n return str.slice(0, lead) + separator + str.slice(-trail);\n }\n\n if (mode === 'tail') {\n return str.slice(0, maxLen) + separator;\n }\n\n throw new Error('Invalid truncate mode: ' + mode);\n};\n\n/**\n * Count truncate util\n * If count exceed the limit, it comes in the form of \"MAX+\"\n *\n * @param {number} count\n * @param {number} MAX default 99\n * @param {string} MAX_SUFFIX default +\n * @returns {string}\n * */\nexport const truncatedCount = (count: number, MAX = 99, MAX_SUFFIX = '+') => {\n if (count >= MAX) return `${MAX}${MAX_SUFFIX}`;\n return `${count}`;\n};\n\n/**\n * Messages date separator format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getDateSeparatorFormat = (date: Date, locale?: Locale): string => {\n if (isThisYear(date)) return format(date, 'MMM dd, yyyy', { locale });\n return format(date, 'E, MMM dd', { locale });\n};\n\n/**\n * Message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, 'p', { locale });\n};\n\n/**\n * Message preview title text\n * */\nexport const getMessagePreviewTitle = (message: SendbirdBaseMessage, EMPTY_USERNAME = '(No name)') => {\n if (message.isFileMessage() || message.isUserMessage()) {\n return message.sender.nickname || EMPTY_USERNAME;\n }\n if (message.isAdminMessage()) {\n return 'Admin';\n }\n return EMPTY_USERNAME;\n};\n\n/**\n * Message preview body text\n * */\nexport const getMessagePreviewBody = (message: SendbirdBaseMessage, EMPTY_MESSAGE = '') => {\n if (message.isFileMessage()) {\n const extIdx = message.name.lastIndexOf('.');\n if (extIdx > -1) {\n const file = message.name.slice(0, extIdx);\n const ext = message.name.slice(extIdx);\n return file + ext;\n }\n\n return message.name;\n }\n\n if (message.isUserMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n if (message.isAdminMessage()) {\n return message.message ?? EMPTY_MESSAGE;\n }\n\n return EMPTY_MESSAGE;\n};\n\n/**\n * Message preview time format\n * */\nexport const getMessagePreviewTime = (timestamp: number, locale?: Locale) => {\n if (isToday(timestamp)) return format(timestamp, 'p', { locale });\n if (isYesterday(timestamp)) return 'Yesterday';\n if (isThisYear(timestamp)) return format(timestamp, 'MMM dd', { locale });\n\n return format(timestamp, 'yyyy/MM/dd', { locale });\n};\n\n/**\n * milliseconds to 00:00 format\n * */\nexport const millsToMMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const mm = String(minutes).padStart(2, '0');\n const ss = String(seconds).padStart(2, '0');\n\n return `${mm}:${ss}`;\n};\n\n/**\n * milliseconds to 0:00 format\n * */\nexport const millsToMSS = (mills: number) => {\n let seconds = Math.floor(Math.max(0, mills) / 1000);\n const minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n\n const ss = String(seconds).padStart(2, '0');\n\n return `${minutes}:${ss}`;\n};\n\n/**\n * Message reply count format\n * If reply count is 1: 1 'reply'\n * If the reply count is greater than 1 : '{count} replies'\n * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'\n * */\nexport const getReplyCountFormat = (replyCount: number, maxReplyCount?: number) => {\n if (maxReplyCount && replyCount > maxReplyCount) {\n return `${maxReplyCount}+ replies`;\n } else if (replyCount === 1) {\n return `${replyCount} reply`;\n } else if (replyCount > 1) {\n return `${replyCount} replies`;\n }\n return '';\n};\n\n/**\n * Thread parent message time format\n *\n * @param {Date} date\n * @param {Locale} [locale]\n * @returns {string}\n * */\nexport const getThreadParentMessageTimeFormat = (date: Date, locale?: Locale): string => {\n return format(date, \"MMM dd 'at' h:mm a\", { locale });\n};\n\n/**\n * File size format\n *\n * @param {number} fileSize\n * @returns {string}\n * */\nexport const getReadableFileSize = (fileSize: number): string => {\n if (fileSize <= 0) {\n return '0 B';\n }\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const digitGroups = Math.floor(Math.log10(fileSize) / Math.log10(1024));\n return `${(fileSize / Math.pow(1024, digitGroups)).toFixed(1)} ${units[digitGroups]}`;\n};\n"],"mappings":"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"}
@@ -6,7 +6,7 @@ export declare function isMyMessage(msg?: SendbirdMessage | null, currentUserId?
6
6
  export declare function messageKeyExtractor(message: SendbirdMessage): string;
7
7
  export declare function messageComparator(a: SendbirdMessage, b: SendbirdMessage): number;
8
8
  export declare function hasSameSender(a?: SendbirdMessage, b?: SendbirdMessage): boolean;
9
- export declare function calcMessageGrouping(groupEnabled: boolean, curr: SendbirdMessage, prev?: SendbirdMessage, next?: SendbirdMessage): {
9
+ export declare function calcMessageGrouping(groupEnabled: boolean, curr: SendbirdMessage, prev?: SendbirdMessage, next?: SendbirdMessage, isReplyThreadType?: boolean, hasParentMessageUI?: boolean): {
10
10
  groupWithPrev: boolean;
11
11
  groupWithNext: boolean;
12
12
  };
@@ -20,7 +20,7 @@ export declare function isSendbirdNotification(dataPayload?: {
20
20
  [key: string]: string | object;
21
21
  }): dataPayload is RawSendbirdDataPayload;
22
22
  export declare function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload): SendbirdDataPayload;
23
- export declare function shouldRenderParentMessage(message: SendbirdMessage): message is (SendbirdUserMessage | SendbirdFileMessage) & {
23
+ export declare function shouldRenderParentMessage(message: SendbirdMessage, hide?: boolean): message is (SendbirdUserMessage | SendbirdFileMessage) & {
24
24
  parentMessage: SendbirdUserMessage | SendbirdFileMessage;
25
25
  };
26
26
  export declare function shouldRenderReaction(channel: SendbirdBaseChannel, reactionEnabled: boolean): boolean;
@@ -62,4 +62,26 @@ export declare const millsToMMSS: (mills: number) => string;
62
62
  * milliseconds to 0:00 format
63
63
  * */
64
64
  export declare const millsToMSS: (mills: number) => string;
65
+ /**
66
+ * Message reply count format
67
+ * If reply count is 1: 1 'reply'
68
+ * If the reply count is greater than 1 : '{count} replies'
69
+ * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'
70
+ * */
71
+ export declare const getReplyCountFormat: (replyCount: number, maxReplyCount?: number) => string;
72
+ /**
73
+ * Thread parent message time format
74
+ *
75
+ * @param {Date} date
76
+ * @param {Locale} [locale]
77
+ * @returns {string}
78
+ * */
79
+ export declare const getThreadParentMessageTimeFormat: (date: Date, locale?: Locale) => string;
80
+ /**
81
+ * File size format
82
+ *
83
+ * @param {number} fileSize
84
+ * @returns {string}
85
+ * */
86
+ export declare const getReadableFileSize: (fileSize: number) => string;
65
87
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sendbird/uikit-utils",
3
- "version": "3.5.4",
3
+ "version": "3.6.0",
4
4
  "description": "A collection of utility functions and constants for building chat UI components with Sendbird UIKit.",
5
5
  "keywords": [
6
6
  "sendbird",
@@ -82,5 +82,5 @@
82
82
  ]
83
83
  ]
84
84
  },
85
- "gitHead": "98ab944367959657368a0f2f2abb3782b2fb88f2"
85
+ "gitHead": "74380f45cc34ef2d9f8a6b7f5cb9144329457c5b"
86
86
  }
@@ -66,12 +66,16 @@ export function calcMessageGrouping(
66
66
  curr: SendbirdMessage,
67
67
  prev?: SendbirdMessage,
68
68
  next?: SendbirdMessage,
69
+ isReplyThreadType?: boolean,
70
+ hasParentMessageUI?: boolean,
69
71
  ) {
70
72
  const getPrev = () => {
71
73
  if (!groupEnabled) return false;
72
74
  if (!prev) return false;
73
75
  if (curr.isAdminMessage()) return false;
74
76
  if (!hasSameSender(curr, prev)) return false;
77
+ if (hasParentMessageUI && curr.parentMessageId) return false;
78
+ if (isReplyThreadType && curr.threadInfo) return false;
75
79
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(prev.createdAt))) return false;
76
80
  return true;
77
81
  };
@@ -81,6 +85,8 @@ export function calcMessageGrouping(
81
85
  if (!next) return false;
82
86
  if (curr.isAdminMessage()) return false;
83
87
  if (!hasSameSender(curr, next)) return false;
88
+ if (hasParentMessageUI && curr.parentMessageId) return false;
89
+ if (isReplyThreadType && curr.threadInfo) return false;
84
90
  if (getMessageTimeFormat(new Date(curr.createdAt)) !== getMessageTimeFormat(new Date(next.createdAt))) return false;
85
91
  return true;
86
92
  };
@@ -125,12 +131,13 @@ export function parseSendbirdNotification(dataPayload: RawSendbirdDataPayload):
125
131
  return typeof dataPayload.sendbird === 'string' ? JSON.parse(dataPayload.sendbird) : dataPayload.sendbird;
126
132
  }
127
133
 
128
- export function shouldRenderParentMessage(message: SendbirdMessage): message is (
129
- | SendbirdUserMessage
130
- | SendbirdFileMessage
131
- ) & {
134
+ export function shouldRenderParentMessage(
135
+ message: SendbirdMessage,
136
+ hide = false,
137
+ ): message is (SendbirdUserMessage | SendbirdFileMessage) & {
132
138
  parentMessage: SendbirdUserMessage | SendbirdFileMessage;
133
139
  } {
140
+ if (hide) return false;
134
141
  return !!(
135
142
  (message.isFileMessage() || message.isUserMessage()) &&
136
143
  (message.parentMessage?.isFileMessage() || message.parentMessage?.isUserMessage())
@@ -152,3 +152,46 @@ export const millsToMSS = (mills: number) => {
152
152
 
153
153
  return `${minutes}:${ss}`;
154
154
  };
155
+
156
+ /**
157
+ * Message reply count format
158
+ * If reply count is 1: 1 'reply'
159
+ * If the reply count is greater than 1 : '{count} replies'
160
+ * If the reply count is greater than {maxReplyCount} : '{maxReplyCount}+ replies'
161
+ * */
162
+ export const getReplyCountFormat = (replyCount: number, maxReplyCount?: number) => {
163
+ if (maxReplyCount && replyCount > maxReplyCount) {
164
+ return `${maxReplyCount}+ replies`;
165
+ } else if (replyCount === 1) {
166
+ return `${replyCount} reply`;
167
+ } else if (replyCount > 1) {
168
+ return `${replyCount} replies`;
169
+ }
170
+ return '';
171
+ };
172
+
173
+ /**
174
+ * Thread parent message time format
175
+ *
176
+ * @param {Date} date
177
+ * @param {Locale} [locale]
178
+ * @returns {string}
179
+ * */
180
+ export const getThreadParentMessageTimeFormat = (date: Date, locale?: Locale): string => {
181
+ return format(date, "MMM dd 'at' h:mm a", { locale });
182
+ };
183
+
184
+ /**
185
+ * File size format
186
+ *
187
+ * @param {number} fileSize
188
+ * @returns {string}
189
+ * */
190
+ export const getReadableFileSize = (fileSize: number): string => {
191
+ if (fileSize <= 0) {
192
+ return '0 B';
193
+ }
194
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
195
+ const digitGroups = Math.floor(Math.log10(fileSize) / Math.log10(1024));
196
+ return `${(fileSize / Math.pow(1024, digitGroups)).toFixed(1)} ${units[digitGroups]}`;
197
+ };