UNPKG

stream-chat-react-native-core

Version:

The official React Native and Expo components for Stream Chat, a service for building chat applications

234 lines 10.1 kB
Object.defineProperty(exports, "__esModule", { value: true }); exports.URLPreviewCompact = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _ComponentsContext = require("../../../contexts/componentsContext/ComponentsContext"); var _MessageContext = require("../../../contexts/messageContext/MessageContext"); var _MessagesContext = require("../../../contexts/messagesContext/MessagesContext"); var _ThemeContext = require("../../../contexts/themeContext/ThemeContext"); var _theme = require("../../../theme"); var _types = require("../../../types/types"); var _utils = require("../../../utils/utils"); var _ui = require("../../ui"); var _ImageBackground = require("../../UIComponents/ImageBackground"); var _openUrlSafely = require("../utils/openUrlSafely"); var _jsxRuntime = require("react/jsx-runtime"); var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/Attachment/UrlPreview/URLPreviewCompact.tsx"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } var URLPreviewCompactWithContext = props => { var attachment = props.attachment, additionalPressableProps = props.additionalPressableProps, _props$ImageComponent = props.ImageComponent, ImageComponent = _props$ImageComponent === void 0 ? _reactNative.Image : _props$ImageComponent, onLongPress = props.onLongPress, onPress = props.onPress, onPressIn = props.onPressIn, preventPress = props.preventPress, _props$styles = props.styles, stylesProp = _props$styles === void 0 ? {} : _props$styles; var _useComponentsContext = (0, _ComponentsContext.useComponentsContext)(), icons = _useComponentsContext.icons; var _useTheme = (0, _ThemeContext.useTheme)(), semantics = _useTheme.theme.semantics; var image_url = attachment.image_url, og_scrape_url = attachment.og_scrape_url, text = attachment.text, thumb_url = attachment.thumb_url, titleText = attachment.title, type = attachment.type; var _useTheme2 = (0, _ThemeContext.useTheme)(), _useTheme2$theme$mess = _useTheme2.theme.messageItemView.compactUrlPreview, wrapper = _useTheme2$theme$mess.wrapper, container = _useTheme2$theme$mess.container, cardCover = _useTheme2$theme$mess.cardCover, cardFooter = _useTheme2$theme$mess.cardFooter, title = _useTheme2$theme$mess.title, description = _useTheme2$theme$mess.description, linkPreview = _useTheme2$theme$mess.linkPreview, linkPreviewText = _useTheme2$theme$mess.linkPreviewText; var styles = useStyles(); var uri = image_url || thumb_url; var defaultOnPress = () => (0, _openUrlSafely.openUrlSafely)(og_scrape_url || uri); var isVideoCard = type === _types.FileTypes.Video && og_scrape_url; return (0, _jsxRuntime.jsx)(_reactNative.View, { style: [styles.wrapper, wrapper], children: (0, _jsxRuntime.jsxs)(_reactNative.Pressable, { disabled: preventPress, onLongPress: event => { if (onLongPress) { onLongPress({ additionalInfo: { url: og_scrape_url }, emitter: 'urlPreview', event }); } }, onPress: event => { if (onPress) { onPress({ additionalInfo: { url: og_scrape_url }, defaultHandler: defaultOnPress, emitter: 'urlPreview', event }); } }, onPressIn: event => { if (onPressIn) { onPressIn({ additionalInfo: { url: og_scrape_url }, defaultHandler: defaultOnPress, emitter: 'urlPreview', event }); } }, style: [styles.container, container, stylesProp.container], testID: "card-attachment", ...additionalPressableProps, children: [uri && (0, _jsxRuntime.jsx)(_ImageBackground.ImageBackground, { ImageComponent: ImageComponent, imageStyle: styles.cardCover, resizeMode: "cover", source: { uri: (0, _utils.makeImageCompatibleUrl)(uri) }, style: [styles.cardCover, stylesProp.cardCover, cardCover], children: isVideoCard ? (0, _jsxRuntime.jsx)(_ui.VideoPlayIndicator, { size: "lg" }) : null }), (0, _jsxRuntime.jsxs)(_reactNative.View, { style: [styles.cardFooter, cardFooter, stylesProp.cardFooter], children: [title ? (0, _jsxRuntime.jsx)(_reactNative.Text, { numberOfLines: 1, style: [styles.title, title, stylesProp.title], children: titleText }) : null, text ? (0, _jsxRuntime.jsx)(_reactNative.Text, { numberOfLines: 1, style: [styles.description, description, stylesProp.description], children: text }) : null, (0, _jsxRuntime.jsxs)(_reactNative.View, { style: [styles.linkPreview, linkPreview, stylesProp.linkPreview], children: [(0, _jsxRuntime.jsx)(icons.Link, { height: 12, width: 12, stroke: semantics.chatTextIncoming }), (0, _jsxRuntime.jsx)(_reactNative.Text, { numberOfLines: 1, style: [styles.linkPreviewText, linkPreviewText, stylesProp.linkPreviewText], children: og_scrape_url })] })] })] }) }); }; var areEqual = (prevProps, nextProps) => { var prevAttachment = prevProps.attachment, prevMyMessageTheme = prevProps.myMessageTheme; var nextAttachment = nextProps.attachment, nextMyMessageTheme = nextProps.myMessageTheme; var attachmentEqual = prevAttachment.image_url === nextAttachment.image_url && prevAttachment.thumb_url === nextAttachment.thumb_url && prevAttachment.type === nextAttachment.type && prevAttachment.og_scrape_url === nextAttachment.og_scrape_url && prevAttachment.text === nextAttachment.text && prevAttachment.title === nextAttachment.title; if (!attachmentEqual) { return false; } var messageThemeEqual = JSON.stringify(prevMyMessageTheme) === JSON.stringify(nextMyMessageTheme); if (!messageThemeEqual) { return false; } return true; }; var MemoizedURLPreviewCompact = _react.default.memo(URLPreviewCompactWithContext, areEqual); var URLPreviewCompact = props => { var _useComponentsContext2 = (0, _ComponentsContext.useComponentsContext)(), ImageComponent = _useComponentsContext2.ImageComponent; var _useMessageContext = (0, _MessageContext.useMessageContext)(), message = _useMessageContext.message, onLongPress = _useMessageContext.onLongPress, onPress = _useMessageContext.onPress, onPressIn = _useMessageContext.onPressIn, preventPress = _useMessageContext.preventPress; var _useMessagesContext = (0, _MessagesContext.useMessagesContext)(), additionalPressableProps = _useMessagesContext.additionalPressableProps, myMessageTheme = _useMessagesContext.myMessageTheme; return (0, _jsxRuntime.jsx)(MemoizedURLPreviewCompact, { additionalPressableProps, channelId: message.cid, ImageComponent, messageId: message.id, myMessageTheme, onLongPress, onPress, onPressIn, preventPress, ...props }, `${message?.id}${message?.updated_at}`); }; exports.URLPreviewCompact = URLPreviewCompact; var useStyles = () => { var _useTheme3 = (0, _ThemeContext.useTheme)(), semantics = _useTheme3.theme.semantics; var _useMessageContext2 = (0, _MessageContext.useMessageContext)(), isMyMessage = _useMessageContext2.isMyMessage; return (0, _react.useMemo)(() => _reactNative.StyleSheet.create({ wrapper: {}, container: { maxWidth: 256, borderRadius: _theme.primitives.radiusLg, backgroundColor: isMyMessage ? semantics.chatBgAttachmentOutgoing : semantics.chatBgAttachmentIncoming, overflow: 'hidden', flexDirection: 'row', alignItems: 'center', gap: _theme.primitives.spacingXs, paddingLeft: _theme.primitives.spacingXs, paddingRight: _theme.primitives.spacingSm, paddingVertical: _theme.primitives.spacingXs }, cardCover: { alignItems: 'center', justifyContent: 'center', aspectRatio: 1 / 1, height: 40, width: 40, borderRadius: _theme.primitives.radiusMd }, cardFooter: { justifyContent: 'space-between', flexShrink: 1 }, title: { color: semantics.chatTextIncoming, fontSize: _theme.primitives.typographyFontSizeSm, fontWeight: _theme.primitives.typographyFontWeightSemiBold, lineHeight: _theme.primitives.typographyLineHeightTight }, description: { color: semantics.chatTextIncoming, fontSize: _theme.primitives.typographyFontSizeXs, fontWeight: _theme.primitives.typographyFontWeightRegular, lineHeight: _theme.primitives.typographyLineHeightTight }, linkPreview: { flexDirection: 'row', alignItems: 'center', gap: _theme.primitives.spacingXxs }, linkPreviewText: { color: semantics.chatTextIncoming, fontSize: _theme.primitives.typographyFontSizeXs, fontWeight: _theme.primitives.typographyFontWeightRegular, lineHeight: _theme.primitives.typographyLineHeightTight, flexShrink: 1 } }), [isMyMessage, semantics]); }; URLPreviewCompact.displayName = 'URLPreviewCompact{messageItemView{urlPreviewCompact}}'; //# sourceMappingURL=URLPreviewCompact.js.map