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 = ({