Skip to content

fix(Message): show error notification when pinning or unpinning fails - #3359

Merged
oliverlaz merged 3 commits into
release-v14from
fix/pin-failure-notification
Oct 30, 2026
Merged

oliverlaz merged 3 commits into
release-v14from
fix/pin-failure-notification

Conversation

@oliverlaz

@oliverlaz oliverlaz commented Oct 29, 2026 •

Copy link
Copy Markdown
Member

Ticket: https://linear.app/stream/issue/REACT-1264

🎯 Goal

When the server rejects a pin (e.g. a user role without the pin permission in the videocall scope), the UI still showed a "Message pinned" success notification. Unpin had the same problem.

usePinHandler caught the API error, rolled back the optimistic update, and swallowed it, so handlePin always resolved. The Pin action in MessageActions relies on handlePin throwing to show its existing "Error pinning message" / "Error removing message pin" notification, so that branch never ran.

On release-v14 only usePinHandler swallowed the error, so this PR covers REACT-1264 for v14. The v15 counterpart, which also fixes mute and delete, is #3360.

πŸ›  Implementation details

  • usePinHandler now rethrows the request's error after rolling back, for both pin and unpin. This matches sibling handlers such as useMuteHandler, which let API errors propagate.
  • The rollback restores only the pin fields, onto the message as currently stored in channel.state (findMessage, which also covers thread replies). An edit or reaction that arrived while the request was in flight is kept instead of being overwritten by the pre-click snapshot. If the pin state changed again in the meantime, the rollback leaves it alone. The optimistic update also starts from the stored message.
  • MessageContext.handlePin's JSDoc now says it pins or unpins and rejects with the request's error after rolling back.
  • The vite example's custom message UI catches handlePin rejections instead of leaking an unhandled rejection.
  • usePinHandler.test.tsx uses a real Channel, with updateMessage writing to channel.state like Channel does, and checks the stored message: pin/unpin success and rollback, an edit made during the request surviving the rollback, and a newer pin state being kept.

Note for custom UIs: handlePin from MessageContext now rejects when the request fails instead of resolving silently. Custom message UIs calling it directly should handle the rejection.

React Native is not affected β€” its handleTogglePinMessage awaits client.pinMessage directly and already shows the error notification.

🎨 UI Changes

No visual changes. A rejected pin/unpin now shows the existing error notification instead of the success one.

@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8176482d-9618-49fc-8489-744ad73902fd

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • πŸ” Trigger review
  • Autofix Β· Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: +581 B (+0.05%)

Total Size: 1.18 MB

πŸ“¦ View Changed
Filename Size Change
dist/cjs/index.js 251 kB +198 B (+0.08%)
dist/es/components/Message/hooks/usePinHandler.mjs 715 B +239 B (+50.21%) πŸ†˜
dist/es/components/TextareaComposer/SuggestionList/MentionItem/mjs 775 B +144 B (+22.82%) 🚨
ℹ️ View Unchanged
Filename Size
dist/cjs/ai-components.js 27.8 kB
dist/cjs/audioProcessing.js 1.74 kB
dist/cjs/channel-detail.js 23.2 kB
dist/cjs/Chart.js 1.09 kB
dist/cjs/chartTypes.js 584 B
dist/cjs/emojis.js 2.69 kB
dist/cjs/mp3-encoder.js 814 B
dist/cjs/NotificationList.js 67 kB
dist/cjs/ReactPlayerWrapper.js 547 B
dist/cjs/useChannelHeaderOnlineStatus.js 8.82 kB
dist/cjs/useInertWhenHidden.js 57.3 kB
dist/cjs/useReducedMotionPreference.js 1.2 kB
dist/cjs/useStableCallback.js 902 B
dist/cjs/useStableId.js 24.7 kB
dist/css/ai-components.css 4.58 kB
dist/css/channel-detail.css 2.84 kB
dist/css/emoji-picker.css 178 B
dist/css/emoji-replacement.css 456 B
dist/css/index.css 42.1 kB
dist/es/_virtual/_rolldown/runtime.mjs 252 B
dist/es/a11y/a11yUtils.mjs 630 B
dist/es/a11y/accessibleLabel.mjs 721 B
dist/es/a11y/hooks/useAriaIdentifiers.mjs 540 B
dist/es/a11y/hooks/useListboxKeyboardNavigation.mjs 1.52 kB
dist/es/a11y/hooks/useResolvedModalAriaProps.mjs 497 B
dist/es/a11y/hooks/useVirtualizedListboxKeyboardNavigation.mjs 1.39 kB
dist/es/ai-components.mjs 298 B
dist/es/channel-detail.mjs 802 B
dist/es/components/Accessibility/AriaLiveAnnouncerProvider.mjs 1.65 kB
dist/es/components/Accessibility/AriaLiveOutlet.mjs 964 B
dist/es/components/Accessibility/AriaLiveOutletContext.mjs 194 B
dist/es/components/Accessibility/hooks/useAudioPlaybackChangeAnnouncements.mjs 425 B
dist/es/components/Accessibility/hooks/useFocusReturn.mjs 916 B
dist/es/components/Accessibility/hooks/useIncomingMessageAnnouncements.mjs 1.19 kB
dist/es/components/Accessibility/hooks/useInertWhenHidden.mjs 1.62 kB
dist/es/components/Accessibility/hooks/useInteractionAnnouncements.mjs 3.02 kB
dist/es/components/Accessibility/NotificationAnnouncer.mjs 1.4 kB
dist/es/components/Accessibility/scheduling/useAnnouncementQueue.mjs 793 B
dist/es/components/Accessibility/scheduling/useDebouncedAnnounce.mjs 1.68 kB
dist/es/components/Accessibility/scheduling/useSettledAnnouncement.mjs 1.84 kB
dist/es/components/Accessibility/useAriaLiveAnnouncer.mjs 300 B
dist/es/components/AIStateIndicator/AIStateIndicator.mjs 458 B
dist/es/components/AIStateIndicator/hooks/useAIState.mjs 616 B
dist/es/components/Attachment/attachment-sizing.mjs 1.05 kB
dist/es/components/Attachment/Attachment.mjs 971 B
dist/es/components/Attachment/AttachmentActions.mjs 1.59 kB
dist/es/components/Attachment/AttachmentContainer.mjs 2.47 kB
dist/es/components/Attachment/Audio.mjs 1.48 kB
dist/es/components/Attachment/audioSampling.mjs 1.29 kB
dist/es/components/Attachment/components/AttachmentUploadProgressIndicator.mjs 825 B
dist/es/components/Attachment/components/DownloadButton.mjs 669 B
dist/es/components/Attachment/components/FileSizeIndicator.mjs 436 B
dist/es/components/Attachment/FileAttachment.mjs 644 B
dist/es/components/Attachment/Geolocation.mjs 1.07 kB
dist/es/components/Attachment/Giphy.mjs 1.03 kB
dist/es/components/Attachment/giphyAccessibility.mjs 481 B
dist/es/components/Attachment/hooks/useAttachmentUploadState.mjs 2.31 kB
dist/es/components/Attachment/hooks/useLocalVideoDimensions.mjs 1.43 kB
dist/es/components/Attachment/icons.mjs 411 B
dist/es/components/Attachment/Image.mjs 346 B
dist/es/components/Attachment/LinkPreview/Card.mjs 1.03 kB
dist/es/components/Attachment/LinkPreview/UnableToRenderCard.mjs 402 B
dist/es/components/Attachment/ModalGallery.mjs 1.87 kB
dist/es/components/Attachment/UnsupportedAttachment.mjs 403 B
dist/es/components/Attachment/utils.mjs 740 B
dist/es/components/Attachment/VideoAttachment.mjs 936 B
dist/es/components/Attachment/VisibilityDisclaimer.mjs 354 B
dist/es/components/Attachment/VoiceRecording.mjs 1.75 kB
dist/es/components/AudioPlayback/AudioPlayer.mjs 3.58 kB
dist/es/components/AudioPlayback/AudioPlayerPool.mjs 1.01 kB
dist/es/components/AudioPlayback/components/DurationDisplay.mjs 596 B
dist/es/components/AudioPlayback/components/formatTime.mjs 339 B
dist/es/components/AudioPlayback/components/keyboardSeek.mjs 524 B
dist/es/components/AudioPlayback/components/PlaybackRateButton.mjs 300 B
dist/es/components/AudioPlayback/components/ProgressBar.mjs 819 B
dist/es/components/AudioPlayback/components/progressBarA11y.mjs 460 B
dist/es/components/AudioPlayback/components/useInteractiveProgressBar.mjs 1.07 kB
dist/es/components/AudioPlayback/components/WaveProgressBar.mjs 1.72 kB
dist/es/components/AudioPlayback/plugins/AudioPlayerNotificationsPlugin.mjs 613 B
dist/es/components/AudioPlayback/WithAudioPlayback.mjs 1 kB
dist/es/components/Avatar/Avatar.mjs 1.02 kB
dist/es/components/Avatar/AvatarStack.mjs 669 B
dist/es/components/Avatar/ChannelAvatar.mjs 344 B
dist/es/components/Avatar/GroupAvatar.mjs 868 B
dist/es/components/Avatar/utils.mjs 183 B
dist/es/components/Badge/Badge.mjs 509 B
dist/es/components/Badge/MediaBadge.mjs 426 B
dist/es/components/BaseImage/BaseImage.mjs 682 B
dist/es/components/BaseImage/ImagePlaceholder.mjs 397 B
dist/es/components/BaseImage/toBaseImageDescriptors.mjs 547 B
dist/es/components/Button/Button.mjs 529 B
dist/es/components/Button/PlayButton.mjs 475 B
dist/es/components/Channel/Channel.mjs 7.14 kB
dist/es/components/Channel/channelState.mjs 978 B
dist/es/components/Channel/constants.mjs 156 B
dist/es/components/Channel/hooks/useChannelContainerClasses.mjs 391 B
dist/es/components/Channel/hooks/useCreateChannelStateContext.mjs 1.1 kB
dist/es/components/Channel/hooks/useCreateTypingContext.mjs 229 B
dist/es/components/Channel/hooks/useEditMessageHandler.mjs 297 B
dist/es/components/Channel/hooks/useIsMounted.mjs 235 B
dist/es/components/Channel/hooks/useMentionsHandlers.mjs 448 B
dist/es/components/Channel/utils.mjs 2.12 kB
dist/es/components/ChannelHeader/ChannelHeader.mjs 927 B
dist/es/components/ChannelHeader/hooks/useChannelHasMembersOnline.mjs 651 B
dist/es/components/ChannelHeader/hooks/useChannelHeaderOnlineStatus.mjs 599 B
dist/es/components/ChannelList/ChannelList.mjs 2.29 kB
dist/es/components/ChannelList/ChannelListHeader.mjs 380 B
dist/es/components/ChannelList/ChannelListUI.mjs 607 B
dist/es/components/ChannelList/hooks/useChannelListKeyboardNavigation.mjs 1.25 kB
dist/es/components/ChannelList/hooks/useChannelListShape.mjs 2.14 kB
dist/es/components/ChannelList/hooks/useChannelMembershipState.mjs 262 B
dist/es/components/ChannelList/hooks/useChannelMembersState.mjs 300 B
dist/es/components/ChannelList/hooks/useConnectionRecoveredListener.mjs 306 B
dist/es/components/ChannelList/hooks/usePaginatedChannels.mjs 1.59 kB
dist/es/components/ChannelList/hooks/useSelectedChannelState.mjs 403 B
dist/es/components/ChannelList/utils.mjs 1.05 kB
dist/es/components/ChannelListItem/ChannelListItem.mjs 1.3 kB
dist/es/components/ChannelListItem/ChannelListItemActionButtons.mjs 2.46 kB
dist/es/components/ChannelListItem/ChannelListItemTimestamp.mjs 505 B
dist/es/components/ChannelListItem/ChannelListItemUI.mjs 1.51 kB
dist/es/components/ChannelListItem/hooks/useChannelDisplayName.mjs 817 B
dist/es/components/ChannelListItem/hooks/useChannelPreviewInfo.mjs 624 B
dist/es/components/ChannelListItem/hooks/useIsChannelMuted.mjs 671 B
dist/es/components/ChannelListItem/hooks/useIsUserMuted.mjs 269 B
dist/es/components/ChannelListItem/hooks/useMessageDeliveryStatus.mjs 830 B
dist/es/components/ChannelListItem/utils.a11y.mjs 2.37 kB
dist/es/components/ChannelListItem/utils.mjs 2.59 kB
dist/es/components/Chat/Chat.mjs 1.25 kB
dist/es/components/Chat/hooks/useChannelsQueryState.mjs 250 B
dist/es/components/Chat/hooks/useChat.mjs 1.05 kB
dist/es/components/Chat/hooks/useCreateChatClient.mjs 533 B
dist/es/components/Chat/hooks/useCreateChatContext.mjs 539 B
dist/es/components/Chat/hooks/useReportLostConnectionSystemNotification.mjs 677 B
dist/es/components/Chat/hooks/useSplitActionSet.mjs 319 B
dist/es/components/ChatView/a11y.utility.mjs 291 B
dist/es/components/ChatView/mjs 2.24 kB
dist/es/components/DateSeparator/DateSeparator.mjs 575 B
dist/es/components/Dialog/components/Alert.mjs 647 B
dist/es/components/Dialog/components/Callout.mjs 819 B
dist/es/components/Dialog/components/ContextMenu.mjs 5.49 kB
dist/es/components/Dialog/components/Prompt.mjs 1.07 kB
dist/es/components/Dialog/components/Viewer.mjs 963 B
dist/es/components/Dialog/hooks/useDialog.mjs 688 B
dist/es/components/Dialog/hooks/usePopoverPosition.mjs 839 B
dist/es/components/Dialog/service/DialogAnchor.mjs 2.06 kB
dist/es/components/Dialog/service/DialogManager.mjs 1.29 kB
dist/es/components/Dialog/service/DialogPortal.mjs 1.02 kB
dist/es/components/DragAndDrop/DragAndDropContainer.mjs 1.16 kB
dist/es/components/EmptyStateIndicator/EmptyStateIndicator.mjs 547 B
dist/es/components/EventComponent/EventComponent.mjs 462 B
dist/es/components/FileIcon/FileIconSet.mjs 6.71 kB
dist/es/components/FileIcon/iconMap.mjs 512 B
dist/es/components/FileIcon/mimeTypes.mjs 1.73 kB
dist/es/components/FileIcon/mjs 599 B
dist/es/components/Form/FieldError.mjs 261 B
dist/es/components/Form/hooks/useFormState.mjs 550 B
dist/es/components/Form/mjs 1.55 kB
dist/es/components/Form/NumericInput.mjs 1.33 kB
dist/es/components/Form/SwitchField.mjs 1.53 kB
dist/es/components/Form/TextInput.mjs 1.3 kB
dist/es/components/Form/TextInputFieldSet.mjs 376 B
dist/es/components/Gallery/Gallery.mjs 654 B
dist/es/components/Gallery/GalleryContext.mjs 422 B
dist/es/components/Gallery/GalleryHeader.mjs 939 B
dist/es/components/Gallery/GalleryUI.mjs 2.02 kB
dist/es/components/Icons/createIcon.mjs 429 B
dist/es/components/Icons/icons.mjs 19.3 kB
dist/es/components/Icons/mjs 378 B
dist/es/components/InfiniteScrollPaginator/hooks/useCursorPaginator.mjs 591 B
dist/es/components/InfiniteScrollPaginator/InfiniteScroll.mjs 1.34 kB
dist/es/components/InfiniteScrollPaginator/InfiniteScrollPaginator.mjs 1.03 kB
dist/es/components/ListItemLayout/ListItemLayout.mjs 707 B
dist/es/components/Loading/AttachmentUploadedSizeIndicator.mjs 634 B
dist/es/components/Loading/LoadingChannel.mjs 639 B
dist/es/components/Loading/LoadingChannels.mjs 377 B
dist/es/components/Loading/LoadingErrorIndicator.mjs 395 B
dist/es/components/Loading/LoadingIndicator.mjs 286 B
dist/es/components/Loading/progress-indicators.mjs 714 B
dist/es/components/Loading/UploadedSizeIndicator.mjs 413 B
dist/es/components/Loading/UploadProgressIndicator.mjs 366 B
dist/es/components/LoadMore/LoadMoreButton.mjs 492 B
dist/es/components/LoadMore/LoadMorePaginator.mjs 378 B
dist/es/components/Location/hooks/useLiveLocationSharingManager.mjs 631 B
dist/es/components/Location/ShareLocationDialog.mjs 2.2 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorder.mjs 621 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecorderRecordingControls.mjs 1 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingButtonWithNotification.mjs 1.04 kB
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPlayback.mjs 989 B
dist/es/components/MediaRecorder/AudioRecorder/AudioRecordingPreview.mjs 909 B
dist/es/components/MediaRecorder/AudioRecorder/hooks/useTimeElapsed.mjs 434 B
dist/es/components/MediaRecorder/AudioRecorder/recordingStateIdentity.mjs 227 B
dist/es/components/MediaRecorder/AudioRecorder/RecordingTimer.mjs 322 B
dist/es/components/MediaRecorder/classes/AmplitudeRecorder.mjs 1.05 kB
dist/es/components/MediaRecorder/classes/BrowserPermission.mjs 749 B
dist/es/components/MediaRecorder/classes/MediaRecorderController.mjs 2.53 kB
dist/es/components/MediaRecorder/hooks/useMediaRecorder.mjs 962 B
dist/es/components/MediaRecorder/observable/BehaviorSubject.mjs 353 B
dist/es/components/MediaRecorder/observable/mjs 186 B
dist/es/components/MediaRecorder/observable/Observable.mjs 310 B
dist/es/components/MediaRecorder/observable/Subject.mjs 548 B
dist/es/components/MediaRecorder/observable/Subscription.mjs 206 B
dist/es/components/MediaRecorder/RecordingPermissionDeniedNotification.mjs 481 B
dist/es/components/MediaRecorder/transcode/audioProcessing.mjs 758 B
dist/es/components/MediaRecorder/transcode/index.mjs 351 B
dist/es/components/MediaRecorder/transcode/wav.mjs 1.33 kB
dist/es/components/Message/emojiRegex.mjs 450 B
dist/es/components/Message/hooks/useActionHandler.mjs 596 B
dist/es/components/Message/hooks/useDeleteHandler.mjs 363 B
dist/es/components/Message/hooks/useFlagHandler.mjs 382 B
dist/es/components/Message/hooks/useMarkUnreadHandler.mjs 324 B
dist/es/components/Message/hooks/useMentionsHandler.mjs 455 B
dist/es/components/Message/hooks/useMessageReminder.mjs 300 B
dist/es/components/Message/hooks/useMessageTextStreaming.mjs 783 B
dist/es/components/Message/hooks/useMuteHandler.mjs 433 B
dist/es/components/Message/hooks/useOpenThreadHandler.mjs 333 B
dist/es/components/Message/hooks/useReactionHandler.mjs 1.36 kB
dist/es/components/Message/hooks/useReactionsFetcher.mjs 492 B
dist/es/components/Message/hooks/useRetryHandler.mjs 266 B
dist/es/components/Message/hooks/useUserHandler.mjs 255 B
dist/es/components/Message/hooks/useUserRole.mjs 718 B
dist/es/components/Message/Message.mjs 1.81 kB
dist/es/components/Message/MessageAlsoSentInChannelIndicator.mjs 1.1 kB
dist/es/components/Message/MessageBlocked.mjs 444 B
dist/es/components/Message/MessageBubble.mjs 246 B
dist/es/components/Message/MessageDeletedBubble.mjs 399 B
dist/es/components/Message/MessageEditedIndicator.mjs 692 B
dist/es/components/Message/MessageRepliesCountButton.mjs 744 B
dist/es/components/Message/MessageStatus.mjs 1.25 kB
dist/es/components/Message/MessageText.mjs 1.62 kB
dist/es/components/Message/MessageTimestamp.mjs 361 B
dist/es/components/Message/MessageTranslationIndicator.mjs 866 B
dist/es/components/Message/MessageUI.mjs 2.77 kB
dist/es/components/Message/PinIndicator.mjs 610 B
dist/es/components/Message/QuotedMessage.mjs 424 B
dist/es/components/Message/ReminderNotification.mjs 947 B
dist/es/components/Message/renderText/componentRenderers/Anchor.mjs 406 B
dist/es/components/Message/renderText/componentRenderers/Emoji.mjs 246 B
dist/es/components/Message/renderText/componentRenderers/Mention.mjs 307 B
dist/es/components/Message/renderText/regex.mjs 440 B
dist/es/components/Message/renderText/rehypePlugins/emojiMarkdownPlugin.mjs 338 B
dist/es/components/Message/renderText/rehypePlugins/mentionsMarkdownPlugin.mjs 1.47 kB
dist/es/components/Message/renderText/remarkPlugins/htmlToTextPlugin.mjs 243 B
dist/es/components/Message/renderText/remarkPlugins/imageToLink.mjs 591 B
dist/es/components/Message/renderText/remarkPlugins/keepLineBreaksPlugin.mjs 824 B
dist/es/components/Message/renderText/remarkPlugins/plusPlusToEmphasis.mjs 962 B
dist/es/components/Message/renderText/remarkPlugins/remarkIgnoreMarkdown.mjs 337 B
dist/es/components/Message/renderText/renderText.mjs 1.58 kB
dist/es/components/Message/StreamedMessageText.mjs 484 B
dist/es/components/Message/Timestamp.mjs 517 B
dist/es/components/Message/utils.mjs 2.65 kB
dist/es/components/MessageActions/DeleteMessageAlert.mjs 581 B
dist/es/components/MessageActions/DownloadSubmenu.mjs 812 B
dist/es/components/MessageActions/downloadUtils.mjs 980 B
dist/es/components/MessageActions/hooks/useBaseMessageActionSetFilter.mjs 1.23 kB
dist/es/components/MessageActions/MessageActions.mjs 3.9 kB
dist/es/components/MessageActions/QuickMessageActionButton.mjs 359 B
dist/es/components/MessageActions/RemindMeSubmenu.mjs 997 B
dist/es/components/MessageBounce/MessageBounceModal.mjs 348 B
dist/es/components/MessageBounce/MessageBouncePrompt.mjs 772 B
dist/es/components/MessageComposer/AttachmentPreviewList/AttachmentPreviewList.mjs 1.19 kB
dist/es/components/MessageComposer/AttachmentPreviewList/AudioAttachmentPreview.mjs 1.75 kB
dist/es/components/MessageComposer/AttachmentPreviewList/FileAttachmentPreview.mjs 1.05 kB
dist/es/components/MessageComposer/AttachmentPreviewList/GeolocationPreview.mjs 715 B
dist/es/components/MessageComposer/AttachmentPreviewList/MediaAttachmentPreview.mjs 1.33 kB
dist/es/components/MessageComposer/AttachmentPreviewList/UnsupportedAttachmentPreview.mjs 529 B
dist/es/components/MessageComposer/AttachmentPreviewList/utils/AttachmentPreviewRoot.mjs 884 B
dist/es/components/MessageComposer/AttachmentPreviewList/VoiceRecordingPreviewSlot.mjs 548 B
dist/es/components/MessageComposer/AttachmentSelector/AttachmentSelector.mjs 3.23 kB
dist/es/components/MessageComposer/AttachmentSelector/CommandsMenu.mjs 1.29 kB
dist/es/components/MessageComposer/CommandChip.mjs 550 B
dist/es/components/MessageComposer/CooldownTimer.mjs 294 B
dist/es/components/MessageComposer/EditedMessagePreview.mjs 318 B
dist/es/components/MessageComposer/hooks/useAttachmentManagerState.mjs 405 B
dist/es/components/MessageComposer/hooks/useAttachmentsForPreview.mjs 362 B
dist/es/components/MessageComposer/hooks/useCanCreatePoll.mjs 285 B
dist/es/components/MessageComposer/hooks/useCooldownRemaining.mjs 449 B
dist/es/components/MessageComposer/hooks/useCreateMessageComposerContext.mjs 429 B
dist/es/components/MessageComposer/hooks/useIsCooldownActive.mjs 294 B
dist/es/components/MessageComposer/hooks/useMessageComposerBindings.mjs 374 B
dist/es/components/MessageComposer/hooks/useMessageComposerCommands.mjs 414 B
dist/es/components/MessageComposer/hooks/useMessageComposerController.mjs 680 B
dist/es/components/MessageComposer/hooks/useMessageComposerHasSendableData.mjs 274 B
dist/es/components/MessageComposer/hooks/useMessageContentIsEmpty.mjs 274 B
dist/es/components/MessageComposer/hooks/usePasteHandler.mjs 577 B
dist/es/components/MessageComposer/hooks/useSubmitHandler.mjs 1.49 kB
dist/es/components/MessageComposer/hooks/useTextareaRef.mjs 269 B
dist/es/components/MessageComposer/hooks/utils.mjs 339 B
dist/es/components/MessageComposer/icons.mjs 1.26 kB
dist/es/components/MessageComposer/LinkPreviewList.mjs 1.07 kB
dist/es/components/MessageComposer/MessageComposer.mjs 1.01 kB
dist/es/components/MessageComposer/MessageComposerActions.mjs 1.31 kB
dist/es/components/MessageComposer/MessageComposerUI.mjs 1.41 kB
dist/es/components/MessageComposer/preEditSnapshot.mjs 627 B
dist/es/components/MessageComposer/QuotedMessageIndicator.mjs 263 B
dist/es/components/MessageComposer/QuotedMessagePreview.mjs 2.93 kB
dist/es/components/MessageComposer/RemoveAttachmentPreviewButton.mjs 586 B
dist/es/components/MessageComposer/SendButton.mjs 483 B
dist/es/components/MessageComposer/SendToChannelCheckbox.mjs 748 B
dist/es/components/MessageComposer/StopAIGenerationButton.mjs 354 B
dist/es/components/MessageComposer/WithDragAndDropUpload.mjs 1.59 kB
dist/es/components/MessageList/FloatingDateSeparator.mjs 687 B
dist/es/components/MessageList/GiphyPreviewMessage.mjs 278 B
dist/es/components/MessageList/hooks/MessageList/useEnrichedMessages.mjs 648 B
dist/es/components/MessageList/hooks/MessageList/useFloatingDateSeparatorMessageList.mjs 933 B
dist/es/components/MessageList/hooks/MessageList/useMessageListElements.mjs 571 B
dist/es/components/MessageList/hooks/MessageList/useMessageListScrollManager.mjs 1.68 kB
dist/es/components/MessageList/hooks/MessageList/useScrollLocationLogic.mjs 3.14 kB
dist/es/components/MessageList/hooks/MessageList/useUnreadMessagesNotification.mjs 1.12 kB
dist/es/components/MessageList/hooks/useLastDeliveredData.mjs 539 B
dist/es/components/MessageList/hooks/useLastOwnMessage.mjs 249 B
dist/es/components/MessageList/hooks/useLastReadData.mjs 397 B
dist/es/components/MessageList/hooks/useMarkRead.mjs 1.18 kB
dist/es/components/MessageList/hooks/useReducedMotionPreference.mjs 475 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useFloatingDateSeparator.mjs 955 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useGiphyPreview.mjs 427 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useMessageSetKey.mjs 396 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useNewMessageNotification.mjs 533 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/usePrependMessagesCount.mjs 647 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollerViewport.mjs 1.12 kB
dist/es/components/MessageList/hooks/VirtualizedMessageList/useScrollToBottomOnNewMessage.mjs 499 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useShouldForceScrollToBottom.mjs 422 B
dist/es/components/MessageList/hooks/VirtualizedMessageList/useUnreadMessagesNotificationVirtualized.mjs 721 B
dist/es/components/MessageList/MessageList.mjs 3.87 kB
dist/es/components/MessageList/MessageListMainPanel.mjs 284 B
dist/es/components/MessageList/NewMessageNotification.mjs 519 B
dist/es/components/MessageList/renderMessages.mjs 1.13 kB
dist/es/components/MessageList/ScrollToLatestMessageButton.mjs 1.09 kB
dist/es/components/MessageList/UnreadMessagesNotification.mjs 616 B
dist/es/components/MessageList/UnreadMessagesSeparator.mjs 601 B
dist/es/components/MessageList/utils.mjs 2.19 kB
dist/es/components/MessageList/VirtualizedMessageList.mjs 4.35 kB
dist/es/components/MessageList/VirtualizedMessageListComponents.mjs 1.66 kB
dist/es/components/Modal/GlobalModal.mjs 1.81 kB
dist/es/components/Notifications/hooks/useNotificationApi.mjs 1.27 kB
dist/es/components/Notifications/hooks/useNotifications.mjs 569 B
dist/es/components/Notifications/hooks/useNotificationTarget.mjs 422 B
dist/es/components/Notifications/hooks/useSystemNotifications.mjs 458 B
dist/es/components/Notifications/Notification.mjs 1.22 kB
dist/es/components/Notifications/NotificationConfigurationContext.mjs 386 B
dist/es/components/Notifications/NotificationList.mjs 3.17 kB
dist/es/components/Notifications/notificationTarget.mjs 636 B
dist/es/components/Poll/hooks/useManagePollVotesRealtime.mjs 686 B
dist/es/components/Poll/hooks/usePollAnswerPagination.mjs 566 B
dist/es/components/Poll/hooks/usePollOptionVotesPagination.mjs 572 B
dist/es/components/Poll/mjs 872 B
dist/es/components/Poll/Poll.mjs 302 B
dist/es/components/Poll/PollActions/AddCommentPrompt.mjs 1.25 kB
dist/es/components/Poll/PollActions/EndPollAlert.mjs 764 B
dist/es/components/Poll/PollActions/PollAction.mjs 492 B
dist/es/components/Poll/PollActions/PollActions.mjs 1.26 kB
dist/es/components/Poll/PollActions/PollAnswerList.mjs 1.01 kB
dist/es/components/Poll/PollActions/PollOptionsFullList.mjs 561 B
dist/es/components/Poll/PollActions/PollQuestion.mjs 335 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotes.mjs 815 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesHeader.mjs 684 B
dist/es/components/Poll/PollActions/PollResults/PollOptionWithVotesList.mjs 615 B
dist/es/components/Poll/PollActions/PollResults/PollResults.mjs 1.03 kB
dist/es/components/Poll/PollActions/SuggestPollOptionPrompt.mjs 1.23 kB
dist/es/components/Poll/PollContent.mjs 488 B
dist/es/components/Poll/PollCreationDialog/MultipleAnswersField.mjs 1.24 kB
dist/es/components/Poll/PollCreationDialog/NameField.mjs 677 B
dist/es/components/Poll/PollCreationDialog/OptionFieldSet.mjs 2.24 kB
dist/es/components/Poll/PollCreationDialog/PollCreationDialog.mjs 1.02 kB
dist/es/components/Poll/PollCreationDialog/PollCreationDialogControls.mjs 820 B
dist/es/components/Poll/PollCreationDialog/PollOptionReorderHandle.mjs 982 B
dist/es/components/Poll/PollHeader.mjs 635 B
dist/es/components/Poll/PollOptionList.mjs 814 B
dist/es/components/Poll/PollOptionSelector.mjs 1.47 kB
dist/es/components/Portal/Portal.mjs 300 B
dist/es/components/ReactFileUtilities/UploadButton.mjs 803 B
dist/es/components/ReactFileUtilities/utils.mjs 1.06 kB
dist/es/components/Reactions/hooks/useFetchReactions.mjs 701 B
dist/es/components/Reactions/hooks/useProcessReactions.mjs 1.23 kB
dist/es/components/Reactions/MessageReactions.mjs 2.07 kB
dist/es/components/Reactions/MessageReactionsDetail.mjs 1.89 kB
dist/es/components/Reactions/reactionOptions.mjs 1.11 kB
dist/es/components/Reactions/ReactionSelector.mjs 1.58 kB
dist/es/components/Reactions/ReactionSelectorWithButton.mjs 910 B
dist/es/components/Reactions/SpriteImage.mjs 727 B
dist/es/components/Reactions/utils/utils.mjs 284 B
dist/es/components/SafeAnchor/SafeAnchor.mjs 336 B
dist/es/components/Search/hooks/useAnnounceSearchResultCount.mjs 1.31 kB
dist/es/components/Search/hooks/useSearchFocusedMessage.mjs 296 B
dist/es/components/Search/hooks/useSearchQueriesInProgress.mjs 450 B
dist/es/components/Search/hooks/useSearchResultsKeyboardNavigation.mjs 721 B
dist/es/components/Search/Search.mjs 643 B
dist/es/components/Search/SearchBar/SearchBar.mjs 1.32 kB
dist/es/components/Search/SearchContext.mjs 306 B
dist/es/components/Search/SearchResults/SearchResultItem.mjs 1.27 kB
dist/es/components/Search/SearchResults/SearchResults.mjs 711 B
dist/es/components/Search/SearchResults/SearchResultsHeader.mjs 856 B
dist/es/components/Search/SearchResults/SearchResultsPresearch.mjs 305 B
dist/es/components/Search/SearchResults/SearchSourceResultList.mjs 649 B
dist/es/components/Search/SearchResults/SearchSourceResultListFooter.mjs 547 B
dist/es/components/Search/SearchResults/SearchSourceResults.mjs 562 B
dist/es/components/Search/SearchResults/SearchSourceResultsEmpty.mjs 308 B
dist/es/components/Search/SearchResults/SearchSourceResultsHeader.mjs 148 B
dist/es/components/Search/SearchResults/SearchSourceResultsLoadingIndicator.mjs 375 B
dist/es/components/Search/SearchSourceResultsContext.mjs 316 B
dist/es/components/SkipNavigation/SkipNavigation.mjs 1.01 kB
dist/es/components/SummarizedMessagePreview/hooks/useLatestMessagePreview.mjs 1.36 kB
dist/es/components/SummarizedMessagePreview/SummarizedMessagePreview.mjs 821 B
dist/es/components/TextareaComposer/hooks/useTextareaPlaceholder.mjs 600 B
dist/es/components/TextareaComposer/SuggestionList/CommandItem.mjs 481 B
dist/es/components/TextareaComposer/SuggestionList/EmoticonItem.mjs 508 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/BroadcastMentionItem.mjs 614 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionItem.mjs 439 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/MentionSuggestionTitle.mjs 236 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/SpecialMentionItem.mjs 161 B
dist/es/components/TextareaComposer/SuggestionList/MentionItem/UserGroupItem.mjs 590 B
dist/es/components/TextareaComposer/SuggestionList/SuggestionList.mjs 2.39 kB
dist/es/components/TextareaComposer/SuggestionList/SuggestionListItem.mjs 648 B
dist/es/components/TextareaComposer/SuggestionList/TokenizedSuggestionParts.mjs 608 B
dist/es/components/TextareaComposer/TextareaComposer.mjs 3.78 kB
dist/es/components/Thread/LegacyThreadContext.mjs 198 B
dist/es/components/Thread/Thread.mjs 1.39 kB
dist/es/components/Thread/ThreadHead.mjs 416 B
dist/es/components/Thread/ThreadHeader.mjs 1.34 kB
dist/es/components/Thread/ThreadStart.mjs 461 B
dist/es/components/Threads/ThreadContext.mjs 305 B
dist/es/components/Threads/ThreadList/ThreadList.mjs 1.52 kB
dist/es/components/Threads/ThreadList/ThreadListEmptyPlaceholder.mjs 390 B
dist/es/components/Threads/ThreadList/ThreadListHeader.mjs 395 B
dist/es/components/Threads/ThreadList/ThreadListItem.mjs 351 B
dist/es/components/Threads/ThreadList/ThreadListItemUI.mjs 1.72 kB
dist/es/components/Threads/ThreadList/ThreadListLoadingIndicator.mjs 441 B
dist/es/components/Threads/ThreadList/ThreadListUnseenThreadsBanner.mjs 625 B
dist/es/components/Threads/ThreadList/utils.a11y.mjs 1.74 kB
dist/es/components/Threads/UnreadCountBadge.mjs 332 B
dist/es/components/Tooltip/hooks/useEnterLeaveHandlers.mjs 296 B
dist/es/components/Tooltip/Tooltip.mjs 556 B
dist/es/components/TypingIndicator/hooks/useDebouncedTypingActive.mjs 974 B
dist/es/components/TypingIndicator/TypingIndicator.mjs 1.22 kB
dist/es/components/TypingIndicator/TypingIndicatorDots.mjs 411 B
dist/es/components/TypingIndicator/TypingIndicatorHeader.mjs 838 B
dist/es/components/TypingIndicator/utils/getTypingStatusMessage.mjs 384 B
dist/es/components/UtilityComponents/ErrorBoundary.mjs 313 B
dist/es/components/UtilityComponents/hooks/useMutationObserver.mjs 798 B
dist/es/components/UtilityComponents/NullComponent.mjs 138 B
dist/es/components/UtilityComponents/useStableId.mjs 455 B
dist/es/components/VideoPlayer/ReactPlayerWrapper.mjs 481 B
dist/es/components/VideoPlayer/VideoPlayer.mjs 466 B
dist/es/components/VideoPlayer/VideoThumbnail.mjs 550 B
dist/es/components/VisuallyHidden/VisuallyHidden.mjs 397 B
dist/es/components/Window/Window.mjs 406 B
dist/es/constants/messageTypes.mjs 173 B
dist/es/context/AttachmentSelectorContext.mjs 272 B
dist/es/context/ChannelActionContext.mjs 412 B
dist/es/context/ChannelListContext.mjs 334 B
dist/es/context/ChannelStateContext.mjs 453 B
dist/es/context/ChatContext.mjs 402 B
dist/es/context/ComponentContext.mjs 263 B
dist/es/context/DialogManagerContext.mjs 1.38 kB
dist/es/context/MessageBounceContext.mjs 739 B
dist/es/context/MessageComposerContext.mjs 306 B
dist/es/context/MessageContext.mjs 305 B
dist/es/context/MessageListContext.mjs 434 B
dist/es/context/MessageTranslationViewContext.mjs 1.55 kB
dist/es/context/ModalContext.mjs 385 B
dist/es/context/PollContext.mjs 278 B
dist/es/context/TranslationContext.mjs 544 B
dist/es/context/TypingContext.mjs 408 B
dist/es/context/useComponentContextIcons.mjs 564 B
dist/es/context/VirtualizedMessageListContext.mjs 310 B
dist/es/context/WithComponents.mjs 308 B
dist/es/emojis.mjs 126 B
dist/es/i18n/de.mjs 12.1 kB
dist/es/i18n/en.mjs 8.92 kB
dist/es/i18n/es.mjs 12.3 kB
dist/es/i18n/fr.mjs 12.5 kB
dist/es/i18n/hi.mjs 13.4 kB
dist/es/i18n/it.mjs 12.2 kB
dist/es/i18n/ja.mjs 12.7 kB
dist/es/i18n/ko.mjs 12.4 kB
dist/es/i18n/nl.mjs 11.8 kB
dist/es/i18n/pt.mjs 12.2 kB
dist/es/i18n/ru.mjs 14.5 kB
dist/es/i18n/Streami18n.mjs 5.08 kB
dist/es/i18n/tr.mjs 11.9 kB
dist/es/i18n/TranslationBuilder/notifications/NotificationTranslationTopic.mjs 588 B
dist/es/i18n/TranslationBuilder/notifications/translators.mjs 668 B
dist/es/i18n/TranslationBuilder/notifications/translatorsByNotificationType.mjs 592 B
dist/es/i18n/TranslationBuilder/TranslationBuilder.mjs 741 B
dist/es/i18n/utils.mjs 2.04 kB
dist/es/index.mjs 8.57 kB
dist/es/mp3-encoder.mjs 778 B
dist/es/plugins/AIComponents/AIMarkdown/AIMarkdown.mjs 1.19 kB
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/Chart.mjs 796 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/chartJsSchema.mjs 425 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/chartTypes.mjs 517 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/JsonChart.mjs 424 B
dist/es/plugins/AIComponents/AIMarkdown/tools/charts/SuspendedChart.mjs 715 B
dist/es/plugins/AIComponents/AIMessageComposer/AIMessageComposer.mjs 2.7 kB
dist/es/plugins/AIComponents/AIMessageComposer/AttachmentPreview.mjs 973 B
dist/es/plugins/AIComponents/AIMessageComposer/hooks/useSpeechToText.mjs 1.12 kB
dist/es/plugins/AIComponents/AIStateIndicator/AIStateIndicator.mjs 656 B
dist/es/plugins/AIComponents/hooks/useHeardText.mjs 2.49 kB
dist/es/plugins/AIComponents/StreamingMessage/StreamingMessage.mjs 456 B
dist/es/plugins/AIComponents/VoiceVisualization/bounce.mjs 804 B
dist/es/plugins/AIComponents/VoiceVisualization/cssGlow.mjs 2.27 kB
dist/es/plugins/AIComponents/VoiceVisualization/driver.mjs 1.99 kB
dist/es/plugins/AIComponents/VoiceVisualization/hitArea.mjs 496 B
dist/es/plugins/AIComponents/VoiceVisualization/math.mjs 1.15 kB
dist/es/plugins/AIComponents/VoiceVisualization/palette.mjs 1.59 kB
dist/es/plugins/AIComponents/VoiceVisualization/renderers/glowWebGLRenderer.mjs 4.75 kB
dist/es/plugins/AIComponents/VoiceVisualization/renderers/types.mjs 216 B
dist/es/plugins/AIComponents/VoiceVisualization/renderers/waveRenderer.mjs 2.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/simplex.mjs 1.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/useAudioLevel.mjs 1.26 kB
dist/es/plugins/AIComponents/VoiceVisualization/useVoiceStateLabel.mjs 356 B
dist/es/plugins/AIComponents/VoiceVisualization/VoiceGlow.mjs 771 B
dist/es/plugins/AIComponents/VoiceVisualization/VoiceGlowCss.mjs 3.39 kB
dist/es/plugins/AIComponents/VoiceVisualization/VoiceVisualizationView.mjs 2.38 kB
dist/es/plugins/AIComponents/VoiceVisualization/VoiceWave.mjs 628 B
dist/es/plugins/ChannelDetail/AvatarWithChannelDetail.mjs 703 B
dist/es/plugins/ChannelDetail/ChannelDetail.mjs 944 B
dist/es/plugins/ChannelDetail/ChannelDetailContext.mjs 373 B
dist/es/plugins/ChannelDetail/ChannelDetailEmptyList.mjs 337 B
dist/es/plugins/ChannelDetail/ChannelDetailListLoadingIndicator.mjs 419 B
dist/es/plugins/ChannelDetail/ChannelDetailNavButton.mjs 505 B
dist/es/plugins/ChannelDetail/ChannelDetailSearchInput.mjs 567 B
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigator.mjs 1.79 kB
dist/es/plugins/ChannelDetail/SectionNavigator/SectionNavigatorHeader.mjs 832 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesEmptyList.mjs 445 B
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.mjs 1.48 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/ChannelFilesView.utils.mjs 1.1 kB
dist/es/plugins/ChannelDetail/Views/ChannelFilesView/useChannelFilesSearch.mjs 726 B
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementActions.mjs 3.67 kB
dist/es/plugins/ChannelDetail/Views/ChannelManagementView/ChannelManagementView.mjs 3.54 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaEmptyList.mjs 454 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.mjs 2.29 kB
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/ChannelMediaView.utils.mjs 665 B
dist/es/plugins/ChannelDetail/Views/ChannelMediaView/useChannelMediaSearch.mjs 723 B
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberActions.mjs 3.26 kB
dist/es/plugins/ChannelDetail/Views/ChannelMemberDetailView/ChannelMemberDetail.mjs 1 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersAddView.mjs 2.21 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersBrowseView.mjs 1.56 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersHeaderActions.mjs 1.61 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.mjs 1.25 kB
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/ChannelMembersView.utils.mjs 361 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberCount.mjs 408 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMemberIds.mjs 430 B
dist/es/plugins/ChannelDetail/Views/ChannelMembersView/useChannelMembersSearch.mjs 744 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesEmptyList.mjs 447 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/PinnedMessagesView.mjs 1.66 kB
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesCount.mjs 447 B
dist/es/plugins/ChannelDetail/Views/PinnedMessagesView/usePinnedMessagesSearch.mjs 881 B
dist/es/plugins/ChannelDetail/VirtualizedList/VirtualizedList.mjs 670 B
dist/es/plugins/Emojis/EmojiPicker.mjs 1.3 kB
dist/es/plugins/Emojis/middleware/textComposerEmojiMiddleware.mjs 1.37 kB
dist/es/plugins/Emojis/Picker.mjs 324 B
dist/es/store/hooks/useStateStore.mjs 516 B
dist/es/utils/findReverse.mjs 188 B
dist/es/utils/getChannel.mjs 690 B
dist/es/utils/getChannelConfig.mjs 266 B
dist/es/utils/getTextareaCaretRect.mjs 856 B
dist/es/utils/getWholeChar.mjs 368 B
dist/es/utils/isDmChannel.mjs 247 B
dist/es/utils/mergeDeep.mjs 197 B
dist/es/utils/useStableCallback.mjs 831 B

compressed-size-action

@codecov

codecov Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Codecov Report

βœ… All modified and coverable lines are covered by tests.
βœ… Project coverage is 86.60%. Comparing base (8fa9b5f) to head (94d7c3a).
⚠️ Report is 6 commits behind head on release-v14.

Additional details and impacted files
@@               Coverage Diff               @@
##           release-v14    #3359      +/-   ##
===============================================
- Coverage        86.84%   86.60%   -0.25%     
===============================================
  Files              526      541      +15     
  Lines            16699    17617     +918     
  Branches          5251     5431     +180     
===============================================
+ Hits             14503    15257     +754     
- Misses            2196     2360     +164     

β˜” View full report in Codecov by Harness.
πŸ“’ Have feedback on the report? Share it here.

πŸš€ New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • πŸ“¦ JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

oliverlaz added a commit that referenced this pull request Oct 30, 2026
…3360)

Ticket: https://linear.app/stream/issue/REACT-1264

### 🎯 Goal

v15 counterpart of #3359.

A failed pin, unpin, mute, unmute or delete showed a success
notification ("Message pinned", "{{ user }} has been muted", "Message
deleted"), e.g. when a `user` role without the pin permission in the
`videocall` scope tries to pin.

`usePinHandler`, `useMuteHandler` and `useDeleteHandler` caught the API
error and only reported it through the optional `notify`, which
`Message.tsx` never passes. So the handlers always resolved, and the
default `MessageActions` published their success notification instead of
the `*:failed` one.

On `release-v14` only `usePinHandler` swallowed the error, which #3359
covers.

### πŸ›  Implementation details

- `usePinHandler`, `useMuteHandler` and `useDeleteHandler` now rethrow
the request's error. The optional `notify` / `getErrorNotification` path
is unchanged and still fires before the rethrow. `useMuteHandler` no
longer returns early from its `catch` when `notify` is missing, which is
the path `Message.tsx` uses.
- `usePinHandler` rolls back only the pin fields, onto the message as
currently stored, so an edit or reaction that arrived while the request
was in flight is kept. If the pin state changed again in the meantime,
the rollback leaves it alone. The rollback also runs before `notify`, so
a throwing callback cannot leave the optimistic state behind.
- `MessageContext.handlePin` documents that it rejects on failure.
- The vite example's custom message UI catches `handlePin` /
`handleDelete` rejections instead of leaking an unhandled rejection.
- Tests: `usePinHandler.test.tsx` (new) covers pin/unpin success,
rollback, concurrent updates, a newer pin state, and a throwing
`notify`. The mute and delete tests that asserted "notify (and not
throw)" now assert the rethrow, plus a case without `notify`. Two
`Message.test.tsx` tests named "should throw when (un)muting a user
fails" now actually assert it.

Note for custom UIs: `handlePin`, `handleMute` and `handleDelete` from
`MessageContext` now reject when the request fails instead of resolving
silently.

Not included: the handlers (plus flag and mark unread) still return
early without a request when a parameter is missing, so the action shows
success. That only affects custom messages and handlers and is left for
a follow-up.

### 🎨 UI Changes

No visual changes. A failed pin, unpin, mute, unmute or delete now shows
the existing error notification instead of the success one.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **Bug Fixes**
* When pinning or unpinning fails, the message returns to its previous
pin state without overwriting newer updates. The request error is also
passed back to calling code, and applicable error notifications are
still shown.
* Mute, unmute, and delete failures now pass their errors back to
calling code, including when notifications are not configured. When
configured, error notifications are still sent.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@oliverlaz
oliverlaz merged commit cf6c8f9 into release-v14 Oct 30, 2026
10 checks passed
@oliverlaz
oliverlaz deleted the fix/pin-failure-notification branch October 30, 2026 10:06

This branch was successfully deployed

2 active deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant