@ermis-network/ermis-chat-react 1.0.1 → 1.0.3

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.
Files changed (38) hide show
  1. package/dist/index.cjs +2501 -1249
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +1231 -134
  4. package/dist/index.css.map +1 -1
  5. package/dist/index.d.mts +306 -2
  6. package/dist/index.d.ts +306 -2
  7. package/dist/index.mjs +2427 -1181
  8. package/dist/index.mjs.map +1 -1
  9. package/package.json +2 -2
  10. package/src/components/ChannelHeader.tsx +50 -9
  11. package/src/components/ChannelInfo/AddMemberModal.tsx +48 -174
  12. package/src/components/ChannelList.tsx +9 -3
  13. package/src/components/CreateChannelModal.tsx +274 -0
  14. package/src/components/ErmisCallProvider.tsx +279 -0
  15. package/src/components/ErmisCallUI.tsx +634 -0
  16. package/src/components/MessageRenderers.tsx +37 -10
  17. package/src/components/Modal.tsx +2 -1
  18. package/src/components/UserPicker.tsx +377 -0
  19. package/src/context/ChatProvider.tsx +49 -1
  20. package/src/context/ErmisCallContext.tsx +37 -0
  21. package/src/hooks/useCallContext.ts +10 -0
  22. package/src/index.ts +27 -0
  23. package/src/styles/_add-member-modal.css +12 -29
  24. package/src/styles/_call-ui.css +743 -0
  25. package/src/styles/_channel-info.css +34 -34
  26. package/src/styles/_channel-list.css +7 -7
  27. package/src/styles/_create-channel-modal.css +183 -0
  28. package/src/styles/_message-bubble.css +108 -16
  29. package/src/styles/_message-input.css +4 -4
  30. package/src/styles/_message-list.css +11 -11
  31. package/src/styles/_modal.css +23 -36
  32. package/src/styles/_panel.css +1 -1
  33. package/src/styles/_search-panel.css +9 -9
  34. package/src/styles/_tokens.css +42 -0
  35. package/src/styles/_typing-indicator.css +15 -2
  36. package/src/styles/_user-picker.css +268 -0
  37. package/src/styles/index.css +3 -0
  38. package/src/types.ts +293 -1
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React$1 from 'react';
2
- import { Channel as Channel$1, Attachment, FormatMessageResponse, ChannelFilters, ChannelSort, ChannelQueryOptions, ErmisChat, MessageLabel } from '@ermis-network/ermis-chat-sdk';
2
+ import { Channel as Channel$1, Attachment, FormatMessageResponse, ChannelFilters, ChannelSort, ChannelQueryOptions, ErmisChat, UserCallInfo, MessageLabel, ErmisCallNode, CallStatus } from '@ermis-network/ermis-chat-sdk';
3
3
  import { VListHandle } from 'virtua';
4
4
 
5
5
  type Theme = 'dark' | 'light';
@@ -39,12 +39,176 @@ type ChatContextValue = {
39
39
  /** Message ID to jump/scroll to (set by search, cleared after scroll) */
40
40
  jumpToMessageId: string | null;
41
41
  setJumpToMessageId: (id: string | null) => void;
42
+ /** Indicates whether the direct call feature is enabled */
43
+ enableCall?: boolean;
42
44
  };
43
45
  type ChatProviderProps = {
44
46
  client: ErmisChat;
45
47
  children: React.ReactNode;
46
48
  /** Initial theme, defaults to 'dark' */
47
49
  initialTheme?: Theme;
50
+ /** Enable direct call feature (Audio/Video). If enabled, configures internal CallProvider */
51
+ enableCall?: boolean;
52
+ /** Provide session ID to be used for call nodes */
53
+ callSessionId?: string;
54
+ /** Override the WebAssembly module path for Call Nodes */
55
+ callWasmPath?: string;
56
+ /** Override the relay URL for Call Nodes */
57
+ callRelayUrl?: string;
58
+ /** Custom Component to completely replace the default Call UI */
59
+ CallUIComponent?: React.ComponentType;
60
+ /** Path to the mp3 file for incoming call ringing */
61
+ incomingCallAudioPath?: string;
62
+ /** Path to the mp3 file for outgoing call ringing */
63
+ outgoingCallAudioPath?: string;
64
+ /** Called when a call is initiated by the local user */
65
+ onCallStart?: (callType: 'audio' | 'video', cid: string) => void;
66
+ /** Called when a call ends (includes duration in seconds) */
67
+ onCallEnd?: (duration: number) => void;
68
+ /** Called when a call error occurs */
69
+ onCallError?: (error: string) => void;
70
+ /** Called when an incoming call is received */
71
+ onIncomingCall?: (callerInfo: UserCallInfo) => void;
72
+ /** Called when the local user accepts an incoming call */
73
+ onCallAccepted?: () => void;
74
+ /** Called when the local user rejects an incoming call */
75
+ onCallRejected?: () => void;
76
+ };
77
+ interface ErmisCallProviderProps {
78
+ children: React.ReactNode;
79
+ client: ErmisChat;
80
+ sessionId: string;
81
+ wasmPath?: string;
82
+ relayUrl?: string;
83
+ /** Called when a call is initiated by the local user */
84
+ onCallStart?: (callType: 'audio' | 'video', cid: string) => void;
85
+ /** Called when a call ends (includes duration in seconds) */
86
+ onCallEnd?: (duration: number) => void;
87
+ /** Called when a call error occurs */
88
+ onCallError?: (error: string) => void;
89
+ /** Called when an incoming call is received */
90
+ onIncomingCall?: (callerInfo: UserCallInfo) => void;
91
+ /** Called when the local user accepts an incoming call */
92
+ onCallAccepted?: () => void;
93
+ /** Called when the local user rejects an incoming call */
94
+ onCallRejected?: () => void;
95
+ }
96
+ type ErmisCallUIProps = {
97
+ /** Additional CSS class name */
98
+ className?: string;
99
+ incomingCallTitle?: (callType: string) => string;
100
+ outgoingCallTitle?: (callType: string) => string;
101
+ ongoingCallTitle?: (callType: string) => string;
102
+ isCallingYouLabel?: string;
103
+ ringingLabel?: string;
104
+ rejectCallLabel?: string;
105
+ acceptCallLabel?: string;
106
+ endCallLabel?: string;
107
+ cancelLabel?: string;
108
+ toggleMicTitle?: string;
109
+ toggleVideoTitle?: string;
110
+ shareScreenTitle?: string;
111
+ stopScreenShareTitle?: string;
112
+ /** Label shown during an active call (default: "Connected") */
113
+ connectedLabel?: string;
114
+ /** Label for the audio call type badge (default: "Audio Call") */
115
+ audioCallBadgeLabel?: string;
116
+ /** Label for the video call type badge (default: "Video Call") */
117
+ videoCallBadgeLabel?: string;
118
+ /** Tooltip for the fullscreen button (default: "Fullscreen") */
119
+ fullscreenTitle?: string;
120
+ /** Tooltip for the exit fullscreen button (default: "Exit Fullscreen") */
121
+ exitFullscreenTitle?: string;
122
+ /** Tooltip for the upgrade call button (default: "Request Video Upgrade") */
123
+ upgradeCallTitle?: string;
124
+ /** If true, suppress incoming call UI — useful for "Do Not Disturb" mode */
125
+ suppressIncomingCalls?: boolean;
126
+ /** Called on each second tick of the call duration timer */
127
+ onCallDurationChange?: (seconds: number) => void;
128
+ AvatarComponent?: React.ComponentType<AvatarProps>;
129
+ MicIcon?: React.ComponentType;
130
+ MicOffIcon?: React.ComponentType;
131
+ VideoIcon?: React.ComponentType;
132
+ VideoOffIcon?: React.ComponentType;
133
+ PhoneIcon?: React.ComponentType;
134
+ ScreenShareIcon?: React.ComponentType;
135
+ ScreenShareOffIcon?: React.ComponentType;
136
+ FullscreenIcon?: React.ComponentType;
137
+ ExitFullscreenIcon?: React.ComponentType;
138
+ /** Custom icon for the upgrade call button (audio → video) */
139
+ UpgradeCallIcon?: React.ComponentType;
140
+ incomingCallAudioPath?: string;
141
+ outgoingCallAudioPath?: string;
142
+ /** Replace the entire Ringing state view */
143
+ RingingComponent?: React.ComponentType<ErmisCallRingingProps>;
144
+ /** Replace the entire Connected Audio state view */
145
+ ConnectedAudioComponent?: React.ComponentType<ErmisCallConnectedAudioProps>;
146
+ /** Replace the entire Connected Video state view */
147
+ ConnectedVideoComponent?: React.ComponentType<ErmisCallConnectedVideoProps>;
148
+ /** Replace the entire Error state view */
149
+ ErrorComponent?: React.ComponentType<ErmisCallErrorProps>;
150
+ /** Replace the controls bar */
151
+ ControlsBarComponent?: React.ComponentType<ErmisCallControlsBarProps>;
152
+ };
153
+ /** Props for the Ringing state view */
154
+ type ErmisCallRingingProps = {
155
+ peerInfo?: UserCallInfo;
156
+ callType: string;
157
+ isIncoming: boolean;
158
+ acceptCall: () => Promise<void>;
159
+ rejectCall: () => Promise<void>;
160
+ endCall: () => Promise<void>;
161
+ AvatarComponent: React.ComponentType<AvatarProps>;
162
+ isCallingYouLabel: string;
163
+ ringingLabel: string;
164
+ rejectCallLabel: string;
165
+ acceptCallLabel: string;
166
+ endCallLabel: string;
167
+ audioCallBadgeLabel: string;
168
+ videoCallBadgeLabel: string;
169
+ };
170
+ /** Props for the Connected Audio state view */
171
+ type ErmisCallConnectedAudioProps = {
172
+ peerInfo?: UserCallInfo;
173
+ callDuration: number;
174
+ isRemoteMicMuted: boolean;
175
+ AvatarComponent: React.ComponentType<AvatarProps>;
176
+ connectedLabel: string;
177
+ renderControls: () => React.ReactNode;
178
+ };
179
+ /** Props for the Connected Video state view */
180
+ type ErmisCallConnectedVideoProps = {
181
+ localVideoRef: React.RefObject<HTMLVideoElement | null>;
182
+ remoteVideoRef: React.RefObject<HTMLVideoElement | null>;
183
+ isRemoteMicMuted: boolean;
184
+ renderControls: () => React.ReactNode;
185
+ };
186
+ /** Props for the Error state view */
187
+ type ErmisCallErrorProps = {
188
+ errorMessage: string;
189
+ clearError: () => void;
190
+ cancelLabel: string;
191
+ PhoneIcon: React.ComponentType;
192
+ };
193
+ /** Props for the Controls bar */
194
+ type ErmisCallControlsBarProps = {
195
+ callType: string;
196
+ toggleMic: () => void;
197
+ toggleVideo: () => void;
198
+ toggleScreenShare: () => Promise<void>;
199
+ toggleFullscreen: () => void;
200
+ upgradeCall: () => Promise<void>;
201
+ endCall: () => Promise<void>;
202
+ isMicMuted: boolean;
203
+ isVideoMuted: boolean;
204
+ isScreenSharing: boolean;
205
+ isFullscreen: boolean;
206
+ audioDevices: MediaDeviceInfo[];
207
+ videoDevices: MediaDeviceInfo[];
208
+ selectedAudioDeviceId: string;
209
+ selectedVideoDeviceId: string;
210
+ switchAudioDevice: (id: string) => Promise<void>;
211
+ switchVideoDevice: (id: string) => Promise<void>;
48
212
  };
49
213
  type AvatarProps = {
50
214
  /** Image URL */
@@ -82,6 +246,18 @@ type ChannelHeaderProps = {
82
246
  renderRight?: (channel: Channel$1, actionDisabled?: boolean) => React.ReactNode;
83
247
  /** Override default title rendering */
84
248
  renderTitle?: (channel: Channel$1) => React.ReactNode;
249
+ /** Custom renderer for Audio Call button */
250
+ renderAudioCallButton?: (onClick: () => void, disabled: boolean) => React.ReactNode;
251
+ /** Custom renderer for Video Call button */
252
+ renderVideoCallButton?: (onClick: () => void, disabled: boolean) => React.ReactNode;
253
+ /** I18n label for the audio call button tooltip (default: "Audio Call") */
254
+ audioCallTitle?: string;
255
+ /** I18n label for the video call button tooltip (default: "Video Call") */
256
+ videoCallTitle?: string;
257
+ /** Custom component to show when a call is active (e.g. "Call in progress" badge) */
258
+ CallBadgeComponent?: React.ComponentType<{
259
+ callType: string;
260
+ }>;
85
261
  };
86
262
  /** Data passed to a fully custom HeaderComponent */
87
263
  type ChannelHeaderData = {
@@ -513,6 +689,7 @@ interface ModalProps {
513
689
  footer?: React.ReactNode;
514
690
  maxWidth?: string;
515
691
  hideCloseButton?: boolean;
692
+ closeOnOutsideClick?: boolean;
516
693
  }
517
694
  /** Attachment item from the channel attachment query API */
518
695
  type AttachmentItem = {
@@ -800,6 +977,89 @@ type ChannelInfoProps = {
800
977
  actionsBlockLabel?: string;
801
978
  actionsUnblockLabel?: string;
802
979
  };
980
+ /** Individual user item in UserPicker */
981
+ type UserPickerUser = {
982
+ id: string;
983
+ name?: string;
984
+ email?: string;
985
+ phone?: string;
986
+ avatar?: string;
987
+ [key: string]: any;
988
+ };
989
+ /** Props for each user row in UserPicker */
990
+ type UserPickerItemProps = {
991
+ user: UserPickerUser;
992
+ selected: boolean;
993
+ disabled: boolean;
994
+ mode: 'radio' | 'checkbox';
995
+ onToggle: (user: UserPickerUser) => void;
996
+ AvatarComponent: React.ComponentType<AvatarProps>;
997
+ };
998
+ /** Props for the selected users chip box */
999
+ type UserPickerSelectedBoxProps = {
1000
+ users: UserPickerUser[];
1001
+ onRemove: (userId: string) => void;
1002
+ AvatarComponent: React.ComponentType<AvatarProps>;
1003
+ /** Label when no users selected */
1004
+ emptyLabel?: string;
1005
+ };
1006
+ /** Main UserPicker props */
1007
+ type UserPickerProps = {
1008
+ /** Selection mode: 'radio' for single, 'checkbox' for multi */
1009
+ mode: 'radio' | 'checkbox';
1010
+ /** Called whenever selection changes */
1011
+ onSelectionChange?: (users: UserPickerUser[]) => void;
1012
+ /** User IDs to exclude from the list (e.g. existing members) */
1013
+ excludeUserIds?: string[];
1014
+ /** Users that are pre-selected on mount */
1015
+ initialSelectedUsers?: UserPickerUser[];
1016
+ /** Page size for queryUsers (default: 30) */
1017
+ pageSize?: number;
1018
+ /** Custom avatar component */
1019
+ AvatarComponent?: React.ComponentType<AvatarProps>;
1020
+ /** Custom user item component (replaces the default row) */
1021
+ UserItemComponent?: React.ComponentType<UserPickerItemProps>;
1022
+ /** Custom selected box component (checkbox mode only) */
1023
+ SelectedBoxComponent?: React.ComponentType<UserPickerSelectedBoxProps>;
1024
+ /** Custom search input component */
1025
+ SearchInputComponent?: React.ComponentType<{
1026
+ value: string;
1027
+ onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
1028
+ placeholder: string;
1029
+ }>;
1030
+ /** I18n labels */
1031
+ searchPlaceholder?: string;
1032
+ loadingText?: string;
1033
+ emptyText?: string;
1034
+ loadingMoreText?: string;
1035
+ selectedEmptyLabel?: string;
1036
+ };
1037
+ type CreateChannelModalProps = {
1038
+ isOpen: boolean;
1039
+ onClose: () => void;
1040
+ onSuccess?: (channel: any) => void;
1041
+ /** Override visual components */
1042
+ AvatarComponent?: React.ComponentType<AvatarProps>;
1043
+ UserItemComponent?: React.ComponentType<UserPickerItemProps>;
1044
+ /** i18n labels */
1045
+ title?: string;
1046
+ directTabLabel?: string;
1047
+ groupTabLabel?: string;
1048
+ groupNameLabel?: string;
1049
+ groupNamePlaceholder?: string;
1050
+ groupDescriptionLabel?: string;
1051
+ groupDescriptionPlaceholder?: string;
1052
+ groupPublicLabel?: string;
1053
+ groupAvatarLabel?: string;
1054
+ userSearchPlaceholder?: string;
1055
+ cancelButtonLabel?: string;
1056
+ createButtonLabel?: string;
1057
+ creatingButtonLabel?: string;
1058
+ /** File upload configuration for group channel images */
1059
+ imageAccept?: string;
1060
+ maxImageSize?: number;
1061
+ maxImageSizeError?: string;
1062
+ };
803
1063
 
804
1064
  declare const ChatProvider: React$1.FC<ChatProviderProps>;
805
1065
 
@@ -1135,4 +1395,48 @@ type PanelProps = {
1135
1395
  */
1136
1396
  declare const Panel: React$1.FC<PanelProps>;
1137
1397
 
1138
- export { type AddMemberButtonProps, type AddMemberModalProps, type AddMemberUserItemProps, type AttachButtonProps, type AttachmentItem, AttachmentList, type AttachmentProps, Avatar, type AvatarProps, Channel, ChannelHeader, type ChannelHeaderData, type ChannelHeaderProps, ChannelInfo, type ChannelInfoActionsProps, type ChannelInfoCoverProps, type ChannelInfoEmptyStateProps, type ChannelInfoFileItemProps, type ChannelInfoHeaderProps, type ChannelInfoLinkItemProps, type ChannelInfoMediaItemProps, type ChannelInfoMemberItemProps, type ChannelInfoProps, type ChannelInfoTabsProps, ChannelItem, type ChannelItemProps, ChannelList, type ChannelListProps, type ChannelProps, type ChatContextValue, ChatProvider, type ChatProviderProps, type DateSeparatorProps, DefaultChannelInfoActions, DefaultChannelInfoCover, DefaultChannelInfoHeader, DefaultChannelInfoTabs, Dropdown, type DropdownProps, type EmojiButtonProps, type EmojiPickerProps, ErrorMessage, type FilePreviewItem, FilesPreview, type FilesPreviewProps, type ForwardChannelItemProps, ForwardMessageModal, type ForwardMessageModalProps, type JumpToLatestProps, type LatestReaction, type MediaTab, type MentionMember, type MentionPayload, MentionSuggestions, type MentionSuggestionsProps, MessageActionsBox, type MessageActionsBoxProps, MessageAttachment, type MessageBubbleProps, MessageInput, type MessageInputProps, MessageItem, type MessageItemProps, type MessageListProps, MessageQuickReactions, MessageReactions, type MessageReactionsProps, type MessageRendererProps, Modal, type ModalProps, Panel, type PinnedMessageItemProps, PinnedMessages, type PinnedMessagesProps, PollMessage, QuotedMessagePreview, type QuotedMessagePreviewProps, type ReactionUser, RegularMessage, ReplyPreview, type ReplyPreviewProps, type SendButtonProps, SignalMessage, StickerMessage, SystemMessage, SystemMessageItem, type SystemMessageItemProps, type Theme, TypingIndicator, type TypingIndicatorProps, type TypingUser, type UseChannelMessagesOptions, type UseChannelReturn, type UseLoadMessagesOptions, type UseLoadMessagesReturn, type UseMentionsOptions, type UseMentionsReturn, type UseScrollToMessageOptions, type UseScrollToMessageReturn, VirtualMessageList, closeAllDropdowns, dedupMessages, defaultMessageRenderers, formatDateLabel, formatTime, getDateKey, getMessageUserId, replaceMentionsForPreview, useBannedState, useBlockedState, useChannel, useChannelListUpdates, useChannelMessages, useChannelRowUpdates, useChatClient, useLoadMessages, useMentions, useMessageActions, usePendingState, useScrollToMessage, useTypingIndicator };
1398
+ declare const UserPicker: React$1.FC<UserPickerProps>;
1399
+
1400
+ declare const CreateChannelModal: React$1.FC<CreateChannelModalProps>;
1401
+
1402
+ type CallContextValue = {
1403
+ callNode: ErmisCallNode | null;
1404
+ callStatus: CallStatus | '';
1405
+ localStream: MediaStream | null;
1406
+ remoteStream: MediaStream | null;
1407
+ callType: string;
1408
+ callerInfo?: UserCallInfo | undefined;
1409
+ receiverInfo?: UserCallInfo | undefined;
1410
+ isIncoming: boolean;
1411
+ createCall: (type: 'audio' | 'video', cid: string) => Promise<void>;
1412
+ acceptCall: () => Promise<void>;
1413
+ rejectCall: () => Promise<void>;
1414
+ endCall: () => Promise<void>;
1415
+ toggleMic: () => void;
1416
+ toggleVideo: () => void;
1417
+ isMicMuted: boolean;
1418
+ isVideoMuted: boolean;
1419
+ audioDevices: MediaDeviceInfo[];
1420
+ videoDevices: MediaDeviceInfo[];
1421
+ selectedAudioDeviceId: string;
1422
+ selectedVideoDeviceId: string;
1423
+ isScreenSharing: boolean;
1424
+ errorMessage: string | null;
1425
+ toggleScreenShare: () => Promise<void>;
1426
+ switchAudioDevice: (id: string) => Promise<void>;
1427
+ switchVideoDevice: (id: string) => Promise<void>;
1428
+ clearError: () => void;
1429
+ isRemoteMicMuted: boolean;
1430
+ isRemoteVideoMuted: boolean;
1431
+ upgradeCall: () => Promise<void>;
1432
+ callDuration: number;
1433
+ };
1434
+ declare const ErmisCallContext: React$1.Context<CallContextValue | undefined>;
1435
+
1436
+ declare const useCallContext: () => CallContextValue;
1437
+
1438
+ declare const ErmisCallProvider: React$1.FC<ErmisCallProviderProps>;
1439
+
1440
+ declare const ErmisCallUI: React$1.FC<ErmisCallUIProps>;
1441
+
1442
+ export { type AddMemberButtonProps, type AddMemberModalProps, type AddMemberUserItemProps, type AttachButtonProps, type AttachmentItem, AttachmentList, type AttachmentProps, Avatar, type AvatarProps, type CallContextValue, Channel, ChannelHeader, type ChannelHeaderData, type ChannelHeaderProps, ChannelInfo, type ChannelInfoActionsProps, type ChannelInfoCoverProps, type ChannelInfoEmptyStateProps, type ChannelInfoFileItemProps, type ChannelInfoHeaderProps, type ChannelInfoLinkItemProps, type ChannelInfoMediaItemProps, type ChannelInfoMemberItemProps, type ChannelInfoProps, type ChannelInfoTabsProps, ChannelItem, type ChannelItemProps, ChannelList, type ChannelListProps, type ChannelProps, type ChatContextValue, ChatProvider, type ChatProviderProps, CreateChannelModal, type CreateChannelModalProps, type DateSeparatorProps, DefaultChannelInfoActions, DefaultChannelInfoCover, DefaultChannelInfoHeader, DefaultChannelInfoTabs, Dropdown, type DropdownProps, type EmojiButtonProps, type EmojiPickerProps, type ErmisCallConnectedAudioProps, type ErmisCallConnectedVideoProps, ErmisCallContext, type ErmisCallControlsBarProps, type ErmisCallErrorProps, ErmisCallProvider, type ErmisCallProviderProps, type ErmisCallRingingProps, ErmisCallUI, type ErmisCallUIProps, ErrorMessage, type FilePreviewItem, FilesPreview, type FilesPreviewProps, type ForwardChannelItemProps, ForwardMessageModal, type ForwardMessageModalProps, type JumpToLatestProps, type LatestReaction, type MediaTab, type MentionMember, type MentionPayload, MentionSuggestions, type MentionSuggestionsProps, MessageActionsBox, type MessageActionsBoxProps, MessageAttachment, type MessageBubbleProps, MessageInput, type MessageInputProps, MessageItem, type MessageItemProps, type MessageListProps, MessageQuickReactions, MessageReactions, type MessageReactionsProps, type MessageRendererProps, Modal, type ModalProps, Panel, type PinnedMessageItemProps, PinnedMessages, type PinnedMessagesProps, PollMessage, QuotedMessagePreview, type QuotedMessagePreviewProps, type ReactionUser, RegularMessage, ReplyPreview, type ReplyPreviewProps, type SendButtonProps, SignalMessage, StickerMessage, SystemMessage, SystemMessageItem, type SystemMessageItemProps, type Theme, TypingIndicator, type TypingIndicatorProps, type TypingUser, type UseChannelMessagesOptions, type UseChannelReturn, type UseLoadMessagesOptions, type UseLoadMessagesReturn, type UseMentionsOptions, type UseMentionsReturn, type UseScrollToMessageOptions, type UseScrollToMessageReturn, UserPicker, type UserPickerItemProps, type UserPickerProps, type UserPickerSelectedBoxProps, type UserPickerUser, VirtualMessageList, closeAllDropdowns, dedupMessages, defaultMessageRenderers, formatDateLabel, formatTime, getDateKey, getMessageUserId, replaceMentionsForPreview, useBannedState, useBlockedState, useCallContext, useChannel, useChannelListUpdates, useChannelMessages, useChannelRowUpdates, useChatClient, useLoadMessages, useMentions, useMessageActions, usePendingState, useScrollToMessage, useTypingIndicator };