stream-chat-react-native-core 4.9.0-beta.4 → 4.9.0

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["Gallery.tsx"],"names":["MemoizedGalleryImage","React","memo","GalleryImage","prevProps","nextProps","uri","styles","StyleSheet","create","errorTextSize","fontSize","galleryContainer","borderTopLeftRadius","borderTopRightRadius","flexDirection","flexWrap","overflow","imageContainer","alignItems","display","justifyContent","padding","imageContainerStyle","flex","imageLoadingIndicatorStyle","position","moreImagesContainer","margin","moreImagesText","color","fontWeight","GalleryWithContext","props","additionalTouchableProps","alignment","groupStyles","hasThreadReplies","ImageLoadingFailedIndicator","ImageLoadingIndicator","images","legacyImageViewerSwipeBehaviour","message","onLongPress","onPress","onPressIn","preventPress","setImage","setImages","setOverlay","threadList","videos","VideoThumbnail","isLoadingImage","isLoadingImageError","setLoadingImage","setLoadingImageError","theme","overlay","colors","messageSimple","gallery","galleryItemColumn","gridHeight","gridWidth","image","maxHeight","maxWidth","minHeight","minWidth","sizeConfig","imagesAndVideos","length","height","invertedDirections","thumbnailGrid","width","messageText","text","messageId","id","numOfColumns","map","rows","colIndex","numOfRows","rowIndex","resizeMode","thumb_url","type","url","openImageViewer","defaultOnPress","borderRadius","event","emitter","defaultHandler","error","console","warn","absoluteFillObject","backgroundColor","areEqual","prevGroupStyles","prevHasThreadReplies","prevImages","prevMessage","prevVideos","nextGroupStyles","nextHasThreadReplies","nextImages","nextMessage","nextVideos","messageEqual","groupStylesEqual","hasThreadRepliesEqual","imagesEqual","every","index","image_url","videosEqual","MemoizedGallery","Gallery","propAdditionalTouchableProps","propAlignment","propGroupStyles","PropImageLoadingFailedIndicator","PropImageLoadingIndicator","propImages","propOnLongPress","propOnPress","propOnPressIn","propPreventPress","propSetImage","propSetOverlay","propThreadList","propVideos","PropVideoThumbnail","contextSetImage","contextAlignment","contextGroupStyles","contextImages","contextOnLongPress","contextOnPress","contextOnPressIn","contextPreventPress","contextThreadList","contextVideos","contextAdditionalTouchableProps","ContextImageLoadingFailedIndicator","ContextImageLoadingIndicator","ContextVideoThumnbnail","contextSetOverlay","channelId","cid","reply_count","displayName"],"mappings":"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","sourcesContent":["import React, { useMemo } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, View } from 'react-native';\n\nimport { GalleryImage } from './GallaryImage';\nimport { useLoadingImage } from './hooks/useLoadingImage';\nimport { buildGallery } from './utils/buildGallery/buildGallery';\n\nimport { getGalleryImageBorderRadius } from './utils/getGalleryImageBorderRadius';\n\nimport { openUrlSafely } from './utils/openUrlSafely';\n\nimport type { MessageType } from '../../components/MessageList/hooks/useMessageList';\nimport {\n ImageGalleryContextValue,\n useImageGalleryContext,\n} from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n MessageContextValue,\n useMessageContext,\n} from '../../contexts/messageContext/MessageContext';\nimport {\n MessagesContextValue,\n useMessagesContext,\n} from '../../contexts/messagesContext/MessagesContext';\nimport {\n OverlayContextValue,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { isVideoPackageAvailable } from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { getUrlWithoutParams } from '../../utils/utils';\n\nconst MemoizedGalleryImage = React.memo(\n GalleryImage,\n (prevProps, nextProps) =>\n getUrlWithoutParams(prevProps.uri) === getUrlWithoutParams(nextProps.uri),\n) as typeof GalleryImage;\n\nconst styles = StyleSheet.create({\n errorTextSize: { fontSize: 10 },\n galleryContainer: {\n borderTopLeftRadius: 13,\n borderTopRightRadius: 13,\n flexDirection: 'row',\n flexWrap: 'wrap',\n overflow: 'hidden',\n },\n imageContainer: {\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n padding: 1,\n },\n imageContainerStyle: { alignItems: 'center', flex: 1, justifyContent: 'center' },\n imageLoadingIndicatorStyle: {\n alignItems: 'center',\n justifyContent: 'center',\n position: 'absolute',\n },\n moreImagesContainer: {\n alignItems: 'center',\n justifyContent: 'center',\n margin: 1,\n },\n moreImagesText: { color: '#FFFFFF', fontSize: 26, fontWeight: '700' },\n});\n\nexport type GalleryPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ImageGalleryContextValue<StreamChatGenerics>, 'setImage' | 'setImages'> &\n Pick<\n MessageContextValue<StreamChatGenerics>,\n | 'alignment'\n | 'groupStyles'\n | 'images'\n | 'videos'\n | 'onLongPress'\n | 'onPress'\n | 'onPressIn'\n | 'preventPress'\n | 'threadList'\n > &\n Pick<\n MessagesContextValue<StreamChatGenerics>,\n | 'additionalTouchableProps'\n | 'legacyImageViewerSwipeBehaviour'\n | 'VideoThumbnail'\n | 'ImageLoadingIndicator'\n | 'ImageLoadingFailedIndicator'\n > &\n Pick<OverlayContextValue, 'setOverlay'> & {\n channelId: string | undefined;\n hasThreadReplies?: boolean;\n /**\n * `message` prop has been introduced here as part of `legacyImageViewerSwipeBehaviour` prop.\n * https://github.com/GetStream/stream-chat-react-native/commit/d5eac6193047916f140efe8e396a671675c9a63f\n * messageId and messageText may seem redundant now, but to avoid breaking change as part\n * of minor release, we are keeping those props.\n *\n * Also `message` type should ideally be imported from MessageContextValue and not be explicitely mentioned\n * here, but due to some circular dependencies within the SDK, it causes \"exccesive deep nesting\" issue with\n * typescript within Channel component. We should take it as a mini-project and resolve all these circular imports.\n *\n * TODO: Fix circular dependencies of imports\n */\n message?: MessageType<StreamChatGenerics>;\n };\n\nconst GalleryWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: GalleryPropsWithContext<StreamChatGenerics>,\n) => {\n const {\n additionalTouchableProps,\n alignment,\n groupStyles,\n hasThreadReplies,\n ImageLoadingFailedIndicator,\n ImageLoadingIndicator,\n images,\n legacyImageViewerSwipeBehaviour,\n message,\n onLongPress,\n onPress,\n onPressIn,\n preventPress,\n setImage,\n setImages,\n setOverlay,\n threadList,\n videos,\n VideoThumbnail,\n } = props;\n\n const { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError } =\n useLoadingImage();\n\n const {\n theme: {\n colors: { overlay },\n messageSimple: {\n gallery: {\n galleryContainer,\n galleryItemColumn,\n gridHeight,\n gridWidth,\n image,\n imageContainer,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n moreImagesContainer,\n moreImagesText,\n },\n },\n },\n } = useTheme();\n\n const sizeConfig = {\n gridHeight,\n gridWidth,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n };\n\n const imagesAndVideos = [...(images || []), ...(videos || [])];\n const { height, invertedDirections, thumbnailGrid, width } = useMemo(\n () =>\n buildGallery({\n images: imagesAndVideos,\n sizeConfig,\n }),\n [imagesAndVideos.length],\n );\n\n if (!imagesAndVideos?.length) return null;\n const messageText = message?.text;\n const messageId = message?.id;\n const numOfColumns = thumbnailGrid.length;\n\n return (\n <View\n style={[\n styles.galleryContainer,\n {\n height,\n width,\n },\n galleryContainer,\n {\n flexDirection: invertedDirections ? 'column' : 'row',\n },\n ]}\n testID='gallery-container'\n >\n {thumbnailGrid.map((rows, colIndex) => {\n const numOfRows = rows.length;\n return (\n <View\n key={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}`}\n style={[\n {\n flexDirection: invertedDirections ? 'row' : 'column',\n },\n galleryItemColumn,\n ]}\n testID={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}`}\n >\n {rows.map(({ height, resizeMode, thumb_url, type, url, width }, rowIndex) => {\n const openImageViewer = () => {\n if (!legacyImageViewerSwipeBehaviour && message) {\n // Added if-else to keep the logic readable, instead of DRY.\n // if - legacyImageViewerSwipeBehaviour is disabled\n // else - legacyImageViewerSwipeBehaviour is enabled\n setImages([message]);\n setImage({ messageId: message.id, url });\n setOverlay('gallery');\n } else if (legacyImageViewerSwipeBehaviour) {\n setImage({ messageId: message?.id, url });\n setOverlay('gallery');\n }\n };\n\n const defaultOnPress = () => {\n if (type === 'video' && !isVideoPackageAvailable()) {\n // This condition is kinda unreachable, since we render videos as file attachment if the video\n // library is not installed. But doesn't hurt to have extra safeguard, in case of some customizations.\n openUrlSafely(url);\n } else {\n openImageViewer();\n }\n };\n\n const borderRadius = getGalleryImageBorderRadius({\n alignment,\n colIndex,\n groupStyles,\n hasThreadReplies,\n height,\n invertedDirections,\n messageText,\n numOfColumns,\n numOfRows,\n rowIndex,\n sizeConfig,\n threadList,\n width,\n });\n\n return (\n <TouchableOpacity\n activeOpacity={0.8}\n disabled={preventPress}\n key={`gallery-item-${messageId}/${colIndex}/${rowIndex}/${imagesAndVideos.length}`}\n onLongPress={(event) => {\n if (onLongPress) {\n onLongPress({\n emitter: 'gallery',\n event,\n });\n }\n }}\n onPress={(event) => {\n if (onPress) {\n onPress({\n defaultHandler: defaultOnPress,\n emitter: 'gallery',\n event,\n });\n }\n }}\n onPressIn={(event) => {\n if (onPressIn) {\n onPressIn({\n defaultHandler: defaultOnPress,\n emitter: 'gallery',\n event,\n });\n }\n }}\n style={[\n styles.imageContainer,\n {\n height,\n width,\n },\n imageContainer,\n ]}\n testID={`gallery-${\n invertedDirections ? 'row' : 'column'\n }-${colIndex}-item-${rowIndex}`}\n {...additionalTouchableProps}\n >\n {type === 'video' ? (\n <VideoThumbnail\n style={[\n borderRadius,\n image,\n {\n height: height - 1,\n width: width - 1,\n },\n ]}\n thumb_url={thumb_url}\n />\n ) : (\n <View style={styles.imageContainerStyle}>\n <MemoizedGalleryImage\n onError={(error) => {\n console.warn(error);\n setLoadingImage(false);\n setLoadingImageError(true);\n }}\n onLoadEnd={() => setLoadingImage(false)}\n onLoadStart={() => setLoadingImage(true)}\n resizeMode={resizeMode}\n style={[\n borderRadius,\n image,\n {\n height: height - 1,\n width: width - 1,\n },\n ]}\n uri={url}\n />\n {isLoadingImage && (\n <View style={{ position: 'absolute' }}>\n <ImageLoadingIndicator style={styles.imageLoadingIndicatorStyle} />\n </View>\n )}\n {isLoadingImageError && (\n <View style={{ position: 'absolute' }}>\n <ImageLoadingFailedIndicator style={styles.imageLoadingIndicatorStyle} />\n </View>\n )}\n </View>\n )}\n {colIndex === numOfColumns - 1 &&\n rowIndex === numOfRows - 1 &&\n imagesAndVideos.length > 4 ? (\n <View\n style={[\n StyleSheet.absoluteFillObject,\n styles.moreImagesContainer,\n { backgroundColor: overlay },\n moreImagesContainer,\n ]}\n >\n <Text style={[styles.moreImagesText, moreImagesText]}>\n {`+${imagesAndVideos.length - 4}`}\n </Text>\n </View>\n ) : null}\n </TouchableOpacity>\n );\n })}\n </View>\n );\n })}\n </View>\n );\n};\n\nconst areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(\n prevProps: GalleryPropsWithContext<StreamChatGenerics>,\n nextProps: GalleryPropsWithContext<StreamChatGenerics>,\n) => {\n const {\n groupStyles: prevGroupStyles,\n hasThreadReplies: prevHasThreadReplies,\n images: prevImages,\n message: prevMessage,\n videos: prevVideos,\n } = prevProps;\n const {\n groupStyles: nextGroupStyles,\n hasThreadReplies: nextHasThreadReplies,\n images: nextImages,\n message: nextMessage,\n videos: nextVideos,\n } = nextProps;\n\n const messageEqual = prevMessage?.id === nextMessage?.id;\n if (!messageEqual) return false;\n\n const groupStylesEqual =\n prevGroupStyles.length === nextGroupStyles.length && prevGroupStyles[0] === nextGroupStyles[0];\n if (!groupStylesEqual) return false;\n\n const hasThreadRepliesEqual = prevHasThreadReplies === nextHasThreadReplies;\n if (!hasThreadRepliesEqual) return false;\n\n const imagesEqual =\n prevImages.length === nextImages.length &&\n prevImages.every(\n (image, index) =>\n getUrlWithoutParams(image.image_url) === getUrlWithoutParams(nextImages[index].image_url) &&\n getUrlWithoutParams(image.thumb_url) === getUrlWithoutParams(nextImages[index].thumb_url),\n );\n if (!imagesEqual) return false;\n\n const videosEqual =\n prevVideos.length === nextVideos.length &&\n prevVideos.every(\n (image, index) =>\n getUrlWithoutParams(image.image_url) === getUrlWithoutParams(nextVideos[index].image_url) &&\n getUrlWithoutParams(image.thumb_url) === getUrlWithoutParams(nextVideos[index].thumb_url),\n );\n if (!videosEqual) return false;\n\n return true;\n};\n\nconst MemoizedGallery = React.memo(GalleryWithContext, areEqual) as typeof GalleryWithContext;\n\nexport type GalleryProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<GalleryPropsWithContext<StreamChatGenerics>>;\n\n/**\n * UI component for card in attachments.\n */\nexport const Gallery = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: GalleryProps<StreamChatGenerics>,\n) => {\n const {\n additionalTouchableProps: propAdditionalTouchableProps,\n alignment: propAlignment,\n groupStyles: propGroupStyles,\n hasThreadReplies,\n ImageLoadingFailedIndicator: PropImageLoadingFailedIndicator,\n ImageLoadingIndicator: PropImageLoadingIndicator,\n images: propImages,\n onLongPress: propOnLongPress,\n onPress: propOnPress,\n onPressIn: propOnPressIn,\n preventPress: propPreventPress,\n setImage: propSetImage,\n setOverlay: propSetOverlay,\n threadList: propThreadList,\n videos: propVideos,\n VideoThumbnail: PropVideoThumbnail,\n } = props;\n\n const { setImage: contextSetImage, setImages } = useImageGalleryContext<StreamChatGenerics>();\n const {\n alignment: contextAlignment,\n groupStyles: contextGroupStyles,\n images: contextImages,\n message,\n onLongPress: contextOnLongPress,\n onPress: contextOnPress,\n onPressIn: contextOnPressIn,\n preventPress: contextPreventPress,\n threadList: contextThreadList,\n videos: contextVideos,\n } = useMessageContext<StreamChatGenerics>();\n const {\n additionalTouchableProps: contextAdditionalTouchableProps,\n ImageLoadingFailedIndicator: ContextImageLoadingFailedIndicator,\n ImageLoadingIndicator: ContextImageLoadingIndicator,\n legacyImageViewerSwipeBehaviour,\n VideoThumbnail: ContextVideoThumnbnail,\n } = useMessagesContext<StreamChatGenerics>();\n const { setOverlay: contextSetOverlay } = useOverlayContext();\n\n const images = propImages || contextImages;\n const videos = propVideos || contextVideos;\n\n if (!images.length && !videos.length) return null;\n\n const additionalTouchableProps = propAdditionalTouchableProps || contextAdditionalTouchableProps;\n const alignment = propAlignment || contextAlignment;\n const groupStyles = propGroupStyles || contextGroupStyles;\n const onLongPress = propOnLongPress || contextOnLongPress;\n const onPressIn = propOnPressIn || contextOnPressIn;\n const onPress = propOnPress || contextOnPress;\n const preventPress =\n typeof propPreventPress === 'boolean' ? propPreventPress : contextPreventPress;\n const setImage = propSetImage || contextSetImage;\n const setOverlay = propSetOverlay || contextSetOverlay;\n const threadList = propThreadList || contextThreadList;\n const VideoThumbnail = PropVideoThumbnail || ContextVideoThumnbnail;\n const ImageLoadingFailedIndicator =\n PropImageLoadingFailedIndicator || ContextImageLoadingFailedIndicator;\n const ImageLoadingIndicator = PropImageLoadingIndicator || ContextImageLoadingIndicator;\n\n return (\n <MemoizedGallery\n {...{\n additionalTouchableProps,\n alignment,\n channelId: message?.cid,\n groupStyles,\n hasThreadReplies: hasThreadReplies || !!message?.reply_count,\n ImageLoadingFailedIndicator,\n ImageLoadingIndicator,\n images,\n legacyImageViewerSwipeBehaviour,\n message,\n onLongPress,\n onPress,\n onPressIn,\n preventPress,\n setImage,\n setImages,\n setOverlay,\n threadList,\n videos,\n VideoThumbnail,\n }}\n />\n );\n};\n\nGallery.displayName = 'Gallery{messageSimple{gallery}}';\n"]}
1
+ {"version":3,"sources":["Gallery.tsx"],"names":["MemoizedGalleryImage","React","memo","GalleryImage","prevProps","nextProps","uri","styles","StyleSheet","create","errorTextSize","fontSize","galleryContainer","borderTopLeftRadius","borderTopRightRadius","flexDirection","flexWrap","overflow","imageContainer","alignItems","display","justifyContent","padding","imageContainerStyle","flex","imageLoadingIndicatorStyle","position","moreImagesContainer","margin","moreImagesText","color","fontWeight","GalleryWithContext","props","additionalTouchableProps","alignment","groupStyles","hasThreadReplies","ImageLoadingFailedIndicator","ImageLoadingIndicator","images","legacyImageViewerSwipeBehaviour","message","onLongPress","onPress","onPressIn","preventPress","setImage","setImages","setOverlay","threadList","videos","VideoThumbnail","theme","messageSimple","gallery","galleryItemColumn","gridHeight","gridWidth","maxHeight","maxWidth","minHeight","minWidth","sizeConfig","imagesAndVideos","length","height","invertedDirections","thumbnailGrid","width","numOfColumns","map","rows","colIndex","numOfRows","thumbnail","rowIndex","borderRadius","messageText","text","undefined","GalleryThumbnail","isLoadingImage","isLoadingImageError","setLoadingImage","setLoadingImageError","overlay","colors","image","openImageViewer","messageId","id","url","defaultOnPress","type","event","emitter","defaultHandler","thumb_url","error","console","warn","resizeMode","absoluteFillObject","backgroundColor","areEqual","prevGroupStyles","prevHasThreadReplies","prevImages","prevMessage","prevVideos","nextGroupStyles","nextHasThreadReplies","nextImages","nextMessage","nextVideos","messageEqual","groupStylesEqual","hasThreadRepliesEqual","imagesEqual","every","index","image_url","videosEqual","MemoizedGallery","Gallery","propAdditionalTouchableProps","propAlignment","propGroupStyles","PropImageLoadingFailedIndicator","PropImageLoadingIndicator","propImages","propOnLongPress","propOnPress","propOnPressIn","propPreventPress","propSetImage","propSetOverlay","propThreadList","propVideos","PropVideoThumbnail","contextSetImage","contextAlignment","contextGroupStyles","contextImages","contextOnLongPress","contextOnPress","contextOnPressIn","contextPreventPress","contextThreadList","contextVideos","contextAdditionalTouchableProps","ContextImageLoadingFailedIndicator","ContextImageLoadingIndicator","ContextVideoThumnbnail","contextSetOverlay","channelId","cid","reply_count","displayName"],"mappings":"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","sourcesContent":["import React, { useMemo } from 'react';\nimport { StyleSheet, Text, TouchableOpacity, View } from 'react-native';\n\nimport type { Attachment } from 'stream-chat';\n\nimport { GalleryImage } from './GallaryImage';\nimport { useLoadingImage } from './hooks/useLoadingImage';\nimport { buildGallery } from './utils/buildGallery/buildGallery';\n\nimport type { Thumbnail } from './utils/buildGallery/types';\nimport { getGalleryImageBorderRadius } from './utils/getGalleryImageBorderRadius';\n\nimport { openUrlSafely } from './utils/openUrlSafely';\n\nimport type { MessageType } from '../../components/MessageList/hooks/useMessageList';\nimport {\n ImageGalleryContextValue,\n useImageGalleryContext,\n} from '../../contexts/imageGalleryContext/ImageGalleryContext';\nimport {\n MessageContextValue,\n useMessageContext,\n} from '../../contexts/messageContext/MessageContext';\nimport {\n MessagesContextValue,\n useMessagesContext,\n} from '../../contexts/messagesContext/MessagesContext';\nimport {\n OverlayContextValue,\n useOverlayContext,\n} from '../../contexts/overlayContext/OverlayContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { isVideoPackageAvailable } from '../../native';\nimport type { DefaultStreamChatGenerics } from '../../types/types';\nimport { getUrlWithoutParams } from '../../utils/utils';\n\nconst MemoizedGalleryImage = React.memo(\n GalleryImage,\n (prevProps, nextProps) =>\n getUrlWithoutParams(prevProps.uri) === getUrlWithoutParams(nextProps.uri),\n) as typeof GalleryImage;\n\nconst styles = StyleSheet.create({\n errorTextSize: { fontSize: 10 },\n galleryContainer: {\n borderTopLeftRadius: 13,\n borderTopRightRadius: 13,\n flexDirection: 'row',\n flexWrap: 'wrap',\n overflow: 'hidden',\n },\n imageContainer: {\n alignItems: 'center',\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n padding: 1,\n },\n imageContainerStyle: { alignItems: 'center', flex: 1, justifyContent: 'center' },\n imageLoadingIndicatorStyle: {\n alignItems: 'center',\n justifyContent: 'center',\n position: 'absolute',\n },\n moreImagesContainer: {\n alignItems: 'center',\n justifyContent: 'center',\n margin: 1,\n },\n moreImagesText: { color: '#FFFFFF', fontSize: 26, fontWeight: '700' },\n});\n\nexport type GalleryPropsWithContext<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Pick<ImageGalleryContextValue<StreamChatGenerics>, 'setImage' | 'setImages'> &\n Pick<\n MessageContextValue<StreamChatGenerics>,\n | 'alignment'\n | 'groupStyles'\n | 'images'\n | 'videos'\n | 'onLongPress'\n | 'onPress'\n | 'onPressIn'\n | 'preventPress'\n | 'threadList'\n > &\n Pick<\n MessagesContextValue<StreamChatGenerics>,\n | 'additionalTouchableProps'\n | 'legacyImageViewerSwipeBehaviour'\n | 'VideoThumbnail'\n | 'ImageLoadingIndicator'\n | 'ImageLoadingFailedIndicator'\n > &\n Pick<OverlayContextValue, 'setOverlay'> & {\n channelId: string | undefined;\n hasThreadReplies?: boolean;\n /**\n * `message` prop has been introduced here as part of `legacyImageViewerSwipeBehaviour` prop.\n * https://github.com/GetStream/stream-chat-react-native/commit/d5eac6193047916f140efe8e396a671675c9a63f\n * messageId and messageText may seem redundant now, but to avoid breaking change as part\n * of minor release, we are keeping those props.\n *\n * Also `message` type should ideally be imported from MessageContextValue and not be explicitely mentioned\n * here, but due to some circular dependencies within the SDK, it causes \"exccesive deep nesting\" issue with\n * typescript within Channel component. We should take it as a mini-project and resolve all these circular imports.\n *\n * TODO: Fix circular dependencies of imports\n */\n message?: MessageType<StreamChatGenerics>;\n };\n\nconst GalleryWithContext = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: GalleryPropsWithContext<StreamChatGenerics>,\n) => {\n const {\n additionalTouchableProps,\n alignment,\n groupStyles,\n hasThreadReplies,\n ImageLoadingFailedIndicator,\n ImageLoadingIndicator,\n images,\n legacyImageViewerSwipeBehaviour,\n message,\n onLongPress,\n onPress,\n onPressIn,\n preventPress,\n setImage,\n setImages,\n setOverlay,\n threadList,\n videos,\n VideoThumbnail,\n } = props;\n\n const {\n theme: {\n messageSimple: {\n gallery: {\n galleryContainer,\n galleryItemColumn,\n gridHeight,\n gridWidth,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n },\n },\n },\n } = useTheme();\n\n const sizeConfig = {\n gridHeight,\n gridWidth,\n maxHeight,\n maxWidth,\n minHeight,\n minWidth,\n };\n\n const imagesAndVideos = [...(images || []), ...(videos || [])];\n const { height, invertedDirections, thumbnailGrid, width } = useMemo(\n () =>\n buildGallery({\n images: imagesAndVideos,\n sizeConfig,\n }),\n [imagesAndVideos.length],\n );\n\n if (!imagesAndVideos?.length) return null;\n const numOfColumns = thumbnailGrid.length;\n\n return (\n <View\n style={[\n styles.galleryContainer,\n {\n height,\n width,\n },\n galleryContainer,\n {\n flexDirection: invertedDirections ? 'column' : 'row',\n },\n ]}\n testID='gallery-container'\n >\n {thumbnailGrid.map((rows, colIndex) => {\n const numOfRows = rows.length;\n return (\n <View\n key={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}`}\n style={[\n {\n flexDirection: invertedDirections ? 'row' : 'column',\n },\n galleryItemColumn,\n ]}\n testID={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}`}\n >\n {rows.map((thumbnail, rowIndex) => {\n const borderRadius = getGalleryImageBorderRadius({\n alignment,\n colIndex,\n groupStyles,\n hasThreadReplies,\n height,\n invertedDirections,\n messageText: message?.text,\n numOfColumns,\n numOfRows,\n rowIndex,\n sizeConfig,\n threadList,\n width,\n });\n\n if (message === undefined) {\n return null;\n }\n\n return (\n <GalleryThumbnail\n additionalTouchableProps={additionalTouchableProps}\n borderRadius={borderRadius}\n colIndex={colIndex}\n ImageLoadingFailedIndicator={ImageLoadingFailedIndicator}\n ImageLoadingIndicator={ImageLoadingIndicator}\n imagesAndVideos={imagesAndVideos}\n invertedDirections={invertedDirections || false}\n key={rowIndex}\n legacyImageViewerSwipeBehaviour={legacyImageViewerSwipeBehaviour}\n message={message}\n numOfColumns={numOfColumns}\n numOfRows={numOfRows}\n onLongPress={onLongPress}\n onPress={onPress}\n onPressIn={onPressIn}\n preventPress={preventPress}\n rowIndex={rowIndex}\n setImage={setImage}\n setImages={setImages}\n setOverlay={setOverlay}\n thumbnail={thumbnail}\n VideoThumbnail={VideoThumbnail}\n />\n );\n })}\n </View>\n );\n })}\n </View>\n );\n};\n\ntype GalleryThumbnailProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = {\n borderRadius: {\n borderBottomLeftRadius: number;\n borderBottomRightRadius: number;\n borderTopLeftRadius: number;\n borderTopRightRadius: number;\n };\n colIndex: number;\n imagesAndVideos: Attachment<StreamChatGenerics>[];\n invertedDirections: boolean;\n message: MessageType<StreamChatGenerics>;\n numOfColumns: number;\n numOfRows: number;\n rowIndex: number;\n thumbnail: Thumbnail;\n} & Pick<\n MessagesContextValue<StreamChatGenerics>,\n | 'additionalTouchableProps'\n | 'legacyImageViewerSwipeBehaviour'\n | 'VideoThumbnail'\n | 'ImageLoadingIndicator'\n | 'ImageLoadingFailedIndicator'\n> &\n Pick<ImageGalleryContextValue<StreamChatGenerics>, 'setImage' | 'setImages'> &\n Pick<\n MessageContextValue<StreamChatGenerics>,\n 'onLongPress' | 'onPress' | 'onPressIn' | 'preventPress'\n > &\n Pick<OverlayContextValue, 'setOverlay'>;\n\nconst GalleryThumbnail = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>({\n additionalTouchableProps,\n borderRadius,\n colIndex,\n ImageLoadingFailedIndicator,\n ImageLoadingIndicator,\n imagesAndVideos,\n invertedDirections,\n legacyImageViewerSwipeBehaviour,\n message,\n numOfColumns,\n numOfRows,\n onLongPress,\n onPress,\n onPressIn,\n preventPress,\n rowIndex,\n setImage,\n setImages,\n setOverlay,\n thumbnail,\n VideoThumbnail,\n}: GalleryThumbnailProps<StreamChatGenerics>) => {\n const { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError } =\n useLoadingImage();\n\n const {\n theme: {\n colors: { overlay },\n messageSimple: {\n gallery: { image, imageContainer, moreImagesContainer, moreImagesText },\n },\n },\n } = useTheme();\n\n const openImageViewer = () => {\n if (!legacyImageViewerSwipeBehaviour && message) {\n // Added if-else to keep the logic readable, instead of DRY.\n // if - legacyImageViewerSwipeBehaviour is disabled\n // else - legacyImageViewerSwipeBehaviour is enabled\n setImages([message]);\n setImage({ messageId: message.id, url: thumbnail.url });\n setOverlay('gallery');\n } else if (legacyImageViewerSwipeBehaviour) {\n setImage({ messageId: message?.id, url: thumbnail.url });\n setOverlay('gallery');\n }\n };\n\n const defaultOnPress = () => {\n if (thumbnail.type === 'video' && !isVideoPackageAvailable()) {\n // This condition is kinda unreachable, since we render videos as file attachment if the video\n // library is not installed. But doesn't hurt to have extra safeguard, in case of some customizations.\n openUrlSafely(thumbnail.url);\n } else {\n openImageViewer();\n }\n };\n\n return (\n <TouchableOpacity\n activeOpacity={0.8}\n disabled={preventPress}\n key={`gallery-item-${message.id}/${colIndex}/${rowIndex}/${imagesAndVideos.length}`}\n onLongPress={(event) => {\n if (onLongPress) {\n onLongPress({\n emitter: 'gallery',\n event,\n });\n }\n }}\n onPress={(event) => {\n if (onPress) {\n onPress({\n defaultHandler: defaultOnPress,\n emitter: 'gallery',\n event,\n });\n }\n }}\n onPressIn={(event) => {\n if (onPressIn) {\n onPressIn({\n defaultHandler: defaultOnPress,\n emitter: 'gallery',\n event,\n });\n }\n }}\n style={[\n styles.imageContainer,\n {\n height: thumbnail.height,\n width: thumbnail.width,\n },\n imageContainer,\n ]}\n testID={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}-item-${rowIndex}`}\n {...additionalTouchableProps}\n >\n {thumbnail.type === 'video' ? (\n <VideoThumbnail\n style={[\n borderRadius,\n image,\n {\n height: thumbnail.height - 1,\n width: thumbnail.width - 1,\n },\n ]}\n thumb_url={thumbnail.thumb_url}\n />\n ) : (\n <View style={styles.imageContainerStyle}>\n <MemoizedGalleryImage\n onError={(error) => {\n console.warn(error);\n setLoadingImage(false);\n setLoadingImageError(true);\n }}\n onLoadEnd={() => setLoadingImage(false)}\n onLoadStart={() => setLoadingImage(true)}\n resizeMode={thumbnail.resizeMode}\n style={[\n borderRadius,\n image,\n {\n height: thumbnail.height - 1,\n width: thumbnail.width - 1,\n },\n ]}\n uri={thumbnail.url}\n />\n {isLoadingImage && (\n <View style={{ position: 'absolute' }}>\n <ImageLoadingIndicator style={styles.imageLoadingIndicatorStyle} />\n </View>\n )}\n {isLoadingImageError && (\n <View style={{ position: 'absolute' }}>\n <ImageLoadingFailedIndicator style={styles.imageLoadingIndicatorStyle} />\n </View>\n )}\n </View>\n )}\n {colIndex === numOfColumns - 1 && rowIndex === numOfRows - 1 && imagesAndVideos.length > 4 ? (\n <View\n style={[\n StyleSheet.absoluteFillObject,\n styles.moreImagesContainer,\n { backgroundColor: overlay },\n moreImagesContainer,\n ]}\n >\n <Text style={[styles.moreImagesText, moreImagesText]}>\n {`+${imagesAndVideos.length - 4}`}\n </Text>\n </View>\n ) : null}\n </TouchableOpacity>\n );\n};\n\nconst areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(\n prevProps: GalleryPropsWithContext<StreamChatGenerics>,\n nextProps: GalleryPropsWithContext<StreamChatGenerics>,\n) => {\n const {\n groupStyles: prevGroupStyles,\n hasThreadReplies: prevHasThreadReplies,\n images: prevImages,\n message: prevMessage,\n videos: prevVideos,\n } = prevProps;\n const {\n groupStyles: nextGroupStyles,\n hasThreadReplies: nextHasThreadReplies,\n images: nextImages,\n message: nextMessage,\n videos: nextVideos,\n } = nextProps;\n\n const messageEqual = prevMessage?.id === nextMessage?.id;\n if (!messageEqual) return false;\n\n const groupStylesEqual =\n prevGroupStyles.length === nextGroupStyles.length && prevGroupStyles[0] === nextGroupStyles[0];\n if (!groupStylesEqual) return false;\n\n const hasThreadRepliesEqual = prevHasThreadReplies === nextHasThreadReplies;\n if (!hasThreadRepliesEqual) return false;\n\n const imagesEqual =\n prevImages.length === nextImages.length &&\n prevImages.every(\n (image, index) =>\n getUrlWithoutParams(image.image_url) === getUrlWithoutParams(nextImages[index].image_url) &&\n getUrlWithoutParams(image.thumb_url) === getUrlWithoutParams(nextImages[index].thumb_url),\n );\n if (!imagesEqual) return false;\n\n const videosEqual =\n prevVideos.length === nextVideos.length &&\n prevVideos.every(\n (image, index) =>\n getUrlWithoutParams(image.image_url) === getUrlWithoutParams(nextVideos[index].image_url) &&\n getUrlWithoutParams(image.thumb_url) === getUrlWithoutParams(nextVideos[index].thumb_url),\n );\n if (!videosEqual) return false;\n\n return true;\n};\n\nconst MemoizedGallery = React.memo(GalleryWithContext, areEqual) as typeof GalleryWithContext;\n\nexport type GalleryProps<\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n> = Partial<GalleryPropsWithContext<StreamChatGenerics>>;\n\n/**\n * UI component for card in attachments.\n */\nexport const Gallery = <\n StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,\n>(\n props: GalleryProps<StreamChatGenerics>,\n) => {\n const {\n additionalTouchableProps: propAdditionalTouchableProps,\n alignment: propAlignment,\n groupStyles: propGroupStyles,\n hasThreadReplies,\n ImageLoadingFailedIndicator: PropImageLoadingFailedIndicator,\n ImageLoadingIndicator: PropImageLoadingIndicator,\n images: propImages,\n onLongPress: propOnLongPress,\n onPress: propOnPress,\n onPressIn: propOnPressIn,\n preventPress: propPreventPress,\n setImage: propSetImage,\n setOverlay: propSetOverlay,\n threadList: propThreadList,\n videos: propVideos,\n VideoThumbnail: PropVideoThumbnail,\n } = props;\n\n const { setImage: contextSetImage, setImages } = useImageGalleryContext<StreamChatGenerics>();\n const {\n alignment: contextAlignment,\n groupStyles: contextGroupStyles,\n images: contextImages,\n message,\n onLongPress: contextOnLongPress,\n onPress: contextOnPress,\n onPressIn: contextOnPressIn,\n preventPress: contextPreventPress,\n threadList: contextThreadList,\n videos: contextVideos,\n } = useMessageContext<StreamChatGenerics>();\n const {\n additionalTouchableProps: contextAdditionalTouchableProps,\n ImageLoadingFailedIndicator: ContextImageLoadingFailedIndicator,\n ImageLoadingIndicator: ContextImageLoadingIndicator,\n legacyImageViewerSwipeBehaviour,\n VideoThumbnail: ContextVideoThumnbnail,\n } = useMessagesContext<StreamChatGenerics>();\n const { setOverlay: contextSetOverlay } = useOverlayContext();\n\n const images = propImages || contextImages;\n const videos = propVideos || contextVideos;\n\n if (!images.length && !videos.length) return null;\n\n const additionalTouchableProps = propAdditionalTouchableProps || contextAdditionalTouchableProps;\n const alignment = propAlignment || contextAlignment;\n const groupStyles = propGroupStyles || contextGroupStyles;\n const onLongPress = propOnLongPress || contextOnLongPress;\n const onPressIn = propOnPressIn || contextOnPressIn;\n const onPress = propOnPress || contextOnPress;\n const preventPress =\n typeof propPreventPress === 'boolean' ? propPreventPress : contextPreventPress;\n const setImage = propSetImage || contextSetImage;\n const setOverlay = propSetOverlay || contextSetOverlay;\n const threadList = propThreadList || contextThreadList;\n const VideoThumbnail = PropVideoThumbnail || ContextVideoThumnbnail;\n const ImageLoadingFailedIndicator =\n PropImageLoadingFailedIndicator || ContextImageLoadingFailedIndicator;\n const ImageLoadingIndicator = PropImageLoadingIndicator || ContextImageLoadingIndicator;\n\n return (\n <MemoizedGallery\n {...{\n additionalTouchableProps,\n alignment,\n channelId: message?.cid,\n groupStyles,\n hasThreadReplies: hasThreadReplies || !!message?.reply_count,\n ImageLoadingFailedIndicator,\n ImageLoadingIndicator,\n images,\n legacyImageViewerSwipeBehaviour,\n message,\n onLongPress,\n onPress,\n onPressIn,\n preventPress,\n setImage,\n setImages,\n setOverlay,\n threadList,\n videos,\n VideoThumbnail,\n }}\n />\n );\n};\n\nGallery.displayName = 'Gallery{messageSimple{gallery}}';\n"]}
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "4.9.0-beta.4"
2
+ "version": "4.9.0"
3
3
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "stream-chat-react-native-core",
3
3
  "description": "The official React Native and Expo components for Stream Chat, a service for building chat applications",
4
- "version": "4.9.0-beta.4",
4
+ "version": "4.9.0",
5
5
  "author": {
6
6
  "company": "Stream.io Inc",
7
7
  "name": "Stream.io Inc"
@@ -1,10 +1,13 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
3
3
 
4
+ import type { Attachment } from 'stream-chat';
5
+
4
6
  import { GalleryImage } from './GallaryImage';
5
7
  import { useLoadingImage } from './hooks/useLoadingImage';
6
8
  import { buildGallery } from './utils/buildGallery/buildGallery';
7
9
 
10
+ import type { Thumbnail } from './utils/buildGallery/types';
8
11
  import { getGalleryImageBorderRadius } from './utils/getGalleryImageBorderRadius';
9
12
 
10
13
  import { openUrlSafely } from './utils/openUrlSafely';
@@ -135,26 +138,18 @@ const GalleryWithContext = <
135
138
  VideoThumbnail,
136
139
  } = props;
137
140
 
138
- const { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError } =
139
- useLoadingImage();
140
-
141
141
  const {
142
142
  theme: {
143
- colors: { overlay },
144
143
  messageSimple: {
145
144
  gallery: {
146
145
  galleryContainer,
147
146
  galleryItemColumn,
148
147
  gridHeight,
149
148
  gridWidth,
150
- image,
151
- imageContainer,
152
149
  maxHeight,
153
150
  maxWidth,
154
151
  minHeight,
155
152
  minWidth,
156
- moreImagesContainer,
157
- moreImagesText,
158
153
  },
159
154
  },
160
155
  },
@@ -180,8 +175,6 @@ const GalleryWithContext = <
180
175
  );
181
176
 
182
177
  if (!imagesAndVideos?.length) return null;
183
- const messageText = message?.text;
184
- const messageId = message?.id;
185
178
  const numOfColumns = thumbnailGrid.length;
186
179
 
187
180
  return (
@@ -212,31 +205,7 @@ const GalleryWithContext = <
212
205
  ]}
213
206
  testID={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}`}
214
207
  >
215
- {rows.map(({ height, resizeMode, thumb_url, type, url, width }, rowIndex) => {
216
- const openImageViewer = () => {
217
- if (!legacyImageViewerSwipeBehaviour && message) {
218
- // Added if-else to keep the logic readable, instead of DRY.
219
- // if - legacyImageViewerSwipeBehaviour is disabled
220
- // else - legacyImageViewerSwipeBehaviour is enabled
221
- setImages([message]);
222
- setImage({ messageId: message.id, url });
223
- setOverlay('gallery');
224
- } else if (legacyImageViewerSwipeBehaviour) {
225
- setImage({ messageId: message?.id, url });
226
- setOverlay('gallery');
227
- }
228
- };
229
-
230
- const defaultOnPress = () => {
231
- if (type === 'video' && !isVideoPackageAvailable()) {
232
- // This condition is kinda unreachable, since we render videos as file attachment if the video
233
- // library is not installed. But doesn't hurt to have extra safeguard, in case of some customizations.
234
- openUrlSafely(url);
235
- } else {
236
- openImageViewer();
237
- }
238
- };
239
-
208
+ {rows.map((thumbnail, rowIndex) => {
240
209
  const borderRadius = getGalleryImageBorderRadius({
241
210
  alignment,
242
211
  colIndex,
@@ -244,7 +213,7 @@ const GalleryWithContext = <
244
213
  hasThreadReplies,
245
214
  height,
246
215
  invertedDirections,
247
- messageText,
216
+ messageText: message?.text,
248
217
  numOfColumns,
249
218
  numOfRows,
250
219
  rowIndex,
@@ -253,112 +222,35 @@ const GalleryWithContext = <
253
222
  width,
254
223
  });
255
224
 
225
+ if (message === undefined) {
226
+ return null;
227
+ }
228
+
256
229
  return (
257
- <TouchableOpacity
258
- activeOpacity={0.8}
259
- disabled={preventPress}
260
- key={`gallery-item-${messageId}/${colIndex}/${rowIndex}/${imagesAndVideos.length}`}
261
- onLongPress={(event) => {
262
- if (onLongPress) {
263
- onLongPress({
264
- emitter: 'gallery',
265
- event,
266
- });
267
- }
268
- }}
269
- onPress={(event) => {
270
- if (onPress) {
271
- onPress({
272
- defaultHandler: defaultOnPress,
273
- emitter: 'gallery',
274
- event,
275
- });
276
- }
277
- }}
278
- onPressIn={(event) => {
279
- if (onPressIn) {
280
- onPressIn({
281
- defaultHandler: defaultOnPress,
282
- emitter: 'gallery',
283
- event,
284
- });
285
- }
286
- }}
287
- style={[
288
- styles.imageContainer,
289
- {
290
- height,
291
- width,
292
- },
293
- imageContainer,
294
- ]}
295
- testID={`gallery-${
296
- invertedDirections ? 'row' : 'column'
297
- }-${colIndex}-item-${rowIndex}`}
298
- {...additionalTouchableProps}
299
- >
300
- {type === 'video' ? (
301
- <VideoThumbnail
302
- style={[
303
- borderRadius,
304
- image,
305
- {
306
- height: height - 1,
307
- width: width - 1,
308
- },
309
- ]}
310
- thumb_url={thumb_url}
311
- />
312
- ) : (
313
- <View style={styles.imageContainerStyle}>
314
- <MemoizedGalleryImage
315
- onError={(error) => {
316
- console.warn(error);
317
- setLoadingImage(false);
318
- setLoadingImageError(true);
319
- }}
320
- onLoadEnd={() => setLoadingImage(false)}
321
- onLoadStart={() => setLoadingImage(true)}
322
- resizeMode={resizeMode}
323
- style={[
324
- borderRadius,
325
- image,
326
- {
327
- height: height - 1,
328
- width: width - 1,
329
- },
330
- ]}
331
- uri={url}
332
- />
333
- {isLoadingImage && (
334
- <View style={{ position: 'absolute' }}>
335
- <ImageLoadingIndicator style={styles.imageLoadingIndicatorStyle} />
336
- </View>
337
- )}
338
- {isLoadingImageError && (
339
- <View style={{ position: 'absolute' }}>
340
- <ImageLoadingFailedIndicator style={styles.imageLoadingIndicatorStyle} />
341
- </View>
342
- )}
343
- </View>
344
- )}
345
- {colIndex === numOfColumns - 1 &&
346
- rowIndex === numOfRows - 1 &&
347
- imagesAndVideos.length > 4 ? (
348
- <View
349
- style={[
350
- StyleSheet.absoluteFillObject,
351
- styles.moreImagesContainer,
352
- { backgroundColor: overlay },
353
- moreImagesContainer,
354
- ]}
355
- >
356
- <Text style={[styles.moreImagesText, moreImagesText]}>
357
- {`+${imagesAndVideos.length - 4}`}
358
- </Text>
359
- </View>
360
- ) : null}
361
- </TouchableOpacity>
230
+ <GalleryThumbnail
231
+ additionalTouchableProps={additionalTouchableProps}
232
+ borderRadius={borderRadius}
233
+ colIndex={colIndex}
234
+ ImageLoadingFailedIndicator={ImageLoadingFailedIndicator}
235
+ ImageLoadingIndicator={ImageLoadingIndicator}
236
+ imagesAndVideos={imagesAndVideos}
237
+ invertedDirections={invertedDirections || false}
238
+ key={rowIndex}
239
+ legacyImageViewerSwipeBehaviour={legacyImageViewerSwipeBehaviour}
240
+ message={message}
241
+ numOfColumns={numOfColumns}
242
+ numOfRows={numOfRows}
243
+ onLongPress={onLongPress}
244
+ onPress={onPress}
245
+ onPressIn={onPressIn}
246
+ preventPress={preventPress}
247
+ rowIndex={rowIndex}
248
+ setImage={setImage}
249
+ setImages={setImages}
250
+ setOverlay={setOverlay}
251
+ thumbnail={thumbnail}
252
+ VideoThumbnail={VideoThumbnail}
253
+ />
362
254
  );
363
255
  })}
364
256
  </View>
@@ -368,6 +260,204 @@ const GalleryWithContext = <
368
260
  );
369
261
  };
370
262
 
263
+ type GalleryThumbnailProps<
264
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
265
+ > = {
266
+ borderRadius: {
267
+ borderBottomLeftRadius: number;
268
+ borderBottomRightRadius: number;
269
+ borderTopLeftRadius: number;
270
+ borderTopRightRadius: number;
271
+ };
272
+ colIndex: number;
273
+ imagesAndVideos: Attachment<StreamChatGenerics>[];
274
+ invertedDirections: boolean;
275
+ message: MessageType<StreamChatGenerics>;
276
+ numOfColumns: number;
277
+ numOfRows: number;
278
+ rowIndex: number;
279
+ thumbnail: Thumbnail;
280
+ } & Pick<
281
+ MessagesContextValue<StreamChatGenerics>,
282
+ | 'additionalTouchableProps'
283
+ | 'legacyImageViewerSwipeBehaviour'
284
+ | 'VideoThumbnail'
285
+ | 'ImageLoadingIndicator'
286
+ | 'ImageLoadingFailedIndicator'
287
+ > &
288
+ Pick<ImageGalleryContextValue<StreamChatGenerics>, 'setImage' | 'setImages'> &
289
+ Pick<
290
+ MessageContextValue<StreamChatGenerics>,
291
+ 'onLongPress' | 'onPress' | 'onPressIn' | 'preventPress'
292
+ > &
293
+ Pick<OverlayContextValue, 'setOverlay'>;
294
+
295
+ const GalleryThumbnail = <
296
+ StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
297
+ >({
298
+ additionalTouchableProps,
299
+ borderRadius,
300
+ colIndex,
301
+ ImageLoadingFailedIndicator,
302
+ ImageLoadingIndicator,
303
+ imagesAndVideos,
304
+ invertedDirections,
305
+ legacyImageViewerSwipeBehaviour,
306
+ message,
307
+ numOfColumns,
308
+ numOfRows,
309
+ onLongPress,
310
+ onPress,
311
+ onPressIn,
312
+ preventPress,
313
+ rowIndex,
314
+ setImage,
315
+ setImages,
316
+ setOverlay,
317
+ thumbnail,
318
+ VideoThumbnail,
319
+ }: GalleryThumbnailProps<StreamChatGenerics>) => {
320
+ const { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError } =
321
+ useLoadingImage();
322
+
323
+ const {
324
+ theme: {
325
+ colors: { overlay },
326
+ messageSimple: {
327
+ gallery: { image, imageContainer, moreImagesContainer, moreImagesText },
328
+ },
329
+ },
330
+ } = useTheme();
331
+
332
+ const openImageViewer = () => {
333
+ if (!legacyImageViewerSwipeBehaviour && message) {
334
+ // Added if-else to keep the logic readable, instead of DRY.
335
+ // if - legacyImageViewerSwipeBehaviour is disabled
336
+ // else - legacyImageViewerSwipeBehaviour is enabled
337
+ setImages([message]);
338
+ setImage({ messageId: message.id, url: thumbnail.url });
339
+ setOverlay('gallery');
340
+ } else if (legacyImageViewerSwipeBehaviour) {
341
+ setImage({ messageId: message?.id, url: thumbnail.url });
342
+ setOverlay('gallery');
343
+ }
344
+ };
345
+
346
+ const defaultOnPress = () => {
347
+ if (thumbnail.type === 'video' && !isVideoPackageAvailable()) {
348
+ // This condition is kinda unreachable, since we render videos as file attachment if the video
349
+ // library is not installed. But doesn't hurt to have extra safeguard, in case of some customizations.
350
+ openUrlSafely(thumbnail.url);
351
+ } else {
352
+ openImageViewer();
353
+ }
354
+ };
355
+
356
+ return (
357
+ <TouchableOpacity
358
+ activeOpacity={0.8}
359
+ disabled={preventPress}
360
+ key={`gallery-item-${message.id}/${colIndex}/${rowIndex}/${imagesAndVideos.length}`}
361
+ onLongPress={(event) => {
362
+ if (onLongPress) {
363
+ onLongPress({
364
+ emitter: 'gallery',
365
+ event,
366
+ });
367
+ }
368
+ }}
369
+ onPress={(event) => {
370
+ if (onPress) {
371
+ onPress({
372
+ defaultHandler: defaultOnPress,
373
+ emitter: 'gallery',
374
+ event,
375
+ });
376
+ }
377
+ }}
378
+ onPressIn={(event) => {
379
+ if (onPressIn) {
380
+ onPressIn({
381
+ defaultHandler: defaultOnPress,
382
+ emitter: 'gallery',
383
+ event,
384
+ });
385
+ }
386
+ }}
387
+ style={[
388
+ styles.imageContainer,
389
+ {
390
+ height: thumbnail.height,
391
+ width: thumbnail.width,
392
+ },
393
+ imageContainer,
394
+ ]}
395
+ testID={`gallery-${invertedDirections ? 'row' : 'column'}-${colIndex}-item-${rowIndex}`}
396
+ {...additionalTouchableProps}
397
+ >
398
+ {thumbnail.type === 'video' ? (
399
+ <VideoThumbnail
400
+ style={[
401
+ borderRadius,
402
+ image,
403
+ {
404
+ height: thumbnail.height - 1,
405
+ width: thumbnail.width - 1,
406
+ },
407
+ ]}
408
+ thumb_url={thumbnail.thumb_url}
409
+ />
410
+ ) : (
411
+ <View style={styles.imageContainerStyle}>
412
+ <MemoizedGalleryImage
413
+ onError={(error) => {
414
+ console.warn(error);
415
+ setLoadingImage(false);
416
+ setLoadingImageError(true);
417
+ }}
418
+ onLoadEnd={() => setLoadingImage(false)}
419
+ onLoadStart={() => setLoadingImage(true)}
420
+ resizeMode={thumbnail.resizeMode}
421
+ style={[
422
+ borderRadius,
423
+ image,
424
+ {
425
+ height: thumbnail.height - 1,
426
+ width: thumbnail.width - 1,
427
+ },
428
+ ]}
429
+ uri={thumbnail.url}
430
+ />
431
+ {isLoadingImage && (
432
+ <View style={{ position: 'absolute' }}>
433
+ <ImageLoadingIndicator style={styles.imageLoadingIndicatorStyle} />
434
+ </View>
435
+ )}
436
+ {isLoadingImageError && (
437
+ <View style={{ position: 'absolute' }}>
438
+ <ImageLoadingFailedIndicator style={styles.imageLoadingIndicatorStyle} />
439
+ </View>
440
+ )}
441
+ </View>
442
+ )}
443
+ {colIndex === numOfColumns - 1 && rowIndex === numOfRows - 1 && imagesAndVideos.length > 4 ? (
444
+ <View
445
+ style={[
446
+ StyleSheet.absoluteFillObject,
447
+ styles.moreImagesContainer,
448
+ { backgroundColor: overlay },
449
+ moreImagesContainer,
450
+ ]}
451
+ >
452
+ <Text style={[styles.moreImagesText, moreImagesText]}>
453
+ {`+${imagesAndVideos.length - 4}`}
454
+ </Text>
455
+ </View>
456
+ ) : null}
457
+ </TouchableOpacity>
458
+ );
459
+ };
460
+
371
461
  const areEqual = <StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics>(
372
462
  prevProps: GalleryPropsWithContext<StreamChatGenerics>,
373
463
  nextProps: GalleryPropsWithContext<StreamChatGenerics>,
package/src/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "4.9.0-beta.4"
2
+ "version": "4.9.0"
3
3
  }