UNPKG

@cometchat/chat-uikit-angular

Version:

Ready-to-use Chat UI Components for Angular (JavaScript/Web)

682 lines 103 kB
import { CometChatMessageOption, MessageBubbleAlignment, CometChatMessageTemplate, CometChatMessageComposerAction, localize, CometChatUIKitConstants, fontHelper, MentionsTargetElement, } from "@cometchat/uikit-resources"; import { CometChatMentionsFormatter, CometChatUIKitLoginListener, CometChatUrlsFormatter, ConversationUtils, UserMentionStyle, } from "@cometchat/uikit-shared"; import { CometChat } from "@cometchat/chat-sdk-javascript"; import { ChatConfigurator } from "../Framework/ChatConfigurator"; export class MessageUtils { /** * Creates an option to edit message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getEditOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.editMessage, title: localize("EDIT"), iconURL: "assets/editicon.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to react to a message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getReactionOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.reactToMessage, title: localize("REACT"), iconURL: "assets/addreaction.svg", onClick: undefined, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to get info about a message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getMessageInfoOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.messageInformation, title: localize("INFO"), iconURL: "assets/Info.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to send a private message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getMessagePrivatelyOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.sendMessagePrivately, title: localize("MESSAGE_PRIVATELY"), iconURL: "assets/message-privately.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to delete a message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getDeleteOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.deleteMessage, title: localize("DELETE"), iconURL: "assets/deleteicon.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to reply to a message in a thread. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getReplyInThreadOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.replyInThread, title: localize("REPLY"), iconURL: "assets/threadicon.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Creates an option to copy a message. * @param {CometChatTheme} theme - The theme object. * @return {CometChatMessageOption} - Returns a new message option. */ getCopyOption(theme) { return new CometChatMessageOption({ id: CometChatUIKitConstants.MessageOption.copyMessage, title: localize("COPY"), iconURL: "assets/Copy.svg", onClick: null, iconTint: theme.palette.getAccent600(), backgroundColor: "transparent", titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent600(), }); } /** * Checks if a message is sent by current logged in user. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} message - The message to check. * @return {boolean} - Returns true if message is sent by current logged in user, otherwise false. */ isSentByMe(loggedInUser, message) { return loggedInUser.getUid() === message.getSender().getUid(); } /** * Fetches options for text messages. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} messageObject - The message object. * @param {CometChatTheme} theme - The theme object. * @param {CometChat.Group} group - The group object. * @return {Array<CometChatMessageOption>} - Returns an array of message options. */ getTextMessageOptions(loggedInUser, messageObject, theme, group) { let isSentByMe = this.isSentByMe(loggedInUser, messageObject); let isParticipant = false; if (group?.getScope() == CometChatUIKitConstants.groupMemberScope.participant) { isParticipant = true; } let messageOptionList = []; messageOptionList.push(this.getReactionOption(theme)); if (!messageObject.getParentMessageId()) { messageOptionList.push(this.getReplyInThreadOption(theme)); } messageOptionList.push(this.getCopyOption(theme)); if (isSentByMe || (!isParticipant && group)) { messageOptionList.push(this.getEditOption(theme)); } if (isSentByMe) { messageOptionList.push(this.getMessageInfoOption(theme)); } if (isSentByMe || (!isParticipant && group)) messageOptionList.push(this.getDeleteOption(theme)); if (group && !isSentByMe) { messageOptionList.push(this.getMessagePrivatelyOption(theme)); } return messageOptionList; } /** * Fetches options for image messages. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} messageObject - The message object. * @param {CometChatTheme} theme - The theme object. * @param {CometChat.Group} group - The group object. * @return {Array<CometChatMessageOption>} - Returns an array of message options. */ getImageMessageOptions(loggedInUser, messageObject, theme, group) { let messageOptionList = []; messageOptionList = ChatConfigurator.getDataSource().getCommonOptions(loggedInUser, messageObject, theme, group); return messageOptionList; } /** * Fetches options for video messages. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} messageObject - The message object. * @param {CometChatTheme} theme - The theme object. * @param {CometChat.Group} group - (Optional) The group object. * @return {Array<CometChatMessageOption>} - Returns an array of message options. */ getVideoMessageOptions(loggedInUser, messageObject, theme, group) { let messageOptionList = []; messageOptionList = ChatConfigurator.getDataSource().getCommonOptions(loggedInUser, messageObject, theme, group); return messageOptionList; } /** * Fetches options for audio messages. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} messageObject - The message object. * @param {CometChatTheme} theme - The theme object. * @param {CometChat.Group} group - (Optional) The group object. * @return {Array<CometChatMessageOption>} - Returns an array of message options. */ getAudioMessageOptions(loggedInUser, messageObject, theme, group) { let messageOptionList = []; messageOptionList = ChatConfigurator.getDataSource().getCommonOptions(loggedInUser, messageObject, theme, group); return messageOptionList; } /** * Fetches options for file messages. * @param {CometChat.User} loggedInUser - The current logged in user. * @param {CometChat.BaseMessage} messageObject - The message object. * @param {CometChatTheme} theme - The theme object. * @param {CometChat.Group} group - (Optional) The group object. * @return {Array<CometChatMessageOption>} - Returns an array of message options. */ getFileMessageOptions(loggedInUser, messageObject, theme, group) { let messageOptionList = []; messageOptionList = ChatConfigurator.getDataSource().getCommonOptions(loggedInUser, messageObject, theme, group); return messageOptionList; } getBottomView(_messageObject, _alignment) { return null; } getSchedulerMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.scheduler, category: CometChatUIKitConstants.MessageCategory.interactive, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getTextMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.text, category: CometChatUIKitConstants.MessageCategory.message, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getAudioMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.audio, category: CometChatUIKitConstants.MessageCategory.message, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getVideoMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.video, category: CometChatUIKitConstants.MessageCategory.message, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getImageMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.image, category: CometChatUIKitConstants.MessageCategory.message, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getGroupActionTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.groupMember, category: CometChatUIKitConstants.MessageCategory.action, }); } getFileMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.file, category: CometChatUIKitConstants.MessageCategory.message, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getFormMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.form, category: CometChatUIKitConstants.MessageCategory.interactive, options: ChatConfigurator.getDataSource().getMessageOptions, }); } getCardMessageTemplate() { return new CometChatMessageTemplate({ type: CometChatUIKitConstants.MessageTypes.card, category: CometChatUIKitConstants.MessageCategory.interactive, options: ChatConfigurator.getDataSource().getMessageOptions, }); } /** * Function to check if a user's status should be visible * @param {CometChat.User | CometChat.GroupMember} user - The user whose status visibility is to be checked. * @return {boolean} - Returns `true` if the user's status should be hidden (blocked or offline), `false` otherwise. */ getUserStatusVisibility(user) { let userBlockedFlag = false; if (user) { if (user.getBlockedByMe() || user.getHasBlockedMe() || user.getStatus() === CometChatUIKitConstants.userStatusType.offline) { userBlockedFlag = true; } } return userBlockedFlag; } getAllMessageTemplates() { return [ ChatConfigurator.getDataSource().getTextMessageTemplate(), ChatConfigurator.getDataSource().getImageMessageTemplate(), ChatConfigurator.getDataSource().getVideoMessageTemplate(), ChatConfigurator.getDataSource().getAudioMessageTemplate(), ChatConfigurator.getDataSource().getFileMessageTemplate(), ChatConfigurator.getDataSource().getGroupActionTemplate(), ChatConfigurator.getDataSource().getFormMessageTemplate(), ChatConfigurator.getDataSource().getCardMessageTemplate(), ChatConfigurator.getDataSource().getSchedulerMessageTemplate(), ]; } getMessageTemplate(messageType, messageCategory) { let _template = null; if (messageCategory != CometChatUIKitConstants.MessageCategory.call) { switch (messageType) { case CometChatUIKitConstants.MessageTypes.text: _template = ChatConfigurator.getDataSource().getTextMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.image: _template = ChatConfigurator.getDataSource().getImageMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.video: _template = ChatConfigurator.getDataSource().getVideoMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.groupMember: _template = ChatConfigurator.getDataSource().getGroupActionTemplate(); break; case CometChatUIKitConstants.MessageTypes.file: _template = ChatConfigurator.getDataSource().getFileMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.audio: _template = ChatConfigurator.getDataSource().getAudioMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.form: _template = ChatConfigurator.getDataSource().getFormMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.card: _template = ChatConfigurator.getDataSource().getCardMessageTemplate(); break; case CometChatUIKitConstants.MessageTypes.scheduler: _template = ChatConfigurator.getDataSource().getSchedulerMessageTemplate(); break; } } return _template; } getMessageOptions(loggedInUser, messageObject, theme, group) { let _optionList = []; if (messageObject.getCategory() == CometChatUIKitConstants.MessageCategory.message) { switch (messageObject.getType()) { case CometChatUIKitConstants.MessageTypes.text: _optionList = ChatConfigurator.getDataSource().getTextMessageOptions(loggedInUser, messageObject, theme, group); break; case CometChatUIKitConstants.MessageTypes.image: _optionList = ChatConfigurator.getDataSource().getImageMessageOptions(loggedInUser, messageObject, theme, group); break; case CometChatUIKitConstants.MessageTypes.video: _optionList = ChatConfigurator.getDataSource().getVideoMessageOptions(loggedInUser, messageObject, theme, group); break; case CometChatUIKitConstants.MessageTypes.groupMember: _optionList = []; break; case CometChatUIKitConstants.MessageTypes.file: _optionList = ChatConfigurator.getDataSource().getFileMessageOptions(loggedInUser, messageObject, theme, group); break; case CometChatUIKitConstants.MessageTypes.audio: _optionList = ChatConfigurator.getDataSource().getAudioMessageOptions(loggedInUser, messageObject, theme, group); break; } } else if (messageObject.getCategory() == CometChatUIKitConstants.MessageCategory.custom || messageObject.getCategory() == CometChatUIKitConstants.MessageCategory.interactive) { _optionList = ChatConfigurator.getDataSource().getCommonOptions(loggedInUser, messageObject, theme, group); } return _optionList; } getCommonOptions(loggedInUser, messageObject, theme, group) { let isSentByMe = this.isSentByMe(loggedInUser, messageObject); let isParticipant = false; if (group?.getScope() == CometChatUIKitConstants.groupMemberScope.participant) isParticipant = true; let messageOptionList = []; messageOptionList.push(this.getReactionOption(theme)); if (!messageObject?.getParentMessageId()) { messageOptionList.push(this.getReplyInThreadOption(theme)); } if (isSentByMe) { messageOptionList.push(this.getMessageInfoOption(theme)); } if (isSentByMe || (!isParticipant && group)) messageOptionList.push(this.getDeleteOption(theme)); if (group && !isSentByMe) { messageOptionList.push(this.getMessagePrivatelyOption(theme)); } return messageOptionList; } getAllMessageTypes() { return [ CometChatUIKitConstants.MessageTypes.text, CometChatUIKitConstants.MessageTypes.image, CometChatUIKitConstants.MessageTypes.audio, CometChatUIKitConstants.MessageTypes.video, CometChatUIKitConstants.MessageTypes.file, CometChatUIKitConstants.MessageTypes.groupMember, CometChatUIKitConstants.MessageTypes.form, CometChatUIKitConstants.MessageTypes.card, CometChatUIKitConstants.MessageTypes.scheduler, ]; } addList() { return "<Message Utils>"; } getAllMessageCategories() { return [ CometChatUIKitConstants.MessageCategory.message, CometChatUIKitConstants.MessageCategory.action, CometChatUIKitConstants.MessageCategory.interactive, ]; } getAuxiliaryOptions(id, user, group) { return null; } getId() { return "messageUtils"; } getActionMessage(message) { try { if (message instanceof CometChat.Action) { const action = message.getAction(); const actionBy = message.getActionBy(); const actionOn = message.getActionOn(); const byString = actionBy.getName(); const forString = action === CometChatUIKitConstants.groupMemberAction.JOINED || action === CometChatUIKitConstants.groupMemberAction.LEFT ? "" : actionOn.getName(); switch (action) { case CometChatUIKitConstants.groupMemberAction.ADDED: return `${byString} ${localize("ADDED")} ${forString}`; case CometChatUIKitConstants.groupMemberAction.JOINED: return `${byString} ${localize("JOINED")}`; case CometChatUIKitConstants.groupMemberAction.LEFT: return `${byString} ${localize("LEFT")}`; case CometChatUIKitConstants.groupMemberAction.KICKED: return `${byString} ${localize("KICKED")} ${forString}`; case CometChatUIKitConstants.groupMemberAction.BANNED: return `${byString} ${localize("BANNED")} ${forString}`; case CometChatUIKitConstants.groupMemberAction.UNBANNED: return `${byString} ${localize("UNBANNED")} ${forString}`; case CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE: return `${byString} ${localize("MADE")} ${forString} ${message.getNewScope()}`; default: return ""; } } else { return ""; } } catch (e) { return ""; } } imageAttachmentOption(theme) { return new CometChatMessageComposerAction({ id: CometChatUIKitConstants.MessageTypes.image, title: localize("ATTACH_IMAGE"), iconURL: "assets/photolibrary.svg", onClick: null, iconTint: theme.palette.getAccent700(), titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent700(), borderRadius: "8px", background: theme.palette.getAccent100(), }); } videoAttachmentOption(theme) { return new CometChatMessageComposerAction({ id: CometChatUIKitConstants.MessageTypes.video, title: localize("ATTACH_VIDEO"), iconURL: "assets/video.svg", onClick: null, iconTint: theme.palette.getAccent700(), titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent700(), borderRadius: "8px", background: theme.palette.getAccent100(), }); } audioAttachmentOption(theme) { return new CometChatMessageComposerAction({ id: CometChatUIKitConstants.MessageTypes.audio, title: localize("ATTACH_AUDIO"), iconURL: "assets/audio-file.svg", onClick: null, iconTint: theme.palette.getAccent700(), titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent700(), borderRadius: "8px", background: theme.palette.getAccent100(), }); } fileAttachmentOption(theme) { return new CometChatMessageComposerAction({ id: CometChatUIKitConstants.MessageTypes.file, title: localize("ATTACH_FILE"), iconURL: "assets/attachment-file.svg", onClick: null, iconTint: theme.palette.getAccent700(), titleFont: fontHelper(theme.typography.subtitle1), titleColor: theme.palette.getAccent700(), borderRadius: "8px", background: theme.palette.getAccent100(), }); } getAttachmentOptions(theme, user, group, id) { let actions = [ this.imageAttachmentOption(theme), this.videoAttachmentOption(theme), this.audioAttachmentOption(theme), this.fileAttachmentOption(theme), ]; return actions; } getLastConversationMessage(conversation, loggedInUser, additionalConfigurations) { let config = { ...additionalConfigurations, textFormatters: additionalConfigurations?.textFormatters && additionalConfigurations?.textFormatters.length ? [...additionalConfigurations.textFormatters] : [this.getMentionsTextFormatter({ theme: additionalConfigurations.theme, disableMentions: additionalConfigurations.disableMentions })], }; let message = ConversationUtils.getLastConversationMessage(conversation, loggedInUser, config); let messageObject = conversation?.getLastMessage(); if (messageObject) { let textFormatters = config.textFormatters; if (config && !config.disableMentions) { let mentionsTextFormatter; for (let i = 0; i < textFormatters.length; i++) { if (textFormatters[i] instanceof CometChatMentionsFormatter) { mentionsTextFormatter = textFormatters[i]; mentionsTextFormatter.setMessage(messageObject); if (messageObject.getMentionedUsers().length) { mentionsTextFormatter.setCometChatUserGroupMembers(messageObject.getMentionedUsers()); } mentionsTextFormatter.setLoggedInUser(CometChatUIKitLoginListener.getLoggedInUser()); } if (mentionsTextFormatter) { break; } } if (!mentionsTextFormatter) { mentionsTextFormatter = ChatConfigurator.getDataSource().getMentionsTextFormatter({ messageObject, ...config, alignment: null, theme: additionalConfigurations.theme, }); textFormatters.push(mentionsTextFormatter); } } if (messageObject && messageObject instanceof CometChat.TextMessage) { for (let i = 0; i < textFormatters.length; i++) { message = textFormatters[i].getFormattedText(message, { mentionsTargetElement: MentionsTargetElement.conversation }); } } } return message; } /** * Adds styled @ for every mention in the text by matching uid * * @param {CometChat.TextMessage} message * @param {string} subtitle * @returns {void} */ getMentionsFormattedText(message, subtitle, mentionsFormatterParams) { const regex = /<@uid:(.*?)>/g; let messageText = message.getText(); let messageTextTmp = subtitle; let match = regex.exec(messageText); let cometChatUsers = []; let mentionedUsers = message.getMentionedUsers(); while (match !== null) { let user; for (let i = 0; i < mentionedUsers.length; i++) { if (match[1] == mentionedUsers[i].getUid()) { user = mentionedUsers[i]; } } if (user) { cometChatUsers.push(user); } match = regex.exec(messageText); } let mentionsFormatter = this.getMentionsTextFormatter(mentionsFormatterParams); mentionsFormatter.setClasses(["cc-mentions"]); mentionsFormatter.setCometChatUserGroupMembers(cometChatUsers); messageTextTmp = mentionsFormatter.getFormattedText(messageTextTmp, mentionsFormatterParams); return messageTextTmp; } getAIOptions(theme, id) { return []; } getAllTextFormatters(formatterParams) { let formatters = []; const mentionsFormatter = formatterParams.disableMentions ? null : ChatConfigurator.getDataSource().getMentionsTextFormatter(formatterParams); const urlTextFormatter = ChatConfigurator.getDataSource().getUrlTextFormatter(formatterParams); if (mentionsFormatter) { formatters.push(mentionsFormatter); } if (urlTextFormatter) { formatters.push(urlTextFormatter); } return formatters; } getMentionsTextFormatter(params) { let mentionsTextFormatter = new CometChatMentionsFormatter(); if (params && params.theme) { mentionsTextFormatter.setComposerMentionStyle(new UserMentionStyle({ loggedInUserTextFont: fontHelper(params.theme.typography.text2), loggedInUserTextColor: params.theme.palette.getPrimary(), loggedInUserTextBackground: "", mentionTextFont: fontHelper(params.theme.typography.text2), mentionTextColor: params.theme.palette.getPrimary(), mentionTextBackground: "", })); mentionsTextFormatter.setConversationMentionStyle(new UserMentionStyle({ loggedInUserTextFont: fontHelper(params.theme.typography.text3), loggedInUserTextColor: params.theme.palette.getPrimary(), loggedInUserTextBackground: "", mentionTextFont: fontHelper(params.theme.typography.text3), mentionTextColor: params.theme.palette.getPrimary(), mentionTextBackground: "", })); mentionsTextFormatter.setRightBubbleMentionStyle(new UserMentionStyle({ loggedInUserTextFont: fontHelper(params.theme.typography.text3), loggedInUserTextColor: params.theme.palette.getTertiary(), loggedInUserTextBackground: "", mentionTextFont: fontHelper(params.theme.typography.text3), mentionTextColor: params.theme.palette.getTertiary(), mentionTextBackground: "", })); mentionsTextFormatter.setLeftBubbleMentionStyle(new UserMentionStyle({ loggedInUserTextFont: fontHelper(params.theme.typography.text3), loggedInUserTextColor: params.theme.palette.getPrimary(), loggedInUserTextBackground: "", mentionTextFont: fontHelper(params.theme.typography.text3), mentionTextColor: params.theme.palette.getPrimary(), mentionTextBackground: "", })); } return mentionsTextFormatter; } getUrlTextFormatter(params = {}) { let urlTextFormatter = new CometChatUrlsFormatter([ /(https?:\/\/[^\s]+)/g, ]); if (params.alignment == MessageBubbleAlignment.left) { urlTextFormatter.setStyle({ formattedTextColor: params.theme.palette.getPrimary(), formattedTextFont: fontHelper(params.theme.typography.text3), }); } else { urlTextFormatter.setStyle({ formattedTextColor: params.theme.palette.getTertiary(), formattedTextFont: fontHelper(params.theme.typography.text3), }); } return urlTextFormatter; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVzc2FnZVV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2hhdC11aWtpdC1hbmd1bGFyL3NyYy9TaGFyZWQvVXRpbHMvTWVzc2FnZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLHdCQUF3QixFQUN4Qiw4QkFBOEIsRUFFOUIsUUFBUSxFQUNSLHVCQUF1QixFQUN2QixVQUFVLEVBRVYscUJBQXFCLEdBQ3RCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUNMLDBCQUEwQixFQUUxQiwyQkFBMkIsRUFDM0Isc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixnQkFBZ0IsR0FDakIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFakUsTUFBTSxPQUFPLFlBQVk7SUFDdkI7Ozs7S0FJQztJQUVELGFBQWEsQ0FBQyxLQUFxQjtRQUNqQyxPQUFPLElBQUksc0JBQXNCLENBQUM7WUFDaEMsRUFBRSxFQUFFLHVCQUF1QixDQUFDLGFBQWEsQ0FBQyxXQUFXO1lBQ3JELEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxxQkFBcUI7WUFDOUIsT0FBTyxFQUFFLElBQUk7WUFDYixRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDdEMsZUFBZSxFQUFFLGFBQWE7WUFDOUIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUNqRCxVQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNEOzs7O0tBSUM7SUFF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