UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

232 lines 10.3 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.checkQuotedMessageEquality = exports.checkMessageEquality = exports.ProgressIndicatorTypes = exports.MessageStatusTypes = exports.FileState = void 0; exports.escapeRegExp = escapeRegExp; exports.stringifyMessage = exports.reduceMessagesToString = exports.makeImageCompatibleUrl = exports.isLocalUrl = exports.isEditedMessage = exports.isBouncedMessage = exports.isBlockedMessage = exports.hashStringToNumber = exports.hasOnlyEmojis = exports.getUrlWithoutParams = exports.getInitialsFromName = exports.getIndicatorTypeForFileState = exports.getFileSizeDisplayText = exports.getFileNameFromPath = exports.getDurationLabelFromDuration = exports.generateRandomId = exports.formatMsToMinSec = exports.findInMessagesById = exports.findInMessagesByDate = void 0; var _dayjs = _interopRequireDefault(require("dayjs")); var _emojiRegex = _interopRequireDefault(require("emoji-regex")); var FileState = exports.FileState = Object.freeze({ BLOCKED: 'blocked', FAILED: 'failed', FINISHED: 'finished', PENDING: 'pending', UPLOADING: 'uploading' }); var ProgressIndicatorTypes = exports.ProgressIndicatorTypes = Object.freeze({ IN_PROGRESS: 'in_progress', INACTIVE: 'inactive', NOT_SUPPORTED: 'not_supported', PENDING: 'pending', RETRY: 'retry' }); var MessageStatusTypes = exports.MessageStatusTypes = { DELIVERED: 'delivered', FAILED: 'failed', RECEIVED: 'received', SENDING: 'sending' }; var getIndicatorTypeForFileState = (fileState, allowSendBeforeAttachmentsUpload) => { var indicatorMap = { [FileState.UPLOADING]: allowSendBeforeAttachmentsUpload ? ProgressIndicatorTypes.INACTIVE : ProgressIndicatorTypes.IN_PROGRESS, [FileState.BLOCKED]: ProgressIndicatorTypes.NOT_SUPPORTED, [FileState.FAILED]: allowSendBeforeAttachmentsUpload ? ProgressIndicatorTypes.INACTIVE : ProgressIndicatorTypes.RETRY, [FileState.PENDING]: ProgressIndicatorTypes.PENDING, [FileState.FINISHED]: ProgressIndicatorTypes.INACTIVE }; return indicatorMap[fileState]; }; exports.getIndicatorTypeForFileState = getIndicatorTypeForFileState; var isBlockedMessage = message => { return message.type === 'error' && (message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' || message.moderation?.action === 'remove'); }; exports.isBlockedMessage = isBlockedMessage; var isBouncedMessage = message => message.type === 'error' && (message?.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_BOUNCE' || message?.moderation?.action === 'bounce'); exports.isBouncedMessage = isBouncedMessage; var isEditedMessage = message => !!message.message_text_updated_at; exports.isEditedMessage = isEditedMessage; var makeImageCompatibleUrl = url => (url.indexOf('//') === 0 ? `https:${url}` : url).trim(); exports.makeImageCompatibleUrl = makeImageCompatibleUrl; var getUrlWithoutParams = url => { if (!url) { return url; } var indexOfQuestion = url.indexOf('?'); if (indexOfQuestion === -1) { return url; } return url.substring(0, url.indexOf('?')); }; exports.getUrlWithoutParams = getUrlWithoutParams; var isLocalUrl = url => !url.includes('http'); exports.isLocalUrl = isLocalUrl; var generateRandomId = (a = '') => a ? ((Number(a) ^ Math.random() * 16) >> Number(a) / 4).toString(16) : `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, generateRandomId); exports.generateRandomId = generateRandomId; var hasOnlyEmojis = text => { try { var emojiOnlyString = [...text.matchAll((0, _emojiRegex.default)())].join(''); var originalTextWithNoSpaces = text.replaceAll(/\s/g, ''); return emojiOnlyString.length !== 0 && emojiOnlyString.length === originalTextWithNoSpaces.length; } catch (e) { return false; } }; exports.hasOnlyEmojis = hasOnlyEmojis; var stringifyMessage = ({ message, includeReactions = true }) => { var attachments = message.attachments, deleted_at = message.deleted_at, i18n = message.i18n, latest_reactions = message.latest_reactions, reaction_groups = message.reaction_groups, reply_count = message.reply_count, status = message.status, text = message.text, type = message.type, updated_at = message.updated_at; var baseFieldsString = `${type}${deleted_at}${text}${reply_count}${status}${updated_at}${JSON.stringify(i18n)}${attachments?.length}`; if (!includeReactions) { return baseFieldsString; } return `${latest_reactions ? latest_reactions.map(({ type, user }) => `${type}${user?.id}`).join() : ''}${reaction_groups ? Object.entries(reaction_groups).flatMap(([type, { count, first_reaction_at, last_reaction_at }]) => `${type}${count}${first_reaction_at}${last_reaction_at}`).join() : ''}${baseFieldsString}`; }; exports.stringifyMessage = stringifyMessage; var reduceMessagesToString = messages => messages.map(message => message?.quoted_message ? `${stringifyMessage({ message })}_${message.quoted_message.type}_${message.quoted_message.deleted_at}_${message.quoted_message.text}_${message.quoted_message.updated_at}` : stringifyMessage({ message })).join(); exports.reduceMessagesToString = reduceMessagesToString; var getFileNameFromPath = path => { var pattern = /[^/]+\.[^/]+$/; var match = path.match(pattern); return match ? match[0] : ''; }; exports.getFileNameFromPath = getFileNameFromPath; var getDurationLabelFromDuration = duration => { if (!duration) { return '00:00'; } var ONE_HOUR_IN_SECONDS = 3600; var ONE_HOUR_IN_MILLISECONDS = ONE_HOUR_IN_SECONDS * 1000; var durationLabel = '00:00'; var isDurationLongerThanHour = duration / ONE_HOUR_IN_MILLISECONDS >= 1; var formattedDurationParam = isDurationLongerThanHour ? 'HH:mm:ss' : 'm:ss'; var formattedVideoDuration = _dayjs.default.duration(duration, 'milliseconds').format(formattedDurationParam); durationLabel = formattedVideoDuration; return durationLabel; }; exports.getDurationLabelFromDuration = getDurationLabelFromDuration; var formatMsToMinSec = ms => { var totalSeconds = Math.max(0, Math.floor(ms / 1000)); var totalMinutes = Math.floor(totalSeconds / 60); var totalHours = Math.floor(totalMinutes / 60); if (totalHours >= 1) { return `${totalHours}h`; } if (totalMinutes >= 1) { return `${totalMinutes}m`; } return `${totalSeconds}s`; }; exports.formatMsToMinSec = formatMsToMinSec; function escapeRegExp(text) { return text.replace(/[-[\]{}()*+?.,/\\^$|#]/g, '\\$&'); } var findInMessagesById = (messages, targetId) => { var idx = messages.findIndex(message => message.id === targetId); return idx; }; exports.findInMessagesById = findInMessagesById; var findInMessagesByDate = (messages, targetDate) => { var targetTimestamp = targetDate.getTime(); var left = 0; var right = messages.length - 1; var middle = 0; while (left <= right) { middle = Math.floor(left + (right - left) / 2); var middleTimestamp = new Date(messages[middle].created_at).getTime(); var middleLeftTimestamp = messages[middle - 1]?.created_at && new Date(messages[middle - 1].created_at).getTime(); var middleRightTimestamp = messages[middle + 1]?.created_at && new Date(messages[middle + 1].created_at).getTime(); if (middleTimestamp === targetTimestamp || middleLeftTimestamp && middleRightTimestamp && middleLeftTimestamp < targetTimestamp && middleRightTimestamp > targetTimestamp) { return { index: middle, message: messages[middle] }; } else if (middleTimestamp < targetTimestamp) { left = middle + 1; } else { right = middle - 1; } } return { index: -1 }; }; exports.findInMessagesByDate = findInMessagesByDate; var checkMessageEquality = (prevMessage, nextMessage) => { var prevMessageExists = !!prevMessage; var nextMessageExists = !!nextMessage; if (!prevMessageExists && !nextMessageExists) { return true; } if (prevMessageExists !== nextMessageExists) { return false; } var messageEqual = prevMessage?.status === nextMessage?.status && prevMessage?.type === nextMessage?.type && prevMessage?.text === nextMessage?.text && prevMessage?.pinned === nextMessage?.pinned && prevMessage?.i18n === nextMessage?.i18n && prevMessage?.reply_count === nextMessage?.reply_count && prevMessage?.updated_at?.getTime?.() === nextMessage?.updated_at?.getTime?.() && prevMessage?.deleted_at?.getTime?.() === nextMessage?.deleted_at?.getTime?.(); return messageEqual; }; exports.checkMessageEquality = checkMessageEquality; var checkQuotedMessageEquality = (prevQuotedMessage, nextQuotedMessage) => { var prevQuotedMessageExists = !!prevQuotedMessage; var nextQuotedMessageExists = !!nextQuotedMessage; if (!prevQuotedMessageExists && !nextQuotedMessageExists) { return true; } if (prevQuotedMessageExists !== nextQuotedMessageExists) { return false; } var quotedMessageEqual = prevQuotedMessage?.type === nextQuotedMessage?.type && prevQuotedMessage?.text === nextQuotedMessage?.text && prevQuotedMessage?.updated_at?.getTime?.() === nextQuotedMessage?.updated_at?.getTime?.() && prevQuotedMessage?.deleted_at?.getTime?.() === nextQuotedMessage?.deleted_at?.getTime?.(); return quotedMessageEqual; }; exports.checkQuotedMessageEquality = checkQuotedMessageEquality; var getInitialsFromName = (name, numberOfInitials = 2) => { if (!name) return ''; var trimmed = name.trim(); if (!trimmed) return ''; return trimmed.split(/\s+/).slice(0, numberOfInitials).map(n => n.charAt(0).toUpperCase()).join(''); }; exports.getInitialsFromName = getInitialsFromName; var hashStringToNumber = str => { var hash = 0; for (var i = 0; i < str.length; i++) { hash = (hash << 5) - hash + str.charCodeAt(i); hash |= 0; } return Math.abs(hash) ?? 0; }; exports.hashStringToNumber = hashStringToNumber; var getFileSizeDisplayText = size => { if (!size) { return; } if (typeof size === 'string') { size = parseFloat(size); } if (size < 1000 * 1000) { return `${Math.floor(Math.floor(size / 10) / 100)} KB`; } return `${Math.floor(Math.floor(size / 10000) / 100)} MB`; }; exports.getFileSizeDisplayText = getFileSizeDisplayText; //# sourceMappingURL=utils.js.map