stream-chat-react
Version:
React components to create chat conversations or livestream style chat
4 lines • 976 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../node_modules/inline-style-parser/index.js", "../../node_modules/style-to-object/src/index.ts", "../../node_modules/extend/index.js", "../../src/experimental/index.ts", "../../src/experimental/MessageActions/MessageActions.tsx", "../../src/context/ChannelListContext.tsx", "../../src/context/ChannelStateContext.tsx", "../../src/context/ChatContext.tsx", "../../src/context/ComponentContext.tsx", "../../src/context/DialogManagerContext.tsx", "../../src/components/Dialog/DialogPortal.tsx", "../../src/components/Dialog/hooks/useDialog.ts", "../../src/store/hooks/useStateStore.ts", "../../src/components/Portal/Portal.ts", "../../src/context/MessageContext.tsx", "../../src/context/TranslationContext.tsx", "../../src/i18n/utils.ts", "../../src/components/MessageInput/hooks/useMessageComposer.ts", "../../src/components/Threads/ThreadContext.tsx", "../../src/components/Avatar/Avatar.tsx", "../../src/components/Threads/icons.tsx", "../../src/utils/getWholeChar.ts", "../../src/components/ChannelPreview/ChannelPreview.tsx", "../../src/components/ChannelPreview/ChannelPreviewMessenger.tsx", "../../src/components/ChannelPreview/ChannelPreviewActionButtons.tsx", "../../src/constants/limits.ts", "../../src/components/ChannelList/hooks/useSelectedChannelState.ts", "../../src/components/ChannelList/hooks/useChannelMembershipState.ts", "../../src/components/ChannelPreview/icons.tsx", "../../src/components/ChannelPreview/hooks/useIsChannelMuted.ts", "../../src/components/ChannelPreview/hooks/useChannelPreviewInfo.ts", "../../src/components/ChannelPreview/utils.tsx", "../../node_modules/devlop/lib/default.js", "../../node_modules/comma-separated-tokens/index.js", "../../node_modules/estree-util-is-identifier-name/lib/index.js", "../../node_modules/hast-util-whitespace/lib/index.js", "../../node_modules/property-information/lib/util/schema.js", "../../node_modules/property-information/lib/util/merge.js", "../../node_modules/property-information/lib/normalize.js", "../../node_modules/property-information/lib/util/info.js", "../../node_modules/property-information/lib/util/types.js", "../../node_modules/property-information/lib/util/defined-info.js", "../../node_modules/property-information/lib/util/create.js", "../../node_modules/property-information/lib/xlink.js", "../../node_modules/property-information/lib/xml.js", "../../node_modules/property-information/lib/util/case-sensitive-transform.js", "../../node_modules/property-information/lib/util/case-insensitive-transform.js", "../../node_modules/property-information/lib/xmlns.js", "../../node_modules/property-information/lib/aria.js", "../../node_modules/property-information/lib/html.js", "../../node_modules/property-information/lib/svg.js", "../../node_modules/property-information/lib/find.js", "../../node_modules/property-information/lib/hast-to-react.js", "../../node_modules/property-information/index.js", "../../node_modules/space-separated-tokens/index.js", "../../node_modules/style-to-object/esm/index.mjs", "../../node_modules/unist-util-position/lib/index.js", "../../node_modules/unist-util-stringify-position/lib/index.js", "../../node_modules/vfile-message/lib/index.js", "../../node_modules/hast-util-to-jsx-runtime/lib/index.js", "../../node_modules/html-url-attributes/lib/index.js", "../../node_modules/react-markdown/lib/index.js", "../../node_modules/mdast-util-to-string/lib/index.js", "../../node_modules/decode-named-character-reference/index.dom.js", "../../node_modules/micromark-util-chunked/index.js", "../../node_modules/micromark-util-combine-extensions/index.js", "../../node_modules/micromark-util-decode-numeric-character-reference/index.js", "../../node_modules/micromark-util-normalize-identifier/index.js", "../../node_modules/micromark-util-character/index.js", "../../node_modules/micromark-util-sanitize-uri/index.js", "../../node_modules/micromark-factory-space/index.js", "../../node_modules/micromark/lib/initialize/content.js", "../../node_modules/micromark/lib/initialize/document.js", "../../node_modules/micromark-util-classify-character/index.js", "../../node_modules/micromark-util-resolve-all/index.js", "../../node_modules/micromark-core-commonmark/lib/attention.js", "../../node_modules/micromark-core-commonmark/lib/autolink.js", "../../node_modules/micromark-core-commonmark/lib/blank-line.js", "../../node_modules/micromark-core-commonmark/lib/block-quote.js", "../../node_modules/micromark-core-commonmark/lib/character-escape.js", "../../node_modules/micromark-core-commonmark/lib/character-reference.js", "../../node_modules/micromark-core-commonmark/lib/code-fenced.js", "../../node_modules/micromark-core-commonmark/lib/code-indented.js", "../../node_modules/micromark-core-commonmark/lib/code-text.js", "../../node_modules/micromark-util-subtokenize/lib/splice-buffer.js", "../../node_modules/micromark-util-subtokenize/index.js", "../../node_modules/micromark-core-commonmark/lib/content.js", "../../node_modules/micromark-factory-destination/index.js", "../../node_modules/micromark-factory-label/index.js", "../../node_modules/micromark-factory-title/index.js", "../../node_modules/micromark-factory-whitespace/index.js", "../../node_modules/micromark-core-commonmark/lib/definition.js", "../../node_modules/micromark-core-commonmark/lib/hard-break-escape.js", "../../node_modules/micromark-core-commonmark/lib/heading-atx.js", "../../node_modules/micromark-util-html-tag-name/index.js", "../../node_modules/micromark-core-commonmark/lib/html-flow.js", "../../node_modules/micromark-core-commonmark/lib/html-text.js", "../../node_modules/micromark-core-commonmark/lib/label-end.js", "../../node_modules/micromark-core-commonmark/lib/label-start-image.js", "../../node_modules/micromark-core-commonmark/lib/label-start-link.js", "../../node_modules/micromark-core-commonmark/lib/line-ending.js", "../../node_modules/micromark-core-commonmark/lib/thematic-break.js", "../../node_modules/micromark-core-commonmark/lib/list.js", "../../node_modules/micromark-core-commonmark/lib/setext-underline.js", "../../node_modules/micromark/lib/initialize/flow.js", "../../node_modules/micromark/lib/initialize/text.js", "../../node_modules/micromark/lib/constructs.js", "../../node_modules/micromark/lib/create-tokenizer.js", "../../node_modules/micromark/lib/parse.js", "../../node_modules/micromark/lib/postprocess.js", "../../node_modules/micromark/lib/preprocess.js", "../../node_modules/micromark-util-decode-string/index.js", "../../node_modules/mdast-util-from-markdown/lib/index.js", "../../node_modules/remark-parse/lib/index.js", "../../node_modules/mdast-util-to-hast/lib/handlers/blockquote.js", "../../node_modules/mdast-util-to-hast/lib/handlers/break.js", "../../node_modules/mdast-util-to-hast/lib/handlers/code.js", "../../node_modules/mdast-util-to-hast/lib/handlers/delete.js", "../../node_modules/mdast-util-to-hast/lib/handlers/emphasis.js", "../../node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.js", "../../node_modules/mdast-util-to-hast/lib/handlers/heading.js", "../../node_modules/mdast-util-to-hast/lib/handlers/html.js", "../../node_modules/mdast-util-to-hast/lib/revert.js", "../../node_modules/mdast-util-to-hast/lib/handlers/image-reference.js", "../../node_modules/mdast-util-to-hast/lib/handlers/image.js", "../../node_modules/mdast-util-to-hast/lib/handlers/inline-code.js", "../../node_modules/mdast-util-to-hast/lib/handlers/link-reference.js", "../../node_modules/mdast-util-to-hast/lib/handlers/link.js", "../../node_modules/mdast-util-to-hast/lib/handlers/list-item.js", "../../node_modules/mdast-util-to-hast/lib/handlers/list.js", "../../node_modules/mdast-util-to-hast/lib/handlers/paragraph.js", "../../node_modules/mdast-util-to-hast/lib/handlers/root.js", "../../node_modules/mdast-util-to-hast/lib/handlers/strong.js", "../../node_modules/mdast-util-to-hast/lib/handlers/table.js", "../../node_modules/mdast-util-to-hast/lib/handlers/table-row.js", "../../node_modules/mdast-util-to-hast/lib/handlers/table-cell.js", "../../node_modules/trim-lines/index.js", "../../node_modules/mdast-util-to-hast/lib/handlers/text.js", "../../node_modules/mdast-util-to-hast/lib/handlers/thematic-break.js", "../../node_modules/mdast-util-to-hast/lib/handlers/index.js", "../../node_modules/@ungap/structured-clone/esm/types.js", "../../node_modules/@ungap/structured-clone/esm/deserialize.js", "../../node_modules/@ungap/structured-clone/esm/serialize.js", "../../node_modules/@ungap/structured-clone/esm/index.js", "../../node_modules/mdast-util-to-hast/lib/footer.js", "../../node_modules/unist-util-is/lib/index.js", "../../node_modules/unist-util-visit-parents/lib/color.js", "../../node_modules/unist-util-visit-parents/lib/index.js", "../../node_modules/unist-util-visit/lib/index.js", "../../node_modules/mdast-util-to-hast/lib/state.js", "../../node_modules/mdast-util-to-hast/lib/index.js", "../../node_modules/remark-rehype/lib/index.js", "../../node_modules/bail/index.js", "../../node_modules/unified/lib/index.js", "../../node_modules/is-plain-obj/index.js", "../../node_modules/trough/index.js", "../../node_modules/vfile/lib/minpath.browser.js", "../../node_modules/vfile/lib/minproc.browser.js", "../../node_modules/vfile/lib/minurl.shared.js", "../../node_modules/vfile/lib/minurl.browser.js", "../../node_modules/vfile/lib/index.js", "../../node_modules/unified/lib/callable-instance.js", "../../src/components/ChannelPreview/hooks/useMessageDeliveryStatus.ts", "../../src/components/Thread/LegacyThreadContext.ts", "../../src/components/Message/utils.tsx", "../../src/components/Message/hooks/useUserRole.ts", "../../src/components/Message/hooks/useMessageReminder.ts", "../../src/components/Dialog/ButtonWithSubmenu.tsx", "../../src/components/Dialog/DialogAnchor.tsx", "../../src/components/MessageActions/MessageActions.tsx", "../../src/components/MessageActions/RemindMeSubmenu.tsx", "../../src/components/Message/icons.tsx", "../../src/components/Reactions/ReactionSelectorWithButton.tsx", "../../src/components/Reactions/ReactionSelector.tsx", "../../src/components/Reactions/reactionOptions.tsx", "../../src/components/Reactions/StreamEmoji.tsx", "../../src/components/Reactions/SpriteImage.tsx", "../../src/components/Reactions/utils/utils.ts", "../../src/components/InfiniteScrollPaginator/InfiniteScrollPaginator.tsx", "../../src/experimental/Search/hooks/useSearchQueriesInProgress.ts", "../../src/experimental/MessageActions/hooks/useBaseMessageActionSetFilter.ts", "../../src/experimental/MessageActions/hooks/useSplitMessageActionSet.ts", "../../src/experimental/MessageActions/defaults.tsx", "../../src/experimental/Search/Search.tsx", "../../src/experimental/Search/SearchBar/SearchBar.tsx", "../../src/experimental/Search/SearchContext.tsx", "../../src/experimental/Search/SearchResults/SearchResults.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResults.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResultList.tsx", "../../src/experimental/Search/SearchResults/SearchResultItem.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResultListFooter.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResultsLoadingIndicator.tsx", "../../src/experimental/Search/SearchSourceResultsContext.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResultsEmpty.tsx", "../../src/experimental/Search/SearchResults/SearchSourceResultsHeader.tsx", "../../src/experimental/Search/SearchResults/SearchResultsHeader.tsx", "../../src/experimental/Search/SearchResults/SearchResultsPresearch.tsx"],
"sourcesContent": ["// http://www.w3.org/TR/CSS21/grammar.html\n// https://github.com/visionmedia/css-parse/pull/49#issuecomment-30088027\nvar COMMENT_REGEX = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\n\nvar NEWLINE_REGEX = /\\n/g;\nvar WHITESPACE_REGEX = /^\\s*/;\n\n// declaration\nvar PROPERTY_REGEX = /^(\\*?[-#/*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/;\nvar COLON_REGEX = /^:\\s*/;\nvar VALUE_REGEX = /^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^)]*?\\)|[^};])+)/;\nvar SEMICOLON_REGEX = /^[;\\s]*/;\n\n// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/Trim#Polyfill\nvar TRIM_REGEX = /^\\s+|\\s+$/g;\n\n// strings\nvar NEWLINE = '\\n';\nvar FORWARD_SLASH = '/';\nvar ASTERISK = '*';\nvar EMPTY_STRING = '';\n\n// types\nvar TYPE_COMMENT = 'comment';\nvar TYPE_DECLARATION = 'declaration';\n\n/**\n * @param {String} style\n * @param {Object} [options]\n * @return {Object[]}\n * @throws {TypeError}\n * @throws {Error}\n */\nmodule.exports = function (style, options) {\n if (typeof style !== 'string') {\n throw new TypeError('First argument must be a string');\n }\n\n if (!style) return [];\n\n options = options || {};\n\n /**\n * Positional.\n */\n var lineno = 1;\n var column = 1;\n\n /**\n * Update lineno and column based on `str`.\n *\n * @param {String} str\n */\n function updatePosition(str) {\n var lines = str.match(NEWLINE_REGEX);\n if (lines) lineno += lines.length;\n var i = str.lastIndexOf(NEWLINE);\n column = ~i ? str.length - i : column + str.length;\n }\n\n /**\n * Mark position and patch `node.position`.\n *\n * @return {Function}\n */\n function position() {\n var start = { line: lineno, column: column };\n return function (node) {\n node.position = new Position(start);\n whitespace();\n return node;\n };\n }\n\n /**\n * Store position information for a node.\n *\n * @constructor\n * @property {Object} start\n * @property {Object} end\n * @property {undefined|String} source\n */\n function Position(start) {\n this.start = start;\n this.end = { line: lineno, column: column };\n this.source = options.source;\n }\n\n /**\n * Non-enumerable source string.\n */\n Position.prototype.content = style;\n\n var errorsList = [];\n\n /**\n * Error `msg`.\n *\n * @param {String} msg\n * @throws {Error}\n */\n function error(msg) {\n var err = new Error(\n options.source + ':' + lineno + ':' + column + ': ' + msg\n );\n err.reason = msg;\n err.filename = options.source;\n err.line = lineno;\n err.column = column;\n err.source = style;\n\n if (options.silent) {\n errorsList.push(err);\n } else {\n throw err;\n }\n }\n\n /**\n * Match `re` and return captures.\n *\n * @param {RegExp} re\n * @return {undefined|Array}\n */\n function match(re) {\n var m = re.exec(style);\n if (!m) return;\n var str = m[0];\n updatePosition(str);\n style = style.slice(str.length);\n return m;\n }\n\n /**\n * Parse whitespace.\n */\n function whitespace() {\n match(WHITESPACE_REGEX);\n }\n\n /**\n * Parse comments.\n *\n * @param {Object[]} [rules]\n * @return {Object[]}\n */\n function comments(rules) {\n var c;\n rules = rules || [];\n while ((c = comment())) {\n if (c !== false) {\n rules.push(c);\n }\n }\n return rules;\n }\n\n /**\n * Parse comment.\n *\n * @return {Object}\n * @throws {Error}\n */\n function comment() {\n var pos = position();\n if (FORWARD_SLASH != style.charAt(0) || ASTERISK != style.charAt(1)) return;\n\n var i = 2;\n while (\n EMPTY_STRING != style.charAt(i) &&\n (ASTERISK != style.charAt(i) || FORWARD_SLASH != style.charAt(i + 1))\n ) {\n ++i;\n }\n i += 2;\n\n if (EMPTY_STRING === style.charAt(i - 1)) {\n return error('End of comment missing');\n }\n\n var str = style.slice(2, i - 2);\n column += 2;\n updatePosition(str);\n style = style.slice(i);\n column += 2;\n\n return pos({\n type: TYPE_COMMENT,\n comment: str\n });\n }\n\n /**\n * Parse declaration.\n *\n * @return {Object}\n * @throws {Error}\n */\n function declaration() {\n var pos = position();\n\n // prop\n var prop = match(PROPERTY_REGEX);\n if (!prop) return;\n comment();\n\n // :\n if (!match(COLON_REGEX)) return error(\"property missing ':'\");\n\n // val\n var val = match(VALUE_REGEX);\n\n var ret = pos({\n type: TYPE_DECLARATION,\n property: trim(prop[0].replace(COMMENT_REGEX, EMPTY_STRING)),\n value: val\n ? trim(val[0].replace(COMMENT_REGEX, EMPTY_STRING))\n : EMPTY_STRING\n });\n\n // ;\n match(SEMICOLON_REGEX);\n\n return ret;\n }\n\n /**\n * Parse declarations.\n *\n * @return {Object[]}\n */\n function declarations() {\n var decls = [];\n\n comments(decls);\n\n // declarations\n var decl;\n while ((decl = declaration())) {\n if (decl !== false) {\n decls.push(decl);\n comments(decls);\n }\n }\n\n return decls;\n }\n\n whitespace();\n return declarations();\n};\n\n/**\n * Trim `str`.\n *\n * @param {String} str\n * @return {String}\n */\nfunction trim(str) {\n return str ? str.replace(TRIM_REGEX, EMPTY_STRING) : EMPTY_STRING;\n}\n", "import type { Declaration } from 'inline-style-parser';\nimport parse from 'inline-style-parser';\n\nexport { Declaration };\n\ninterface StyleObject {\n [name: string]: string;\n}\n\ntype Iterator = (\n property: string,\n value: string,\n declaration: Declaration,\n) => void;\n\n/**\n * Parses inline style to object.\n *\n * @param style - Inline style.\n * @param iterator - Iterator.\n * @returns - Style object or null.\n *\n * @example Parsing inline style to object:\n *\n * ```js\n * import parse from 'style-to-object';\n * parse('line-height: 42;'); // { 'line-height': '42' }\n * ```\n */\nexport default function StyleToObject(\n style: string,\n iterator?: Iterator,\n): StyleObject | null {\n let styleObject: StyleObject | null = null;\n\n if (!style || typeof style !== 'string') {\n return styleObject;\n }\n\n const declarations = parse(style);\n const hasIterator = typeof iterator === 'function';\n\n declarations.forEach((declaration) => {\n if (declaration.type !== 'declaration') {\n return;\n }\n\n const { property, value } = declaration;\n\n if (hasIterator) {\n iterator(property, value, declaration);\n } else if (value) {\n styleObject = styleObject || {};\n styleObject[property] = value;\n }\n });\n\n return styleObject;\n}\n", "'use strict';\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n", "export * from './MessageActions';\nexport * from './Search';\n", "import clsx from 'clsx';\nimport React, { useState } from 'react';\nimport type { PropsWithChildren } from 'react';\n\nimport { useChatContext, useMessageContext, useTranslationContext } from '../../context';\nimport { ActionsIcon } from '../../components/Message/icons';\nimport { DialogAnchor, useDialog, useDialogIsOpen } from '../../components/Dialog';\nimport { MessageActionsWrapper } from '../../components/MessageActions/MessageActions';\nimport { useBaseMessageActionSetFilter, useSplitMessageActionSet } from './hooks';\nimport { defaultMessageActionSet } from './defaults';\nimport type { MESSAGE_ACTIONS } from '../../components';\n\nexport type MessageActionSetItem = {\n Component: React.ComponentType;\n placement: 'quick' | 'dropdown';\n type: keyof typeof MESSAGE_ACTIONS | (string & {});\n};\n\nexport type MessageActionsProps = {\n disableBaseMessageActionSetFilter?: boolean;\n messageActionSet?: MessageActionSetItem[];\n};\n\n// TODO: allow passing down customWrapperClass\n/**\n * A new actions component to replace current `MessageOptions` component.\n * Exports from `stream-chat-react/experimental` __MIGHT__ change - use with caution\n * and follow release notes in case you notice unexpected behavior.\n */\nexport const MessageActions = ({\n disableBaseMessageActionSetFilter = false,\n messageActionSet = defaultMessageActionSet,\n}: MessageActionsProps) => {\n const { theme } = useChatContext();\n const { isMyMessage, message } = useMessageContext();\n const { t } = useTranslationContext();\n const [actionsBoxButtonElement, setActionsBoxButtonElement] =\n useState<HTMLButtonElement | null>(null);\n\n const filteredMessageActionSet = useBaseMessageActionSetFilter(\n messageActionSet,\n disableBaseMessageActionSetFilter,\n );\n\n const { dropdownActionSet, quickActionSet } = useSplitMessageActionSet(\n filteredMessageActionSet,\n );\n\n const dropdownDialogId = `message-actions--${message.id}`;\n const reactionSelectorDialogId = `reaction-selector--${message.id}`;\n const dialog = useDialog({ id: dropdownDialogId });\n const dropdownDialogIsOpen = useDialogIsOpen(dropdownDialogId);\n const reactionSelectorDialogIsOpen = useDialogIsOpen(reactionSelectorDialogId);\n\n // do not render anything if total action count is zero\n if (dropdownActionSet.length + quickActionSet.length === 0) {\n return null;\n }\n\n return (\n <div\n className={clsx(`str-chat__message-${theme}__actions str-chat__message-options`, {\n 'str-chat__message-options--active':\n dropdownDialogIsOpen || reactionSelectorDialogIsOpen,\n })}\n >\n {dropdownActionSet.length > 0 && (\n <MessageActionsWrapper inline={false} toggleOpen={dialog?.toggle}>\n <button\n aria-expanded={dropdownDialogIsOpen}\n aria-haspopup='true'\n aria-label={t('aria/Open Message Actions Menu')}\n className='str-chat__message-actions-box-button'\n data-testid='message-actions-toggle-button'\n ref={setActionsBoxButtonElement}\n >\n <ActionsIcon className='str-chat__message-action-icon' />\n </button>\n\n <DialogAnchor\n id={dropdownDialogId}\n placement={isMyMessage() ? 'top-end' : 'top-start'}\n referenceElement={actionsBoxButtonElement}\n tabIndex={-1}\n trapFocus\n >\n <DropdownBox open={dropdownDialogIsOpen}>\n {dropdownActionSet.map(({ Component: DropdownActionComponent, type }) => (\n <DropdownActionComponent key={type} />\n ))}\n </DropdownBox>\n </DialogAnchor>\n </MessageActionsWrapper>\n )}\n {quickActionSet.map(({ Component: QuickActionComponent, type }) => (\n <QuickActionComponent key={type} />\n ))}\n </div>\n );\n};\n\nconst DropdownBox = ({ children, open }: PropsWithChildren<{ open: boolean }>) => {\n const { t } = useTranslationContext();\n return (\n <div\n className={clsx('str-chat__message-actions-box', {\n 'str-chat__message-actions-box--open': open,\n })}\n >\n <div\n aria-label={t('aria/Message Options')}\n className='str-chat__message-actions-list'\n role='listbox'\n >\n {children}\n </div>\n </div>\n );\n};\n", "import type { Dispatch, PropsWithChildren, SetStateAction } from 'react';\nimport React, { createContext, useContext } from 'react';\n\nimport type { Channel } from 'stream-chat';\n\nexport type ChannelListContextValue = {\n /**\n * State representing the array of loaded channels.\n * Channels query is executed by default only by ChannelList component in the SDK.\n */\n channels: Channel[];\n /**\n * Indicator for channel pagination to determine whether more items can be loaded\n */\n hasNextPage: boolean;\n /**\n * Pagination function to load more channels\n */\n loadNextPage(): Promise<void>;\n /**\n * Sets the list of Channel objects to be rendered by ChannelList component.\n */\n setChannels: Dispatch<SetStateAction<Channel[]>>;\n};\n\nexport const ChannelListContext = createContext<ChannelListContextValue | undefined>(\n undefined,\n);\n\n/**\n * Context provider for components rendered within the `ChannelList`\n */\nexport const ChannelListContextProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: ChannelListContextValue;\n}>) => (\n <ChannelListContext.Provider value={value as unknown as ChannelListContextValue}>\n {children}\n </ChannelListContext.Provider>\n);\n\nexport const useChannelListContext = (componentName?: string) => {\n const contextValue = useContext(ChannelListContext);\n\n if (!contextValue) {\n console.warn(\n `The useChannelListContext hook was called outside of the ChannelListContext provider. Make sure this hook is called within the ChannelList component. The errored call is located in the ${componentName} component.`,\n );\n\n return {} as ChannelListContextValue;\n }\n\n return contextValue as unknown as ChannelListContextValue;\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\nimport type {\n Channel,\n ChannelConfigWithInfo,\n LocalMessage,\n Mute,\n ChannelState as StreamChannelState,\n} from 'stream-chat';\n\nimport type {\n ChannelUnreadUiState,\n GiphyVersions,\n ImageAttachmentSizeHandler,\n UnknownType,\n VideoAttachmentSizeHandler,\n} from '../types/types';\n\nexport type ChannelNotifications = Array<{\n id: string;\n text: string;\n type: 'success' | 'error';\n}>;\n\nexport type ChannelState = {\n suppressAutoscroll: boolean;\n error?: Error | null;\n hasMore?: boolean;\n hasMoreNewer?: boolean;\n highlightedMessageId?: string;\n loading?: boolean;\n loadingMore?: boolean;\n loadingMoreNewer?: boolean;\n members?: StreamChannelState['members'];\n messages?: LocalMessage[];\n pinnedMessages?: LocalMessage[];\n read?: StreamChannelState['read'];\n thread?: LocalMessage | null;\n threadHasMore?: boolean;\n threadLoadingMore?: boolean;\n threadMessages?: LocalMessage[];\n threadSuppressAutoscroll?: boolean;\n typing?: StreamChannelState['typing'];\n watcherCount?: number;\n watchers?: StreamChannelState['watchers'];\n};\n\nexport type ChannelStateContextValue = Omit<ChannelState, 'typing'> & {\n channel: Channel;\n channelCapabilities: Record<string, boolean>;\n channelConfig: ChannelConfigWithInfo | undefined;\n imageAttachmentSizeHandler: ImageAttachmentSizeHandler;\n notifications: ChannelNotifications;\n shouldGenerateVideoThumbnail: boolean;\n videoAttachmentSizeHandler: VideoAttachmentSizeHandler;\n channelUnreadUiState?: ChannelUnreadUiState;\n giphyVersion?: GiphyVersions;\n mutes?: Array<Mute>;\n watcher_count?: number;\n};\n\nexport const ChannelStateContext = React.createContext<\n ChannelStateContextValue | undefined\n>(undefined);\n\nexport const ChannelStateProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: ChannelStateContextValue;\n}>) => (\n <ChannelStateContext.Provider value={value as unknown as ChannelStateContextValue}>\n {children}\n </ChannelStateContext.Provider>\n);\n\nexport const useChannelStateContext = (componentName?: string) => {\n const contextValue = useContext(ChannelStateContext);\n\n if (!contextValue) {\n console.warn(\n `The useChannelStateContext hook was called outside of the ChannelStateContext provider. Make sure this hook is called within a child of the Channel component. The errored call is located in the ${componentName} component.`,\n );\n\n return {} as ChannelStateContextValue;\n }\n\n return contextValue as unknown as ChannelStateContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference, so if ChannelStateContext\n * typing is desired while using the HOC withChannelStateContext, the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChannelStateContext = <P extends UnknownType>(\n Component: React.ComponentType<P>,\n) => {\n const WithChannelStateContextComponent = (\n props: Omit<P, keyof ChannelStateContextValue>,\n ) => {\n const channelStateContext = useChannelStateContext();\n\n return <Component {...(props as P)} {...channelStateContext} />;\n };\n\n WithChannelStateContextComponent.displayName = (\n Component.displayName ||\n Component.name ||\n 'Component'\n ).replace('Base', '');\n\n return WithChannelStateContextComponent;\n};\n", "import React, { useContext } from 'react';\nimport type { PropsWithChildren } from 'react';\nimport type {\n AppSettingsAPIResponse,\n Channel,\n Mute,\n SearchController,\n} from 'stream-chat';\n\nimport { getDisplayName } from './utils/getDisplayName';\nimport type { ChatProps } from '../components/Chat/Chat';\nimport type { UnknownType } from '../types/types';\nimport type { ChannelsQueryState } from '../components/Chat/hooks/useChannelsQueryState';\n\ntype CSSClasses =\n | 'chat'\n | 'chatContainer'\n | 'channel'\n | 'channelList'\n | 'message'\n | 'messageList'\n | 'thread'\n | 'threadList'\n | 'virtualMessage'\n | 'virtualizedMessageList';\n\nexport type CustomClasses = Partial<Record<CSSClasses, string>>;\n\ntype ChannelConfId = string; // e.g.: \"messaging:general\"\n\nexport type ChatContextValue = {\n /**\n * Indicates, whether a channels query has been triggered within ChannelList by its channels pagination controller.\n */\n channelsQueryState: ChannelsQueryState;\n closeMobileNav: () => void;\n getAppSettings: () => Promise<AppSettingsAPIResponse> | null;\n latestMessageDatesByChannels: Record<ChannelConfId, Date>;\n mutes: Array<Mute>;\n openMobileNav: () => void;\n /** Instance of SearchController class that allows to control all the search operations. */\n searchController: SearchController;\n /**\n * Sets active channel to be rendered within Channel component.\n * @param newChannel\n * @param watchers\n * @param event\n */\n setActiveChannel: (\n newChannel?: Channel,\n watchers?: { limit?: number; offset?: number },\n event?: React.BaseSyntheticEvent,\n ) => void;\n useImageFlagEmojisOnWindows: boolean;\n /**\n * Active channel used to render the contents of the Channel component.\n */\n channel?: Channel;\n /**\n * Object through which custom classes can be set for main container components of the SDK.\n */\n customClasses?: CustomClasses;\n navOpen?: boolean;\n} & Partial<Pick<ChatProps, 'isMessageAIGenerated'>> &\n Required<Pick<ChatProps, 'theme' | 'client'>>;\n\nexport const ChatContext = React.createContext<ChatContextValue | undefined>(undefined);\n\nexport const ChatProvider = ({\n children,\n value,\n}: PropsWithChildren<{\n value: ChatContextValue;\n}>) => (\n <ChatContext.Provider value={value as unknown as ChatContextValue}>\n {children}\n </ChatContext.Provider>\n);\n\nexport const useChatContext = (componentName?: string) => {\n const contextValue = useContext(ChatContext);\n\n if (!contextValue) {\n console.warn(\n `The useChatContext hook was called outside of the ChatContext provider. Make sure this hook is called within a child of the Chat component. The errored call is located in the ${componentName} component.`,\n );\n\n return {} as ChatContextValue;\n }\n\n return contextValue as unknown as ChatContextValue;\n};\n\n/**\n * Typescript currently does not support partial inference so if ChatContext\n * typing is desired while using the HOC withChatContext the Props for the\n * wrapped component must be provided as the first generic.\n */\nexport const withChatContext = <P extends UnknownType>(\n Component: React.ComponentType<P>,\n) => {\n const WithChatContextComponent = (props: Omit<P, keyof ChatContextValue>) => {\n const chatContext = useChatContext();\n\n return <Component {...(props as P)} {...chatContext} />;\n };\n WithChatContextComponent.displayName = `WithChatContext${getDisplayName(Component)}`;\n return WithChatContextComponent;\n};\n", "import type { PropsWithChildren } from 'react';\nimport React, { useContext } from 'react';\n\nimport type {\n AttachmentPreviewListProps,\n AttachmentProps,\n AvatarProps,\n BaseImageProps,\n ChannelPreviewActionButtonsProps,\n CooldownTimerProps,\n CustomMessageActionsListProps,\n DateSeparatorProps,\n EmojiSearchIndex,\n EmptyStateIndicatorProps,\n EventComponentProps,\n FixedHeightMessageProps,\n GiphyPreviewMessageProps,\n LoadingIndicatorProps,\n MessageBouncePromptProps,\n MessageDeletedProps,\n MessageInputProps,\n MessageListNotificationsProps,\n MessageNotificationProps,\n MessageOptionsProps,\n MessageProps,\n MessageRepliesCountButtonProps,\n MessageStatusProps,\n MessageTimestampProps,\n MessageUIComponentProps,\n ModalGalleryProps,\n ModalProps,\n PinIndicatorProps,\n PollCreationDialogProps,\n PollOptionSelectorProps,\n QuotedMessagePreviewProps,\n ReactionOptions,\n ReactionSelectorProps,\n ReactionsListModalProps,\n ReactionsListProps,\n RecordingPermissionDeniedNotificationProps,\n ReminderNotificationProps,\n SendButtonProps,\n StartRecordingAudioButtonProps,\n StreamedMessageTextProps,\n TextareaComposerProps,\n ThreadHeaderProps,\n ThreadListItemProps,\n ThreadListItemUIProps,\n TimestampProps,\n TypingIndicatorProps,\n UnreadMessagesNotificationProps,\n UnreadMessagesSeparatorProps,\n} from '../components';\n\nimport type {\n SuggestionItemProps,\n SuggestionListProps,\n} from '../components/TextareaComposer';\n\nimport type {\n SearchProps,\n SearchResultsPresearchProps,\n SearchSourceResultListProps,\n} from '../experimental';\n\nimport type { PropsWithChildrenOnly, UnknownType } from '../types/types';\nimport type { StopAIGenerationButtonProps } from '../components/MessageInput/StopAIGenerationButton';\nimport type { ShareLocationDialogProps } from '../components/Location';\n\nexport type ComponentContextValue = {\n /** Custom UI component to display a message attachment, defaults to and accepts same props as: [Attachment](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Attachment/Attachment.tsx) */\n Attachment?: React.ComponentType<AttachmentProps>;\n /** Custom UI component to display an attachment previews in MessageInput, defaults to and accepts same props as: [Attachment](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentPreviewList.tsx) */\n AttachmentPreviewList?: React.ComponentType<AttachmentPreviewListProps>;\n /** Custom UI component to control adding attachments to MessageInput, defaults to and accepts same props as: [AttachmentSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AttachmentSelector.tsx) */\n AttachmentSelector?: React.ComponentType;\n /** Custom UI component for contents of attachment selector initiation button */\n AttachmentSelectorInitiationButtonContents?: React.ComponentType;\n /** Custom UI component to display AudioRecorder in MessageInput, defaults to and accepts same props as: [AudioRecorder](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/AudioRecorder.tsx) */\n AudioRecorder?: React.ComponentType;\n /** Optional UI component to override the default suggestion Item component, defaults to and accepts same props as: [Item](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/Item.js) */\n AutocompleteSuggestionItem?: React.ComponentType<SuggestionItemProps>;\n /** Optional UI component to override the default List component that displays suggestions, defaults to and accepts same props as: [List](https://github.com/GetStream/stream-chat-react/blob/master/src/components/AutoCompleteTextarea/List.js) */\n AutocompleteSuggestionList?: React.ComponentType<SuggestionListProps>;\n /** UI component to display a user's avatar, defaults to and accepts same props as: [Avatar](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Avatar/Avatar.tsx) */\n Avatar?: React.ComponentType<AvatarProps>;\n /** Custom UI component to display <img/> elements resp. a fallback in case of load error, defaults to and accepts same props as: [BaseImage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/BaseImage.tsx) */\n BaseImage?: React.ComponentType<BaseImageProps>;\n /** Custom UI component to display set of action buttons within `ChannelPreviewMessenger` component, accepts same props as: [ChannelPreviewActionButtons](https://github.com/GetStream/stream-chat-react/blob/master/src/components/ChannelList/ChannelPreviewActionButtons.tsx) */\n ChannelPreviewActionButtons?: React.ComponentType<ChannelPreviewActionButtonsProps>;\n /** Custom UI component to display the slow mode cooldown timer, defaults to and accepts same props as: [CooldownTimer](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/CooldownTimer.tsx) */\n CooldownTimer?: React.ComponentType<CooldownTimerProps>;\n /** Custom UI component to render set of buttons to be displayed in the MessageActionsBox, defaults to and accepts same props as: [CustomMessageActionsList](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageActions/CustomMessageActionsList.tsx) */\n CustomMessageActionsList?: React.ComponentType<CustomMessageActionsListProps>;\n /** Custom UI component for date separators, defaults to and accepts same props as: [DateSeparator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/DateSeparator.tsx) */\n DateSeparator?: React.ComponentType<DateSeparatorProps>;\n /** Custom UI component to override default edit message input, defaults to and accepts same props as: [EditMessageForm](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/EditMessageForm.tsx) */\n EditMessageInput?: React.ComponentType<MessageInputProps>;\n /** Custom UI component for rendering button with emoji picker in MessageInput */\n EmojiPicker?: React.ComponentType;\n /** Mechanism to be used with autocomplete and text replace features of the `MessageInput` component, see [emoji-mart `SearchIndex`](https://github.com/missive/emoji-mart#%EF%B8%8F%EF%B8%8F-headless-search) */\n emojiSearchIndex?: EmojiSearchIndex;\n /** Custom UI component to be displayed when the `MessageList` is empty, defaults to and accepts same props as: [EmptyStateIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EmptyStateIndicator/EmptyStateIndicator.tsx) */\n EmptyStateIndicator?: React.ComponentType<EmptyStateIndicatorProps>;\n /**\n * Custom UI component for file upload icon, defaults to and accepts same props as: [FileUploadIcon](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/icons.tsx)\n * @deprecated use AttachmentSelectorInitiationButtonContents prop instead\n */\n FileUploadIcon?: React.ComponentType;\n /** Custom UI component to render a Giphy preview in the `VirtualizedMessageList` */\n GiphyPreviewMessage?: React.ComponentType<GiphyPreviewMessageProps>;\n /** Custom UI component to render at the top of the `MessageList` */\n HeaderComponent?: React.ComponentType;\n /** Custom UI component handling how the message input is rendered, defaults to and accepts the same props as [MessageInputFlat](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageInput/MessageInputFlat.tsx) */\n Input?: React.ComponentType<MessageInputProps>;\n /** Custom component to render link previews in message input **/\n LinkPreviewList?: React.ComponentType;\n /** Custom UI component to render while the `MessageList` is loading new messages, defaults to and accepts same props as: [LoadingIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Loading/LoadingIndicator.tsx) */\n LoadingIndicator?: React.ComponentType<LoadingIndicatorProps>;\n /** Custom UI component to display a message in the standard `MessageList`, defaults to and accepts the same props as: [MessageSimple](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageSimple.tsx) */\n Message?: React.ComponentType<MessageUIComponentProps>;\n /** Custom UI component for message actions popup, accepts no props, all the defaults are set within [MessageActions (unstable)](https://github.com/GetStream/stream-chat-react/blob/master/src/experimental/MessageActions/MessageActions.tsx) */\n MessageActions?: React.ComponentType;\n /** Custom UI component to display the contents of a bounced message modal. Usually it allows to retry, edit, or delete the message. Defaults to and accepts the same props as: [MessageBouncePrompt](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageBounce/MessageBouncePrompt.tsx) */\n MessageBouncePrompt?: React.ComponentType<MessageBouncePromptProps>;\n /** Custom UI component for a moderation-blocked message, defaults to and accepts same props as: [MessageBlocked](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageBlocked.tsx) */\n MessageBlocked?: React.ComponentType;\n /** Custom UI component for a deleted message, defaults to and accepts same props as: [MessageDeleted](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageDeleted.tsx) */\n MessageDeleted?: React.ComponentType<MessageDeletedProps>;\n /** Custom UI component for an indicator that a message is a thread reply sent to channel list: [MessageIsThreadReplyInChannelButtonIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageIsThreadReplyInChannelButtonIndicator.tsx) */\n MessageIsThreadReplyInChannelButtonIndicator?: React.ComponentType;\n MessageListMainPanel?: React.ComponentType<PropsWithChildrenOnly>;\n /** Custom UI component that displays message and connection status notifications in the `MessageList`, defaults to and accepts same props as [DefaultMessageListNotifications](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/MessageListNotifications.tsx) */\n MessageListNotifications?: React.ComponentType<MessageListNotificationsProps>;\n /** Custom UI component to display a notification when scrolled up the list and new messages arrive, defaults to and accepts same props as [MessageNotification](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageList/MessageNotification.tsx) */\n MessageNotification?: React.ComponentType<MessageNotificationProps>;\n /**\n * Custom UI component for message options popup, defaults to and accepts same props as: [MessageOptions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageOptions.tsx)\n *\n * @deprecated Use MessageActions property instead.\n */\n MessageOptions?: React.ComponentType<MessageOptionsProps>;\n /** Custom UI component to display message replies, defaults to and accepts same props as: [MessageRepliesCountButton](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageRepliesCountButton.tsx) */\n MessageRepliesCountButton?: React.ComponentType<MessageRepliesCountButtonProps>;\n /** Custom UI component to display message delivery status, defaults to and accepts same props as: [MessageStatus](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageStatus.tsx) */\n MessageStatus?: React.ComponentType<MessageStatusProps>;\n /** Custom UI component to display system messages, defaults to and accepts same props as: [EventComponent](https://github.com/GetStream/stream-chat-react/blob/master/src/components/EventComponent/EventComponent.tsx) */\n MessageSystem?: React.ComponentType<EventComponentProps>;\n /** Custom UI component to display a timestamp on a message, defaults to and accepts same props as: [MessageTimestamp](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageTimestamp.tsx) */\n MessageTimestamp?: React.ComponentType<MessageTimestampProps>;\n /** Custom UI component for viewing content in a modal, defaults to and accepts the same props as [Modal](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Modal/Modal.tsx) */\n Modal?: React.ComponentType<ModalProps>;\n /** Custom UI component for viewing message's image attachments, defaults to and accepts the same props as [ModalGallery](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Gallery/ModalGallery.tsx) */\n ModalGallery?: React.ComponentType<ModalGalleryProps>;\n /** Custom UI component to override default pinned message indicator, defaults to and accepts same props as: [PinIndicator](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/icons.tsx) */\n PinIndicator?: React.ComponentType<PinIndicatorProps>;\n /** Custom UI component to override default poll actions rendering in a message, defaults to and accepts same props as: [PollActions](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollActions/PollActions.tsx) */\n PollActions?: React.ComponentType;\n /** Custom UI component to override default poll rendering in a message, defaults to and accepts same props as: [PollContent](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollContent.tsx) */\n PollContent?: React.ComponentType;\n /** Custom UI component to override default poll creation dialog contents, defaults to and accepts same props as: [PollCreationDialog](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollCreationDialog/PollCreationDialog.tsx) */\n PollCreationDialog?: React.ComponentType<PollCreationDialogProps>;\n /** Custom UI component to override default poll header in a message, defaults to and accepts same props as: [PollHeader](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollHeader.tsx) */\n PollHeader?: React.ComponentType;\n /** Custom UI component to override default poll option selector, defaults to and accepts same props as: [PollOptionSelector](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Poll/PollOptionSelector.tsx) */\n PollOptionSelector?: React.ComponentType<PollOptionSelectorProps>;\n /** Custom UI component to override quoted message UI on a sent message, defaults to and accepts same props as: [QuotedMessage](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/QuotedMessage.tsx) */\n QuotedMessage?: React.ComponentType;\n /** Custom UI component to overri