UNPKG

stream-chat-react

Version:

React components to create chat conversations or livestream style chat

288 lines (287 loc) 11.8 kB
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; import deepequal from 'react-fast-compare'; /** * Following function validates a function which returns notification message. * It validates if the first parameter is function and also if return value of function is string or no. */ export var validateAndGetMessage = function (func, args) { if (!func || typeof func !== 'function') return null; // below is due to tests passing a single argument // rather than an array. if (!(args instanceof Array)) { // @ts-expect-error args = [args]; } var returnValue = func.apply(void 0, args); if (typeof returnValue !== 'string') return null; return returnValue; }; /** * Tell if the owner of the current message is muted */ export var isUserMuted = function (message, mutes) { if (!mutes || !message) return false; var userMuted = mutes.filter(function (el) { var _a; return el.target.id === ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id); }); return !!userMuted.length; }; export var MESSAGE_ACTIONS = { delete: 'delete', edit: 'edit', flag: 'flag', mute: 'mute', pin: 'pin', quote: 'quote', react: 'react', reply: 'reply', }; // @deprecated in favor of `channelCapabilities` - TODO: remove in next major release export var defaultPinPermissions = { commerce: { admin: true, anonymous: false, channel_member: false, channel_moderator: true, guest: false, member: false, moderator: true, owner: true, user: false, }, gaming: { admin: true, anonymous: false, channel_member: false, channel_moderator: true, guest: false, member: false, moderator: true, owner: false, user: false, }, livestream: { admin: true, anonymous: false, channel_member: false, channel_moderator: true, guest: false, member: false, moderator: true, owner: true, user: false, }, messaging: { admin: true, anonymous: false, channel_member: true, channel_moderator: true, guest: false, member: true, moderator: true, owner: true, user: false, }, team: { admin: true, anonymous: false, channel_member: true, channel_moderator: true, guest: false, member: true, moderator: true, owner: true, user: false, }, }; export var getMessageActions = function (actions, _a) { var canDelete = _a.canDelete, canEdit = _a.canEdit, canFlag = _a.canFlag, canMute = _a.canMute, canPin = _a.canPin, canQuote = _a.canQuote, canReact = _a.canReact, canReply = _a.canReply; var messageActionsAfterPermission = []; var messageActions = []; if (actions && typeof actions === 'boolean') { // If value of actions is true, then populate all the possible values messageActions = Object.keys(MESSAGE_ACTIONS); } else if (actions && actions.length > 0) { messageActions = __spreadArray([], actions, true); } else { return []; } if (canDelete && messageActions.indexOf(MESSAGE_ACTIONS.delete) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.delete); } if (canEdit && messageActions.indexOf(MESSAGE_ACTIONS.edit) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.edit); } if (canFlag && messageActions.indexOf(MESSAGE_ACTIONS.flag) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.flag); } if (canMute && messageActions.indexOf(MESSAGE_ACTIONS.mute) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.mute); } if (canPin && messageActions.indexOf(MESSAGE_ACTIONS.pin) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.pin); } if (canQuote && messageActions.indexOf(MESSAGE_ACTIONS.quote) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.quote); } if (canReact && messageActions.indexOf(MESSAGE_ACTIONS.react) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.react); } if (canReply && messageActions.indexOf(MESSAGE_ACTIONS.reply) > -1) { messageActionsAfterPermission.push(MESSAGE_ACTIONS.reply); } return messageActionsAfterPermission; }; var ACTIONS_NOT_WORKING_IN_THREAD = ['pin', 'react', 'reply']; export var showMessageActionsBox = function (actions, inThread) { if (actions.length === 0) { return false; } if (inThread && actions.filter(function (action) { return !ACTIONS_NOT_WORKING_IN_THREAD.includes(action); }).length === 0) { return false; } if (actions.length === 1 && (actions.includes('react') || actions.includes('reply'))) { return false; } if (actions.length === 2 && actions.includes('react') && actions.includes('reply')) { return false; } return true; }; var areMessagesEqual = function (prevMessage, nextMessage) { var _a, _b, _c, _d, _e, _f; return prevMessage.deleted_at === nextMessage.deleted_at && ((_a = prevMessage.latest_reactions) === null || _a === void 0 ? void 0 : _a.length) === ((_b = nextMessage.latest_reactions) === null || _b === void 0 ? void 0 : _b.length) && ((_c = prevMessage.own_reactions) === null || _c === void 0 ? void 0 : _c.length) === ((_d = nextMessage.own_reactions) === null || _d === void 0 ? void 0 : _d.length) && prevMessage.pinned === nextMessage.pinned && prevMessage.reply_count === nextMessage.reply_count && prevMessage.status === nextMessage.status && prevMessage.text === nextMessage.text && prevMessage.type === nextMessage.type && prevMessage.updated_at === nextMessage.updated_at && ((_e = prevMessage.user) === null || _e === void 0 ? void 0 : _e.updated_at) === ((_f = nextMessage.user) === null || _f === void 0 ? void 0 : _f.updated_at); }; export var areMessagePropsEqual = function (prevProps, nextProps) { var prevMessage = prevProps.message, prevMessageUI = prevProps.Message; var nextMessage = nextProps.message, nextMessageUI = nextProps.Message; if (prevMessageUI !== nextMessageUI) return false; if (prevProps.endOfGroup !== nextProps.endOfGroup) return false; if (nextProps.showDetailedReactions !== prevProps.showDetailedReactions) { return false; } var messagesAreEqual = areMessagesEqual(prevMessage, nextMessage); if (!messagesAreEqual) return false; var deepEqualProps = deepequal(nextProps.messageActions, prevProps.messageActions) && deepequal(nextProps.readBy, prevProps.readBy) && deepequal(nextProps.highlighted, prevProps.highlighted) && deepequal(nextProps.groupStyles, prevProps.groupStyles) && // last 3 messages can have different group styles deepequal(nextProps.mutes, prevProps.mutes) && deepequal(nextProps.lastReceivedId, prevProps.lastReceivedId); if (!deepEqualProps) return false; return (prevProps.messageListRect === nextProps.messageListRect // MessageList wrapper layout changes ); }; export var areMessageUIPropsEqual = function (prevProps, nextProps) { var _a, _b, _c, _d; var prevLastReceivedId = prevProps.lastReceivedId, prevMessage = prevProps.message; var nextLastReceivedId = nextProps.lastReceivedId, nextMessage = nextProps.message; if (prevProps.editing !== nextProps.editing) return false; if (prevProps.highlighted !== nextProps.highlighted) return false; if (prevProps.endOfGroup !== nextProps.endOfGroup) return false; if (((_a = prevProps.mutes) === null || _a === void 0 ? void 0 : _a.length) !== ((_b = nextProps.mutes) === null || _b === void 0 ? void 0 : _b.length)) return false; if (((_c = prevProps.readBy) === null || _c === void 0 ? void 0 : _c.length) !== ((_d = nextProps.readBy) === null || _d === void 0 ? void 0 : _d.length)) return false; if (prevProps.showDetailedReactions !== nextProps.showDetailedReactions) { return false; } if ((prevMessage.id === prevLastReceivedId || prevMessage.id === nextLastReceivedId) && prevLastReceivedId !== nextLastReceivedId) { return false; } return areMessagesEqual(prevMessage, nextMessage); }; export var messageHasReactions = function (message) { return !!(message === null || message === void 0 ? void 0 : message.latest_reactions) && !!message.latest_reactions.length; }; export var messageHasAttachments = function (message) { return !!(message === null || message === void 0 ? void 0 : message.attachments) && !!message.attachments.length; }; export var getImages = function (message) { if (!(message === null || message === void 0 ? void 0 : message.attachments)) { return []; } return message.attachments.filter(function (item) { return item.type === 'image'; }); }; export var getNonImageAttachments = function (message) { if (!(message === null || message === void 0 ? void 0 : message.attachments)) { return []; } return message.attachments.filter(function (item) { return item.type !== 'image'; }); }; /** * Default Tooltip Username mapper implementation. * * @param user the user. */ export var mapToUserNameOrId = function (user) { return user.name || user.id; }; export var getReadByTooltipText = function (users, t, client, tooltipUserNameMapper) { var outStr = ''; if (!t) { throw new Error('getReadByTooltipText was called, but translation function is not available'); } if (!tooltipUserNameMapper) { throw new Error('getReadByTooltipText was called, but tooltipUserNameMapper function is not available'); } // first filter out client user, so restLength won't count it var otherUsers = users .filter(function (item) { return item && (client === null || client === void 0 ? void 0 : client.user) && item.id !== client.user.id; }) .map(tooltipUserNameMapper); var slicedArr = otherUsers.slice(0, 5); var restLength = otherUsers.length - slicedArr.length; if (slicedArr.length === 1) { outStr = "".concat(slicedArr[0], " "); } else if (slicedArr.length === 2) { // joins all with "and" but =no commas // example: "bob and sam" outStr = t('{{ firstUser }} and {{ secondUser }}', { firstUser: slicedArr[0], secondUser: slicedArr[1], }); } else if (slicedArr.length > 2) { // joins all with commas, but last one gets ", and" (oxford comma!) // example: "bob, joe, sam and 4 more" if (restLength === 0) { // mutate slicedArr to remove last user to display it separately var lastUser = slicedArr.splice(slicedArr.length - 1, 1); outStr = t('{{ commaSeparatedUsers }}, and {{ lastUser }}', { commaSeparatedUsers: slicedArr.join(', '), lastUser: lastUser, }); } else { outStr = t('{{ commaSeparatedUsers }} and {{ moreCount }} more', { commaSeparatedUsers: slicedArr.join(', '), moreCount: restLength, }); } } return outStr; };