stream-chat-react 14.0.0-beta.2 → 14.0.0-beta.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/WithAudioPlayback.236d404c.js +4670 -0
- package/dist/cjs/WithAudioPlayback.236d404c.js.map +1 -0
- package/dist/{audioProcessing-BbOs2wMd.js → cjs/audioProcessing.56e5db9d.js} +1 -1
- package/dist/cjs/audioProcessing.56e5db9d.js.map +1 -0
- package/dist/cjs/emojis.js +2 -2
- package/dist/cjs/emojis.js.map +1 -1
- package/dist/cjs/index.js +807 -485
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mp3-encoder.js +1 -1
- package/dist/css/emoji-replacement.css +34 -0
- package/dist/css/emoji-replacement.css.map +1 -0
- package/dist/css/index.css +190 -51
- package/dist/css/index.css.map +1 -1
- package/dist/es/WithAudioPlayback.89700cb5.mjs +4654 -0
- package/dist/es/WithAudioPlayback.89700cb5.mjs.map +1 -0
- package/dist/{audioProcessing-ByEVSjGG.mjs → es/audioProcessing.21cb49e1.mjs} +1 -1
- package/dist/es/audioProcessing.21cb49e1.mjs.map +1 -0
- package/dist/es/emojis.mjs +2 -2
- package/dist/es/emojis.mjs.map +1 -1
- package/dist/es/index.mjs +857 -535
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/mp3-encoder.mjs +1 -1
- package/dist/types/components/Attachment/Giphy.d.ts.map +1 -1
- package/dist/types/components/Attachment/VoiceRecording.d.ts.map +1 -1
- package/dist/types/components/AudioPlayback/AudioPlayer.d.ts.map +1 -1
- package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts +1 -1
- package/dist/types/components/BaseImage/toBaseImageDescriptors.d.ts.map +1 -1
- package/dist/types/components/ChannelList/hooks/useMobileNavigation.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts +3 -1
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.d.ts.map +1 -1
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts +6 -3
- package/dist/types/components/ChannelListItem/ChannelListItemActionButtons.defaults.d.ts.map +1 -1
- package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts +5 -0
- package/dist/types/components/Chat/hooks/useSplitActionSet.d.ts.map +1 -1
- package/dist/types/components/Dialog/components/ContextMenu.d.ts +119 -3
- package/dist/types/components/Dialog/components/ContextMenu.d.ts.map +1 -1
- package/dist/types/components/Dialog/hooks/useDialog.d.ts +1 -1
- package/dist/types/components/Dialog/hooks/useDialog.d.ts.map +1 -1
- package/dist/types/components/Dialog/service/DialogAnchor.d.ts +14 -1
- package/dist/types/components/Dialog/service/DialogAnchor.d.ts.map +1 -1
- package/dist/types/components/Dialog/service/DialogManager.d.ts +14 -3
- package/dist/types/components/Dialog/service/DialogManager.d.ts.map +1 -1
- package/dist/types/components/Dialog/service/DialogPortal.d.ts.map +1 -1
- package/dist/types/components/Form/TextInput.d.ts +2 -2
- package/dist/types/components/Form/TextInput.d.ts.map +1 -1
- package/dist/types/components/Gallery/GalleryContext.d.ts +1 -1
- package/dist/types/components/Gallery/GalleryContext.d.ts.map +1 -1
- package/dist/types/components/Icons/IconGiphy.d.ts.map +1 -1
- package/dist/types/components/Icons/icons.d.ts +56 -340
- package/dist/types/components/Icons/icons.d.ts.map +1 -1
- package/dist/types/components/Loading/LoadingIndicator.d.ts +2 -2
- package/dist/types/components/Loading/LoadingIndicator.d.ts.map +1 -1
- package/dist/types/components/MessageActions/MessageActions.d.ts +14 -3
- package/dist/types/components/MessageActions/MessageActions.d.ts.map +1 -1
- package/dist/types/components/MessageActions/MessageActions.defaults.d.ts +1 -1
- package/dist/types/components/MessageActions/MessageActions.defaults.d.ts.map +1 -1
- package/dist/types/components/MessageActions/QuickMessageActionButton.d.ts.map +1 -1
- package/dist/types/components/MessageActions/hooks/useBaseMessageActionSetFilter.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.d.ts.map +1 -1
- package/dist/types/components/MessageComposer/AttachmentSelector/AttachmentSelector.d.ts.map +1 -1
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts +18 -0
- package/dist/types/components/MessageList/hooks/MessageList/useScrollLocationLogic.d.ts.map +1 -1
- package/dist/types/components/Poll/PollActions/PollResults/PollOptionWithVotes.d.ts.map +1 -1
- package/dist/types/components/Poll/PollCreationDialog/OptionFieldSet.d.ts.map +1 -1
- package/dist/types/components/Reactions/MessageReactions.d.ts.map +1 -1
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts +1 -0
- package/dist/types/components/Reactions/MessageReactionsDetail.d.ts.map +1 -1
- package/dist/types/components/Reactions/ReactionSelector.d.ts +1 -1
- package/dist/types/components/Reactions/ReactionSelector.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/SuggestionList/SuggestionList.d.ts.map +1 -1
- package/dist/types/components/TextareaComposer/TextareaComposer.d.ts.map +1 -1
- package/dist/types/context/ChannelListContext.d.ts +1 -1
- package/dist/types/context/ChannelListContext.d.ts.map +1 -1
- package/dist/types/context/ComponentContext.d.ts +5 -1
- package/dist/types/context/ComponentContext.d.ts.map +1 -1
- package/dist/types/context/DialogManagerContext.d.ts +11 -7
- package/dist/types/context/DialogManagerContext.d.ts.map +1 -1
- package/package.json +5 -4
- package/dist/WithAudioPlayback-C1hfFIcu.mjs +0 -4716
- package/dist/WithAudioPlayback-C1hfFIcu.mjs.map +0 -1
- package/dist/WithAudioPlayback-myzUS2m6.js +0 -4732
- package/dist/WithAudioPlayback-myzUS2m6.js.map +0 -1
- package/dist/assets/icons/stream-chat-icons.eot +0 -0
- package/dist/assets/icons/stream-chat-icons.svg +0 -50
- package/dist/assets/icons/stream-chat-icons.ttf +0 -0
- package/dist/assets/icons/stream-chat-icons.woff +0 -0
- package/dist/assets/icons/stream-chat-icons.woff2 +0 -0
- package/dist/audioProcessing-BbOs2wMd.js.map +0 -1
- package/dist/audioProcessing-ByEVSjGG.mjs.map +0 -1
- package/dist/css/v2/emoji-mart.css +0 -1
- package/dist/css/v2/emoji-replacement.css +0 -1
- package/dist/css/v2/index.css +0 -1
- package/dist/css/v2/index.layout.css +0 -1
- package/dist/scss/v2/AIStateIndicator/AIStateIndicator-layout.scss +0 -3
- package/dist/scss/v2/AIStateIndicator/AIStateIndicator-theme.scss +0 -7
- package/dist/scss/v2/AttachmentList/AttachmentList-layout.scss +0 -701
- package/dist/scss/v2/AttachmentList/AttachmentList-theme.scss +0 -605
- package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-layout.scss +0 -141
- package/dist/scss/v2/AttachmentPreviewList/AttachmentPreviewList-theme.scss +0 -190
- package/dist/scss/v2/AudioRecorder/AudioRecorder-layout.scss +0 -139
- package/dist/scss/v2/AudioRecorder/AudioRecorder-theme.scss +0 -61
- package/dist/scss/v2/Autocomplete/Autocomplete-layout.scss +0 -94
- package/dist/scss/v2/Autocomplete/Autocomplete-theme.scss +0 -220
- package/dist/scss/v2/Avatar/Avatar-layout.scss +0 -137
- package/dist/scss/v2/Avatar/Avatar-theme.scss +0 -64
- package/dist/scss/v2/BaseImage/BaseImage-layout.scss +0 -21
- package/dist/scss/v2/BaseImage/BaseImage-theme.scss +0 -35
- package/dist/scss/v2/BaseImage/index.scss +0 -2
- package/dist/scss/v2/Channel/Channel-layout.scss +0 -141
- package/dist/scss/v2/Channel/Channel-theme.scss +0 -100
- package/dist/scss/v2/ChannelHeader/ChannelHeader-layout.scss +0 -27
- package/dist/scss/v2/ChannelHeader/ChannelHeader-theme.scss +0 -43
- package/dist/scss/v2/ChannelList/ChannelList-layout.scss +0 -65
- package/dist/scss/v2/ChannelList/ChannelList-theme.scss +0 -89
- package/dist/scss/v2/ChannelPreview/ChannelPreview-layout.scss +0 -126
- package/dist/scss/v2/ChannelPreview/ChannelPreview-theme.scss +0 -148
- package/dist/scss/v2/ChannelSearch/ChannelSearch-layout.scss +0 -122
- package/dist/scss/v2/ChannelSearch/ChannelSearch-theme.scss +0 -238
- package/dist/scss/v2/ChatView/ChatView-layout.scss +0 -43
- package/dist/scss/v2/ChatView/ChatView-theme.scss +0 -32
- package/dist/scss/v2/Dialog/Dialog-layout.scss +0 -70
- package/dist/scss/v2/Dialog/Dialog-theme.scss +0 -103
- package/dist/scss/v2/DragAndDropContainer/DragAndDropContainer-layout.scss +0 -5
- package/dist/scss/v2/DragAndDropContainer/DragAndDropContainer-theme.scss +0 -47
- package/dist/scss/v2/DropzoneContainer/DropzoneContainer-layout.scss +0 -14
- package/dist/scss/v2/DropzoneContainer/DropzoneContainer-theme.scss +0 -17
- package/dist/scss/v2/EditMessageForm/EditMessageForm-layout.scss +0 -51
- package/dist/scss/v2/EditMessageForm/EditMessageForm-theme.scss +0 -50
- package/dist/scss/v2/Form/Form-layout.scss +0 -49
- package/dist/scss/v2/Form/Form-theme.scss +0 -82
- package/dist/scss/v2/Icon/Icon-layout.scss +0 -98
- package/dist/scss/v2/Icon/Icon-theme.scss +0 -17
- package/dist/scss/v2/ImageCarousel/ImageCarousel-layout.scss +0 -51
- package/dist/scss/v2/ImageCarousel/ImageCarousel-theme.scss +0 -30
- package/dist/scss/v2/InfiniteScrollPaginator/InfiniteScrollPaginator-layout.scss +0 -4
- package/dist/scss/v2/LinkPreview/LinkPreview-layout.scss +0 -67
- package/dist/scss/v2/LinkPreview/LinkPreview-theme.scss +0 -32
- package/dist/scss/v2/LinkPreview/index.scss +0 -2
- package/dist/scss/v2/LoadingIndicator/LoadingIndicator-layout.scss +0 -64
- package/dist/scss/v2/LoadingIndicator/LoadingIndicator-theme.scss +0 -14
- package/dist/scss/v2/Location/Location-layout.scss +0 -52
- package/dist/scss/v2/Location/Location-theme.scss +0 -32
- package/dist/scss/v2/Message/Message-layout.scss +0 -619
- package/dist/scss/v2/Message/Message-theme.scss +0 -483
- package/dist/scss/v2/MessageActionsBox/MessageActionsBox-layout.scss +0 -21
- package/dist/scss/v2/MessageActionsBox/MessageActionsBox-theme.scss +0 -85
- package/dist/scss/v2/MessageBouncePrompt/MessageBouncePrompt-layout.scss +0 -19
- package/dist/scss/v2/MessageBouncePrompt/MessageBouncePrompt-theme.scss +0 -51
- package/dist/scss/v2/MessageInput/MessageInput-layout.scss +0 -268
- package/dist/scss/v2/MessageInput/MessageInput-theme.scss +0 -359
- package/dist/scss/v2/MessageList/MessageList-layout.scss +0 -65
- package/dist/scss/v2/MessageList/MessageList-theme.scss +0 -107
- package/dist/scss/v2/MessageList/VirtualizedMessageList-layout.scss +0 -57
- package/dist/scss/v2/MessageList/VirtualizedMessageList-theme.scss +0 -41
- package/dist/scss/v2/MessageReactions/MessageReactions-layout.scss +0 -143
- package/dist/scss/v2/MessageReactions/MessageReactions-theme.scss +0 -92
- package/dist/scss/v2/MessageReactions/MessageReactionsSelector-layout.scss +0 -86
- package/dist/scss/v2/MessageReactions/MessageReactionsSelector-theme.scss +0 -94
- package/dist/scss/v2/Modal/Modal-layout.scss +0 -74
- package/dist/scss/v2/Modal/Modal-theme.scss +0 -109
- package/dist/scss/v2/Notification/MessageNotification-layout.scss +0 -12
- package/dist/scss/v2/Notification/MessageNotification-theme.scss +0 -34
- package/dist/scss/v2/Notification/Notification-layout.scss +0 -7
- package/dist/scss/v2/Notification/Notification-theme.scss +0 -32
- package/dist/scss/v2/Notification/NotificationList-layout.scss +0 -11
- package/dist/scss/v2/Notification/NotificationList-theme.scss +0 -31
- package/dist/scss/v2/Poll/Poll-layout.scss +0 -493
- package/dist/scss/v2/Poll/Poll-theme.scss +0 -178
- package/dist/scss/v2/Search/Search-layout.scss +0 -148
- package/dist/scss/v2/Search/Search-theme.scss +0 -222
- package/dist/scss/v2/Thread/Thread-layout.scss +0 -65
- package/dist/scss/v2/Thread/Thread-theme.scss +0 -82
- package/dist/scss/v2/ThreadList/ThreadList-layout.scss +0 -152
- package/dist/scss/v2/ThreadList/ThreadList-theme.scss +0 -75
- package/dist/scss/v2/Tooltip/Tooltip-layout.scss +0 -10
- package/dist/scss/v2/Tooltip/Tooltip-theme.scss +0 -36
- package/dist/scss/v2/TypingIndicator/TypingIndicator-layout.scss +0 -31
- package/dist/scss/v2/TypingIndicator/TypingIndicator-theme.scss +0 -68
- package/dist/scss/v2/UnreadCountBadge/UnreadCountBadge-layout.scss +0 -49
- package/dist/scss/v2/UnreadCountBadge/UnreadCountBadge-theme.scss +0 -11
- package/dist/scss/v2/_base.scss +0 -65
- package/dist/scss/v2/_emoji-replacement.scss +0 -45
- package/dist/scss/v2/_global-layout-variables.scss +0 -65
- package/dist/scss/v2/_global-theme-variables.scss +0 -173
- package/dist/scss/v2/_icons.scss +0 -36
- package/dist/scss/v2/_palette-variables.scss +0 -55
- package/dist/scss/v2/_utils.scss +0 -212
- package/dist/scss/v2/_variables.scss +0 -2
- package/dist/scss/v2/common/CTAButton/CTAButton-layout.scss +0 -4
- package/dist/scss/v2/common/CTAButton/CTAButton-theme.scss +0 -42
- package/dist/scss/v2/common/CircleFAButton/CircleFAButton-layout.scss +0 -14
- package/dist/scss/v2/common/CircleFAButton/CircleFAButton-theme.scss +0 -35
- package/dist/scss/v2/index.layout.scss +0 -49
- package/dist/scss/v2/index.scss +0 -50
- package/dist/scss/v2/vendor/emoji-mart.scss +0 -514
- package/dist/scss/v2/vendor/react-image-gallery.scss +0 -258
- /package/dist/{assets → css/assets}/EmojiOneColor.woff2 +0 -0
- /package/dist/{assets → css/assets}/NotoColorEmoji-flags.woff2 +0 -0
package/dist/es/index.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
2
2
|
import clsx from "clsx";
|
|
3
3
|
import { nanoid } from "nanoid";
|
|
4
|
-
import React, { useState, useEffect, useCallback, useLayoutEffect, useMemo, useContext, createContext, useRef, forwardRef,
|
|
5
|
-
import { u as useHandleFileChangeWrapper, d as dataTransferItemsToFiles, r as renderAudio, t as toAudioBuffer, c as createFileFromBlobs, g as getExtensionFromMimeType, a as getRecordedMediaTypeFromMimeType } from "
|
|
6
|
-
import { u as useStateStore, a as useMessageComposerController, i as isMessageBounced, b as useChannelActionContext, C as ComponentContext, c as useTranslationContext, d as useChannelStateContext, e as useChatContext, f as isNotificationForPanel, B as BaseIcon, g as Button, I as
|
|
7
|
-
import { bu, bx,
|
|
4
|
+
import React, { useState, useEffect, useCallback, useLayoutEffect, useMemo, useContext, createContext, useRef, forwardRef, createElement, Component, Fragment as Fragment$1 } from "react";
|
|
5
|
+
import { u as useHandleFileChangeWrapper, d as dataTransferItemsToFiles, r as renderAudio, t as toAudioBuffer, c as createFileFromBlobs, g as getExtensionFromMimeType, a as getRecordedMediaTypeFromMimeType } from "./audioProcessing.21cb49e1.mjs";
|
|
6
|
+
import { u as useStateStore, a as useMessageComposerController, i as isMessageBounced, b as useChannelActionContext, C as ComponentContext, c as useTranslationContext, d as useChannelStateContext, e as useChatContext, f as isNotificationForPanel, B as BaseIcon, g as Button, I as IconPauseFill, h as IconPlayFill, j as getDefaultExportFromCjs, k as defaultTranslatorFunction, p as predefinedFormatters, L as LocalizedFormat, l as calendar, m as IconLoading, n as isNetworkSendFailure, v as validateAndGetMessage, o as isUserMuted, q as defaultPinPermissions, r as useThreadContext, s as usePopoverPosition, t as useComponentContext, w as IconXmark, x as IconUser, y as IconExclamationMarkFill, z as IconChevronRight, A as IconChevronLeft, D as IconArrowLeft, E as IconExclamationMark, F as IconNoSign, G as isMessageErrorRetryable, H as ACTIONS_NOT_WORKING_IN_THREAD, J as useNotificationTarget, K as IconArrowUpRight, M as addNotificationTargetTag, N as IconPin, O as mapToUserNameOrId, P as IconClock, Q as IconCheckmark1Small, R as IconChecks, S as getReadByTooltipText, T as messageHasAttachments, U as messageTextHasEmojisOnly, V as isDate, W as getDateString, X as IconTranslate, Y as useMessageComposerContext, Z as useIsCooldownActive, _ as IconCrossSmall, $ as IconImage, a0 as IconPoll, a1 as IconLocation, a2 as IconFile, a3 as IconLink, a4 as IconVideo, a5 as IconVideoFill, a6 as IconVoice, a7 as IconSave, a8 as IconBell, a9 as IconChevronDown, aa as IconPlusSmall, ab as IconCheckmark, ac as DEFAULT_LOAD_PAGE_SCROLL_THRESHOLD, ad as IconTrophy, ae as IconReorder, af as IconMinusCircle, ag as IconSend, ah as IconAudio, ai as IconUserAdd, aj as IconMute, ak as IconFlag, al as IconUserRemove, am as IconAttachment, an as IconCommand, ao as CHANNEL_CONTAINER_ID, ap as IconPlus, aq as IconExclamationTriangle, ar as useAudioPlayer, as as IconRetry, at as IconArrowDownCircle, au as IconThunder, av as IconDelete, aw as IconUpload, ax as MessageComposerContextProvider, ay as useTypingContext, az as defaultDateTimeParser, aA as isLanguageSupported, aB as IconLayoutAlignLeft, aC as useChatViewContext, aD as MESSAGE_ACTIONS, aE as LegacyThreadContext, aF as IconReply, aG as IconEmoji, aH as IconMore, aI as IconUserCheck, aJ as IconUnsave, aK as IconBellOff, aL as IconNotification, aM as IconEdit, aN as IconCopy, aO as IconUnpin, aP as IconQuote, aQ as IconThread, aR as areMessageUIPropsEqual, aS as isDateSeparatorMessage, aT as isMessageBlocked, aU as messageHasSingleAttachment, aV as messageHasGiphyAttachment, aW as messageHasReactions, aX as isMessageEdited, aY as countEmojis, aZ as areMessagePropsEqual, a_ as getMessageActions, a$ as processMessages, b0 as insertIntro, b1 as getGroupStyles, b2 as getLastReceived, b3 as IconArrowUp, b4 as isIntroMessage, b5 as isLocalMessage, b6 as getIsFirstUnreadMessage, b7 as IconArrowDown, b8 as DEFAULT_NEXT_CHANNEL_PAGE_SIZE, b9 as EmptyStateIndicator, ba as getChannel, bb as IconSearch, bc as IconXCircle, bd as useChannelListContext, be as DEFAULT_JUMP_TO_PAGE_SIZE, bf as ChannelListContextProvider, bg as IconArchive, bh as IconLeave, bi as IconCamera, bj as IconExclamationCircleFill, bk as ChatProvider, bl as TranslationProvider, bm as useThreadsViewContext, bn as IconMessageBubbles, bo as IconRefresh, bp as IconEyeOpen } from "./WithAudioPlayback.89700cb5.mjs";
|
|
7
|
+
import { bu, bx, c5, c6, c7, c8, c9, ca, bz, bC, by, bB, bD, cb, bG, bJ, bK, bM, bN, bH, bI, bP, bQ, bR, bL, bO, bS, bT, cc, bU, c3, c4, cd, ce, cf, br, bF, bE, bs, bt, bV, bW, c0, c1, bZ, b_, cg, b$, ch, bY, bX, bq, bA, bv, bw, c2 } from "./WithAudioPlayback.89700cb5.mjs";
|
|
8
8
|
import { StateStore, formatMessage, MessageComposer as MessageComposer$1, isGiphyAttachment, isScrapedContent, isLocalVideoAttachment, isVideoAttachment, isLocalImageAttachment, isImageAttachment, isAudioAttachment, isVoiceRecordingAttachment, isFileAttachment, isVoteAnswer, VotingVisibility, isLocalVoiceRecordingAttachment, isLocalAudioAttachment, isLocalFileAttachment, isLocalAttachment, LinkPreviewsManager, SearchController, ChannelSearchSource, UserSearchSource, MessageSearchSource, StreamChat, isSharedLocationResponse, LiveLocationManager } from "stream-chat";
|
|
9
9
|
import throttle from "lodash.throttle";
|
|
10
10
|
import * as linkify from "linkifyjs";
|
|
@@ -19,7 +19,6 @@ import { visit, SKIP } from "unist-util-visit";
|
|
|
19
19
|
import i18n from "i18next";
|
|
20
20
|
import Dayjs from "dayjs";
|
|
21
21
|
import uniqBy from "lodash.uniqby";
|
|
22
|
-
import { match, P } from "ts-pattern";
|
|
23
22
|
import { useSyncExternalStore } from "use-sync-external-store/shim";
|
|
24
23
|
import debounce from "lodash.debounce";
|
|
25
24
|
import fixWebmDuration from "fix-webm-duration";
|
|
@@ -72,10 +71,11 @@ const useAIState = (channel) => {
|
|
|
72
71
|
return { aiState };
|
|
73
72
|
};
|
|
74
73
|
class DialogManager {
|
|
75
|
-
constructor({ id } = {}) {
|
|
74
|
+
constructor({ closeOnClickOutside = true, id } = {}) {
|
|
76
75
|
this.state = new StateStore({
|
|
77
76
|
dialogsById: {}
|
|
78
77
|
});
|
|
78
|
+
this.closeOnClickOutside = closeOnClickOutside;
|
|
79
79
|
this.id = id ?? nanoid();
|
|
80
80
|
}
|
|
81
81
|
get openDialogCount() {
|
|
@@ -90,13 +90,14 @@ class DialogManager {
|
|
|
90
90
|
get(id) {
|
|
91
91
|
return this.state.getLatestValue().dialogsById[id];
|
|
92
92
|
}
|
|
93
|
-
getOrCreate({ id }) {
|
|
93
|
+
getOrCreate({ closeOnClickOutside, id }) {
|
|
94
94
|
let dialog = this.state.getLatestValue().dialogsById[id];
|
|
95
95
|
if (!dialog) {
|
|
96
96
|
dialog = {
|
|
97
97
|
close: () => {
|
|
98
98
|
this.close(id);
|
|
99
99
|
},
|
|
100
|
+
closeOnClickOutside,
|
|
100
101
|
id,
|
|
101
102
|
isOpen: false,
|
|
102
103
|
open: () => {
|
|
@@ -112,21 +113,22 @@ class DialogManager {
|
|
|
112
113
|
};
|
|
113
114
|
this.state.next((current) => ({
|
|
114
115
|
...current,
|
|
115
|
-
|
|
116
|
+
dialogsById: { ...current.dialogsById, [id]: dialog }
|
|
116
117
|
}));
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
-
|
|
119
|
+
const shouldUpdateDialogSettings = dialog.closeOnClickOutside !== closeOnClickOutside || !!dialog.removalTimeout;
|
|
120
|
+
if (shouldUpdateDialogSettings) {
|
|
121
|
+
if (dialog.removalTimeout) clearTimeout(dialog.removalTimeout);
|
|
122
|
+
dialog = {
|
|
123
|
+
...dialog,
|
|
124
|
+
closeOnClickOutside,
|
|
125
|
+
removalTimeout: void 0
|
|
126
|
+
};
|
|
120
127
|
this.state.next((current) => ({
|
|
121
128
|
...current,
|
|
122
|
-
|
|
123
|
-
dialogsById
|
|
124
|
-
|
|
125
|
-
[id]: {
|
|
126
|
-
...dialog,
|
|
127
|
-
removalTimeout: void 0
|
|
128
|
-
}
|
|
129
|
-
}
|
|
129
|
+
dialogsById: {
|
|
130
|
+
...current.dialogsById,
|
|
131
|
+
[id]: dialog
|
|
130
132
|
}
|
|
131
133
|
}));
|
|
132
134
|
}
|
|
@@ -203,7 +205,11 @@ class DialogManager {
|
|
|
203
205
|
}));
|
|
204
206
|
}
|
|
205
207
|
}
|
|
206
|
-
const useDialog = ({
|
|
208
|
+
const useDialog = ({
|
|
209
|
+
closeOnClickOutside,
|
|
210
|
+
dialogManagerId,
|
|
211
|
+
id
|
|
212
|
+
}) => {
|
|
207
213
|
const { dialogManager } = useDialogManager({ dialogManagerId });
|
|
208
214
|
useEffect(
|
|
209
215
|
() => () => {
|
|
@@ -211,7 +217,7 @@ const useDialog = ({ dialogManagerId, id }) => {
|
|
|
211
217
|
},
|
|
212
218
|
[dialogManager, id]
|
|
213
219
|
);
|
|
214
|
-
return dialogManager.getOrCreate({ id });
|
|
220
|
+
return dialogManager.getOrCreate({ closeOnClickOutside, id });
|
|
215
221
|
};
|
|
216
222
|
const useDialogOnNearestManager = ({ id }) => {
|
|
217
223
|
const { dialogManager } = useNearestDialogManagerContext() ?? {};
|
|
@@ -258,9 +264,37 @@ const Portal = ({
|
|
|
258
264
|
if (!portalDestination) return null;
|
|
259
265
|
return createPortal(children, portalDestination);
|
|
260
266
|
};
|
|
267
|
+
const shouldCloseOnOutsideClick = ({
|
|
268
|
+
dialog,
|
|
269
|
+
managerCloseOnClickOutside
|
|
270
|
+
}) => dialog.closeOnClickOutside ?? managerCloseOnClickOutside;
|
|
261
271
|
const DialogPortalDestination = () => {
|
|
262
272
|
const { dialogManager } = useNearestDialogManagerContext() ?? {};
|
|
263
273
|
const openedDialogCount = useOpenedDialogCount({ dialogManagerId: dialogManager?.id });
|
|
274
|
+
const [destinationRoot, setDestinationRoot] = useState(null);
|
|
275
|
+
useEffect(() => {
|
|
276
|
+
if (!destinationRoot || !dialogManager) return;
|
|
277
|
+
const handleDocumentClick = (event) => {
|
|
278
|
+
if (destinationRoot.contains(event.target)) return;
|
|
279
|
+
setTimeout(() => {
|
|
280
|
+
Object.values(dialogManager.state.getLatestValue().dialogsById).forEach(
|
|
281
|
+
(dialog) => {
|
|
282
|
+
if (!dialog.isOpen) return;
|
|
283
|
+
if (!shouldCloseOnOutsideClick({
|
|
284
|
+
dialog,
|
|
285
|
+
managerCloseOnClickOutside: dialogManager.closeOnClickOutside
|
|
286
|
+
}))
|
|
287
|
+
return;
|
|
288
|
+
dialogManager.close(dialog.id);
|
|
289
|
+
}
|
|
290
|
+
);
|
|
291
|
+
}, 0);
|
|
292
|
+
};
|
|
293
|
+
document.addEventListener("click", handleDocumentClick, { capture: true });
|
|
294
|
+
return () => {
|
|
295
|
+
document.removeEventListener("click", handleDocumentClick, { capture: true });
|
|
296
|
+
};
|
|
297
|
+
}, [destinationRoot, dialogManager]);
|
|
264
298
|
if (!openedDialogCount) return null;
|
|
265
299
|
return /* @__PURE__ */ jsx(
|
|
266
300
|
"div",
|
|
@@ -268,7 +302,22 @@ const DialogPortalDestination = () => {
|
|
|
268
302
|
className: "str-chat__dialog-overlay",
|
|
269
303
|
"data-str-chat__portal-id": dialogManager?.id,
|
|
270
304
|
"data-testid": "str-chat__dialog-overlay",
|
|
271
|
-
onClick: () =>
|
|
305
|
+
onClick: (event) => {
|
|
306
|
+
if (!dialogManager) return;
|
|
307
|
+
if (event.target !== event.currentTarget) return;
|
|
308
|
+
Object.values(dialogManager.state.getLatestValue().dialogsById).forEach(
|
|
309
|
+
(dialog) => {
|
|
310
|
+
if (!dialog.isOpen) return;
|
|
311
|
+
if (!shouldCloseOnOutsideClick({
|
|
312
|
+
dialog,
|
|
313
|
+
managerCloseOnClickOutside: dialogManager.closeOnClickOutside
|
|
314
|
+
}))
|
|
315
|
+
return;
|
|
316
|
+
dialogManager.close(dialog.id);
|
|
317
|
+
}
|
|
318
|
+
);
|
|
319
|
+
},
|
|
320
|
+
ref: setDestinationRoot,
|
|
272
321
|
style: {
|
|
273
322
|
"--str-chat__dialog-overlay-height": openedDialogCount > 0 ? "100%" : "0"
|
|
274
323
|
}
|
|
@@ -290,11 +339,16 @@ const DialogPortalEntry = ({
|
|
|
290
339
|
};
|
|
291
340
|
const dialogManagersRegistry = new StateStore({});
|
|
292
341
|
const getDialogManager = (id) => dialogManagersRegistry.getLatestValue()[id];
|
|
293
|
-
const getOrCreateDialogManager = (
|
|
342
|
+
const getOrCreateDialogManager = ({
|
|
343
|
+
closeOnClickOutside,
|
|
344
|
+
id
|
|
345
|
+
}) => {
|
|
294
346
|
let manager = getDialogManager(id);
|
|
295
347
|
if (!manager) {
|
|
296
|
-
manager = new DialogManager({ id });
|
|
348
|
+
manager = new DialogManager({ closeOnClickOutside, id });
|
|
297
349
|
dialogManagersRegistry.partialNext({ [id]: manager });
|
|
350
|
+
} else if (typeof closeOnClickOutside === "boolean") {
|
|
351
|
+
manager.closeOnClickOutside = closeOnClickOutside;
|
|
298
352
|
}
|
|
299
353
|
return manager;
|
|
300
354
|
};
|
|
@@ -305,20 +359,21 @@ const removeDialogManager = (id) => {
|
|
|
305
359
|
const DialogManagerProviderContext = React.createContext(void 0);
|
|
306
360
|
const DialogManagerProvider = ({
|
|
307
361
|
children,
|
|
362
|
+
closeOnClickOutside,
|
|
308
363
|
id
|
|
309
364
|
}) => {
|
|
310
365
|
const [dialogManager, setDialogManager] = useState(() => {
|
|
311
366
|
if (id) return getDialogManager(id) ?? null;
|
|
312
|
-
return new DialogManager();
|
|
367
|
+
return new DialogManager({ closeOnClickOutside });
|
|
313
368
|
});
|
|
314
369
|
useEffect(() => {
|
|
315
370
|
if (!id) return;
|
|
316
|
-
setDialogManager(getOrCreateDialogManager(id));
|
|
371
|
+
setDialogManager(getOrCreateDialogManager({ closeOnClickOutside, id }));
|
|
317
372
|
return () => {
|
|
318
373
|
removeDialogManager(id);
|
|
319
374
|
setDialogManager(null);
|
|
320
375
|
};
|
|
321
|
-
}, [id]);
|
|
376
|
+
}, [closeOnClickOutside, id]);
|
|
322
377
|
if (!dialogManager) return null;
|
|
323
378
|
return /* @__PURE__ */ jsxs(DialogManagerProviderContext.Provider, { value: { dialogManager }, children: [
|
|
324
379
|
children,
|
|
@@ -662,39 +717,37 @@ const IconGiphy = ({ className, ...props }) => /* @__PURE__ */ jsxs(
|
|
|
662
717
|
className: clsx("str-chat__icon--giphy", className),
|
|
663
718
|
viewBox: "0 0 16 16",
|
|
664
719
|
children: [
|
|
665
|
-
/* @__PURE__ */
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
] }),
|
|
697
|
-
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "clip0_4197_15218", children: /* @__PURE__ */ jsx("rect", { fill: "white", height: "16", width: "16" }) }) })
|
|
720
|
+
/* @__PURE__ */ jsx("rect", { fill: "black", height: "16", rx: "8", width: "16" }),
|
|
721
|
+
/* @__PURE__ */ jsx(
|
|
722
|
+
"path",
|
|
723
|
+
{
|
|
724
|
+
clipRule: "evenodd",
|
|
725
|
+
d: "M5.27976 4.40015H10.7206V11.5999H5.2793L5.27976 4.40015Z",
|
|
726
|
+
fill: "black",
|
|
727
|
+
fillRule: "evenodd"
|
|
728
|
+
}
|
|
729
|
+
),
|
|
730
|
+
/* @__PURE__ */ jsx("path", { d: "M4.19189 4.1333H5.27969V11.8669H4.19189V4.1333Z", fill: "#04FF8E" }),
|
|
731
|
+
/* @__PURE__ */ jsx("path", { d: "M10.7202 6.26685H11.808V11.8668H10.7202V6.26685Z", fill: "#8E2EFF" }),
|
|
732
|
+
/* @__PURE__ */ jsx("path", { d: "M4.19189 11.5999H11.8079V12.6667H4.19189V11.5999Z", fill: "#00C5FF" }),
|
|
733
|
+
/* @__PURE__ */ jsx("path", { d: "M4.19189 3.33325H8.54403V4.40005H4.19189V3.33325Z", fill: "#FFF152" }),
|
|
734
|
+
/* @__PURE__ */ jsx(
|
|
735
|
+
"path",
|
|
736
|
+
{
|
|
737
|
+
d: "M10.72 5.46638V4.40005H9.63174V3.33325H8.54395V6.53318H11.8078V5.46638",
|
|
738
|
+
fill: "#FF5B5B"
|
|
739
|
+
}
|
|
740
|
+
),
|
|
741
|
+
/* @__PURE__ */ jsx("path", { d: "M10.7202 7.6V6.5332H11.808", fill: "#551C99" }),
|
|
742
|
+
/* @__PURE__ */ jsx(
|
|
743
|
+
"path",
|
|
744
|
+
{
|
|
745
|
+
clipRule: "evenodd",
|
|
746
|
+
d: "M8.54432 3.33325V4.40005H7.45605",
|
|
747
|
+
fill: "#999131",
|
|
748
|
+
fillRule: "evenodd"
|
|
749
|
+
}
|
|
750
|
+
)
|
|
698
751
|
]
|
|
699
752
|
}
|
|
700
753
|
);
|
|
@@ -708,7 +761,7 @@ const PlayButton = ({ className, isPlaying, ...props }) => /* @__PURE__ */ jsx(
|
|
|
708
761
|
size: "sm",
|
|
709
762
|
variant: "secondary",
|
|
710
763
|
...props,
|
|
711
|
-
children: isPlaying ? /* @__PURE__ */ jsx(
|
|
764
|
+
children: isPlaying ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconPlayFill, {})
|
|
712
765
|
}
|
|
713
766
|
);
|
|
714
767
|
const Anonymous$b = "Anonym";
|
|
@@ -7232,10 +7285,10 @@ function requireRelativeTime() {
|
|
|
7232
7285
|
function i(r2, t2, e2, o2) {
|
|
7233
7286
|
return n.fromToBase(r2, t2, e2, o2);
|
|
7234
7287
|
}
|
|
7235
|
-
e.en.relativeTime = o, n.fromToBase = function(t2, n2, i2,
|
|
7288
|
+
e.en.relativeTime = o, n.fromToBase = function(t2, n2, i2, d2, u2) {
|
|
7236
7289
|
for (var a, f, s, l = i2.$locale().relativeTime || o, h = r.thresholds || [{ l: "s", r: 44, d: "second" }, { l: "m", r: 89 }, { l: "mm", r: 44, d: "minute" }, { l: "h", r: 89 }, { l: "hh", r: 21, d: "hour" }, { l: "d", r: 35 }, { l: "dd", r: 25, d: "day" }, { l: "M", r: 45 }, { l: "MM", r: 10, d: "month" }, { l: "y", r: 17 }, { l: "yy", d: "year" }], m = h.length, c = 0; c < m; c += 1) {
|
|
7237
7290
|
var y = h[c];
|
|
7238
|
-
y.d && (a =
|
|
7291
|
+
y.d && (a = d2 ? e(t2).diff(i2, y.d, true) : i2.diff(t2, y.d, true));
|
|
7239
7292
|
var p = (r.rounding || Math.round)(Math.abs(a));
|
|
7240
7293
|
if (s = a > 0, p <= y.r || !y.r) {
|
|
7241
7294
|
p <= 1 && c > 0 && (y = h[c - 1]);
|
|
@@ -7730,7 +7783,7 @@ class NotificationTranslationTopic extends TranslationTopic {
|
|
|
7730
7783
|
}
|
|
7731
7784
|
}
|
|
7732
7785
|
var de$1 = { exports: {} };
|
|
7733
|
-
var
|
|
7786
|
+
var de = de$1.exports;
|
|
7734
7787
|
var hasRequiredDe;
|
|
7735
7788
|
function requireDe() {
|
|
7736
7789
|
if (hasRequiredDe) return de$1.exports;
|
|
@@ -7738,7 +7791,7 @@ function requireDe() {
|
|
|
7738
7791
|
(function(module, exports$1) {
|
|
7739
7792
|
!(function(e, n) {
|
|
7740
7793
|
module.exports = n(Dayjs);
|
|
7741
|
-
})(
|
|
7794
|
+
})(de, function(e) {
|
|
7742
7795
|
e = e && e.hasOwnProperty("default") ? e.default : e;
|
|
7743
7796
|
var n = { s: "ein paar Sekunden", m: ["eine Minute", "einer Minute"], mm: "%d Minuten", h: ["eine Stunde", "einer Stunde"], hh: "%d Stunden", d: ["ein Tag", "einem Tag"], dd: ["%d Tage", "%d Tagen"], M: ["ein Monat", "einem Monat"], MM: ["%d Monate", "%d Monaten"], y: ["ein Jahr", "einem Jahr"], yy: ["%d Jahre", "%d Jahren"] };
|
|
7744
7797
|
function t(e2, t2, a2) {
|
|
@@ -8447,7 +8500,7 @@ const LoadingChannels = () => /* @__PURE__ */ jsxs("div", { className: "str-chat
|
|
|
8447
8500
|
/* @__PURE__ */ jsx(LoadingItems, {}),
|
|
8448
8501
|
/* @__PURE__ */ jsx(LoadingItems, {})
|
|
8449
8502
|
] });
|
|
8450
|
-
const LoadingIndicator = (props) => /* @__PURE__ */ jsx(
|
|
8503
|
+
const LoadingIndicator = (props) => /* @__PURE__ */ jsx(IconLoading, { ...props, className: "str-chat__loading-indicator" });
|
|
8451
8504
|
const UnMemoizedCustomNotification = (props) => {
|
|
8452
8505
|
const { active, children, className, type } = props;
|
|
8453
8506
|
if (!active) return null;
|
|
@@ -9037,6 +9090,7 @@ function useDialogAnchor({
|
|
|
9037
9090
|
setPopperElement(null);
|
|
9038
9091
|
}
|
|
9039
9092
|
return {
|
|
9093
|
+
placement: stabilisedChosenPlacement ?? chosenPlacement,
|
|
9040
9094
|
setPopperElement,
|
|
9041
9095
|
styles: {
|
|
9042
9096
|
left: x ?? 0,
|
|
@@ -9049,6 +9103,8 @@ const DialogAnchor = ({
|
|
|
9049
9103
|
allowFlip = true,
|
|
9050
9104
|
children,
|
|
9051
9105
|
className,
|
|
9106
|
+
closeOnClickOutside,
|
|
9107
|
+
closeTransitionMs = 0,
|
|
9052
9108
|
dialogManagerId,
|
|
9053
9109
|
focus = true,
|
|
9054
9110
|
id,
|
|
@@ -9061,12 +9117,44 @@ const DialogAnchor = ({
|
|
|
9061
9117
|
updatePositionOnContentResize,
|
|
9062
9118
|
...restDivProps
|
|
9063
9119
|
}) => {
|
|
9064
|
-
const dialog = useDialog({ dialogManagerId, id });
|
|
9120
|
+
const dialog = useDialog({ closeOnClickOutside, dialogManagerId, id });
|
|
9065
9121
|
const open = useDialogIsOpen(id, dialogManagerId);
|
|
9066
|
-
const
|
|
9122
|
+
const [shouldRender, setShouldRender] = useState(open);
|
|
9123
|
+
const closeTimeoutRef = useRef(null);
|
|
9124
|
+
const isClosing = !open && shouldRender;
|
|
9125
|
+
useEffect(() => {
|
|
9126
|
+
if (open) {
|
|
9127
|
+
setShouldRender(true);
|
|
9128
|
+
if (closeTimeoutRef.current) {
|
|
9129
|
+
clearTimeout(closeTimeoutRef.current);
|
|
9130
|
+
closeTimeoutRef.current = null;
|
|
9131
|
+
}
|
|
9132
|
+
return;
|
|
9133
|
+
}
|
|
9134
|
+
if (!shouldRender) return;
|
|
9135
|
+
if (!closeTransitionMs) {
|
|
9136
|
+
setShouldRender(false);
|
|
9137
|
+
return;
|
|
9138
|
+
}
|
|
9139
|
+
closeTimeoutRef.current = setTimeout(() => {
|
|
9140
|
+
setShouldRender(false);
|
|
9141
|
+
closeTimeoutRef.current = null;
|
|
9142
|
+
}, closeTransitionMs);
|
|
9143
|
+
}, [closeTransitionMs, open, shouldRender]);
|
|
9144
|
+
useEffect(
|
|
9145
|
+
() => () => {
|
|
9146
|
+
if (closeTimeoutRef.current) clearTimeout(closeTimeoutRef.current);
|
|
9147
|
+
},
|
|
9148
|
+
[]
|
|
9149
|
+
);
|
|
9150
|
+
const {
|
|
9151
|
+
placement: chosenPlacement,
|
|
9152
|
+
setPopperElement,
|
|
9153
|
+
styles
|
|
9154
|
+
} = useDialogAnchor({
|
|
9067
9155
|
allowFlip,
|
|
9068
9156
|
offset,
|
|
9069
|
-
open,
|
|
9157
|
+
open: shouldRender,
|
|
9070
9158
|
placement,
|
|
9071
9159
|
referenceElement,
|
|
9072
9160
|
updateKey,
|
|
@@ -9083,7 +9171,7 @@ const DialogAnchor = ({
|
|
|
9083
9171
|
document.removeEventListener("keyup", hideOnEscape);
|
|
9084
9172
|
};
|
|
9085
9173
|
}, [dialog, open]);
|
|
9086
|
-
if (!
|
|
9174
|
+
if (!shouldRender) {
|
|
9087
9175
|
return null;
|
|
9088
9176
|
}
|
|
9089
9177
|
return /* @__PURE__ */ jsx(DialogPortalEntry, { dialogId: id, dialogManagerId, children: /* @__PURE__ */ jsx(FocusScope, { autoFocus: focus, contain: trapFocus, restoreFocus: true, children: /* @__PURE__ */ jsx(
|
|
@@ -9091,6 +9179,8 @@ const DialogAnchor = ({
|
|
|
9091
9179
|
{
|
|
9092
9180
|
...restDivProps,
|
|
9093
9181
|
className: clsx("str-chat__dialog-contents", className),
|
|
9182
|
+
"data-str-chat-dialog-state": isClosing ? "closing" : "open",
|
|
9183
|
+
"data-str-chat-placement": chosenPlacement,
|
|
9094
9184
|
"data-testid": "str-chat__dialog-contents",
|
|
9095
9185
|
ref: setPopperElement,
|
|
9096
9186
|
style: styles,
|
|
@@ -9122,7 +9212,7 @@ const DefaultCalloutDialog = ({ children, className, onClose }) => /* @__PURE__
|
|
|
9122
9212
|
onClick: onClose,
|
|
9123
9213
|
size: "sm",
|
|
9124
9214
|
variant: "secondary",
|
|
9125
|
-
children: /* @__PURE__ */ jsx(
|
|
9215
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
9126
9216
|
}
|
|
9127
9217
|
)
|
|
9128
9218
|
] });
|
|
@@ -9192,7 +9282,7 @@ const Avatar = ({
|
|
|
9192
9282
|
}
|
|
9193
9283
|
) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9194
9284
|
!!sizeAwareInitials.length && /* @__PURE__ */ jsx("div", { className: "str-chat__avatar-initials", "data-testid": "avatar-fallback", children: sizeAwareInitials }),
|
|
9195
|
-
!sizeAwareInitials.length && /* @__PURE__ */ jsx(
|
|
9285
|
+
!sizeAwareInitials.length && /* @__PURE__ */ jsx(IconUser, {})
|
|
9196
9286
|
] })
|
|
9197
9287
|
]
|
|
9198
9288
|
}
|
|
@@ -9221,7 +9311,7 @@ const ErrorBadge = ({
|
|
|
9221
9311
|
className,
|
|
9222
9312
|
size = "sm",
|
|
9223
9313
|
...rest
|
|
9224
|
-
}) => /* @__PURE__ */ jsx(Badge, { ...rest, className, size, variant: "error", children: /* @__PURE__ */ jsx(
|
|
9314
|
+
}) => /* @__PURE__ */ jsx(Badge, { ...rest, className, size, variant: "error", children: /* @__PURE__ */ jsx(IconExclamationMarkFill, {}) });
|
|
9225
9315
|
function AvatarStack({
|
|
9226
9316
|
badgeSize,
|
|
9227
9317
|
component: Component2 = "div",
|
|
@@ -9433,16 +9523,152 @@ const EmojiContextMenuButton = ({
|
|
|
9433
9523
|
]
|
|
9434
9524
|
}
|
|
9435
9525
|
);
|
|
9436
|
-
const
|
|
9437
|
-
|
|
9438
|
-
|
|
9439
|
-
|
|
9526
|
+
const ContextMenuButtonWithSubmenu = ({
|
|
9527
|
+
children,
|
|
9528
|
+
className,
|
|
9529
|
+
Submenu,
|
|
9530
|
+
submenuContainerProps,
|
|
9531
|
+
submenuPlacement = "right-start",
|
|
9532
|
+
submenuRollAxis = "x",
|
|
9533
|
+
...buttonProps
|
|
9440
9534
|
}) => {
|
|
9535
|
+
const { className: submenuClassName, ...submenuContainerRestProps } = submenuContainerProps ?? {};
|
|
9536
|
+
const buttonRef = useRef(null);
|
|
9537
|
+
const [dialogContainer, setDialogContainer] = useState(null);
|
|
9538
|
+
const keepSubmenuOpenFlag = useRef(false);
|
|
9539
|
+
const dialogCloseTimeout = useRef(null);
|
|
9540
|
+
const dialogId2 = useMemo(() => `submenu-${Math.random().toString(36).slice(2)}`, []);
|
|
9541
|
+
const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
|
|
9542
|
+
const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
|
|
9543
|
+
const {
|
|
9544
|
+
placement: chosenPlacement,
|
|
9545
|
+
setPopperElement,
|
|
9546
|
+
styles
|
|
9547
|
+
} = useDialogAnchor({
|
|
9548
|
+
open: dialogIsOpen,
|
|
9549
|
+
placement: submenuPlacement,
|
|
9550
|
+
referenceElement: buttonRef.current
|
|
9551
|
+
});
|
|
9552
|
+
const closeDialogLazily = useCallback(() => {
|
|
9553
|
+
if (dialogCloseTimeout.current) clearTimeout(dialogCloseTimeout.current);
|
|
9554
|
+
dialogCloseTimeout.current = setTimeout(() => {
|
|
9555
|
+
if (keepSubmenuOpenFlag.current) return;
|
|
9556
|
+
dialog.close();
|
|
9557
|
+
}, 100);
|
|
9558
|
+
}, [dialog]);
|
|
9559
|
+
const keepSubmenuOpen = useCallback(() => {
|
|
9560
|
+
keepSubmenuOpenFlag.current = true;
|
|
9561
|
+
}, []);
|
|
9562
|
+
const allowToCloseSubmenu = useCallback(() => {
|
|
9563
|
+
keepSubmenuOpenFlag.current = false;
|
|
9564
|
+
}, []);
|
|
9565
|
+
const closeSubmenu = useCallback(() => {
|
|
9566
|
+
allowToCloseSubmenu();
|
|
9567
|
+
closeDialogLazily();
|
|
9568
|
+
}, [allowToCloseSubmenu, closeDialogLazily]);
|
|
9569
|
+
const handleClose = useCallback(
|
|
9570
|
+
(event) => {
|
|
9571
|
+
const parentButton = buttonRef.current;
|
|
9572
|
+
if (!dialogIsOpen || !parentButton) return;
|
|
9573
|
+
event.stopPropagation();
|
|
9574
|
+
closeDialogLazily();
|
|
9575
|
+
parentButton.focus();
|
|
9576
|
+
},
|
|
9577
|
+
[closeDialogLazily, dialogIsOpen, buttonRef]
|
|
9578
|
+
);
|
|
9579
|
+
const handleFocusParentButton = () => {
|
|
9580
|
+
if (dialogIsOpen) return;
|
|
9581
|
+
dialog.open();
|
|
9582
|
+
keepSubmenuOpen();
|
|
9583
|
+
};
|
|
9584
|
+
useEffect(() => {
|
|
9585
|
+
const parentButton = buttonRef.current;
|
|
9586
|
+
if (!dialogIsOpen || !parentButton) return;
|
|
9587
|
+
const hideOnEscape = (event) => {
|
|
9588
|
+
if (event.key !== "Escape") return;
|
|
9589
|
+
handleClose(event);
|
|
9590
|
+
closeSubmenu();
|
|
9591
|
+
};
|
|
9592
|
+
document.addEventListener("keyup", hideOnEscape, { capture: true });
|
|
9593
|
+
return () => {
|
|
9594
|
+
document.removeEventListener("keyup", hideOnEscape, { capture: true });
|
|
9595
|
+
};
|
|
9596
|
+
}, [dialogIsOpen, handleClose, closeSubmenu]);
|
|
9597
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
9598
|
+
/* @__PURE__ */ jsx(
|
|
9599
|
+
BaseContextMenuButton,
|
|
9600
|
+
{
|
|
9601
|
+
"aria-selected": "false",
|
|
9602
|
+
className: clsx(className, "str_chat__button-with-submenu", {
|
|
9603
|
+
"str_chat__button-with-submenu--submenu-open": dialogIsOpen
|
|
9604
|
+
}),
|
|
9605
|
+
hasSubMenu: true,
|
|
9606
|
+
onBlur: closeSubmenu,
|
|
9607
|
+
onClick: (event) => {
|
|
9608
|
+
event.stopPropagation();
|
|
9609
|
+
dialog.toggle();
|
|
9610
|
+
},
|
|
9611
|
+
onFocus: handleFocusParentButton,
|
|
9612
|
+
onMouseEnter: handleFocusParentButton,
|
|
9613
|
+
onMouseLeave: closeSubmenu,
|
|
9614
|
+
role: "option",
|
|
9615
|
+
...buttonProps,
|
|
9616
|
+
ref: buttonRef,
|
|
9617
|
+
children
|
|
9618
|
+
}
|
|
9619
|
+
),
|
|
9620
|
+
dialogIsOpen && /* @__PURE__ */ jsx(
|
|
9621
|
+
"div",
|
|
9622
|
+
{
|
|
9623
|
+
className: clsx("str-chat__context-menu__submenu-container", submenuClassName),
|
|
9624
|
+
"data-str-chat-placement": chosenPlacement,
|
|
9625
|
+
"data-str-chat-roll-axis": submenuRollAxis,
|
|
9626
|
+
onBlur: (event) => {
|
|
9627
|
+
const isBlurredDescendant = event.relatedTarget instanceof Node && dialogContainer?.contains(event.relatedTarget);
|
|
9628
|
+
if (isBlurredDescendant) return;
|
|
9629
|
+
closeSubmenu();
|
|
9630
|
+
},
|
|
9631
|
+
onFocus: keepSubmenuOpen,
|
|
9632
|
+
onMouseEnter: keepSubmenuOpen,
|
|
9633
|
+
onMouseLeave: closeSubmenu,
|
|
9634
|
+
ref: (element) => {
|
|
9635
|
+
setPopperElement(element);
|
|
9636
|
+
setDialogContainer(element);
|
|
9637
|
+
},
|
|
9638
|
+
style: styles,
|
|
9639
|
+
tabIndex: -1,
|
|
9640
|
+
...submenuContainerRestProps,
|
|
9641
|
+
children: /* @__PURE__ */ jsx(Submenu, {})
|
|
9642
|
+
}
|
|
9643
|
+
)
|
|
9644
|
+
] });
|
|
9645
|
+
};
|
|
9646
|
+
const ContextMenuButton = (props) => {
|
|
9647
|
+
const {
|
|
9648
|
+
Submenu,
|
|
9649
|
+
submenuContainerProps,
|
|
9650
|
+
submenuPlacement,
|
|
9651
|
+
submenuRollAxis,
|
|
9652
|
+
...buttonProps
|
|
9653
|
+
} = props;
|
|
9441
9654
|
const [isFocused, setIsFocused] = useState(false);
|
|
9655
|
+
if (Submenu) {
|
|
9656
|
+
return /* @__PURE__ */ jsx(
|
|
9657
|
+
ContextMenuButtonWithSubmenu,
|
|
9658
|
+
{
|
|
9659
|
+
...buttonProps,
|
|
9660
|
+
Submenu,
|
|
9661
|
+
submenuContainerProps,
|
|
9662
|
+
submenuPlacement,
|
|
9663
|
+
submenuRollAxis
|
|
9664
|
+
}
|
|
9665
|
+
);
|
|
9666
|
+
}
|
|
9667
|
+
const { onBlur, onFocus, ...baseButtonProps } = buttonProps;
|
|
9442
9668
|
return /* @__PURE__ */ jsx(
|
|
9443
9669
|
BaseContextMenuButton,
|
|
9444
9670
|
{
|
|
9445
|
-
...
|
|
9671
|
+
...baseButtonProps,
|
|
9446
9672
|
"aria-selected": isFocused ? "true" : "false",
|
|
9447
9673
|
onBlur: (e) => {
|
|
9448
9674
|
setIsFocused(false);
|
|
@@ -9491,12 +9717,14 @@ function ContextMenuContent({
|
|
|
9491
9717
|
backLabel = "Back",
|
|
9492
9718
|
children,
|
|
9493
9719
|
className,
|
|
9720
|
+
enableAnimations = true,
|
|
9494
9721
|
Header: Header2,
|
|
9495
9722
|
items,
|
|
9496
9723
|
ItemsWrapper,
|
|
9497
9724
|
menuClassName,
|
|
9498
9725
|
onClose,
|
|
9499
9726
|
onMenuLevelChange,
|
|
9727
|
+
transitionDirection,
|
|
9500
9728
|
...props
|
|
9501
9729
|
}) {
|
|
9502
9730
|
const rootLevel = useMemo(
|
|
@@ -9509,6 +9737,7 @@ function ContextMenuContent({
|
|
|
9509
9737
|
[Header2, items, ItemsWrapper, menuClassName]
|
|
9510
9738
|
);
|
|
9511
9739
|
const [menuStack, setMenuStack] = useState(() => [rootLevel]);
|
|
9740
|
+
const [menuBodyAnimationKey, setMenuBodyAnimationKey] = useState(0);
|
|
9512
9741
|
const activeMenu = menuStack[menuStack.length - 1];
|
|
9513
9742
|
const ActiveMenuItemsWrapper = activeMenu.ItemsWrapper ?? React.Fragment;
|
|
9514
9743
|
const closeMenu = useCallback(() => {
|
|
@@ -9532,10 +9761,9 @@ function ContextMenuContent({
|
|
|
9532
9761
|
[ItemsWrapper]
|
|
9533
9762
|
);
|
|
9534
9763
|
const returnToParentMenu = useCallback(() => {
|
|
9535
|
-
|
|
9536
|
-
|
|
9537
|
-
|
|
9538
|
-
}, []);
|
|
9764
|
+
if (menuStack.length <= 1) return;
|
|
9765
|
+
setMenuStack((current) => current.slice(0, current.length - 1));
|
|
9766
|
+
}, [menuStack.length]);
|
|
9539
9767
|
useEffect(() => {
|
|
9540
9768
|
setMenuStack((current) => {
|
|
9541
9769
|
if (current.length === 1 && current[0] === rootLevel) return current;
|
|
@@ -9545,42 +9773,116 @@ function ContextMenuContent({
|
|
|
9545
9773
|
useEffect(() => {
|
|
9546
9774
|
onMenuLevelChange?.(menuStack.length);
|
|
9547
9775
|
}, [menuStack.length, onMenuLevelChange]);
|
|
9548
|
-
|
|
9549
|
-
|
|
9550
|
-
|
|
9551
|
-
|
|
9552
|
-
|
|
9553
|
-
|
|
9554
|
-
|
|
9776
|
+
useEffect(() => {
|
|
9777
|
+
if (!transitionDirection) return;
|
|
9778
|
+
setMenuBodyAnimationKey((value) => value + 1);
|
|
9779
|
+
}, [transitionDirection, menuStack.length]);
|
|
9780
|
+
return /* @__PURE__ */ jsx(ContextMenuContext.Provider, { value: { closeMenu, openSubmenu, returnToParentMenu }, children: /* @__PURE__ */ jsxs(
|
|
9781
|
+
ContextMenuRoot,
|
|
9782
|
+
{
|
|
9783
|
+
className: clsx(className, activeMenu.menuClassName),
|
|
9784
|
+
"data-str-chat-enable-animations": enableAnimations,
|
|
9785
|
+
...props,
|
|
9786
|
+
children: [
|
|
9787
|
+
activeMenu.Header ? /* @__PURE__ */ jsx(activeMenu.Header, {}) : menuStack.length > 1 ? /* @__PURE__ */ jsx(ContextMenuHeader, { children: /* @__PURE__ */ jsxs(ContextMenuBackButton, { onClick: returnToParentMenu, children: [
|
|
9788
|
+
/* @__PURE__ */ jsx(IconChevronLeft, {}),
|
|
9789
|
+
/* @__PURE__ */ jsx("span", { children: backLabel })
|
|
9790
|
+
] }) }) : null,
|
|
9791
|
+
/* @__PURE__ */ jsx(
|
|
9792
|
+
ContextMenuBody,
|
|
9793
|
+
{
|
|
9794
|
+
className: clsx({
|
|
9795
|
+
"str-chat__context-menu__body--submenu-backward": transitionDirection === "backward",
|
|
9796
|
+
"str-chat__context-menu__body--submenu-forward": transitionDirection === "forward"
|
|
9797
|
+
}),
|
|
9798
|
+
children: activeMenu.Submenu ? /* @__PURE__ */ jsx(activeMenu.Submenu, {}) : /* @__PURE__ */ jsx(ActiveMenuItemsWrapper, { children: typeof children !== "undefined" ? children : activeMenu.items?.map((Item2, index) => /* @__PURE__ */ jsx(Item2, {}, `context-menu-item-${index}`)) })
|
|
9799
|
+
},
|
|
9800
|
+
`context-menu-body-${menuStack.length}-${menuBodyAnimationKey}`
|
|
9801
|
+
)
|
|
9802
|
+
]
|
|
9803
|
+
}
|
|
9804
|
+
) });
|
|
9555
9805
|
}
|
|
9556
9806
|
const ContextMenu = (props) => {
|
|
9807
|
+
const { ContextMenuContent: ContextMenuContentComponent = ContextMenuContent } = useComponentContext();
|
|
9557
9808
|
const {
|
|
9558
9809
|
allowFlip,
|
|
9810
|
+
closeOnClickOutside,
|
|
9811
|
+
closeTransitionMs = 130,
|
|
9559
9812
|
dialogManagerId,
|
|
9560
9813
|
focus,
|
|
9561
9814
|
id,
|
|
9562
9815
|
placement,
|
|
9563
9816
|
referenceElement,
|
|
9817
|
+
submenuTransitionDurationMs,
|
|
9564
9818
|
tabIndex,
|
|
9565
9819
|
trapFocus,
|
|
9566
9820
|
...menuProps
|
|
9567
9821
|
} = props;
|
|
9822
|
+
const resolvedSubmenuTransitionDurationMs = submenuTransitionDurationMs ?? 460;
|
|
9568
9823
|
const isAnchored = id != null;
|
|
9569
9824
|
const [menuLevel, setMenuLevel] = useState(1);
|
|
9825
|
+
const [transitionDirection, setTransitionDirection] = useState(void 0);
|
|
9826
|
+
const [contentResetToken, setContentResetToken] = useState(0);
|
|
9827
|
+
const transitionTimeoutRef = useRef(null);
|
|
9828
|
+
const previousMenuLevelRef = useRef(1);
|
|
9570
9829
|
const open = useDialogIsOpen(id ?? "", dialogManagerId);
|
|
9830
|
+
const previousOpenRef = useRef(open);
|
|
9571
9831
|
useEffect(() => {
|
|
9572
|
-
if (isAnchored
|
|
9832
|
+
if (!isAnchored) return;
|
|
9833
|
+
if (previousOpenRef.current && !open) {
|
|
9834
|
+
setMenuLevel(1);
|
|
9835
|
+
setTransitionDirection(void 0);
|
|
9836
|
+
setContentResetToken((value) => value + 1);
|
|
9837
|
+
previousMenuLevelRef.current = 1;
|
|
9838
|
+
if (transitionTimeoutRef.current) {
|
|
9839
|
+
clearTimeout(transitionTimeoutRef.current);
|
|
9840
|
+
transitionTimeoutRef.current = null;
|
|
9841
|
+
}
|
|
9842
|
+
}
|
|
9843
|
+
previousOpenRef.current = open;
|
|
9573
9844
|
}, [isAnchored, open]);
|
|
9574
|
-
|
|
9575
|
-
|
|
9845
|
+
useEffect(
|
|
9846
|
+
() => () => {
|
|
9847
|
+
if (transitionTimeoutRef.current) {
|
|
9848
|
+
clearTimeout(transitionTimeoutRef.current);
|
|
9849
|
+
}
|
|
9850
|
+
},
|
|
9851
|
+
[]
|
|
9852
|
+
);
|
|
9853
|
+
const handleMenuLevelChange = useCallback(
|
|
9854
|
+
(level) => {
|
|
9855
|
+
if (isAnchored) {
|
|
9856
|
+
const previousLevel = previousMenuLevelRef.current;
|
|
9857
|
+
if (level !== previousLevel) {
|
|
9858
|
+
setTransitionDirection(level > previousLevel ? "forward" : "backward");
|
|
9859
|
+
if (transitionTimeoutRef.current) clearTimeout(transitionTimeoutRef.current);
|
|
9860
|
+
transitionTimeoutRef.current = setTimeout(() => {
|
|
9861
|
+
setTransitionDirection(void 0);
|
|
9862
|
+
transitionTimeoutRef.current = null;
|
|
9863
|
+
}, resolvedSubmenuTransitionDurationMs);
|
|
9864
|
+
}
|
|
9865
|
+
previousMenuLevelRef.current = level;
|
|
9866
|
+
setMenuLevel(level);
|
|
9867
|
+
return;
|
|
9868
|
+
}
|
|
9869
|
+
menuProps.onMenuLevelChange?.(level);
|
|
9870
|
+
},
|
|
9871
|
+
[isAnchored, menuProps, resolvedSubmenuTransitionDurationMs]
|
|
9872
|
+
);
|
|
9873
|
+
const content = /* @__PURE__ */ createElement(
|
|
9874
|
+
ContextMenuContentComponent,
|
|
9576
9875
|
{
|
|
9577
9876
|
...menuProps,
|
|
9578
|
-
|
|
9877
|
+
key: `context-menu-content-${contentResetToken}`,
|
|
9878
|
+
onMenuLevelChange: handleMenuLevelChange,
|
|
9879
|
+
transitionDirection
|
|
9579
9880
|
}
|
|
9580
9881
|
);
|
|
9581
9882
|
if (isAnchored) {
|
|
9582
9883
|
const {
|
|
9583
9884
|
backLabel: _b,
|
|
9885
|
+
enableAnimations: _ea,
|
|
9584
9886
|
Header: _h,
|
|
9585
9887
|
items: _i,
|
|
9586
9888
|
ItemsWrapper: _w,
|
|
@@ -9593,6 +9895,8 @@ const ContextMenu = (props) => {
|
|
|
9593
9895
|
DialogAnchor,
|
|
9594
9896
|
{
|
|
9595
9897
|
allowFlip,
|
|
9898
|
+
closeOnClickOutside,
|
|
9899
|
+
closeTransitionMs,
|
|
9596
9900
|
dialogManagerId,
|
|
9597
9901
|
focus,
|
|
9598
9902
|
id,
|
|
@@ -9623,7 +9927,7 @@ const PromptHeader = ({ className, close, description, title }) => /* @__PURE__
|
|
|
9623
9927
|
onClick: close,
|
|
9624
9928
|
size: "sm",
|
|
9625
9929
|
variant: "secondary",
|
|
9626
|
-
children: /* @__PURE__ */ jsx(
|
|
9930
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
9627
9931
|
}
|
|
9628
9932
|
)
|
|
9629
9933
|
] });
|
|
@@ -9692,7 +9996,7 @@ const ViewerHeader = ({
|
|
|
9692
9996
|
onClick: close,
|
|
9693
9997
|
size: "sm",
|
|
9694
9998
|
variant: "secondary",
|
|
9695
|
-
children: /* @__PURE__ */ jsx(
|
|
9999
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
9696
10000
|
}
|
|
9697
10001
|
)
|
|
9698
10002
|
] });
|
|
@@ -9829,7 +10133,7 @@ function MessageBouncePrompt({ children }) {
|
|
|
9829
10133
|
Alert.Header,
|
|
9830
10134
|
{
|
|
9831
10135
|
className: "str-chat__message-bounce-alert-header",
|
|
9832
|
-
Icon:
|
|
10136
|
+
Icon: IconExclamationMark,
|
|
9833
10137
|
title: !children ? t("This message did not meet our content guidelines") : void 0,
|
|
9834
10138
|
children
|
|
9835
10139
|
}
|
|
@@ -9880,7 +10184,7 @@ const MessageBubble = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
|
9880
10184
|
const MessageDeletedBubble = () => {
|
|
9881
10185
|
const { t } = useTranslationContext();
|
|
9882
10186
|
return /* @__PURE__ */ jsx(MessageBubble, { "data-testid": "message-deleted-bubble", children: /* @__PURE__ */ jsxs("div", { className: "str-chat__message-text", children: [
|
|
9883
|
-
/* @__PURE__ */ jsx(
|
|
10187
|
+
/* @__PURE__ */ jsx(IconNoSign, {}),
|
|
9884
10188
|
/* @__PURE__ */ jsx("span", { children: t("Message deleted") })
|
|
9885
10189
|
] }) });
|
|
9886
10190
|
};
|
|
@@ -9930,7 +10234,9 @@ const useBaseMessageActionSetFilter = (messageActionSet, disable = false) => {
|
|
|
9930
10234
|
if (isBounced || isInitialMessage || // not sure whether this thing even works anymore
|
|
9931
10235
|
!message.type || message.type === "system" || message.type === "ephemeral" || message.status === "sending")
|
|
9932
10236
|
return [];
|
|
9933
|
-
return messageActionSet.filter((
|
|
10237
|
+
return messageActionSet.filter((action) => {
|
|
10238
|
+
if (action.placement === "quick-dropdown-toggle") return true;
|
|
10239
|
+
const type = action.type;
|
|
9934
10240
|
if (ACTIONS_NOT_WORKING_IN_THREAD.includes(type) && isMessageThreadReply)
|
|
9935
10241
|
return false;
|
|
9936
10242
|
if (message.error) {
|
|
@@ -10021,7 +10327,7 @@ const MessageAlsoSentInChannelIndicator = () => {
|
|
|
10021
10327
|
};
|
|
10022
10328
|
if (!message?.show_in_channel) return null;
|
|
10023
10329
|
return /* @__PURE__ */ jsxs("div", { className: "str-chat__message-also-sent-in-channel", role: "status", children: [
|
|
10024
|
-
/* @__PURE__ */ jsx(
|
|
10330
|
+
/* @__PURE__ */ jsx(IconArrowUpRight, {}),
|
|
10025
10331
|
/* @__PURE__ */ jsx("span", { children: threadList ? t("Also sent in channel") : t("Replied to a thread") }),
|
|
10026
10332
|
/* @__PURE__ */ jsx("span", { children: " · " }),
|
|
10027
10333
|
/* @__PURE__ */ jsx(
|
|
@@ -10235,7 +10541,7 @@ const UnMemoizedMessageStatus = (props) => {
|
|
|
10235
10541
|
children: t("Delivered")
|
|
10236
10542
|
}
|
|
10237
10543
|
),
|
|
10238
|
-
/* @__PURE__ */ jsx(
|
|
10544
|
+
/* @__PURE__ */ jsx(IconChecks, { className: "str-chat__message-status-delivered" })
|
|
10239
10545
|
] })),
|
|
10240
10546
|
read && (MessageReadStatus ? /* @__PURE__ */ jsx(MessageReadStatus, {}) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
10241
10547
|
/* @__PURE__ */ jsx(
|
|
@@ -10247,7 +10553,7 @@ const UnMemoizedMessageStatus = (props) => {
|
|
|
10247
10553
|
children: getReadByTooltipText(readBy, t, client, tooltipUserNameMapper)
|
|
10248
10554
|
}
|
|
10249
10555
|
),
|
|
10250
|
-
/* @__PURE__ */ jsx(
|
|
10556
|
+
/* @__PURE__ */ jsx(IconChecks, { className: "str-chat__message-status-read" }),
|
|
10251
10557
|
readersWithoutOwnUser.length > 1 && /* @__PURE__ */ jsx(
|
|
10252
10558
|
"span",
|
|
10253
10559
|
{
|
|
@@ -10277,14 +10583,14 @@ const matchMarkdownLinks = (message) => {
|
|
|
10277
10583
|
const regexMdLinks = /\[([^[]+)\](\(.*\))/gm;
|
|
10278
10584
|
const matches = message.match(regexMdLinks);
|
|
10279
10585
|
const singleMatch = /\[([^[]+)\]\((.*)\)/;
|
|
10280
|
-
const links = matches ? matches.map((
|
|
10281
|
-
const i = singleMatch.exec(
|
|
10586
|
+
const links = matches ? matches.map((match) => {
|
|
10587
|
+
const i = singleMatch.exec(match);
|
|
10282
10588
|
return i && [i[1], i[2]];
|
|
10283
10589
|
}) : [];
|
|
10284
10590
|
return links.flat();
|
|
10285
10591
|
};
|
|
10286
10592
|
const emojiMarkdownPlugin = () => {
|
|
10287
|
-
const replace = (
|
|
10593
|
+
const replace = (match) => u("element", { properties: {}, tagName: "emoji" }, [u("text", match)]);
|
|
10288
10594
|
const transform2 = (node) => findAndReplace(node, [emojiRegex(), replace]);
|
|
10289
10595
|
return transform2;
|
|
10290
10596
|
};
|
|
@@ -10294,13 +10600,13 @@ const mentionsMarkdownPlugin = (mentioned_users) => () => {
|
|
|
10294
10600
|
mentioned_usernames.map((username) => `@${username}`).join("|"),
|
|
10295
10601
|
"g"
|
|
10296
10602
|
);
|
|
10297
|
-
const replace = (
|
|
10298
|
-
const usernameOrId =
|
|
10603
|
+
const replace = (match) => {
|
|
10604
|
+
const usernameOrId = match.replace("@", "");
|
|
10299
10605
|
const user = mentioned_users.find(
|
|
10300
10606
|
({ id, name }) => name === usernameOrId || id === usernameOrId
|
|
10301
10607
|
);
|
|
10302
10608
|
return u("element", { mentionedUser: user, properties: {}, tagName: "mention" }, [
|
|
10303
|
-
u("text",
|
|
10609
|
+
u("text", match)
|
|
10304
10610
|
]);
|
|
10305
10611
|
};
|
|
10306
10612
|
const transform2 = (tree) => {
|
|
@@ -10405,12 +10711,12 @@ const plusPlusToEmphasis = () => {
|
|
|
10405
10711
|
if (node.type !== "text" || parent == null || typeof index !== "number") return;
|
|
10406
10712
|
const value = node.value;
|
|
10407
10713
|
INS_REGEX.lastIndex = 0;
|
|
10408
|
-
let
|
|
10714
|
+
let match;
|
|
10409
10715
|
let last = 0;
|
|
10410
10716
|
const out = [];
|
|
10411
|
-
while (
|
|
10412
|
-
const [full, inner] =
|
|
10413
|
-
const start =
|
|
10717
|
+
while (match = INS_REGEX.exec(value)) {
|
|
10718
|
+
const [full, inner] = match;
|
|
10719
|
+
const start = match.index;
|
|
10414
10720
|
if (start > last) out.push({ type: "text", value: value.slice(last, start) });
|
|
10415
10721
|
out.push({
|
|
10416
10722
|
children: [{ type: "text", value: inner }],
|
|
@@ -11739,7 +12045,7 @@ const ImagePlaceholder = ({ className }) => {
|
|
|
11739
12045
|
className: clsx("str-chat__image-placeholder", className),
|
|
11740
12046
|
"data-testid": "str-chat__base-image-placeholder",
|
|
11741
12047
|
role: "img",
|
|
11742
|
-
children: /* @__PURE__ */ jsx(
|
|
12048
|
+
children: /* @__PURE__ */ jsx(IconImage, {})
|
|
11743
12049
|
}
|
|
11744
12050
|
);
|
|
11745
12051
|
};
|
|
@@ -11838,6 +12144,7 @@ const toBaseImageDescriptors = (attachment, options = {}) => {
|
|
|
11838
12144
|
title: attachment.title
|
|
11839
12145
|
};
|
|
11840
12146
|
}
|
|
12147
|
+
return void 0;
|
|
11841
12148
|
};
|
|
11842
12149
|
const BASE_FILE_ICON_CLASSNAME = "str-chat__file-icon";
|
|
11843
12150
|
const FILE_ICON_GRAPHIC_CLASSNAME = "str-chat__file-icon__graphic";
|
|
@@ -12800,16 +13107,16 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12800
13107
|
};
|
|
12801
13108
|
if (!groupedAttachments.total) return result;
|
|
12802
13109
|
if (groupedAttachments.polls.length > 0)
|
|
12803
|
-
return { ...result, Icon:
|
|
13110
|
+
return { ...result, Icon: IconPoll, previewType: "poll" };
|
|
12804
13111
|
if (groupedAttachments.locations.length > 0)
|
|
12805
|
-
return { ...result, Icon:
|
|
13112
|
+
return { ...result, Icon: IconLocation, previewType: "location" };
|
|
12806
13113
|
if (groupedAttachments.giphies.length > 0 && groupedAttachments.giphies.length === groupedAttachments.total) {
|
|
12807
13114
|
const giphyAttachment = groupedAttachments.giphies[0];
|
|
12808
13115
|
const giphyVersion = giphyAttachment.giphy?.[giphyVersionName];
|
|
12809
13116
|
const src = giphyVersion?.url || giphyAttachment.thumb_url || giphyAttachment.image_url || "";
|
|
12810
13117
|
return {
|
|
12811
13118
|
...result,
|
|
12812
|
-
Icon:
|
|
13119
|
+
Icon: IconFile,
|
|
12813
13120
|
PreviewImage: /* @__PURE__ */ jsx(
|
|
12814
13121
|
BaseImage,
|
|
12815
13122
|
{
|
|
@@ -12826,7 +13133,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12826
13133
|
const fileAttachment = groupedAttachments.documents[0];
|
|
12827
13134
|
return {
|
|
12828
13135
|
...result,
|
|
12829
|
-
Icon:
|
|
13136
|
+
Icon: IconFile,
|
|
12830
13137
|
PreviewImage: /* @__PURE__ */ jsx(FileIcon, { fileName: fileAttachment.title, mimeType: fileAttachment.mime_type }),
|
|
12831
13138
|
previewType: "file"
|
|
12832
13139
|
};
|
|
@@ -12835,7 +13142,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12835
13142
|
const linkAttachment = groupedAttachments.links[0];
|
|
12836
13143
|
return {
|
|
12837
13144
|
...result,
|
|
12838
|
-
Icon:
|
|
13145
|
+
Icon: IconLink,
|
|
12839
13146
|
PreviewImage: /* @__PURE__ */ jsx(
|
|
12840
13147
|
BaseImage,
|
|
12841
13148
|
{
|
|
@@ -12863,7 +13170,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12863
13170
|
title: videoAttachment.title
|
|
12864
13171
|
}
|
|
12865
13172
|
),
|
|
12866
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__attachment-preview__thumbnail__play-indicator", children: /* @__PURE__ */ jsx(
|
|
13173
|
+
/* @__PURE__ */ jsx("div", { className: "str-chat__attachment-preview__thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlayFill, {}) })
|
|
12867
13174
|
] }),
|
|
12868
13175
|
previewType: "video"
|
|
12869
13176
|
};
|
|
@@ -12872,7 +13179,7 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12872
13179
|
const imageAttachment = groupedAttachments.images[0];
|
|
12873
13180
|
return {
|
|
12874
13181
|
...result,
|
|
12875
|
-
Icon:
|
|
13182
|
+
Icon: IconVideoFill,
|
|
12876
13183
|
PreviewImage: /* @__PURE__ */ jsx(
|
|
12877
13184
|
BaseImage,
|
|
12878
13185
|
{
|
|
@@ -12886,8 +13193,8 @@ const getAttachmentIconWithType = (quotedMessage, giphyVersionName) => {
|
|
|
12886
13193
|
};
|
|
12887
13194
|
}
|
|
12888
13195
|
if (groupedAttachments.voiceRecordings.length === groupedAttachments.total)
|
|
12889
|
-
return { ...result, Icon:
|
|
12890
|
-
return { ...result, Icon:
|
|
13196
|
+
return { ...result, Icon: IconVoice, previewType: "voice" };
|
|
13197
|
+
return { ...result, Icon: IconFile, previewType: "mixed" };
|
|
12891
13198
|
};
|
|
12892
13199
|
const QuotedMessagePreview = ({
|
|
12893
13200
|
getQuotedMessageAuthor,
|
|
@@ -13038,7 +13345,7 @@ const reminderStateSelector = (state) => ({
|
|
|
13038
13345
|
function SavedForLaterContent() {
|
|
13039
13346
|
const { t } = useTranslationContext();
|
|
13040
13347
|
return /* @__PURE__ */ jsxs("p", { className: "str-chat__message-saved-for-later", children: [
|
|
13041
|
-
/* @__PURE__ */ jsx(
|
|
13348
|
+
/* @__PURE__ */ jsx(IconSave, {}),
|
|
13042
13349
|
/* @__PURE__ */ jsx("span", { children: t("Saved for later") })
|
|
13043
13350
|
] });
|
|
13044
13351
|
}
|
|
@@ -13082,7 +13389,7 @@ function RemindMeContent({ reminder }) {
|
|
|
13082
13389
|
});
|
|
13083
13390
|
};
|
|
13084
13391
|
return /* @__PURE__ */ jsxs("p", { className: "str-chat__message-reminder", children: [
|
|
13085
|
-
/* @__PURE__ */ jsx(
|
|
13392
|
+
/* @__PURE__ */ jsx(IconBell, {}),
|
|
13086
13393
|
/* @__PURE__ */ jsx("span", { children: t("Reminder set") }),
|
|
13087
13394
|
/* @__PURE__ */ jsx("span", { children: " · " }),
|
|
13088
13395
|
/* @__PURE__ */ jsx("span", { className: "str-chat__message-reminder__time-left", children: renderTime() })
|
|
@@ -13795,10 +14102,10 @@ const TextInput = forwardRef(function TextInput2({
|
|
|
13795
14102
|
const displayMessage = displayError || displaySuccess || displayNeutralMessage;
|
|
13796
14103
|
const messageId = displayMessage ? `${id}-message` : void 0;
|
|
13797
14104
|
const messageContent = displayError ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13798
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: errorMessageIcon ?? /* @__PURE__ */ jsx(
|
|
14105
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: errorMessageIcon ?? /* @__PURE__ */ jsx(IconExclamationMark, {}) }),
|
|
13799
14106
|
errorMessage ?? message
|
|
13800
14107
|
] }) : displaySuccess ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
13801
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: successMessageIcon ?? /* @__PURE__ */ jsx(
|
|
14108
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__form-text-input__message-icon", children: successMessageIcon ?? /* @__PURE__ */ jsx(IconCheckmark, {}) }),
|
|
13802
14109
|
successMessage
|
|
13803
14110
|
] }) : displayNeutralMessage ? message : null;
|
|
13804
14111
|
return /* @__PURE__ */ jsxs(
|
|
@@ -14675,7 +14982,8 @@ const PollOptionWithVotes = ({
|
|
|
14675
14982
|
"div",
|
|
14676
14983
|
{
|
|
14677
14984
|
className: clsx("str-chat__poll-option", {
|
|
14678
|
-
"str-chat__poll-option--has-more-votes": isVotesPreview && voteCount > countVotesPreview
|
|
14985
|
+
"str-chat__poll-option--has-more-votes": isVotesPreview && voteCount > countVotesPreview,
|
|
14986
|
+
"str-chat__poll-option--has-votes": voteCount
|
|
14679
14987
|
}),
|
|
14680
14988
|
children: [
|
|
14681
14989
|
/* @__PURE__ */ jsx(PollOptionWithVotesHeader, { option, optionOrderNumber: orderNumber }),
|
|
@@ -15241,7 +15549,7 @@ const OptionFieldSet = () => {
|
|
|
15241
15549
|
className: "str-chat__form__input-field__value",
|
|
15242
15550
|
error: !!error,
|
|
15243
15551
|
id: option.id,
|
|
15244
|
-
leading: draggable ? /* @__PURE__ */ jsx(
|
|
15552
|
+
leading: draggable ? /* @__PURE__ */ jsx(IconReorder, { className: "str-chat__drag-handle" }) : void 0,
|
|
15245
15553
|
message: error ? /* @__PURE__ */ jsx("span", { "data-testid": "poll-option-input-field-error", children: knownValidationErrors[error] ?? t("Error") }) : void 0,
|
|
15246
15554
|
onBlur: () => {
|
|
15247
15555
|
pollComposer.handleFieldBlur("options");
|
|
@@ -15280,7 +15588,7 @@ const RemoveOptionButton = ({ className, ...props }) => /* @__PURE__ */ jsx(
|
|
|
15280
15588
|
size: "sm",
|
|
15281
15589
|
variant: "secondary",
|
|
15282
15590
|
...props,
|
|
15283
|
-
children: /* @__PURE__ */ jsx(
|
|
15591
|
+
children: /* @__PURE__ */ jsx(IconMinusCircle, {})
|
|
15284
15592
|
}
|
|
15285
15593
|
);
|
|
15286
15594
|
const PollCreationDialogControls = ({
|
|
@@ -15316,7 +15624,7 @@ const PollCreationDialogControls = ({
|
|
|
15316
15624
|
},
|
|
15317
15625
|
type: "submit",
|
|
15318
15626
|
children: [
|
|
15319
|
-
/* @__PURE__ */ jsx(
|
|
15627
|
+
/* @__PURE__ */ jsx(IconSend, {}),
|
|
15320
15628
|
t("Send poll")
|
|
15321
15629
|
]
|
|
15322
15630
|
}
|
|
@@ -15398,12 +15706,12 @@ const AttachmentSelectorContextProvider = ({
|
|
|
15398
15706
|
}) => /* @__PURE__ */ jsx(AttachmentSelectorContext.Provider, { value, children });
|
|
15399
15707
|
const useAttachmentSelectorContext = () => useContext(AttachmentSelectorContext);
|
|
15400
15708
|
const icons = {
|
|
15401
|
-
ban:
|
|
15402
|
-
flag:
|
|
15709
|
+
ban: IconUserRemove,
|
|
15710
|
+
flag: IconFlag,
|
|
15403
15711
|
giphy: IconGiphy,
|
|
15404
15712
|
mute: IconMute,
|
|
15405
|
-
unban:
|
|
15406
|
-
unmute:
|
|
15713
|
+
unban: IconUserAdd,
|
|
15714
|
+
unmute: IconAudio
|
|
15407
15715
|
};
|
|
15408
15716
|
const CommandsMenuClassName = "str-chat__context-menu--commands";
|
|
15409
15717
|
const CommandsSubmenuHeader = () => {
|
|
@@ -15495,7 +15803,7 @@ const AttachmentSelectorMenuInitButtonIcon = ({ className }) => {
|
|
|
15495
15803
|
return /* @__PURE__ */ jsx("span", { className, children: /* @__PURE__ */ jsx(AttachmentSelectorInitiationButtonContents, {}) });
|
|
15496
15804
|
}
|
|
15497
15805
|
return /* @__PURE__ */ jsx(
|
|
15498
|
-
|
|
15806
|
+
IconPlus,
|
|
15499
15807
|
{
|
|
15500
15808
|
className: clsx("str-chat__attachment-selector__menu-button__icon", className)
|
|
15501
15809
|
}
|
|
@@ -15558,7 +15866,7 @@ const DefaultAttachmentSelectorComponents = {
|
|
|
15558
15866
|
{
|
|
15559
15867
|
className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button",
|
|
15560
15868
|
hasSubMenu: hasSubmenu,
|
|
15561
|
-
Icon:
|
|
15869
|
+
Icon: IconCommand,
|
|
15562
15870
|
onClick: () => {
|
|
15563
15871
|
if (!hasSubmenu) return;
|
|
15564
15872
|
openSubmenu({
|
|
@@ -15579,7 +15887,7 @@ const DefaultAttachmentSelectorComponents = {
|
|
|
15579
15887
|
ContextMenuButton,
|
|
15580
15888
|
{
|
|
15581
15889
|
className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__upload-file-button",
|
|
15582
|
-
Icon:
|
|
15890
|
+
Icon: IconAttachment,
|
|
15583
15891
|
onClick: () => {
|
|
15584
15892
|
fileInput?.click();
|
|
15585
15893
|
closeMenu();
|
|
@@ -15595,7 +15903,7 @@ const DefaultAttachmentSelectorComponents = {
|
|
|
15595
15903
|
ContextMenuButton,
|
|
15596
15904
|
{
|
|
15597
15905
|
className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__add-location-button",
|
|
15598
|
-
Icon:
|
|
15906
|
+
Icon: IconLocation,
|
|
15599
15907
|
onClick: () => {
|
|
15600
15908
|
openModalForAction("addLocation");
|
|
15601
15909
|
closeMenu();
|
|
@@ -15611,7 +15919,7 @@ const DefaultAttachmentSelectorComponents = {
|
|
|
15611
15919
|
ContextMenuButton,
|
|
15612
15920
|
{
|
|
15613
15921
|
className: "str-chat__attachment-selector-actions-menu__button str-chat__attachment-selector-actions-menu__create-poll-button",
|
|
15614
|
-
Icon:
|
|
15922
|
+
Icon: IconPoll,
|
|
15615
15923
|
onClick: () => {
|
|
15616
15924
|
openModalForAction("createPoll");
|
|
15617
15925
|
closeMenu();
|
|
@@ -15688,7 +15996,7 @@ const AttachmentSelector = ({
|
|
|
15688
15996
|
getModalPortalDestination
|
|
15689
15997
|
}) => {
|
|
15690
15998
|
const { t } = useTranslationContext();
|
|
15691
|
-
const { Modal = GlobalModal } = useComponentContext();
|
|
15999
|
+
const { ContextMenu: ContextMenuComponent = ContextMenu, Modal = GlobalModal } = useComponentContext();
|
|
15692
16000
|
const { channelCapabilities } = useChannelStateContext();
|
|
15693
16001
|
const messageComposer = useMessageComposerController();
|
|
15694
16002
|
const isCooldownActive = useIsCooldownActive();
|
|
@@ -15748,7 +16056,7 @@ const AttachmentSelector = ({
|
|
|
15748
16056
|
}
|
|
15749
16057
|
),
|
|
15750
16058
|
/* @__PURE__ */ jsx(
|
|
15751
|
-
|
|
16059
|
+
ContextMenuComponent,
|
|
15752
16060
|
{
|
|
15753
16061
|
allowFlip: true,
|
|
15754
16062
|
backLabel: t("Back"),
|
|
@@ -15944,7 +16252,7 @@ const FileAttachmentPreview = ({
|
|
|
15944
16252
|
uploadState === "uploading" && /* @__PURE__ */ jsx(LoadingIndicatorIcon, {}),
|
|
15945
16253
|
!hasError && /* @__PURE__ */ jsx(FileSizeIndicator, { fileSize: attachment.file_size }),
|
|
15946
16254
|
hasFatalError && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__fatal-error", children: [
|
|
15947
|
-
/* @__PURE__ */ jsx(
|
|
16255
|
+
/* @__PURE__ */ jsx(IconExclamationMark, {}),
|
|
15948
16256
|
/* @__PURE__ */ jsx("span", { children: hasSizeLimitError ? t("File too large") : uploadState === "blocked" ? t("Upload blocked") : t("Upload failed") })
|
|
15949
16257
|
] }),
|
|
15950
16258
|
hasRetriableError && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__retriable-error", children: [
|
|
@@ -16500,7 +16808,7 @@ const AudioAttachmentPreview = ({
|
|
|
16500
16808
|
}
|
|
16501
16809
|
)
|
|
16502
16810
|
] }) : hasFatalError ? /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__fatal-error", children: [
|
|
16503
|
-
/* @__PURE__ */ jsx(
|
|
16811
|
+
/* @__PURE__ */ jsx(IconExclamationMark, {}),
|
|
16504
16812
|
/* @__PURE__ */ jsx("span", { children: hasSizeLimitError ? t("File too large") : uploadState === "blocked" ? t("Upload blocked") : t("Upload failed") })
|
|
16505
16813
|
] }) : /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-file__retriable-error", children: [
|
|
16506
16814
|
/* @__PURE__ */ jsx(IconExclamationTriangle, {}),
|
|
@@ -16599,10 +16907,10 @@ const MediaAttachmentPreview = ({
|
|
|
16599
16907
|
/* @__PURE__ */ jsxs("div", { className: clsx("str-chat__attachment-preview-media__overlay"), children: [
|
|
16600
16908
|
isUploading && /* @__PURE__ */ jsx(LoadingIndicator2, {}),
|
|
16601
16909
|
isVideoAttachment(attachment) && !hasUploadError && uploadState !== "uploading" && /* @__PURE__ */ jsxs("div", { className: "str-chat__attachment-preview-media__video-indicator", children: [
|
|
16602
|
-
/* @__PURE__ */ jsx(
|
|
16910
|
+
/* @__PURE__ */ jsx(IconVideoFill, {}),
|
|
16603
16911
|
attachment.duration && /* @__PURE__ */ jsx("div", { children: attachment.duration })
|
|
16604
16912
|
] }),
|
|
16605
|
-
hasFatalError && /* @__PURE__ */ jsx(
|
|
16913
|
+
hasFatalError && /* @__PURE__ */ jsx(IconExclamationMark, {}),
|
|
16606
16914
|
hasRetriableError && /* @__PURE__ */ jsx(
|
|
16607
16915
|
Button,
|
|
16608
16916
|
{
|
|
@@ -16614,7 +16922,7 @@ const MediaAttachmentPreview = ({
|
|
|
16614
16922
|
onClick: retry,
|
|
16615
16923
|
size: "sm",
|
|
16616
16924
|
variant: "danger",
|
|
16617
|
-
children: /* @__PURE__ */ jsx(
|
|
16925
|
+
children: /* @__PURE__ */ jsx(IconRetry, {})
|
|
16618
16926
|
}
|
|
16619
16927
|
)
|
|
16620
16928
|
] })
|
|
@@ -16685,7 +16993,7 @@ const GalleryHeader = ({ currentItem }) => {
|
|
|
16685
16993
|
className: "str-chat__gallery__action-button str-chat__gallery__action-button--close",
|
|
16686
16994
|
onClick: modalContext.close,
|
|
16687
16995
|
title: t("Close"),
|
|
16688
|
-
children: /* @__PURE__ */ jsx(
|
|
16996
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
16689
16997
|
}
|
|
16690
16998
|
) : null
|
|
16691
16999
|
] })
|
|
@@ -16732,9 +17040,9 @@ const VideoThumbnail = ({
|
|
|
16732
17040
|
onClick: onPlay,
|
|
16733
17041
|
size: "lg",
|
|
16734
17042
|
variant: "secondary",
|
|
16735
|
-
children: /* @__PURE__ */ jsx(
|
|
17043
|
+
children: /* @__PURE__ */ jsx(IconPlayFill, {})
|
|
16736
17044
|
}
|
|
16737
|
-
) : /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__video-thumbnail__play-indicator", children: /* @__PURE__ */ jsx(
|
|
17045
|
+
) : /* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__video-thumbnail__play-indicator", children: /* @__PURE__ */ jsx(IconPlayFill, {}) })
|
|
16738
17046
|
] });
|
|
16739
17047
|
};
|
|
16740
17048
|
const SWIPE_THRESHOLD = 50;
|
|
@@ -17158,7 +17466,7 @@ const CommandChip = ({ command }) => {
|
|
|
17158
17466
|
textComposer.setCommand(null);
|
|
17159
17467
|
textareaRef.current?.focus();
|
|
17160
17468
|
},
|
|
17161
|
-
children: /* @__PURE__ */ jsx(
|
|
17469
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
17162
17470
|
}
|
|
17163
17471
|
)
|
|
17164
17472
|
] });
|
|
@@ -17223,7 +17531,7 @@ const LinkPreviewCard = ({ linkPreview }) => {
|
|
|
17223
17531
|
/* @__PURE__ */ jsx("div", { className: "str-chat__link-preview-card__content-title", children: linkPreview.title }),
|
|
17224
17532
|
/* @__PURE__ */ jsx("div", { className: "str-chat__link-preview-card__content-description", children: linkPreview.text }),
|
|
17225
17533
|
/* @__PURE__ */ jsxs("div", { className: "str-chat__link-preview-card__content__url", children: [
|
|
17226
|
-
/* @__PURE__ */ jsx(
|
|
17534
|
+
/* @__PURE__ */ jsx(IconLink, {}),
|
|
17227
17535
|
/* @__PURE__ */ jsx("span", { children: linkPreview.og_scrape_url })
|
|
17228
17536
|
] })
|
|
17229
17537
|
] }),
|
|
@@ -17301,7 +17609,7 @@ const AudioRecordingPlayback = ({
|
|
|
17301
17609
|
onClick: audioPlayer.togglePlay,
|
|
17302
17610
|
size: "sm",
|
|
17303
17611
|
variant: "secondary",
|
|
17304
|
-
children: isPlaying ? /* @__PURE__ */ jsx(
|
|
17612
|
+
children: isPlaying ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconPlayFill, {})
|
|
17305
17613
|
}
|
|
17306
17614
|
),
|
|
17307
17615
|
/* @__PURE__ */ jsx(
|
|
@@ -17419,7 +17727,7 @@ const AudioRecordingPreview = () => {
|
|
|
17419
17727
|
};
|
|
17420
17728
|
}, [recorder, startCounter, stopCounter]);
|
|
17421
17729
|
return /* @__PURE__ */ jsxs("div", { className: "str-chat__audio-recorder__recording-preview", children: [
|
|
17422
|
-
/* @__PURE__ */ jsx(
|
|
17730
|
+
/* @__PURE__ */ jsx(IconVoice, {}),
|
|
17423
17731
|
/* @__PURE__ */ jsx(RecordingTimer, { durationSeconds: secondsElapsed }),
|
|
17424
17732
|
/* @__PURE__ */ jsx(AudioRecordingWaveform, {})
|
|
17425
17733
|
] });
|
|
@@ -17439,7 +17747,7 @@ const ToggleRecordingButton = () => {
|
|
|
17439
17747
|
onClick: () => isRecording(recordingState) ? recorder?.pause() : recorder?.resume(),
|
|
17440
17748
|
size: "sm",
|
|
17441
17749
|
variant: "secondary",
|
|
17442
|
-
children: isRecording(recordingState) ? /* @__PURE__ */ jsx(
|
|
17750
|
+
children: isRecording(recordingState) ? /* @__PURE__ */ jsx(IconPauseFill, {}) : /* @__PURE__ */ jsx(IconVoice, {})
|
|
17443
17751
|
}
|
|
17444
17752
|
);
|
|
17445
17753
|
};
|
|
@@ -17474,7 +17782,7 @@ const AudioRecorderRecordingControls = () => {
|
|
|
17474
17782
|
},
|
|
17475
17783
|
size: "sm",
|
|
17476
17784
|
variant: "secondary",
|
|
17477
|
-
children: /* @__PURE__ */ jsx(
|
|
17785
|
+
children: /* @__PURE__ */ jsx(IconDelete, {})
|
|
17478
17786
|
}
|
|
17479
17787
|
),
|
|
17480
17788
|
/* @__PURE__ */ jsx(ToggleRecordingButton, {}),
|
|
@@ -17571,7 +17879,7 @@ const DefaultStartRecordingAudioButton = forwardRef(function StartRecordingAudio
|
|
|
17571
17879
|
variant: "secondary",
|
|
17572
17880
|
...props,
|
|
17573
17881
|
ref,
|
|
17574
|
-
children: /* @__PURE__ */ jsx(
|
|
17882
|
+
children: /* @__PURE__ */ jsx(IconVoice, {})
|
|
17575
17883
|
}
|
|
17576
17884
|
);
|
|
17577
17885
|
});
|
|
@@ -17612,7 +17920,7 @@ const SendToChannelCheckbox = () => {
|
|
|
17612
17920
|
type: "checkbox"
|
|
17613
17921
|
}
|
|
17614
17922
|
),
|
|
17615
|
-
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__send-to-channel-checkbox__visual", children: /* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__checkmark", children: /* @__PURE__ */ jsx(
|
|
17923
|
+
/* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "str-chat__send-to-channel-checkbox__visual", children: /* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__checkmark", children: /* @__PURE__ */ jsx(IconCheckmark, {}) }) }),
|
|
17616
17924
|
/* @__PURE__ */ jsx("span", { className: "str-chat__send-to-channel-checkbox__label", children: labelText })
|
|
17617
17925
|
]
|
|
17618
17926
|
}
|
|
@@ -17778,7 +18086,10 @@ const SuggestionList = ({
|
|
|
17778
18086
|
setFocusedItemIndex,
|
|
17779
18087
|
suggestionItemComponents = defaultComponents
|
|
17780
18088
|
}) => {
|
|
17781
|
-
const {
|
|
18089
|
+
const {
|
|
18090
|
+
AutocompleteSuggestionItem = SuggestionListItem,
|
|
18091
|
+
ContextMenu: ContextMenuComponent = ContextMenu
|
|
18092
|
+
} = useComponentContext();
|
|
17782
18093
|
const { textareaRef } = useMessageComposerContext();
|
|
17783
18094
|
const messageComposer = useMessageComposerController();
|
|
17784
18095
|
const { textComposer } = messageComposer;
|
|
@@ -17896,7 +18207,7 @@ const SuggestionList = ({
|
|
|
17896
18207
|
zIndex: 1e3
|
|
17897
18208
|
},
|
|
17898
18209
|
children: /* @__PURE__ */ jsx(
|
|
17899
|
-
|
|
18210
|
+
ContextMenuComponent,
|
|
17900
18211
|
{
|
|
17901
18212
|
className: clsx("str-chat__suggestion-list", className),
|
|
17902
18213
|
Header: suggestions.searchSource.type === "commands" ? CommandsMenuHeader : void 0,
|
|
@@ -18122,12 +18433,6 @@ const TextareaComposer = ({
|
|
|
18122
18433
|
if (!textareaRef.current || textareaIsFocused || !focus) return;
|
|
18123
18434
|
textareaRef.current.focus();
|
|
18124
18435
|
}, [attachments, focus, quotedMessage, textareaRef]);
|
|
18125
|
-
useEffect(
|
|
18126
|
-
() => () => {
|
|
18127
|
-
messageComposer.clear();
|
|
18128
|
-
},
|
|
18129
|
-
[messageComposer]
|
|
18130
|
-
);
|
|
18131
18436
|
useLayoutEffect(() => {
|
|
18132
18437
|
const textarea = textareaRef.current;
|
|
18133
18438
|
if (!textarea || isComposing) return;
|
|
@@ -18275,7 +18580,7 @@ const FileDragAndDropContent = ({
|
|
|
18275
18580
|
}) => {
|
|
18276
18581
|
const { t } = useTranslationContext();
|
|
18277
18582
|
return /* @__PURE__ */ jsx("div", { className: "str-chat__dropzone-container__content", children: isDragRejected ? /* @__PURE__ */ jsx("p", { children: t("Some of the files will not be accepted") }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
18278
|
-
/* @__PURE__ */ jsx(
|
|
18583
|
+
/* @__PURE__ */ jsx(IconUpload, {}),
|
|
18279
18584
|
/* @__PURE__ */ jsx("p", { children: t("Drag your files here") })
|
|
18280
18585
|
] }) });
|
|
18281
18586
|
};
|
|
@@ -18311,7 +18616,7 @@ const SendButton = ({ children, sendMessage, ...rest }) => {
|
|
|
18311
18616
|
size: "sm",
|
|
18312
18617
|
variant: "primary",
|
|
18313
18618
|
...rest,
|
|
18314
|
-
children: children ?? /* @__PURE__ */ jsx(
|
|
18619
|
+
children: children ?? /* @__PURE__ */ jsx(IconSend, {})
|
|
18315
18620
|
}
|
|
18316
18621
|
);
|
|
18317
18622
|
};
|
|
@@ -18347,7 +18652,7 @@ const MessageComposerActions = () => {
|
|
|
18347
18652
|
const stopGenerating = useCallback(() => channel?.stopAIResponse(), [channel]);
|
|
18348
18653
|
const shouldDisplayStopAIGeneration = [AIStates.Thinking, AIStates.Generating].includes(aiState) && !!StopAIGenerationButton$1;
|
|
18349
18654
|
const recordingEnabled = !!(recordingController.recorder && navigator.mediaDevices);
|
|
18350
|
-
let content = SendButton$1 ? /* @__PURE__ */ jsx(SendButton$1, { sendMessage: handleSubmit }) : /* @__PURE__ */ jsx(SendButton, { sendMessage: handleSubmit, children: editedMessage || command ? /* @__PURE__ */ jsx(
|
|
18655
|
+
let content = SendButton$1 ? /* @__PURE__ */ jsx(SendButton$1, { sendMessage: handleSubmit }) : /* @__PURE__ */ jsx(SendButton, { sendMessage: handleSubmit, children: editedMessage || command ? /* @__PURE__ */ jsx(IconCheckmark, {}) : /* @__PURE__ */ jsx(IconSend, {}) });
|
|
18351
18656
|
if (shouldDisplayStopAIGeneration) {
|
|
18352
18657
|
content = /* @__PURE__ */ jsx(StopAIGenerationButton$1, { onClick: stopGenerating });
|
|
18353
18658
|
} else if (hideSendButton) return null;
|
|
@@ -18363,7 +18668,7 @@ const AdditionalMessageComposerActions = () => {
|
|
|
18363
18668
|
const isCooldownActive = useIsCooldownActive();
|
|
18364
18669
|
return /* @__PURE__ */ jsx("div", { className: "str-chat__message-composer__additional-actions", children: !isCooldownActive && EmojiPicker ? /* @__PURE__ */ jsx(EmojiPicker, {}) : null });
|
|
18365
18670
|
};
|
|
18366
|
-
const GeolocationPreviewImage = () => /* @__PURE__ */ jsx("div", { className: "str-chat__location-preview-image", children: /* @__PURE__ */ jsx(
|
|
18671
|
+
const GeolocationPreviewImage = () => /* @__PURE__ */ jsx("div", { className: "str-chat__location-preview-image", children: /* @__PURE__ */ jsx(IconLocation, {}) });
|
|
18367
18672
|
const GeolocationPreview = ({
|
|
18368
18673
|
location,
|
|
18369
18674
|
PreviewImage = GeolocationPreviewImage,
|
|
@@ -18581,7 +18886,7 @@ const MessageComposerProvider = (props) => {
|
|
|
18581
18886
|
const messageComposer = useMessageComposerController();
|
|
18582
18887
|
useEffect(
|
|
18583
18888
|
() => () => {
|
|
18584
|
-
messageComposer.createDraft();
|
|
18889
|
+
messageComposer.createDraft().finally(() => messageComposer.clear());
|
|
18585
18890
|
},
|
|
18586
18891
|
[messageComposer]
|
|
18587
18892
|
);
|
|
@@ -18899,7 +19204,7 @@ const useChat = ({
|
|
|
18899
19204
|
};
|
|
18900
19205
|
useEffect(() => {
|
|
18901
19206
|
if (!client) return;
|
|
18902
|
-
const version = "14.0.0-beta.
|
|
19207
|
+
const version = "14.0.0-beta.4";
|
|
18903
19208
|
const userAgent = client.getUserAgent();
|
|
18904
19209
|
if (!userAgent.includes("stream-chat-react")) {
|
|
18905
19210
|
client.setUserAgent(`stream-chat-react-${version}-${userAgent}`);
|
|
@@ -19066,7 +19371,7 @@ const ThreadHeader = (props) => {
|
|
|
19066
19371
|
onClick: closeThread,
|
|
19067
19372
|
size: "md",
|
|
19068
19373
|
variant: "secondary",
|
|
19069
|
-
children: /* @__PURE__ */ jsx(
|
|
19374
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
19070
19375
|
}
|
|
19071
19376
|
)
|
|
19072
19377
|
] });
|
|
@@ -19374,7 +19679,7 @@ const ReactionSelector = (props) => {
|
|
|
19374
19679
|
onClick: () => setExtendedListOpen(true),
|
|
19375
19680
|
size: "sm",
|
|
19376
19681
|
variant: "secondary",
|
|
19377
|
-
children: /* @__PURE__ */ jsx(
|
|
19682
|
+
children: /* @__PURE__ */ jsx(IconPlus, {})
|
|
19378
19683
|
}
|
|
19379
19684
|
)
|
|
19380
19685
|
] }),
|
|
@@ -19400,10 +19705,10 @@ const ReactionSelector = (props) => {
|
|
|
19400
19705
|
) })
|
|
19401
19706
|
] });
|
|
19402
19707
|
};
|
|
19403
|
-
ReactionSelector.getDialogId = (
|
|
19708
|
+
ReactionSelector.getDialogId = ({ messageId, threadList }) => {
|
|
19404
19709
|
const dialogIdNamespace = threadList ? "-thread" : "";
|
|
19405
|
-
return `reaction-selector${dialogIdNamespace}
|
|
19406
|
-
}
|
|
19710
|
+
return `reaction-selector${dialogIdNamespace}-${messageId}`;
|
|
19711
|
+
};
|
|
19407
19712
|
ReactionSelector.displayName = "ReactionSelector";
|
|
19408
19713
|
const ReactionSelectorWithButton = ({
|
|
19409
19714
|
ReactionIcon
|
|
@@ -19488,6 +19793,7 @@ const QuickMessageActionsButton = ({ className, ...props }) => /* @__PURE__ */ j
|
|
|
19488
19793
|
appearance: "ghost",
|
|
19489
19794
|
circular: true,
|
|
19490
19795
|
className: clsx("str-chat__message-actions-box-button", className),
|
|
19796
|
+
size: "sm",
|
|
19491
19797
|
variant: "secondary",
|
|
19492
19798
|
...props
|
|
19493
19799
|
}
|
|
@@ -19554,7 +19860,7 @@ const DefaultMessageActionComponents = {
|
|
|
19554
19860
|
"aria-label": t("aria/Open Thread"),
|
|
19555
19861
|
className: msgActionsBoxButtonClassName,
|
|
19556
19862
|
"data-testid": "thread-action",
|
|
19557
|
-
Icon:
|
|
19863
|
+
Icon: IconThread,
|
|
19558
19864
|
onClick: (e) => {
|
|
19559
19865
|
handleOpenThread(e);
|
|
19560
19866
|
closeMenu();
|
|
@@ -19581,7 +19887,7 @@ const DefaultMessageActionComponents = {
|
|
|
19581
19887
|
{
|
|
19582
19888
|
"aria-label": t("aria/Quote Message"),
|
|
19583
19889
|
className: msgActionsBoxButtonClassName,
|
|
19584
|
-
Icon:
|
|
19890
|
+
Icon: IconQuote,
|
|
19585
19891
|
onClick: () => {
|
|
19586
19892
|
handleQuote();
|
|
19587
19893
|
closeMenu();
|
|
@@ -19618,7 +19924,7 @@ const DefaultMessageActionComponents = {
|
|
|
19618
19924
|
{
|
|
19619
19925
|
"aria-label": t("aria/Copy Message Text"),
|
|
19620
19926
|
className: msgActionsBoxButtonClassName,
|
|
19621
|
-
Icon:
|
|
19927
|
+
Icon: IconCopy,
|
|
19622
19928
|
onClick: () => {
|
|
19623
19929
|
if (message.text) navigator.clipboard.writeText(message.text);
|
|
19624
19930
|
closeMenu();
|
|
@@ -19636,7 +19942,7 @@ const DefaultMessageActionComponents = {
|
|
|
19636
19942
|
{
|
|
19637
19943
|
"aria-label": t("aria/Resend Message"),
|
|
19638
19944
|
className: msgActionsBoxButtonClassName,
|
|
19639
|
-
Icon:
|
|
19945
|
+
Icon: IconRetry,
|
|
19640
19946
|
onClick: () => {
|
|
19641
19947
|
handleRetry(message);
|
|
19642
19948
|
closeMenu();
|
|
@@ -19655,7 +19961,7 @@ const DefaultMessageActionComponents = {
|
|
|
19655
19961
|
{
|
|
19656
19962
|
"aria-label": t("aria/Edit Message"),
|
|
19657
19963
|
className: msgActionsBoxButtonClassName,
|
|
19658
|
-
Icon:
|
|
19964
|
+
Icon: IconEdit,
|
|
19659
19965
|
onClick: () => {
|
|
19660
19966
|
messageComposer.initState({ composition: message });
|
|
19661
19967
|
closeMenu();
|
|
@@ -19673,7 +19979,7 @@ const DefaultMessageActionComponents = {
|
|
|
19673
19979
|
{
|
|
19674
19980
|
"aria-label": t("aria/Mark Message Unread"),
|
|
19675
19981
|
className: msgActionsBoxButtonClassName,
|
|
19676
|
-
Icon:
|
|
19982
|
+
Icon: IconNotification,
|
|
19677
19983
|
onClick: (event) => {
|
|
19678
19984
|
handleMarkUnread(event);
|
|
19679
19985
|
closeMenu();
|
|
@@ -19696,7 +20002,7 @@ const DefaultMessageActionComponents = {
|
|
|
19696
20002
|
"aria-label": reminder ? t("aria/Remind Me Message") : t("aria/Remove Reminder"),
|
|
19697
20003
|
className: msgActionsBoxButtonClassName,
|
|
19698
20004
|
hasSubMenu: !reminder,
|
|
19699
|
-
Icon: reminder ? IconBellOff :
|
|
20005
|
+
Icon: reminder ? IconBellOff : IconBell,
|
|
19700
20006
|
onClick: () => {
|
|
19701
20007
|
if (reminder) {
|
|
19702
20008
|
client.reminders.deleteReminder(reminder.id);
|
|
@@ -19725,7 +20031,7 @@ const DefaultMessageActionComponents = {
|
|
|
19725
20031
|
{
|
|
19726
20032
|
"aria-label": reminder ? t("aria/Remove Save For Later") : t("aria/Bookmark Message"),
|
|
19727
20033
|
className: msgActionsBoxButtonClassName,
|
|
19728
|
-
Icon: reminder ?
|
|
20034
|
+
Icon: reminder ? IconUnsave : IconSave,
|
|
19729
20035
|
onClick: () => {
|
|
19730
20036
|
if (reminder) client.reminders.deleteReminder(reminder.id);
|
|
19731
20037
|
else client.reminders.createReminder({ messageId: message.id });
|
|
@@ -19744,7 +20050,7 @@ const DefaultMessageActionComponents = {
|
|
|
19744
20050
|
{
|
|
19745
20051
|
"aria-label": t("aria/Flag Message"),
|
|
19746
20052
|
className: msgActionsBoxButtonClassName,
|
|
19747
|
-
Icon:
|
|
20053
|
+
Icon: IconFlag,
|
|
19748
20054
|
onClick: (event) => {
|
|
19749
20055
|
handleFlag(event);
|
|
19750
20056
|
closeMenu();
|
|
@@ -19764,7 +20070,7 @@ const DefaultMessageActionComponents = {
|
|
|
19764
20070
|
{
|
|
19765
20071
|
"aria-label": isMuted ? t("aria/Unmute User") : t("aria/Mute User"),
|
|
19766
20072
|
className: msgActionsBoxButtonClassName,
|
|
19767
|
-
Icon: isMuted ?
|
|
20073
|
+
Icon: isMuted ? IconAudio : IconMute,
|
|
19768
20074
|
onClick: (event) => {
|
|
19769
20075
|
handleMute(event);
|
|
19770
20076
|
closeMenu();
|
|
@@ -19787,7 +20093,7 @@ const DefaultMessageActionComponents = {
|
|
|
19787
20093
|
{
|
|
19788
20094
|
"aria-label": t("aria/Delete Message"),
|
|
19789
20095
|
className: msgActionsBoxButtonClassName,
|
|
19790
|
-
Icon:
|
|
20096
|
+
Icon: IconDelete,
|
|
19791
20097
|
onClick: () => {
|
|
19792
20098
|
setOpenModal(true);
|
|
19793
20099
|
},
|
|
@@ -19833,7 +20139,7 @@ const DefaultMessageActionComponents = {
|
|
|
19833
20139
|
{
|
|
19834
20140
|
"aria-label": isBlocked ? t("aria/Unblock User") : t("aria/Block User"),
|
|
19835
20141
|
className: clsx(msgActionsBoxButtonClassName),
|
|
19836
|
-
Icon: isBlocked ?
|
|
20142
|
+
Icon: isBlocked ? IconUserCheck : IconNoSign,
|
|
19837
20143
|
onClick: () => {
|
|
19838
20144
|
const targetId = message.user?.id;
|
|
19839
20145
|
if (targetId) {
|
|
@@ -19848,8 +20154,34 @@ const DefaultMessageActionComponents = {
|
|
|
19848
20154
|
}
|
|
19849
20155
|
},
|
|
19850
20156
|
quick: {
|
|
20157
|
+
// eslint-disable-next-line react/display-name
|
|
20158
|
+
DropdownToggle: forwardRef((_, ref) => {
|
|
20159
|
+
const { t } = useTranslationContext();
|
|
20160
|
+
const { message } = useMessageContext();
|
|
20161
|
+
const dropdownDialogIsOpen = useDialogIsOpen(
|
|
20162
|
+
MessageActions.getDialogId({ messageId: message.id })
|
|
20163
|
+
);
|
|
20164
|
+
const { dialog } = useDialogOnNearestManager({
|
|
20165
|
+
id: MessageActions.getDialogId({ messageId: message.id })
|
|
20166
|
+
});
|
|
20167
|
+
return /* @__PURE__ */ jsx(
|
|
20168
|
+
QuickMessageActionsButton,
|
|
20169
|
+
{
|
|
20170
|
+
"aria-expanded": dropdownDialogIsOpen,
|
|
20171
|
+
"aria-haspopup": "true",
|
|
20172
|
+
"aria-label": t("aria/Open Message Actions Menu"),
|
|
20173
|
+
className: "str-chat__message-actions-box-button",
|
|
20174
|
+
"data-testid": "message-actions-toggle-button",
|
|
20175
|
+
onClick: () => {
|
|
20176
|
+
dialog?.toggle();
|
|
20177
|
+
},
|
|
20178
|
+
ref,
|
|
20179
|
+
children: /* @__PURE__ */ jsx(IconMore, { className: "str-chat__message-action-icon" })
|
|
20180
|
+
}
|
|
20181
|
+
);
|
|
20182
|
+
}),
|
|
19851
20183
|
React() {
|
|
19852
|
-
return /* @__PURE__ */ jsx(ReactionSelectorWithButton, { ReactionIcon:
|
|
20184
|
+
return /* @__PURE__ */ jsx(ReactionSelectorWithButton, { ReactionIcon: IconEmoji });
|
|
19853
20185
|
},
|
|
19854
20186
|
Reply() {
|
|
19855
20187
|
const { handleOpenThread } = useMessageContext();
|
|
@@ -19861,14 +20193,17 @@ const DefaultMessageActionComponents = {
|
|
|
19861
20193
|
className: "str-chat__message-reply-in-thread-button",
|
|
19862
20194
|
"data-testid": "thread-action",
|
|
19863
20195
|
onClick: handleOpenThread,
|
|
19864
|
-
children: /* @__PURE__ */ jsx(
|
|
20196
|
+
children: /* @__PURE__ */ jsx(IconReply, { className: "str-chat__message-action-icon" })
|
|
19865
20197
|
}
|
|
19866
20198
|
);
|
|
19867
20199
|
}
|
|
19868
20200
|
}
|
|
19869
20201
|
};
|
|
19870
20202
|
const defaultMessageActionSet = [
|
|
19871
|
-
|
|
20203
|
+
{
|
|
20204
|
+
Component: DefaultMessageActionComponents.quick.DropdownToggle,
|
|
20205
|
+
placement: "quick-dropdown-toggle"
|
|
20206
|
+
},
|
|
19872
20207
|
{
|
|
19873
20208
|
Component: DefaultMessageActionComponents.quick.Reply,
|
|
19874
20209
|
placement: "quick",
|
|
@@ -19958,14 +20293,14 @@ function useFetchReactions(options) {
|
|
|
19958
20293
|
const handleFetchReactions = propHandleFetchReactions ?? contextHandleFetchReactions;
|
|
19959
20294
|
const [refetchNonce, setRefetchNonce] = useState(null);
|
|
19960
20295
|
useEffect(() => {
|
|
19961
|
-
if (!shouldFetch
|
|
20296
|
+
if (!shouldFetch) {
|
|
19962
20297
|
return;
|
|
19963
20298
|
}
|
|
19964
20299
|
let cancel = false;
|
|
19965
20300
|
(async () => {
|
|
19966
20301
|
try {
|
|
19967
20302
|
setIsLoading(true);
|
|
19968
|
-
const reactions2 = await handleFetchReactions(reactionType, sort);
|
|
20303
|
+
const reactions2 = await handleFetchReactions(reactionType ?? void 0, sort);
|
|
19969
20304
|
if (!cancel) {
|
|
19970
20305
|
setReactions(reactions2);
|
|
19971
20306
|
}
|
|
@@ -19989,6 +20324,16 @@ function useFetchReactions(options) {
|
|
|
19989
20324
|
return { isLoading, reactions, refetch };
|
|
19990
20325
|
}
|
|
19991
20326
|
const defaultReactionDetailsSort = { created_at: -1 };
|
|
20327
|
+
const MessageReactionsDetailLoadingIndicator = () => {
|
|
20328
|
+
const elements = useMemo(
|
|
20329
|
+
() => Array.from({ length: 3 }, (_, index) => /* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
|
|
20330
|
+
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
|
|
20331
|
+
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
|
|
20332
|
+
] }, index)),
|
|
20333
|
+
[]
|
|
20334
|
+
);
|
|
20335
|
+
return /* @__PURE__ */ jsx(Fragment, { children: elements });
|
|
20336
|
+
};
|
|
19992
20337
|
function MessageReactionsDetail({
|
|
19993
20338
|
handleFetchReactions,
|
|
19994
20339
|
onSelectedReactionTypeChange,
|
|
@@ -19999,7 +20344,11 @@ function MessageReactionsDetail({
|
|
|
19999
20344
|
totalReactionCount
|
|
20000
20345
|
}) {
|
|
20001
20346
|
const { client } = useChatContext();
|
|
20002
|
-
const {
|
|
20347
|
+
const {
|
|
20348
|
+
Avatar: Avatar$1 = Avatar,
|
|
20349
|
+
LoadingIndicator: LoadingIndicator2 = MessageReactionsDetailLoadingIndicator,
|
|
20350
|
+
reactionOptions = defaultReactionOptions
|
|
20351
|
+
} = useComponentContext(MessageReactionsDetail.name);
|
|
20003
20352
|
const { t } = useTranslationContext();
|
|
20004
20353
|
const {
|
|
20005
20354
|
handleReaction: contextHandleReaction,
|
|
@@ -20026,7 +20375,7 @@ function MessageReactionsDetail({
|
|
|
20026
20375
|
"div",
|
|
20027
20376
|
{
|
|
20028
20377
|
className: "str-chat__message-reactions-detail",
|
|
20029
|
-
"data-testid": "reactions-
|
|
20378
|
+
"data-testid": "message-reactions-detail",
|
|
20030
20379
|
children: [
|
|
20031
20380
|
typeof totalReactionCount === "number" && /* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__total-count", children: t("{{ count }} reactions", { count: totalReactionCount }) }),
|
|
20032
20381
|
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__reaction-type-list-container", children: /* @__PURE__ */ jsx("ul", { className: "str-chat__message-reactions-detail__reaction-type-list", children: reactions.map(
|
|
@@ -20039,7 +20388,9 @@ function MessageReactionsDetail({
|
|
|
20039
20388
|
{
|
|
20040
20389
|
"aria-pressed": reactionType === selectedReactionType,
|
|
20041
20390
|
className: "str-chat__message-reactions-detail__reaction-type-list-item-button",
|
|
20042
|
-
onClick: () => onSelectedReactionTypeChange?.(
|
|
20391
|
+
onClick: () => onSelectedReactionTypeChange?.(
|
|
20392
|
+
selectedReactionType === reactionType ? null : reactionType
|
|
20393
|
+
),
|
|
20043
20394
|
children: [
|
|
20044
20395
|
/* @__PURE__ */ jsx("span", { className: "str-chat__message-reactions-detail__reaction-type-list-item-icon", children: /* @__PURE__ */ jsx(EmojiComponent, {}) }),
|
|
20045
20396
|
reactionCount > 1 && /* @__PURE__ */ jsx(
|
|
@@ -20063,22 +20414,10 @@ function MessageReactionsDetail({
|
|
|
20063
20414
|
className: "str-chat__message-reactions-detail__user-list",
|
|
20064
20415
|
"data-testid": "all-reacting-users",
|
|
20065
20416
|
children: [
|
|
20066
|
-
areReactionsLoading && /* @__PURE__ */
|
|
20067
|
-
|
|
20068
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
|
|
20069
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
|
|
20070
|
-
] }),
|
|
20071
|
-
/* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
|
|
20072
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
|
|
20073
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
|
|
20074
|
-
] }),
|
|
20075
|
-
/* @__PURE__ */ jsxs("div", { className: "str-chat__message-reactions-detail__skeleton-item", children: [
|
|
20076
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-avatar" }),
|
|
20077
|
-
/* @__PURE__ */ jsx("div", { className: "str-chat__message-reactions-detail__skeleton-line" })
|
|
20078
|
-
] })
|
|
20079
|
-
] }),
|
|
20080
|
-
!areReactionsLoading && /* @__PURE__ */ jsx(Fragment, { children: reactionDetailsWithLegacyFallback.map(({ user }) => {
|
|
20417
|
+
areReactionsLoading && /* @__PURE__ */ jsx(LoadingIndicator2, {}),
|
|
20418
|
+
!areReactionsLoading && /* @__PURE__ */ jsx(Fragment, { children: reactionDetailsWithLegacyFallback.map(({ type, user }) => {
|
|
20081
20419
|
const belongsToCurrentUser = client.user?.id === user?.id;
|
|
20420
|
+
const EmojiComponent = Array.isArray(reactionOptions) ? void 0 : reactionOptions.quick[type]?.Component ?? reactionOptions.extended?.[type]?.Component;
|
|
20082
20421
|
return /* @__PURE__ */ jsxs(
|
|
20083
20422
|
"div",
|
|
20084
20423
|
{
|
|
@@ -20103,23 +20442,23 @@ function MessageReactionsDetail({
|
|
|
20103
20442
|
children: belongsToCurrentUser ? t("You") : user?.name || user?.id
|
|
20104
20443
|
}
|
|
20105
20444
|
),
|
|
20106
|
-
belongsToCurrentUser &&
|
|
20445
|
+
belongsToCurrentUser && /* @__PURE__ */ jsx(
|
|
20107
20446
|
"button",
|
|
20108
20447
|
{
|
|
20109
20448
|
className: "str-chat__message-reactions-detail__user-list-item-button",
|
|
20110
20449
|
"data-testid": "remove-reaction-button",
|
|
20111
|
-
onClick: (e) => {
|
|
20112
|
-
contextHandleReaction(
|
|
20113
|
-
|
|
20114
|
-
});
|
|
20450
|
+
onClick: async (e) => {
|
|
20451
|
+
await contextHandleReaction(type, e);
|
|
20452
|
+
refetch();
|
|
20115
20453
|
},
|
|
20116
20454
|
children: t("Tap to remove")
|
|
20117
20455
|
}
|
|
20118
20456
|
)
|
|
20119
|
-
] })
|
|
20457
|
+
] }),
|
|
20458
|
+
/* @__PURE__ */ jsx("span", { className: "str-chat__message-reactions-detail__user-list-item-icon", children: EmojiComponent && !selectedReactionType && /* @__PURE__ */ jsx(EmojiComponent, {}) })
|
|
20120
20459
|
]
|
|
20121
20460
|
},
|
|
20122
|
-
user?.id
|
|
20461
|
+
`${user?.id}-${type}`
|
|
20123
20462
|
);
|
|
20124
20463
|
}) })
|
|
20125
20464
|
]
|
|
@@ -20268,6 +20607,7 @@ const UnMemoizedMessageReactions = (props) => {
|
|
|
20268
20607
|
const divRef = useRef(null);
|
|
20269
20608
|
const dialogId2 = `message-reactions-detail-${message.id}`;
|
|
20270
20609
|
const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
|
|
20610
|
+
const isDialogOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
|
|
20271
20611
|
const handleReactionButtonClick = (reactionType) => {
|
|
20272
20612
|
if (totalReactionCount > MAX_MESSAGE_REACTIONS_TO_FETCH) {
|
|
20273
20613
|
return;
|
|
@@ -20302,6 +20642,8 @@ const UnMemoizedMessageReactions = (props) => {
|
|
|
20302
20642
|
children: /* @__PURE__ */ jsxs(
|
|
20303
20643
|
FragmentOrButton,
|
|
20304
20644
|
{
|
|
20645
|
+
"aria-expanded": isDialogOpen,
|
|
20646
|
+
"aria-pressed": isDialogOpen,
|
|
20305
20647
|
buttonIf: visualStyle === "clustered",
|
|
20306
20648
|
className: "str-chat__message-reactions__list-button",
|
|
20307
20649
|
onClick: () => handleReactionButtonClick(existingReactions[0]?.reactionType ?? null),
|
|
@@ -20339,9 +20681,7 @@ const UnMemoizedMessageReactions = (props) => {
|
|
|
20339
20681
|
"button",
|
|
20340
20682
|
{
|
|
20341
20683
|
className: "str-chat__message-reactions__list-item-button",
|
|
20342
|
-
onClick: () => handleReactionButtonClick(
|
|
20343
|
-
existingReactions.at(-1)?.reactionType ?? null
|
|
20344
|
-
),
|
|
20684
|
+
onClick: () => handleReactionButtonClick(null),
|
|
20345
20685
|
children: /* @__PURE__ */ jsxs("span", { className: "str-chat__message-reactions__overflow-count", children: [
|
|
20346
20686
|
"+",
|
|
20347
20687
|
totalReactionCount - cappedExistingReactions.reactionCountToDisplay
|
|
@@ -20466,91 +20806,74 @@ const StreamEmoji = ({
|
|
|
20466
20806
|
const useSplitActionSet = (actionSet) => useMemo(() => {
|
|
20467
20807
|
const quickActionSet = [];
|
|
20468
20808
|
const dropdownActionSet = [];
|
|
20809
|
+
let quickDropdownToggleAction;
|
|
20469
20810
|
for (const action of actionSet) {
|
|
20470
20811
|
if (action.placement === "quick")
|
|
20471
20812
|
quickActionSet.push(action);
|
|
20472
20813
|
if (action.placement === "dropdown")
|
|
20473
20814
|
dropdownActionSet.push(action);
|
|
20815
|
+
if (action.placement === "quick-dropdown-toggle") {
|
|
20816
|
+
quickDropdownToggleAction ?? (quickDropdownToggleAction = action);
|
|
20817
|
+
}
|
|
20474
20818
|
}
|
|
20475
|
-
return { dropdownActionSet, quickActionSet };
|
|
20819
|
+
return { dropdownActionSet, quickActionSet, quickDropdownToggleAction };
|
|
20476
20820
|
}, [actionSet]);
|
|
20477
20821
|
const MessageActions = ({
|
|
20478
20822
|
disableBaseMessageActionSetFilter = false,
|
|
20479
20823
|
messageActionSet = defaultMessageActionSet
|
|
20480
20824
|
}) => {
|
|
20481
|
-
const { theme } = useChatContext();
|
|
20482
20825
|
const { isMyMessage, message, threadList } = useMessageContext();
|
|
20826
|
+
const { ContextMenu: ContextMenuComponent = ContextMenu } = useComponentContext();
|
|
20483
20827
|
const { t } = useTranslationContext();
|
|
20484
20828
|
const [actionsBoxButtonElement, setActionsBoxButtonElement] = useState(null);
|
|
20485
20829
|
const filteredMessageActionSet = useBaseMessageActionSetFilter(
|
|
20486
20830
|
messageActionSet,
|
|
20487
20831
|
disableBaseMessageActionSetFilter
|
|
20488
20832
|
);
|
|
20489
|
-
const { dropdownActionSet, quickActionSet } = useSplitActionSet(
|
|
20490
|
-
|
|
20491
|
-
);
|
|
20492
|
-
const dropdownDialogId = `message-actions--${message.id}`;
|
|
20833
|
+
const { dropdownActionSet, quickActionSet, quickDropdownToggleAction } = useSplitActionSet(filteredMessageActionSet);
|
|
20834
|
+
const messageActionsDialogId = MessageActions.getDialogId({ messageId: message.id });
|
|
20493
20835
|
const reactionSelectorDialogId = ReactionSelector.getDialogId({
|
|
20494
20836
|
messageId: message.id,
|
|
20495
20837
|
threadList
|
|
20496
20838
|
});
|
|
20497
|
-
const { dialog, dialogManager } = useDialogOnNearestManager({
|
|
20498
|
-
|
|
20839
|
+
const { dialog, dialogManager } = useDialogOnNearestManager({
|
|
20840
|
+
id: messageActionsDialogId
|
|
20841
|
+
});
|
|
20842
|
+
const messageActionsDialogIsOpen = useDialogIsOpen(
|
|
20843
|
+
messageActionsDialogId,
|
|
20844
|
+
dialogManager?.id
|
|
20845
|
+
);
|
|
20499
20846
|
const reactionSelectorDialogIsOpen = useDialogIsOpen(
|
|
20500
20847
|
reactionSelectorDialogId,
|
|
20501
20848
|
dialogManager?.id
|
|
20502
20849
|
);
|
|
20503
|
-
const contextMenuItems = useMemo(
|
|
20504
|
-
() => dropdownActionSet.map(({ Component: Component2 }) => {
|
|
20505
|
-
const ActionItem = (menuProps) => /* @__PURE__ */ jsx(Component2, { ...menuProps });
|
|
20506
|
-
return ActionItem;
|
|
20507
|
-
}),
|
|
20508
|
-
[dropdownActionSet]
|
|
20509
|
-
);
|
|
20510
20850
|
if (dropdownActionSet.length + quickActionSet.length === 0) {
|
|
20511
20851
|
return null;
|
|
20512
20852
|
}
|
|
20513
20853
|
return /* @__PURE__ */ jsxs(
|
|
20514
20854
|
"div",
|
|
20515
20855
|
{
|
|
20516
|
-
className: clsx(
|
|
20517
|
-
"str-chat__message-options--active":
|
|
20856
|
+
className: clsx("str-chat__message-options", {
|
|
20857
|
+
"str-chat__message-options--active": messageActionsDialogIsOpen || reactionSelectorDialogIsOpen
|
|
20518
20858
|
}),
|
|
20519
20859
|
children: [
|
|
20520
|
-
dropdownActionSet.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
20521
|
-
/* @__PURE__ */ jsx(
|
|
20522
|
-
Button,
|
|
20523
|
-
{
|
|
20524
|
-
appearance: "ghost",
|
|
20525
|
-
"aria-expanded": dropdownDialogIsOpen,
|
|
20526
|
-
"aria-haspopup": "true",
|
|
20527
|
-
"aria-label": t("aria/Open Message Actions Menu"),
|
|
20528
|
-
circular: true,
|
|
20529
|
-
className: "str-chat__message-actions-box-button",
|
|
20530
|
-
"data-testid": "message-actions-toggle-button",
|
|
20531
|
-
onClick: () => {
|
|
20532
|
-
dialog?.toggle();
|
|
20533
|
-
},
|
|
20534
|
-
ref: setActionsBoxButtonElement,
|
|
20535
|
-
variant: "secondary",
|
|
20536
|
-
children: /* @__PURE__ */ jsx(IconDotGrid1x3Horizontal, { className: "str-chat__message-action-icon" })
|
|
20537
|
-
}
|
|
20538
|
-
),
|
|
20860
|
+
quickDropdownToggleAction && dropdownActionSet.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
20861
|
+
/* @__PURE__ */ jsx(quickDropdownToggleAction.Component, { ref: setActionsBoxButtonElement }),
|
|
20539
20862
|
/* @__PURE__ */ jsx(
|
|
20540
|
-
|
|
20863
|
+
ContextMenuComponent,
|
|
20541
20864
|
{
|
|
20542
20865
|
backLabel: t("Back"),
|
|
20543
20866
|
className: clsx("str-chat__message-actions-box", {
|
|
20544
|
-
"str-chat__message-actions-box--open":
|
|
20867
|
+
"str-chat__message-actions-box--open": messageActionsDialogIsOpen
|
|
20545
20868
|
}),
|
|
20546
20869
|
dialogManagerId: dialogManager?.id,
|
|
20547
|
-
id:
|
|
20548
|
-
items: contextMenuItems,
|
|
20870
|
+
id: messageActionsDialogId,
|
|
20549
20871
|
onClose: dialog?.close,
|
|
20550
20872
|
placement: isMyMessage() ? "top-end" : "top-start",
|
|
20551
20873
|
referenceElement: actionsBoxButtonElement,
|
|
20552
20874
|
tabIndex: -1,
|
|
20553
|
-
trapFocus: true
|
|
20875
|
+
trapFocus: true,
|
|
20876
|
+
children: dropdownActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type))
|
|
20554
20877
|
}
|
|
20555
20878
|
)
|
|
20556
20879
|
] }),
|
|
@@ -20559,6 +20882,8 @@ const MessageActions = ({
|
|
|
20559
20882
|
}
|
|
20560
20883
|
);
|
|
20561
20884
|
};
|
|
20885
|
+
MessageActions.getDialogId = ({ messageId }) => `message-actions-${messageId}`;
|
|
20886
|
+
MessageActions.displayName = "MessageActions";
|
|
20562
20887
|
const MessageUIWithContext = ({
|
|
20563
20888
|
endOfGroup,
|
|
20564
20889
|
firstOfGroup,
|
|
@@ -21385,6 +21710,7 @@ const useScrollLocationLogic = (params) => {
|
|
|
21385
21710
|
const closeToBottom = useRef(false);
|
|
21386
21711
|
const closeToTop = useRef(false);
|
|
21387
21712
|
const previousScrollTopRef = useRef(0);
|
|
21713
|
+
const previousMessagesLengthRef = useRef(messages.length);
|
|
21388
21714
|
const anchorRestoreCleanupRef = useRef(null);
|
|
21389
21715
|
const captureAnchor = useCallback(() => {
|
|
21390
21716
|
if (!listElement) return null;
|
|
@@ -21536,6 +21862,60 @@ const useScrollLocationLogic = (params) => {
|
|
|
21536
21862
|
scrollToBottom();
|
|
21537
21863
|
}
|
|
21538
21864
|
}, [disableAutoScrollToBottom, justReachedLatestMessageSet, listElement, hasMoreNewer]);
|
|
21865
|
+
useLayoutEffect(() => {
|
|
21866
|
+
if (!listElement || disableAutoScrollToBottom || hasMoreNewer || suppressAutoscroll || justReachedLatestMessageSet || isRestoringOlderAnchorRef.current) {
|
|
21867
|
+
return;
|
|
21868
|
+
}
|
|
21869
|
+
const initialDistanceToBottom = listElement.scrollHeight - (listElement.scrollTop + listElement.clientHeight);
|
|
21870
|
+
const messagesHydrated = previousMessagesLengthRef.current === 0 && messages.length > 0;
|
|
21871
|
+
if (initialDistanceToBottom > scrolledUpThreshold && !messagesHydrated) {
|
|
21872
|
+
return;
|
|
21873
|
+
}
|
|
21874
|
+
let keepPinnedToBottom = true;
|
|
21875
|
+
const maybeScrollToBottom = () => {
|
|
21876
|
+
if (keepPinnedToBottom) {
|
|
21877
|
+
scrollToBottom();
|
|
21878
|
+
}
|
|
21879
|
+
};
|
|
21880
|
+
maybeScrollToBottom();
|
|
21881
|
+
const settleDelays = [80, messagesHydrated ? 260 : 420, 900, 1700];
|
|
21882
|
+
const settleTimeoutIds = settleDelays.map(
|
|
21883
|
+
(delay) => setTimeout(maybeScrollToBottom, delay)
|
|
21884
|
+
);
|
|
21885
|
+
const stopKeepingPinnedToBottom = () => {
|
|
21886
|
+
keepPinnedToBottom = false;
|
|
21887
|
+
};
|
|
21888
|
+
listElement.addEventListener("pointerdown", stopKeepingPinnedToBottom, {
|
|
21889
|
+
passive: true
|
|
21890
|
+
});
|
|
21891
|
+
listElement.addEventListener("touchstart", stopKeepingPinnedToBottom, {
|
|
21892
|
+
passive: true
|
|
21893
|
+
});
|
|
21894
|
+
listElement.addEventListener("wheel", stopKeepingPinnedToBottom, {
|
|
21895
|
+
passive: true
|
|
21896
|
+
});
|
|
21897
|
+
listElement.addEventListener("keydown", stopKeepingPinnedToBottom);
|
|
21898
|
+
const pinWindowTimeoutId = setTimeout(() => {
|
|
21899
|
+
stopKeepingPinnedToBottom();
|
|
21900
|
+
}, 2200);
|
|
21901
|
+
return () => {
|
|
21902
|
+
settleTimeoutIds.forEach(clearTimeout);
|
|
21903
|
+
clearTimeout(pinWindowTimeoutId);
|
|
21904
|
+
listElement.removeEventListener("pointerdown", stopKeepingPinnedToBottom);
|
|
21905
|
+
listElement.removeEventListener("touchstart", stopKeepingPinnedToBottom);
|
|
21906
|
+
listElement.removeEventListener("wheel", stopKeepingPinnedToBottom);
|
|
21907
|
+
listElement.removeEventListener("keydown", stopKeepingPinnedToBottom);
|
|
21908
|
+
};
|
|
21909
|
+
}, [
|
|
21910
|
+
disableAutoScrollToBottom,
|
|
21911
|
+
hasMoreNewer,
|
|
21912
|
+
justReachedLatestMessageSet,
|
|
21913
|
+
listElement,
|
|
21914
|
+
messages.length,
|
|
21915
|
+
scrollToBottom,
|
|
21916
|
+
scrolledUpThreshold,
|
|
21917
|
+
suppressAutoscroll
|
|
21918
|
+
]);
|
|
21539
21919
|
const updateScrollTop = useMessageListScrollManager({
|
|
21540
21920
|
captureAnchor,
|
|
21541
21921
|
disableScrollManagement: disableScrollManagement || isRestoringOlderAnchorRef.current,
|
|
@@ -21562,6 +21942,9 @@ const useScrollLocationLogic = (params) => {
|
|
|
21562
21942
|
useLayoutEffect(() => {
|
|
21563
21943
|
previousHasMoreNewerRef.current = hasMoreNewer;
|
|
21564
21944
|
}, [hasMoreNewer]);
|
|
21945
|
+
useLayoutEffect(() => {
|
|
21946
|
+
previousMessagesLengthRef.current = messages.length;
|
|
21947
|
+
}, [messages.length]);
|
|
21565
21948
|
const onScroll = useCallback(
|
|
21566
21949
|
(event) => {
|
|
21567
21950
|
const element = event.target;
|
|
@@ -21570,8 +21953,10 @@ const useScrollLocationLogic = (params) => {
|
|
|
21570
21953
|
updateScrollTop(scrollTop, captureAnchor);
|
|
21571
21954
|
const offsetHeight = element.offsetHeight;
|
|
21572
21955
|
const scrollHeight = element.scrollHeight;
|
|
21956
|
+
const distanceToBottom = scrollHeight - (scrollTop + offsetHeight);
|
|
21957
|
+
const bottomEnterThreshold = Math.max(Math.floor(scrolledUpThreshold * 0.6), 24);
|
|
21573
21958
|
const prevCloseToBottom = closeToBottom.current;
|
|
21574
|
-
closeToBottom.current =
|
|
21959
|
+
closeToBottom.current = prevCloseToBottom ? distanceToBottom < scrolledUpThreshold : distanceToBottom < bottomEnterThreshold;
|
|
21575
21960
|
closeToTop.current = scrollTop < scrolledUpThreshold;
|
|
21576
21961
|
if (closeToBottom.current) {
|
|
21577
21962
|
setHasNewMessages(false);
|
|
@@ -21616,7 +22001,7 @@ const UnreadMessagesSeparator = ({
|
|
|
21616
22001
|
onClick: () => markRead(),
|
|
21617
22002
|
size: "sm",
|
|
21618
22003
|
variant: "secondary",
|
|
21619
|
-
children: /* @__PURE__ */ jsx(
|
|
22004
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
21620
22005
|
}
|
|
21621
22006
|
)
|
|
21622
22007
|
]
|
|
@@ -21836,7 +22221,7 @@ const UnreadMessagesNotification = ({
|
|
|
21836
22221
|
]
|
|
21837
22222
|
}
|
|
21838
22223
|
),
|
|
21839
|
-
/* @__PURE__ */ jsx(Button, { appearance: "outline", onClick: () => markRead(), variant: "secondary", children: /* @__PURE__ */ jsx(
|
|
22224
|
+
/* @__PURE__ */ jsx(Button, { appearance: "outline", onClick: () => markRead(), variant: "secondary", children: /* @__PURE__ */ jsx(IconXmark, {}) })
|
|
21840
22225
|
]
|
|
21841
22226
|
}
|
|
21842
22227
|
);
|
|
@@ -23506,11 +23891,17 @@ const useConnectionRecoveredListener = (forceUpdate) => {
|
|
|
23506
23891
|
const MOBILE_NAV_BREAKPOINT = 768;
|
|
23507
23892
|
const useMobileNavigation = (channelListRef, navOpen, closeMobileNav) => {
|
|
23508
23893
|
useEffect(() => {
|
|
23894
|
+
const isClickInsideChannelList = (event) => {
|
|
23895
|
+
const channelListElement = channelListRef.current;
|
|
23896
|
+
if (!channelListElement) return false;
|
|
23897
|
+
const eventPath = event.composedPath();
|
|
23898
|
+
return eventPath.includes(channelListElement);
|
|
23899
|
+
};
|
|
23509
23900
|
const handleClickOutside = (event) => {
|
|
23510
23901
|
if (typeof window !== "undefined" && window.innerWidth >= MOBILE_NAV_BREAKPOINT) {
|
|
23511
23902
|
return;
|
|
23512
23903
|
}
|
|
23513
|
-
if (closeMobileNav && channelListRef.current && !
|
|
23904
|
+
if (closeMobileNav && channelListRef.current && !isClickInsideChannelList(event) && navOpen) {
|
|
23514
23905
|
closeMobileNav();
|
|
23515
23906
|
}
|
|
23516
23907
|
};
|
|
@@ -24203,7 +24594,7 @@ const SearchBar = () => {
|
|
|
24203
24594
|
"str-chat__search-bar__input-wrapper--active": isActive
|
|
24204
24595
|
}),
|
|
24205
24596
|
children: [
|
|
24206
|
-
/* @__PURE__ */ jsx(
|
|
24597
|
+
/* @__PURE__ */ jsx(IconSearch, {}),
|
|
24207
24598
|
/* @__PURE__ */ jsx(
|
|
24208
24599
|
"input",
|
|
24209
24600
|
{
|
|
@@ -24247,7 +24638,7 @@ const SearchBar = () => {
|
|
|
24247
24638
|
ref: clearButtonRef,
|
|
24248
24639
|
size: "xs",
|
|
24249
24640
|
variant: "secondary",
|
|
24250
|
-
children: /* @__PURE__ */ jsx(
|
|
24641
|
+
children: /* @__PURE__ */ jsx(IconXCircle, {})
|
|
24251
24642
|
}
|
|
24252
24643
|
)
|
|
24253
24644
|
]
|
|
@@ -24640,7 +25031,7 @@ const UnMemoizedLoadMoreButton = ({
|
|
|
24640
25031
|
return /* @__PURE__ */ jsx("div", { className: "str-chat__load-more-button", children: /* @__PURE__ */ jsx(
|
|
24641
25032
|
Button,
|
|
24642
25033
|
{
|
|
24643
|
-
appearance: "
|
|
25034
|
+
appearance: "ghost",
|
|
24644
25035
|
"aria-label": t("aria/Load More Channels"),
|
|
24645
25036
|
"data-testid": "load-more-button",
|
|
24646
25037
|
disabled: loading,
|
|
@@ -25248,6 +25639,36 @@ const useArchiveActionButtonBehavior = () => {
|
|
|
25248
25639
|
};
|
|
25249
25640
|
};
|
|
25250
25641
|
const defaultChannelActionSet = [
|
|
25642
|
+
{
|
|
25643
|
+
// eslint-disable-next-line react/display-name
|
|
25644
|
+
Component: forwardRef((_, ref) => {
|
|
25645
|
+
const { channel } = useChannelListItemContext();
|
|
25646
|
+
const dialogId2 = ChannelListItemActionButtons.getDialogId({
|
|
25647
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
25648
|
+
channelId: channel.id
|
|
25649
|
+
});
|
|
25650
|
+
const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
|
|
25651
|
+
const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
|
|
25652
|
+
return /* @__PURE__ */ jsx(
|
|
25653
|
+
Button,
|
|
25654
|
+
{
|
|
25655
|
+
appearance: "ghost",
|
|
25656
|
+
"aria-expanded": dialogIsOpen,
|
|
25657
|
+
"aria-pressed": dialogIsOpen,
|
|
25658
|
+
circular: true,
|
|
25659
|
+
onClick: (e) => {
|
|
25660
|
+
e.stopPropagation();
|
|
25661
|
+
dialog.toggle();
|
|
25662
|
+
},
|
|
25663
|
+
ref,
|
|
25664
|
+
size: "sm",
|
|
25665
|
+
variant: "secondary",
|
|
25666
|
+
children: /* @__PURE__ */ jsx(IconMore, {})
|
|
25667
|
+
}
|
|
25668
|
+
);
|
|
25669
|
+
}),
|
|
25670
|
+
placement: "quick-dropdown-toggle"
|
|
25671
|
+
},
|
|
25251
25672
|
{
|
|
25252
25673
|
Component() {
|
|
25253
25674
|
const behaviorProps = useArchiveActionButtonBehavior();
|
|
@@ -25335,7 +25756,7 @@ const defaultChannelActionSet = [
|
|
|
25335
25756
|
{
|
|
25336
25757
|
"aria-label": title,
|
|
25337
25758
|
disabled: inProgress,
|
|
25338
|
-
Icon:
|
|
25759
|
+
Icon: IconNoSign,
|
|
25339
25760
|
onClick: async () => {
|
|
25340
25761
|
try {
|
|
25341
25762
|
setInProgress(true);
|
|
@@ -25380,7 +25801,7 @@ const defaultChannelActionSet = [
|
|
|
25380
25801
|
const membership = useChannelMembershipState(channel);
|
|
25381
25802
|
const dialogId2 = ChannelListItemActionButtons.getDialogId(
|
|
25382
25803
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
25383
|
-
channel.id
|
|
25804
|
+
{ channelId: channel.id }
|
|
25384
25805
|
);
|
|
25385
25806
|
const { dialog } = useDialogOnNearestManager({ id: dialogId2 });
|
|
25386
25807
|
const [inProgress, setInProgress] = useState(false);
|
|
@@ -25441,7 +25862,7 @@ const defaultChannelActionSet = [
|
|
|
25441
25862
|
{
|
|
25442
25863
|
"aria-label": title,
|
|
25443
25864
|
disabled: inProgress,
|
|
25444
|
-
Icon:
|
|
25865
|
+
Icon: IconLeave,
|
|
25445
25866
|
onClick: async (e) => {
|
|
25446
25867
|
e.stopPropagation();
|
|
25447
25868
|
try {
|
|
@@ -25482,59 +25903,23 @@ const useBaseChannelActionSetFilter = (channelActionSet) => {
|
|
|
25482
25903
|
const connectedUserIsMember = typeof membership.user !== "undefined";
|
|
25483
25904
|
const ownCapabilities = channel.data?.own_capabilities;
|
|
25484
25905
|
return useMemo(() => {
|
|
25485
|
-
const filtered = channelActionSet.filter(
|
|
25486
|
-
(action)
|
|
25487
|
-
|
|
25488
|
-
|
|
25489
|
-
|
|
25490
|
-
|
|
25491
|
-
|
|
25492
|
-
|
|
25493
|
-
|
|
25494
|
-
|
|
25495
|
-
|
|
25496
|
-
|
|
25497
|
-
|
|
25498
|
-
|
|
25499
|
-
|
|
25500
|
-
|
|
25501
|
-
|
|
25502
|
-
},
|
|
25503
|
-
isDirectMessageChannel: false
|
|
25504
|
-
},
|
|
25505
|
-
{
|
|
25506
|
-
action: { placement: "dropdown", type: "mute" },
|
|
25507
|
-
isDirectMessageChannel: true,
|
|
25508
|
-
ownCapabilities: P.when(
|
|
25509
|
-
(capabilities) => capabilities?.includes("mute-channel")
|
|
25510
|
-
)
|
|
25511
|
-
},
|
|
25512
|
-
{
|
|
25513
|
-
action: { placement: "quick", type: "mute" },
|
|
25514
|
-
isDirectMessageChannel: false,
|
|
25515
|
-
ownCapabilities: P.when(
|
|
25516
|
-
(capabilities) => capabilities?.includes("mute-channel")
|
|
25517
|
-
)
|
|
25518
|
-
},
|
|
25519
|
-
{
|
|
25520
|
-
action: { type: "ban" },
|
|
25521
|
-
memberCount: P.number.gt(0).and(P.number.lte(2)),
|
|
25522
|
-
ownCapabilities: P.when(
|
|
25523
|
-
(capabilities) => capabilities?.includes("ban-channel-members")
|
|
25524
|
-
)
|
|
25525
|
-
},
|
|
25526
|
-
{
|
|
25527
|
-
action: { type: "leave" },
|
|
25528
|
-
ownCapabilities: P.when(
|
|
25529
|
-
(capabilities) => capabilities?.includes("leave-channel")
|
|
25530
|
-
)
|
|
25531
|
-
},
|
|
25532
|
-
{
|
|
25533
|
-
action: { connectedUserIsMember: true, type: "pin" }
|
|
25534
|
-
},
|
|
25535
|
-
() => true
|
|
25536
|
-
).otherwise(() => false)
|
|
25537
|
-
);
|
|
25906
|
+
const filtered = channelActionSet.filter((action) => {
|
|
25907
|
+
if (action.placement === "quick-dropdown-toggle") return true;
|
|
25908
|
+
switch (action.type) {
|
|
25909
|
+
case "archive":
|
|
25910
|
+
return connectedUserIsMember && (action.placement === "quick" && isDirectMessageChannel || action.placement === "dropdown" && !isDirectMessageChannel);
|
|
25911
|
+
case "mute":
|
|
25912
|
+
return ownCapabilities?.includes("mute-channel") && (action.placement === "dropdown" && isDirectMessageChannel || action.placement === "quick" && !isDirectMessageChannel);
|
|
25913
|
+
case "ban":
|
|
25914
|
+
return memberCount > 0 && memberCount <= 2 && ownCapabilities?.includes("ban-channel-members");
|
|
25915
|
+
case "leave":
|
|
25916
|
+
return ownCapabilities?.includes("leave-channel");
|
|
25917
|
+
case "pin":
|
|
25918
|
+
return connectedUserIsMember;
|
|
25919
|
+
default:
|
|
25920
|
+
return true;
|
|
25921
|
+
}
|
|
25922
|
+
});
|
|
25538
25923
|
return filtered;
|
|
25539
25924
|
}, [
|
|
25540
25925
|
channelActionSet,
|
|
@@ -25545,17 +25930,18 @@ const useBaseChannelActionSetFilter = (channelActionSet) => {
|
|
|
25545
25930
|
]);
|
|
25546
25931
|
};
|
|
25547
25932
|
const ChannelListItemActionButtons = () => {
|
|
25933
|
+
const { ContextMenu: ContextMenuComponent = ContextMenu } = useComponentContext();
|
|
25548
25934
|
const { channel } = useChannelListItemContext();
|
|
25549
25935
|
const [referenceElement, setReferenceElement] = React.useState(null);
|
|
25550
|
-
const dialogId2 = ChannelListItemActionButtons.getDialogId(
|
|
25936
|
+
const dialogId2 = ChannelListItemActionButtons.getDialogId({
|
|
25551
25937
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
25552
|
-
channel.id
|
|
25553
|
-
);
|
|
25938
|
+
channelId: channel.id
|
|
25939
|
+
});
|
|
25554
25940
|
const { dialog, dialogManager } = useDialogOnNearestManager({ id: dialogId2 });
|
|
25555
25941
|
const dialogIsOpen = useDialogIsOpen(dialogId2, dialogManager?.id);
|
|
25556
25942
|
const filteredActionSet = useBaseChannelActionSetFilter(defaultChannelActionSet);
|
|
25557
|
-
const
|
|
25558
|
-
if (
|
|
25943
|
+
const { dropdownActionSet, quickActionSet, quickDropdownToggleAction } = useSplitActionSet(filteredActionSet);
|
|
25944
|
+
if (quickActionSet.length + dropdownActionSet.length === 0) {
|
|
25559
25945
|
return null;
|
|
25560
25946
|
}
|
|
25561
25947
|
return /* @__PURE__ */ jsxs(
|
|
@@ -25565,26 +25951,10 @@ const ChannelListItemActionButtons = () => {
|
|
|
25565
25951
|
"str-chat__channel-list-item__action-buttons--active": dialogIsOpen
|
|
25566
25952
|
}),
|
|
25567
25953
|
children: [
|
|
25568
|
-
|
|
25569
|
-
|
|
25570
|
-
{
|
|
25571
|
-
appearance: "ghost",
|
|
25572
|
-
"aria-expanded": dialogIsOpen,
|
|
25573
|
-
"aria-pressed": dialogIsOpen,
|
|
25574
|
-
circular: true,
|
|
25575
|
-
onClick: (e) => {
|
|
25576
|
-
e.stopPropagation();
|
|
25577
|
-
dialog.toggle();
|
|
25578
|
-
},
|
|
25579
|
-
ref: setReferenceElement,
|
|
25580
|
-
size: "sm",
|
|
25581
|
-
variant: "secondary",
|
|
25582
|
-
children: /* @__PURE__ */ jsx(IconDotGrid1x3Horizontal, {})
|
|
25583
|
-
}
|
|
25584
|
-
),
|
|
25585
|
-
splitActionSet.quickActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type)),
|
|
25954
|
+
quickDropdownToggleAction && dropdownActionSet.length > 0 && /* @__PURE__ */ jsx(quickDropdownToggleAction.Component, { ref: setReferenceElement }),
|
|
25955
|
+
quickActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type)),
|
|
25586
25956
|
/* @__PURE__ */ jsx(
|
|
25587
|
-
|
|
25957
|
+
ContextMenuComponent,
|
|
25588
25958
|
{
|
|
25589
25959
|
className: "str-chat__channel-list-item__action-buttons-context-menu",
|
|
25590
25960
|
dialogManagerId: dialogManager?.id,
|
|
@@ -25594,14 +25964,14 @@ const ChannelListItemActionButtons = () => {
|
|
|
25594
25964
|
referenceElement,
|
|
25595
25965
|
tabIndex: -1,
|
|
25596
25966
|
trapFocus: true,
|
|
25597
|
-
children:
|
|
25967
|
+
children: dropdownActionSet.map(({ Component: Component2, type }) => /* @__PURE__ */ jsx(Component2, {}, type))
|
|
25598
25968
|
}
|
|
25599
25969
|
)
|
|
25600
25970
|
]
|
|
25601
25971
|
}
|
|
25602
25972
|
);
|
|
25603
25973
|
};
|
|
25604
|
-
ChannelListItemActionButtons.getDialogId = (channelId) => `channel-action-buttons-${channelId}`;
|
|
25974
|
+
ChannelListItemActionButtons.getDialogId = ({ channelId }) => `channel-action-buttons-${channelId}`;
|
|
25605
25975
|
ChannelListItemActionButtons.displayName = "ChannelListItemActionButtons";
|
|
25606
25976
|
function ChannelListItemTimestamp({ lastMessage }) {
|
|
25607
25977
|
const { t, tDateTimeParser } = useTranslationContext("ChannelListItemTimestamp");
|
|
@@ -25751,21 +26121,21 @@ const useLatestMessagePreview = ({
|
|
|
25751
26121
|
]);
|
|
25752
26122
|
};
|
|
25753
26123
|
const deliveryStatusIconMap = {
|
|
25754
|
-
delivered:
|
|
25755
|
-
read:
|
|
26124
|
+
delivered: IconChecks,
|
|
26125
|
+
read: IconChecks,
|
|
25756
26126
|
sending: IconClock,
|
|
25757
26127
|
sent: IconCheckmark1Small
|
|
25758
26128
|
};
|
|
25759
26129
|
const contentTypeIconMap = {
|
|
25760
|
-
deleted:
|
|
25761
|
-
error:
|
|
25762
|
-
file:
|
|
25763
|
-
giphy:
|
|
25764
|
-
image:
|
|
25765
|
-
link:
|
|
25766
|
-
location:
|
|
26130
|
+
deleted: IconNoSign,
|
|
26131
|
+
error: IconExclamationCircleFill,
|
|
26132
|
+
file: IconFile,
|
|
26133
|
+
giphy: IconFile,
|
|
26134
|
+
image: IconCamera,
|
|
26135
|
+
link: IconLink,
|
|
26136
|
+
location: IconLocation,
|
|
25767
26137
|
video: IconVideo,
|
|
25768
|
-
voice:
|
|
26138
|
+
voice: IconVoice
|
|
25769
26139
|
};
|
|
25770
26140
|
const SummarizedMessagePreview = ({
|
|
25771
26141
|
latestMessage,
|
|
@@ -26361,7 +26731,7 @@ const ThreadListItem = ({
|
|
|
26361
26731
|
const ThreadListEmptyPlaceholder = () => {
|
|
26362
26732
|
const { t } = useTranslationContext("ThreadListEmptyPlaceholder");
|
|
26363
26733
|
return /* @__PURE__ */ jsxs("div", { className: "str-chat__thread-list-empty-placeholder", children: [
|
|
26364
|
-
/* @__PURE__ */ jsx(
|
|
26734
|
+
/* @__PURE__ */ jsx(IconMessageBubbles, {}),
|
|
26365
26735
|
/* @__PURE__ */ jsx("p", { children: t("Reply to a message to start a thread") })
|
|
26366
26736
|
] });
|
|
26367
26737
|
};
|
|
@@ -26384,7 +26754,7 @@ const ThreadListUnseenThreadsBanner = () => {
|
|
|
26384
26754
|
onClick: () => client.threads.reload(),
|
|
26385
26755
|
children: [
|
|
26386
26756
|
!isLoading && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
26387
|
-
/* @__PURE__ */ jsx(
|
|
26757
|
+
/* @__PURE__ */ jsx(IconRefresh, {}),
|
|
26388
26758
|
/* @__PURE__ */ jsx("span", { children: t("ThreadListUnseenThreadsBanner/unreadThreads", {
|
|
26389
26759
|
count: unseenThreadIds.length
|
|
26390
26760
|
}) })
|
|
@@ -26539,11 +26909,11 @@ const ThreadList = ({ virtuosoProps }) => {
|
|
|
26539
26909
|
);
|
|
26540
26910
|
};
|
|
26541
26911
|
const IconsBySeverity = {
|
|
26542
|
-
error:
|
|
26912
|
+
error: IconExclamationMark,
|
|
26543
26913
|
info: null,
|
|
26544
|
-
//
|
|
26545
|
-
loading:
|
|
26546
|
-
success:
|
|
26914
|
+
// IconInfo,
|
|
26915
|
+
loading: IconRefresh,
|
|
26916
|
+
success: IconCheckmark,
|
|
26547
26917
|
warning: IconExclamationTriangle
|
|
26548
26918
|
};
|
|
26549
26919
|
const DefaultNotificationIcon = ({ notification }) => {
|
|
@@ -26622,7 +26992,7 @@ const Notification = forwardRef(
|
|
|
26622
26992
|
onClick: handleDismiss,
|
|
26623
26993
|
size: "sm",
|
|
26624
26994
|
variant: "secondary",
|
|
26625
|
-
children: /* @__PURE__ */ jsx(
|
|
26995
|
+
children: /* @__PURE__ */ jsx(IconXmark, {})
|
|
26626
26996
|
}
|
|
26627
26997
|
)
|
|
26628
26998
|
]
|
|
@@ -26927,7 +27297,7 @@ const VoiceRecordingPlayerUI = ({ audioPlayer }) => {
|
|
|
26927
27297
|
secondsElapsed
|
|
26928
27298
|
} = useStateStore(audioPlayer?.state, audioPlayerStateSelector) ?? {};
|
|
26929
27299
|
return /* @__PURE__ */ jsxs("div", { className: rootClassName, "data-testid": "voice-recording-widget", children: [
|
|
26930
|
-
/* @__PURE__ */ jsx(PlayButton, { isPlaying: !!isPlaying, onClick: audioPlayer.togglePlay }),
|
|
27300
|
+
/* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__play-button-container", children: /* @__PURE__ */ jsx(PlayButton, { isPlaying: !!isPlaying, onClick: audioPlayer.togglePlay }) }),
|
|
26931
27301
|
/* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__metadata", children: /* @__PURE__ */ jsxs("div", { className: "str-chat__message-attachment__voice-recording-widget__audio-state", children: [
|
|
26932
27302
|
/* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment__voice-recording-widget__timer", children: durationSeconds ? /* @__PURE__ */ jsx(
|
|
26933
27303
|
DurationDisplay,
|
|
@@ -27184,7 +27554,7 @@ const ThumbnailButton = ({
|
|
|
27184
27554
|
"aria-hidden": "true",
|
|
27185
27555
|
className: "str-chat__modal-gallery__image-load-failed-overlay",
|
|
27186
27556
|
"data-testid": "str-chat__modal-gallery__image-load-failed-overlay",
|
|
27187
|
-
children: /* @__PURE__ */ jsx("div", { className: "str-chat__modal-gallery__image-retry-indicator", children: /* @__PURE__ */ jsx(
|
|
27557
|
+
children: /* @__PURE__ */ jsx("div", { className: "str-chat__modal-gallery__image-retry-indicator", children: /* @__PURE__ */ jsx(IconRetry, {}) })
|
|
27188
27558
|
}
|
|
27189
27559
|
),
|
|
27190
27560
|
showOverlay && /* @__PURE__ */ jsxs("div", { className: "str-chat__modal-gallery__placeholder", children: [
|
|
@@ -27275,7 +27645,7 @@ const CardContent = (props) => {
|
|
|
27275
27645
|
className: "str-chat__message-attachment-card--source-link",
|
|
27276
27646
|
"data-testid": "card-source-link",
|
|
27277
27647
|
children: [
|
|
27278
|
-
/* @__PURE__ */ jsx(
|
|
27648
|
+
/* @__PURE__ */ jsx(IconLink, {}),
|
|
27279
27649
|
/* @__PURE__ */ jsx("div", { className: "str-chat__message-attachment-card--url", children: url })
|
|
27280
27650
|
]
|
|
27281
27651
|
}
|
|
@@ -27336,23 +27706,44 @@ const FileAttachment = ({ attachment }) => {
|
|
|
27336
27706
|
);
|
|
27337
27707
|
};
|
|
27338
27708
|
const Giphy = ({ attachment }) => {
|
|
27339
|
-
const { giphyVersion: giphyVersionName } = useChannelStateContext();
|
|
27709
|
+
const { giphyVersion: giphyVersionName, imageAttachmentSizeHandler } = useChannelStateContext();
|
|
27340
27710
|
const { BaseImage: BaseImage$1 = BaseImage } = useComponentContext();
|
|
27341
27711
|
const { t } = useTranslationContext();
|
|
27342
27712
|
const usesDefaultBaseImage = BaseImage$1 === BaseImage;
|
|
27713
|
+
const imageElement = useRef(null);
|
|
27714
|
+
const [attachmentConfiguration, setAttachmentConfiguration] = useState(void 0);
|
|
27343
27715
|
const imageDescriptors = useMemo(
|
|
27344
27716
|
() => toGalleryItemDescriptors(attachment, { giphyVersionName }),
|
|
27345
27717
|
[attachment, giphyVersionName]
|
|
27346
27718
|
);
|
|
27347
|
-
|
|
27348
|
-
const
|
|
27719
|
+
const alt = imageDescriptors && imageDescriptors.alt;
|
|
27720
|
+
const dimensions = imageDescriptors && imageDescriptors.dimensions;
|
|
27721
|
+
const imageUrl = imageDescriptors && imageDescriptors.imageUrl;
|
|
27722
|
+
const title = imageDescriptors && imageDescriptors.title;
|
|
27723
|
+
const resolvedImageUrl = attachmentConfiguration?.url || imageUrl;
|
|
27724
|
+
const imageStyleVariables = useMemo(() => {
|
|
27725
|
+
const originalHeight = Number(dimensions?.height);
|
|
27726
|
+
const originalWidth = Number(dimensions?.width);
|
|
27727
|
+
return {
|
|
27728
|
+
"--original-height": String(originalHeight > 1 ? originalHeight : 1e6),
|
|
27729
|
+
"--original-width": String(originalWidth > 1 ? originalWidth : 1e6)
|
|
27730
|
+
};
|
|
27731
|
+
}, [dimensions?.height, dimensions?.width]);
|
|
27732
|
+
useLayoutEffect(() => {
|
|
27733
|
+
if (!imageElement.current || !imageAttachmentSizeHandler) return;
|
|
27734
|
+
const config = imageAttachmentSizeHandler(attachment, imageElement.current);
|
|
27735
|
+
setAttachmentConfiguration(config);
|
|
27736
|
+
}, [attachment, imageAttachmentSizeHandler]);
|
|
27737
|
+
if (!imageUrl) return null;
|
|
27349
27738
|
return /* @__PURE__ */ jsxs("div", { className: clsx(`str-chat__message-attachment-giphy`), children: [
|
|
27350
27739
|
/* @__PURE__ */ jsx(
|
|
27351
27740
|
BaseImage$1,
|
|
27352
27741
|
{
|
|
27353
27742
|
alt: alt ?? title ?? t("User uploaded content"),
|
|
27354
27743
|
height: dimensions?.height,
|
|
27355
|
-
|
|
27744
|
+
ref: imageElement,
|
|
27745
|
+
src: resolvedImageUrl,
|
|
27746
|
+
style: imageStyleVariables,
|
|
27356
27747
|
width: dimensions?.width,
|
|
27357
27748
|
...usesDefaultBaseImage ? { showDownloadButtonOnError: false } : {}
|
|
27358
27749
|
}
|
|
@@ -27425,7 +27816,7 @@ const DefaultGeolocationAttachmentMapPlaceholder = ({
|
|
|
27425
27816
|
className: "str-chat__message-attachment-geolocation__placeholder",
|
|
27426
27817
|
"data-testid": "geolocation-attachment-map-placeholder",
|
|
27427
27818
|
children: [
|
|
27428
|
-
/* @__PURE__ */ jsx(
|
|
27819
|
+
/* @__PURE__ */ jsx(IconLocation, {}),
|
|
27429
27820
|
/* @__PURE__ */ jsx(
|
|
27430
27821
|
"a",
|
|
27431
27822
|
{
|
|
@@ -27977,12 +28368,12 @@ export {
|
|
|
27977
28368
|
Card,
|
|
27978
28369
|
CardContainer,
|
|
27979
28370
|
bx as Channel,
|
|
27980
|
-
|
|
27981
|
-
|
|
28371
|
+
c5 as ChannelActionContext,
|
|
28372
|
+
c6 as ChannelActionProvider,
|
|
27982
28373
|
ChannelAvatar,
|
|
27983
28374
|
ChannelHeader,
|
|
27984
28375
|
ChannelList,
|
|
27985
|
-
|
|
28376
|
+
c7 as ChannelListContext,
|
|
27986
28377
|
ChannelListContextProvider,
|
|
27987
28378
|
ChannelListItem,
|
|
27988
28379
|
ChannelListItemActionButtons,
|
|
@@ -27990,10 +28381,10 @@ export {
|
|
|
27990
28381
|
ChannelListItemUI,
|
|
27991
28382
|
ChannelListUI,
|
|
27992
28383
|
ChannelSearchResultItem,
|
|
27993
|
-
|
|
27994
|
-
|
|
28384
|
+
c8 as ChannelStateContext,
|
|
28385
|
+
c9 as ChannelStateProvider,
|
|
27995
28386
|
Chat,
|
|
27996
|
-
|
|
28387
|
+
ca as ChatContext,
|
|
27997
28388
|
ChatProvider,
|
|
27998
28389
|
bz as ChatView,
|
|
27999
28390
|
bC as ChatViewChannelsSelectorButton,
|
|
@@ -28005,12 +28396,13 @@ export {
|
|
|
28005
28396
|
CommandChip,
|
|
28006
28397
|
CommandItem,
|
|
28007
28398
|
ComponentContext,
|
|
28008
|
-
|
|
28399
|
+
cb as ComponentProvider,
|
|
28009
28400
|
ConnectionStatus,
|
|
28010
28401
|
ContextMenu,
|
|
28011
28402
|
ContextMenuBackButton,
|
|
28012
28403
|
ContextMenuBody,
|
|
28013
28404
|
ContextMenuButton,
|
|
28405
|
+
ContextMenuContent,
|
|
28014
28406
|
ContextMenuHeader,
|
|
28015
28407
|
ContextMenuRoot,
|
|
28016
28408
|
CooldownTimer,
|
|
@@ -28050,163 +28442,92 @@ export {
|
|
|
28050
28442
|
GlobalModal,
|
|
28051
28443
|
GroupAvatar,
|
|
28052
28444
|
Header$1 as Header,
|
|
28053
|
-
bG as IconApiAggregate,
|
|
28054
|
-
bH as IconApples,
|
|
28055
28445
|
IconArchive,
|
|
28056
|
-
IconArrowBoxLeft,
|
|
28057
28446
|
IconArrowDown,
|
|
28058
28447
|
IconArrowDownCircle,
|
|
28059
28448
|
IconArrowLeft,
|
|
28060
|
-
|
|
28061
|
-
IconArrowRightUp,
|
|
28062
|
-
IconArrowRotateClockwise,
|
|
28063
|
-
IconArrowRotateRightLeftRepeatRefresh,
|
|
28064
|
-
IconArrowShareLeft,
|
|
28449
|
+
bG as IconArrowRight,
|
|
28065
28450
|
IconArrowUp,
|
|
28066
|
-
|
|
28067
|
-
|
|
28068
|
-
|
|
28069
|
-
|
|
28451
|
+
IconArrowUpRight,
|
|
28452
|
+
IconAttachment,
|
|
28453
|
+
IconAudio,
|
|
28454
|
+
IconBell,
|
|
28070
28455
|
IconBellOff,
|
|
28071
|
-
|
|
28072
|
-
|
|
28073
|
-
|
|
28074
|
-
|
|
28075
|
-
bO as IconBubble2Solid,
|
|
28076
|
-
bP as IconBubble3ChatMessage,
|
|
28077
|
-
bQ as IconBubble3Solid,
|
|
28078
|
-
bR as IconBubbleAnnotation2ChatMessage,
|
|
28079
|
-
IconBubbleText6ChatMessage,
|
|
28080
|
-
bT as IconBubbleText6Solid,
|
|
28081
|
-
bS as IconBubbleText6SolidChatMessage,
|
|
28082
|
-
IconBubbleWideNotificationChatMessage,
|
|
28083
|
-
bU as IconBubbleWideSparkleChatMessage,
|
|
28084
|
-
IconBubbles,
|
|
28085
|
-
bV as IconCalendar1,
|
|
28086
|
-
bW as IconCallCancel,
|
|
28087
|
-
IconCamera1,
|
|
28088
|
-
bX as IconCar1,
|
|
28089
|
-
bY as IconCat,
|
|
28090
|
-
IconChainLink,
|
|
28091
|
-
IconChart5,
|
|
28456
|
+
bJ as IconBubble3ChatMessage,
|
|
28457
|
+
bK as IconBubbleText6SolidChatMessage,
|
|
28458
|
+
IconCamera,
|
|
28459
|
+
IconCheckmark,
|
|
28092
28460
|
IconCheckmark1Small,
|
|
28093
|
-
|
|
28094
|
-
bZ as IconCheckmark2Small,
|
|
28461
|
+
IconChecks,
|
|
28095
28462
|
IconChevronDown,
|
|
28096
|
-
b_ as IconChevronGrabberVerticalSelector,
|
|
28097
28463
|
IconChevronLeft,
|
|
28098
28464
|
IconChevronRight,
|
|
28099
|
-
b$ as IconChevronTop,
|
|
28100
|
-
IconCircleBanSign,
|
|
28101
|
-
c0 as IconCircleCheck,
|
|
28102
|
-
c1 as IconCircleInfoTooltip,
|
|
28103
|
-
IconCircleMinus,
|
|
28104
|
-
c2 as IconCircleQuestionmark,
|
|
28105
|
-
c3 as IconCircleQuestionmarkFilled,
|
|
28106
|
-
IconCircleX,
|
|
28107
28465
|
IconClock,
|
|
28108
|
-
|
|
28109
|
-
|
|
28110
|
-
c5 as IconCode,
|
|
28111
|
-
c6 as IconCodeBrackets,
|
|
28112
|
-
c7 as IconCodeEditorInsert,
|
|
28113
|
-
c8 as IconCompass,
|
|
28114
|
-
c9 as IconCreditCard2Billing,
|
|
28115
|
-
IconCrossMedium,
|
|
28466
|
+
IconCommand,
|
|
28467
|
+
IconCopy,
|
|
28116
28468
|
IconCrossSmall,
|
|
28117
|
-
|
|
28118
|
-
|
|
28119
|
-
|
|
28120
|
-
|
|
28121
|
-
|
|
28122
|
-
|
|
28123
|
-
cc as IconEmojiAddReaction,
|
|
28124
|
-
cd as IconEmojiSad,
|
|
28125
|
-
IconEmojiSmile,
|
|
28126
|
-
IconExclamation,
|
|
28127
|
-
IconExclamationCircle,
|
|
28128
|
-
IconExclamationCircle1,
|
|
28469
|
+
IconDelete,
|
|
28470
|
+
IconEdit,
|
|
28471
|
+
IconEmoji,
|
|
28472
|
+
IconExclamationCircleFill,
|
|
28473
|
+
IconExclamationMark,
|
|
28474
|
+
IconExclamationMarkFill,
|
|
28129
28475
|
IconExclamationTriangle,
|
|
28130
|
-
ce as IconExclamationTriangle1,
|
|
28131
28476
|
IconEyeOpen,
|
|
28132
|
-
|
|
28133
|
-
|
|
28134
|
-
cf as IconFilledCircleInfoTooltip,
|
|
28135
|
-
cg as IconFilter1,
|
|
28136
|
-
IconFlag2,
|
|
28137
|
-
ch as IconGauge,
|
|
28477
|
+
IconFile,
|
|
28478
|
+
IconFlag,
|
|
28138
28479
|
IconGiphy,
|
|
28139
|
-
|
|
28140
|
-
|
|
28141
|
-
ck as IconHeart2,
|
|
28142
|
-
cl as IconHistory,
|
|
28143
|
-
IconImages1Alt,
|
|
28144
|
-
cm as IconInvite,
|
|
28145
|
-
cn as IconLayersBehind,
|
|
28480
|
+
IconImage,
|
|
28481
|
+
bM as IconInfo,
|
|
28146
28482
|
IconLayoutAlignLeft,
|
|
28147
|
-
|
|
28148
|
-
|
|
28149
|
-
|
|
28150
|
-
|
|
28151
|
-
|
|
28152
|
-
|
|
28153
|
-
|
|
28154
|
-
|
|
28155
|
-
|
|
28156
|
-
|
|
28157
|
-
|
|
28158
|
-
|
|
28483
|
+
IconLeave,
|
|
28484
|
+
bN as IconLightBulbSimple,
|
|
28485
|
+
IconLink,
|
|
28486
|
+
IconLoading,
|
|
28487
|
+
IconLocation,
|
|
28488
|
+
bH as IconMessageBubble,
|
|
28489
|
+
bI as IconMessageBubbleFill,
|
|
28490
|
+
IconMessageBubbles,
|
|
28491
|
+
bP as IconMinus,
|
|
28492
|
+
IconMinusCircle,
|
|
28493
|
+
bQ as IconMinusSmall,
|
|
28494
|
+
IconMore,
|
|
28159
28495
|
IconMute,
|
|
28160
|
-
|
|
28161
|
-
|
|
28162
|
-
|
|
28163
|
-
cy as IconPaperPlaneTopRight,
|
|
28164
|
-
IconPaperclip,
|
|
28165
|
-
cz as IconParagraphsText,
|
|
28166
|
-
IconPause,
|
|
28167
|
-
cA as IconPencil,
|
|
28168
|
-
IconPeople,
|
|
28169
|
-
cB as IconPeople2,
|
|
28170
|
-
IconPeopleAdd,
|
|
28171
|
-
IconPeopleAdded,
|
|
28172
|
-
cC as IconPeopleCircle,
|
|
28173
|
-
cD as IconPeopleCopy,
|
|
28174
|
-
cE as IconPeopleEditUserRights,
|
|
28175
|
-
IconPeopleRemove,
|
|
28176
|
-
cF as IconPersona,
|
|
28496
|
+
IconNoSign,
|
|
28497
|
+
IconNotification,
|
|
28498
|
+
IconPauseFill,
|
|
28177
28499
|
IconPin,
|
|
28178
|
-
|
|
28179
|
-
|
|
28500
|
+
IconPlayFill,
|
|
28501
|
+
IconPlus,
|
|
28180
28502
|
IconPlusSmall,
|
|
28181
|
-
|
|
28182
|
-
|
|
28183
|
-
|
|
28184
|
-
|
|
28185
|
-
|
|
28186
|
-
|
|
28187
|
-
|
|
28188
|
-
|
|
28189
|
-
|
|
28190
|
-
|
|
28191
|
-
|
|
28192
|
-
|
|
28193
|
-
cQ as IconTeam,
|
|
28194
|
-
cR as IconTennis,
|
|
28195
|
-
cS as IconTextToImageURLEnrichment,
|
|
28503
|
+
IconPoll,
|
|
28504
|
+
IconQuote,
|
|
28505
|
+
IconRefresh,
|
|
28506
|
+
IconReorder,
|
|
28507
|
+
IconReply,
|
|
28508
|
+
IconRetry,
|
|
28509
|
+
IconSave,
|
|
28510
|
+
IconSearch,
|
|
28511
|
+
IconSend,
|
|
28512
|
+
bR as IconSettingsGear2,
|
|
28513
|
+
IconThread,
|
|
28514
|
+
bL as IconThreadFill,
|
|
28196
28515
|
IconThunder,
|
|
28197
28516
|
IconTranslate,
|
|
28198
|
-
IconTrashBin,
|
|
28199
|
-
cT as IconTrending4,
|
|
28200
28517
|
IconTrophy,
|
|
28201
|
-
cU as IconUnlocked,
|
|
28202
28518
|
IconUnpin,
|
|
28203
|
-
|
|
28519
|
+
IconUnsave,
|
|
28520
|
+
IconUpload,
|
|
28521
|
+
IconUser,
|
|
28522
|
+
IconUserAdd,
|
|
28523
|
+
IconUserCheck,
|
|
28524
|
+
IconUserRemove,
|
|
28204
28525
|
IconVideo,
|
|
28205
|
-
|
|
28206
|
-
|
|
28207
|
-
|
|
28208
|
-
|
|
28209
|
-
|
|
28526
|
+
IconVideoFill,
|
|
28527
|
+
IconVoice,
|
|
28528
|
+
bO as IconVoiceFill,
|
|
28529
|
+
IconXCircle,
|
|
28530
|
+
IconXmark,
|
|
28210
28531
|
ImageComponent,
|
|
28211
28532
|
ImageContainer,
|
|
28212
28533
|
ImagePlaceholder,
|
|
@@ -28215,9 +28536,9 @@ export {
|
|
|
28215
28536
|
LinkPreviewList,
|
|
28216
28537
|
LoadMoreButton,
|
|
28217
28538
|
LoadMorePaginator,
|
|
28218
|
-
|
|
28539
|
+
bS as LoadingChannel,
|
|
28219
28540
|
LoadingChannels,
|
|
28220
|
-
|
|
28541
|
+
bT as LoadingErrorIndicator,
|
|
28221
28542
|
LoadingIndicator,
|
|
28222
28543
|
LoadingIndicatorIcon,
|
|
28223
28544
|
MAX_MESSAGE_REACTIONS_TO_FETCH,
|
|
@@ -28232,7 +28553,7 @@ export {
|
|
|
28232
28553
|
MessageBouncePrompt,
|
|
28233
28554
|
MessageBounceProvider,
|
|
28234
28555
|
MessageComposer,
|
|
28235
|
-
|
|
28556
|
+
cc as MessageComposerContext,
|
|
28236
28557
|
MessageComposerContextProvider,
|
|
28237
28558
|
MessageComposerUI,
|
|
28238
28559
|
MessageContext,
|
|
@@ -28245,6 +28566,7 @@ export {
|
|
|
28245
28566
|
MessageProvider,
|
|
28246
28567
|
MessageReactions,
|
|
28247
28568
|
MessageReactionsDetail,
|
|
28569
|
+
MessageReactionsDetailLoadingIndicator,
|
|
28248
28570
|
MessageRepliesCountButton,
|
|
28249
28571
|
MessageSearchResultItem,
|
|
28250
28572
|
MessageStatus,
|
|
@@ -28264,7 +28586,7 @@ export {
|
|
|
28264
28586
|
NotificationList,
|
|
28265
28587
|
NotificationTranslationTopic,
|
|
28266
28588
|
NumericInput,
|
|
28267
|
-
|
|
28589
|
+
bU as OPTIONAL_MESSAGE_ACTIONS,
|
|
28268
28590
|
OtherFilesContainer,
|
|
28269
28591
|
PauseIcon,
|
|
28270
28592
|
PinIndicator,
|
|
@@ -28331,22 +28653,22 @@ export {
|
|
|
28331
28653
|
TextInputFieldSet,
|
|
28332
28654
|
TextareaComposer,
|
|
28333
28655
|
Thread,
|
|
28334
|
-
|
|
28656
|
+
c3 as ThreadContext,
|
|
28335
28657
|
ThreadHeader,
|
|
28336
28658
|
ThreadList,
|
|
28337
28659
|
ThreadListItem,
|
|
28338
28660
|
ThreadListItemUI,
|
|
28339
|
-
|
|
28661
|
+
c4 as ThreadProvider,
|
|
28340
28662
|
ThreadStart,
|
|
28341
28663
|
Tooltip,
|
|
28342
28664
|
TranslationBuilder,
|
|
28343
|
-
|
|
28665
|
+
cd as TranslationContext,
|
|
28344
28666
|
TranslationProvider,
|
|
28345
28667
|
TranslationTopic,
|
|
28346
|
-
|
|
28668
|
+
ce as TypingContext,
|
|
28347
28669
|
TypingIndicator,
|
|
28348
28670
|
TypingIndicatorHeader,
|
|
28349
|
-
|
|
28671
|
+
cf as TypingProvider,
|
|
28350
28672
|
UNREAD_MESSAGE_SEPARATOR_CLASS,
|
|
28351
28673
|
UnMemoizedLoadMorePaginator,
|
|
28352
28674
|
UnreadMessagesNotification,
|
|
@@ -28404,21 +28726,21 @@ export {
|
|
|
28404
28726
|
getCssDimensionsVariables,
|
|
28405
28727
|
getGroupChannelDisplayInfo,
|
|
28406
28728
|
getGroupStyles,
|
|
28407
|
-
|
|
28729
|
+
bV as getImages,
|
|
28408
28730
|
getIsFirstUnreadMessage,
|
|
28409
28731
|
getLastReceived,
|
|
28410
28732
|
getLatestMessagePreview,
|
|
28411
28733
|
getMessageActions,
|
|
28412
|
-
|
|
28413
|
-
|
|
28414
|
-
|
|
28734
|
+
bW as getNonImageAttachments,
|
|
28735
|
+
c0 as getNotificationTargetPanel,
|
|
28736
|
+
c1 as getNotificationTargetTag,
|
|
28415
28737
|
getReadByTooltipText,
|
|
28416
28738
|
getTextareaCaretRect,
|
|
28417
28739
|
getTranslatedMessageText,
|
|
28418
28740
|
getWholeChar,
|
|
28419
28741
|
handleActionWarning,
|
|
28420
|
-
|
|
28421
|
-
|
|
28742
|
+
bZ as hasMoreMessagesProbably,
|
|
28743
|
+
b_ as hasNotMoreMessages,
|
|
28422
28744
|
hiTranslations,
|
|
28423
28745
|
htmlToTextPlugin,
|
|
28424
28746
|
imageToLink,
|
|
@@ -28428,7 +28750,7 @@ export {
|
|
|
28428
28750
|
isChrome,
|
|
28429
28751
|
isDate,
|
|
28430
28752
|
isDateSeparatorMessage,
|
|
28431
|
-
|
|
28753
|
+
cg as isDayOrMoment,
|
|
28432
28754
|
isFirefox,
|
|
28433
28755
|
isGalleryAttachmentType,
|
|
28434
28756
|
isIntroMessage,
|
|
@@ -28440,8 +28762,8 @@ export {
|
|
|
28440
28762
|
isMessageErrorRetryable,
|
|
28441
28763
|
isNetworkSendFailure,
|
|
28442
28764
|
isNotificationForPanel,
|
|
28443
|
-
|
|
28444
|
-
|
|
28765
|
+
b$ as isNotificationTargetPanel,
|
|
28766
|
+
ch as isNumberOrString,
|
|
28445
28767
|
isSafari,
|
|
28446
28768
|
isSvgAttachment,
|
|
28447
28769
|
isUserMuted,
|
|
@@ -28449,8 +28771,8 @@ export {
|
|
|
28449
28771
|
jaTranslations,
|
|
28450
28772
|
keepLineBreaksPlugin,
|
|
28451
28773
|
koTranslations,
|
|
28452
|
-
|
|
28453
|
-
|
|
28774
|
+
bY as makeDateMessageId,
|
|
28775
|
+
bX as makeIntroMessage,
|
|
28454
28776
|
mapEmojiMartData,
|
|
28455
28777
|
mapToUserNameOrId,
|
|
28456
28778
|
markDownRenderers,
|
|
@@ -28528,7 +28850,7 @@ export {
|
|
|
28528
28850
|
useFlagHandler,
|
|
28529
28851
|
useGalleryContext,
|
|
28530
28852
|
useLastReadData,
|
|
28531
|
-
|
|
28853
|
+
c2 as useLegacyThreadContext,
|
|
28532
28854
|
useLiveLocationSharingManager,
|
|
28533
28855
|
useMarkUnreadHandler,
|
|
28534
28856
|
useMentionsHandler,
|