From 97a137944581614678b4390001f602814ccbf52c Mon Sep 17 00:00:00 2001 From: Zita Szupera Date: Wed, 15 Jul 2026 17:06:40 -0500 Subject: [PATCH 1/3] feat: allow custom icons --- .../Attachment/Audio/PlayPauseButton.tsx | 8 +- .../src/components/Attachment/FileIcon.tsx | 46 ++--- .../src/components/Attachment/Giphy/Giphy.tsx | 5 +- .../Attachment/UrlPreview/URLPreview.tsx | 5 +- .../UrlPreview/URLPreviewCompact.tsx | 5 +- .../AttachmentMediaPicker.tsx | 5 +- .../AttachmentPickerItem.tsx | 4 +- .../components/AttachmentPickerContent.tsx | 13 +- .../components/AttachmentTypePickerButton.tsx | 28 ++- .../AutoCompleteSuggestionCommandIcon.tsx | 21 +- .../AutoCompleteSuggestionHeader.tsx | 5 +- .../mentionItems/MentionBroadcastItem.tsx | 5 +- .../mentionItems/MentionRoleItem.tsx | 5 +- .../mentionItems/MentionUserGroupItem.tsx | 23 ++- .../components/ChannelDetailsNavHeader.tsx | 5 +- .../ChannelDetailsNavigationSection.tsx | 12 +- .../components/ChannelDetailsProfile.tsx | 5 +- .../ChannelEditDetailsFormHeader.tsx | 5 +- .../components/ChannelEditImageSheet.tsx | 16 +- .../members/ChannelAddMembersButton.tsx | 5 +- .../members/ChannelAddMembersFormHeader.tsx | 5 +- .../components/members/ChannelMemberItem.tsx | 5 +- .../components/modal/ModalHeader.tsx | 5 +- .../navigation-section/FileAttachmentList.tsx | 9 +- .../navigation-section/MediaItem.tsx | 5 +- .../navigation-section/MediaList.tsx | 5 +- .../navigation-section/PinnedMessageList.tsx | 5 +- .../hooks/useChannelDetailsNavigationItems.ts | 25 ++- .../ChannelMessagePreviewDeliveryStatus.tsx | 21 +- .../ChannelPreview/ChannelPreviewMessage.tsx | 4 +- .../ChannelPreviewMutedStatus.tsx | 5 +- .../ChannelPreviewPinnedStatus.tsx | 5 +- .../ChannelPreview/ChannelSwipableWrapper.tsx | 4 +- .../components/ImageGalleryFooter.tsx | 9 +- .../components/ImageGalleryHeader.tsx | 5 +- .../components/ImageGalleryVideoControl.tsx | 10 +- .../Indicators/EmptyStateIndicator.tsx | 9 +- .../Headers/MessagePinnedHeader.tsx | 5 +- .../Headers/MessageReminderHeader.tsx | 5 +- .../Headers/MessageSavedForLaterHeader.tsx | 5 +- .../Headers/SentToChannelHeader.tsx | 5 +- .../MessageItemView/MessageDeleted.tsx | 5 +- .../MessageItemView/MessageReplies.tsx | 8 +- .../Message/MessageItemView/MessageStatus.tsx | 23 ++- .../MessageItemView/MessageSwipeContent.tsx | 5 +- .../ReactionList/ReactionListClustered.tsx | 6 +- .../ReactionList/ReactionListItem.tsx | 6 +- .../Message/hooks/useMessageActions.tsx | 49 ++--- .../ShowThreadMessageInChannelButton.tsx | 10 +- .../StopMessageStreamingButton.tsx | 5 +- .../AttachmentRemoveControl.tsx | 5 +- .../AttachmentUploadProgressIndicator.tsx | 11 +- .../VideoAttachmentUploadPreview.tsx | 5 +- .../AudioRecorder/AudioRecorder.tsx | 27 ++- .../AudioRecorder/AudioRecordingButton.tsx | 5 +- .../AudioRecordingInProgress.tsx | 5 +- .../AudioRecordingLockIndicator.tsx | 11 +- .../AudioRecorder/AudioRecordingPreview.tsx | 8 +- .../components/InputButtons/AttachButton.tsx | 5 +- .../components/LinkPreviewList.tsx | 5 +- .../components/OutputButtons/EditButton.tsx | 5 +- .../components/OutputButtons/SendButton.tsx | 5 +- .../MessageList/ScrollToBottomButton.tsx | 5 +- .../UnreadMessagesNotification.tsx | 8 +- .../MessageMenu/MessageReactionPicker.tsx | 5 +- .../MessageMenu/MessageUserReactions.tsx | 7 +- .../MessageMenu/MessageUserReactionsItem.tsx | 5 +- .../MessageUserReactionsItem.test.tsx | 2 +- .../components/Notifications/Notification.tsx | 35 ++-- .../Poll/components/CreatePollHeader.tsx | 11 +- .../Poll/components/CreatePollOptions.tsx | 11 +- .../Poll/components/MultipleVotesSettings.tsx | 7 +- .../Poll/components/PollModalHeader.tsx | 5 +- .../components/Poll/components/PollOption.tsx | 4 +- .../ThreadList/ThreadListUnreadBanner.tsx | 10 +- .../ThreadMessagePreviewDeliveryStatus.tsx | 16 +- .../UIComponents/EmptySearchResult.tsx | 5 +- .../components/UIComponents/SearchInput.tsx | 12 +- .../UIComponents/SelectionCircle.tsx | 5 +- .../src/components/UIComponents/Spinner.tsx | 5 +- .../src/components/ui/Avatar/AvatarGroup.tsx | 7 +- .../src/components/ui/Avatar/UserAvatar.tsx | 11 +- .../src/components/ui/Badge/ErrorBadge.tsx | 5 +- .../src/components/ui/Badge/GiphyBadge.tsx | 5 +- .../src/components/ui/Badge/ImgurBadge.tsx | 5 +- .../src/components/ui/Badge/RetryBadge.tsx | 5 +- package/src/components/ui/GiphyChip.tsx | 8 +- package/src/components/ui/Input/Input.tsx | 8 +- .../src/components/ui/VideoPlayIndicator.tsx | 5 +- .../componentsContext/ComponentsContext.tsx | 48 ++++- .../componentsContext/defaultComponents.ts | 193 ++++++++++++++++++ .../__tests__/useChannelActionItems.test.tsx | 15 ++ .../useChannelMemberActionItems.test.tsx | 9 + .../hooks/actions/useChannelActionItems.tsx | 26 ++- .../actions/useChannelMemberActionItems.tsx | 17 +- .../messagePreview/useMessagePreviewIcon.tsx | 28 +-- 96 files changed, 726 insertions(+), 423 deletions(-) diff --git a/package/src/components/Attachment/Audio/PlayPauseButton.tsx b/package/src/components/Attachment/Audio/PlayPauseButton.tsx index 5786b02bda..1e0ac70459 100644 --- a/package/src/components/Attachment/Audio/PlayPauseButton.tsx +++ b/package/src/components/Attachment/Audio/PlayPauseButton.tsx @@ -2,8 +2,7 @@ import React, { useMemo } from 'react'; import { Pressable, PressableProps, StyleProp, StyleSheet, ViewStyle } from 'react-native'; import { useTheme } from '../../../contexts'; -import { Pause } from '../../../icons/pause-fill'; -import { Play } from '../../../icons/play-fill'; +import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { primitives } from '../../../theme'; import { buttonSizes } from '../../ui/Button/constants'; @@ -31,6 +30,7 @@ export const PlayPauseButton = ({ const { theme: { semantics }, } = useTheme(); + const { icons } = useComponentsContext(); const styles = useStyles(); return ( {isPlaying ? ( - + ) : ( - + )} ); diff --git a/package/src/components/Attachment/FileIcon.tsx b/package/src/components/Attachment/FileIcon.tsx index 8e9157e1d8..304ecde815 100644 --- a/package/src/components/Attachment/FileIcon.tsx +++ b/package/src/components/Attachment/FileIcon.tsx @@ -1,18 +1,9 @@ import React from 'react'; +import { useComponentsContext } from '../../contexts/componentsContext/ComponentsContext'; +import type { IconsMap } from '../../contexts/componentsContext/defaultComponents'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; -import { Audio } from '../../icons/filetype-audio-xl'; -import { Code } from '../../icons/filetype-code-xl'; -import { ZIP } from '../../icons/filetype-compression-xl'; -import { OtherFileIcon } from '../../icons/filetype-other-xl'; -import { PDF } from '../../icons/filetype-pdf-xl'; -import { Presentation } from '../../icons/filetype-presentation-xl'; -import { SpreadSheet } from '../../icons/filetype-spreadsheet-xl'; -import { DOC } from '../../icons/filetype-text-xl'; -import { Video } from '../../icons/filetype-video-xl'; -import type { IconProps } from '../../icons/utils/base'; - // https://www.iana.org/assignments/media-types/media-types.xhtml#audio const audioFileTypes = [ 'audio/1d-interleaved-parityfec', @@ -349,49 +340,49 @@ const codeFileTypes = [ 'text/plain', ]; -const mimeTypeToIconMap: Record> = { - 'application/pdf': PDF, // .pdf +const mimeTypeToIconKeyMap: Record = { + 'application/pdf': 'PDF', // .pdf }; for (const type of audioFileTypes) { - mimeTypeToIconMap[type] = Audio; + mimeTypeToIconKeyMap[type] = 'Audio'; } for (const type of docMimeTypes) { - mimeTypeToIconMap[type] = DOC; + mimeTypeToIconKeyMap[type] = 'DOC'; } for (const type of excelMimeTypes) { - mimeTypeToIconMap[type] = SpreadSheet; + mimeTypeToIconKeyMap[type] = 'SpreadSheet'; } for (const type of powerpointMimeTypes) { - mimeTypeToIconMap[type] = Presentation; + mimeTypeToIconKeyMap[type] = 'Presentation'; } for (const type of zipFileTypes) { - mimeTypeToIconMap[type] = ZIP; + mimeTypeToIconKeyMap[type] = 'ZIP'; } for (const type of videoFileTypes) { - mimeTypeToIconMap[type] = Video; + mimeTypeToIconKeyMap[type] = 'Video'; } for (const type of codeFileTypes) { - mimeTypeToIconMap[type] = Code; + mimeTypeToIconKeyMap[type] = 'Code'; } -function mimeTypeToIcon(mimeType?: string): React.ComponentType { +function mimeTypeToIconKey(mimeType?: string): keyof IconsMap { if (!mimeType) { - return OtherFileIcon; + return 'OtherFileIcon'; } - const Icon = mimeTypeToIconMap[mimeType]; - if (Icon) { - return Icon; + const iconKey = mimeTypeToIconKeyMap[mimeType]; + if (iconKey) { + return iconKey; } - return OtherFileIcon; + return 'OtherFileIcon'; } export type FileIconProps = { @@ -426,8 +417,9 @@ export const FileIcon = ({ mimeType, size = 'md' }: FileIconProps) => { }, }, } = useTheme(); + const { icons } = useComponentsContext(); - const Icon = mimeTypeToIcon(mimeType); + const Icon = icons[mimeTypeToIconKey(mimeType)]; return ; }; diff --git a/package/src/components/Attachment/Giphy/Giphy.tsx b/package/src/components/Attachment/Giphy/Giphy.tsx index 836aee2350..8c954ce7d7 100644 --- a/package/src/components/Attachment/Giphy/Giphy.tsx +++ b/package/src/components/Attachment/Giphy/Giphy.tsx @@ -5,6 +5,7 @@ import type { Attachment } from 'stream-chat'; import { GiphyImage } from './GiphyImage'; +import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { MessageContextValue, useMessageContext, @@ -16,7 +17,6 @@ import { import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext'; -import { EyeOpen } from '../../../icons/EyeOpen'; import { components, primitives } from '../../../theme'; import { Button } from '../../ui/'; @@ -43,6 +43,7 @@ const GiphyWithContext = (props: GiphyPropsWithContext) => { const { actions, image_url, thumb_url } = attachment; + const { icons } = useComponentsContext(); const { t } = useTranslationContext(); const { @@ -68,7 +69,7 @@ const GiphyWithContext = (props: GiphyPropsWithContext) => { testID='giphy-action-attachment' > - + {t('Only visible to you')} diff --git a/package/src/components/Attachment/UrlPreview/URLPreview.tsx b/package/src/components/Attachment/UrlPreview/URLPreview.tsx index 424c2d1d1b..cac7956894 100644 --- a/package/src/components/Attachment/UrlPreview/URLPreview.tsx +++ b/package/src/components/Attachment/UrlPreview/URLPreview.tsx @@ -25,7 +25,6 @@ import { useMessagesContext, } from '../../../contexts/messagesContext/MessagesContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; -import { Link } from '../../../icons/link'; import { primitives } from '../../../theme'; import { FileTypes } from '../../../types/types'; import { makeImageCompatibleUrl } from '../../../utils/utils'; @@ -67,6 +66,8 @@ const URLPreviewWithContext = (props: URLPreviewPropsWithContext) => { styles: stylesProp = {}, } = props; + const { icons } = useComponentsContext(); + const { theme: { semantics }, } = useTheme(); @@ -155,7 +156,7 @@ const URLPreviewWithContext = (props: URLPreviewPropsWithContext) => { ) : null} - + ) : null} - + { const { theme: { semantics }, } = useTheme(); + const { icons } = useComponentsContext(); - return ; + return ; }; export const AttachmentMediaPicker = (props: AttachmentPickerContentProps) => { diff --git a/package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx b/package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx index 3f6c83fdd5..2af5aed769 100644 --- a/package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx +++ b/package/src/components/AttachmentPicker/components/AttachmentMediaPicker/AttachmentPickerItem.tsx @@ -15,7 +15,6 @@ import { useMessageInputContext } from '../../../../contexts/messageInputContext import { useTheme } from '../../../../contexts/themeContext/ThemeContext'; import { useTranslationContext } from '../../../../contexts/translationContext/TranslationContext'; import { useViewport } from '../../../../hooks/useViewport'; -import { Plus } from '../../../../icons/plus'; import { NativeHandlers } from '../../../../native'; import { primitives } from '../../../../theme'; import type { File } from '../../../../types/types'; @@ -163,6 +162,7 @@ const AttachmentImage = (props: AttachmentPickerItemType) => { const AttachmentIosLimited = () => { const { numberOfAttachmentPickerImageColumns } = useAttachmentPickerContext(); + const { icons } = useComponentsContext(); const { vw } = useViewport(); const { t } = useTranslationContext(); const size = vw(100) / (numberOfAttachmentPickerImageColumns || 3) - 2; @@ -178,7 +178,7 @@ const AttachmentIosLimited = () => { ]} onPress={NativeHandlers.iOS14RefreshGallerySelection} > - + {t('Add more')} ); diff --git a/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx b/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx index 91610b5798..c02a4ad876 100644 --- a/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx +++ b/package/src/components/AttachmentPicker/components/AttachmentPickerContent.tsx @@ -19,9 +19,9 @@ import { useMessageInputContext, useTranslationContext, } from '../../../contexts'; +import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { useAttachmentPickerState, useStableCallback } from '../../../hooks'; -import { Camera, FilePickerIcon, PollThumbnail, VideoIcon } from '../../../icons'; import { primitives } from '../../../theme'; import { CommandSuggestionItem } from '../../AutoCompleteInput/AutoCompleteSuggestionItem'; @@ -149,6 +149,7 @@ export const AttachmentCommandPicker = () => { export const AttachmentPollPicker = (props: AttachmentPickerContentProps) => { const { t } = useTranslationContext(); + const { icons } = useComponentsContext(); const { height } = props; const { openPollCreationDialog, sendMessage } = useMessageInputContext(); @@ -158,7 +159,7 @@ export const AttachmentPollPicker = (props: AttachmentPickerContentProps) => { return ( { const [permissionDenied, setPermissionDenied] = useState(false); const { t } = useTranslationContext(); + const { icons } = useComponentsContext(); const { height, videoOnly } = props; const { takeAndUploadImage } = useMessageInputContext(); @@ -198,7 +200,7 @@ export const AttachmentCameraPicker = ( return permissionDenied ? ( ) : ( { const { t } = useTranslationContext(); + const { icons } = useComponentsContext(); const { height } = props; const { pickFile } = useMessageInputContext(); return ( { const { hasImagePicker, pickAndUploadImageFromNativePicker } = useMessageInputContext(); const { attachmentPickerStore, disableAttachmentPicker } = useAttachmentPickerContext(); + const { icons } = useComponentsContext(); const { selectedPicker } = useAttachmentPickerState(); const setImagePicker = useStableCallback(() => { @@ -85,7 +79,7 @@ export const MediaPickerButton = () => { @@ -94,6 +88,7 @@ export const MediaPickerButton = () => { export const CameraPickerButton = () => { const { attachmentPickerStore, disableAttachmentPicker } = useAttachmentPickerContext(); + const { icons } = useComponentsContext(); const { selectedPicker } = useAttachmentPickerState(); const { hasCameraPicker, takeAndUploadImage } = useMessageInputContext(); @@ -119,14 +114,14 @@ export const CameraPickerButton = () => { {Platform.OS === 'android' ? ( @@ -137,6 +132,7 @@ export const CameraPickerButton = () => { export const FilePickerButton = () => { const { attachmentPickerStore, disableAttachmentPicker } = useAttachmentPickerContext(); + const { icons } = useComponentsContext(); const { selectedPicker } = useAttachmentPickerState(); const { hasFilePicker, pickFile } = useMessageInputContext(); @@ -152,7 +148,7 @@ export const FilePickerButton = () => { @@ -164,6 +160,7 @@ export const PollPickerButton = () => { const { selectedPicker } = useAttachmentPickerState(); const { threadList } = useChannelContext(); + const { icons } = useComponentsContext(); const { hasCreatePoll } = useMessagesContext(); const ownCapabilities = useOwnCapabilitiesContext(); @@ -180,7 +177,7 @@ export const PollPickerButton = () => { @@ -191,6 +188,7 @@ export const CommandsPickerButton = () => { const [showCommandsSheet, setShowCommandsSheet] = useState(false); const { hasCommands } = useMessageInputContext(); const { attachmentPickerStore, disableAttachmentPicker } = useAttachmentPickerContext(); + const { icons } = useComponentsContext(); const { selectedPicker } = useAttachmentPickerState(); const setCommandsPicker = useStableCallback(() => { @@ -208,7 +206,7 @@ export const CommandsPickerButton = () => { diff --git a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionCommandIcon.tsx b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionCommandIcon.tsx index c14a695f1d..e457544782 100644 --- a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionCommandIcon.tsx +++ b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionCommandIcon.tsx @@ -3,32 +3,31 @@ import { StyleSheet, View } from 'react-native'; import { CommandVariants } from 'stream-chat'; +import { useComponentsContext } from '../../contexts/componentsContext/ComponentsContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; -import { Flag, GiphyIcon, Mute, Sound, UserAdd, UserDelete } from '../../icons'; -import { Lightning } from '../../icons/bolt'; -import { Imgur } from '../../icons/imgur'; export const SuggestionCommandIcon = ({ name }: { name: CommandVariants }) => { const { theme: { semantics }, } = useTheme(); + const { icons } = useComponentsContext(); if (name === 'ban') { - return ; + return ; } else if (name === 'flag') { - return ; + return ; } else if (name === 'giphy') { - return ; + return ; } else if (name === 'imgur') { - return ; + return ; } else if (name === 'mute') { - return ; + return ; } else if (name === 'unban') { - return ; + return ; } else if (name === 'unmute') { - return ; + return ; } else { - return ; + return ; } }; diff --git a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx index a912d5c57c..b778c5af6e 100644 --- a/package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx +++ b/package/src/components/AutoCompleteInput/AutoCompleteSuggestionHeader.tsx @@ -1,9 +1,9 @@ import React, { useMemo } from 'react'; import { StyleSheet, Text, View } from 'react-native'; +import { useComponentsContext } from '../../contexts/componentsContext/ComponentsContext'; import { useTheme } from '../../contexts/themeContext/ThemeContext'; -import { Smile } from '../../icons/emoji'; import { primitives } from '../../theme'; export type AutoCompleteSuggestionHeaderProps = { @@ -48,11 +48,12 @@ export const EmojiHeader: React.FC = ({ query semantics, }, } = useTheme(); + const { icons } = useComponentsContext(); const styles = useStyles(); return ( - + {`Emoji matching "${queryText}"`} diff --git a/package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx b/package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx index 5b90332e61..0a6db47aba 100644 --- a/package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx +++ b/package/src/components/AutoCompleteInput/mentionItems/MentionBroadcastItem.tsx @@ -6,8 +6,8 @@ import { EnhancedMentionContent } from './EnhancedMentionContent'; import { EnhancedMentionIcon } from './EnhancedMentionIcon'; import { MentionItem } from './MentionItem'; +import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext'; -import { Megaphone } from '../../../icons/megaphone'; export type MentionBroadcastItemProps = { entity: ChannelMentionSuggestion | HereMentionSuggestion; @@ -24,8 +24,9 @@ const SUBTITLE_KEY = { export const MentionBroadcastItem = ({ entity }: MentionBroadcastItemProps) => { const { t } = useTranslationContext(); + const { icons } = useComponentsContext(); return ( - }> + }> { const { t } = useTranslationContext(); + const { icons } = useComponentsContext(); return ( - }> + }> ( - }> - - -); +export const MentionUserGroupItem = ({ entity }: MentionUserGroupItemProps) => { + const { icons } = useComponentsContext(); + return ( + }> + + + ); +}; diff --git a/package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx b/package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx index 439dbb30fa..9f00da6a0f 100644 --- a/package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx +++ b/package/src/components/ChannelDetails/components/ChannelDetailsNavHeader.tsx @@ -4,10 +4,10 @@ import { I18nManager, StyleSheet, Text, View } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { useChannelDetailsContext } from '../../../contexts/channelDetailsContext/channelDetailsContext'; +import { useComponentsContext } from '../../../contexts/componentsContext/ComponentsContext'; import { useTheme } from '../../../contexts/themeContext/ThemeContext'; import { useTranslationContext } from '../../../contexts/translationContext/TranslationContext'; import { useIsDirectChat } from '../../../hooks/useIsDirectChat'; -import { ChevronLeft } from '../../../icons/chevron-left'; import { primitives } from '../../../theme'; import { Button } from '../../ui/Button/Button'; @@ -26,6 +26,7 @@ export const ChannelDetailsNavHeader = ({ title, }: ChannelDetailsNavHeaderProps) => { const { channel } = useChannelDetailsContext(); + const { icons } = useComponentsContext(); const { t } = useTranslationContext(); const { theme: { @@ -54,7 +55,7 @@ export const ChannelDetailsNavHeader = ({