UNPKG

stream-chat-react-native-core

Version:

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

302 lines (300 loc) 13.9 kB
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.clamp = exports.IsSwiping = exports.ImageGalleryWithContext = exports.ImageGallery = exports.HasPinched = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); var _reactNativeGestureHandler = require("react-native-gesture-handler"); var _reactNativeReanimated = _interopRequireWildcard(require("react-native-reanimated")); var _AnimatedGalleryImage = require("./components/AnimatedGalleryImage"); var _AnimatedGalleryVideo = require("./components/AnimatedGalleryVideo"); var _ImageGalleryA11yProbe = require("./components/ImageGalleryA11yProbe"); var _useCurrentImageHeight = require("./hooks/useCurrentImageHeight"); var _useImageGalleryGestures = require("./hooks/useImageGalleryGestures"); var _AccessibilityContext = require("../../contexts/accessibilityContext/AccessibilityContext"); var _ComponentsContext = require("../../contexts/componentsContext/ComponentsContext"); var _ImageGalleryContext = require("../../contexts/imageGalleryContext/ImageGalleryContext"); var _OverlayContext = require("../../contexts/overlayContext/OverlayContext"); var _ThemeContext = require("../../contexts/themeContext/ThemeContext"); var _hooks = require("../../hooks"); var _useViewport2 = require("../../hooks/useViewport"); var _types = require("../../types/types"); var _KeyboardCompatibleView = require("../KeyboardCompatibleView/KeyboardCompatibleView"); var _UIComponents = require("../UIComponents"); var _jsxRuntime = require("react/jsx-runtime"); var _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/ImageGallery/ImageGallery.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 MARGIN = 32; var HasPinched = exports.HasPinched = function (HasPinched) { HasPinched[HasPinched["FALSE"] = 0] = "FALSE"; HasPinched[HasPinched["TRUE"] = 1] = "TRUE"; return HasPinched; }({}); var IsSwiping = exports.IsSwiping = function (IsSwiping) { IsSwiping[IsSwiping["UNDETERMINED"] = 0] = "UNDETERMINED"; IsSwiping[IsSwiping["TRUE"] = 1] = "TRUE"; IsSwiping[IsSwiping["FALSE"] = 2] = "FALSE"; return IsSwiping; }({}); var imageGallerySelector = state => ({ assets: state.assets }); var PAGER_WINDOW_RADIUS = 4; var galleryPagerSelector = state => ({ assets: state.assets, currentIndex: state.currentIndex }); var GalleryPager = props => { var fullWindowHeight = props.fullWindowHeight, fullWindowWidth = props.fullWindowWidth, offsetScale = props.offsetScale, scale = props.scale, slide = props.slide, translateX = props.translateX, translateY = props.translateY; var _useImageGalleryConte = (0, _ImageGalleryContext.useImageGalleryContext)(), imageGalleryStateStore = _useImageGalleryConte.imageGalleryStateStore; var _useStateStore = (0, _hooks.useStateStore)(imageGalleryStateStore.state, galleryPagerSelector), assets = _useStateStore.assets, currentIndex = _useStateStore.currentIndex; var slideStyle = { height: fullWindowHeight * 8, marginRight: MARGIN, width: fullWindowWidth * 8 }; var lo = Math.max(0, currentIndex - PAGER_WINDOW_RADIUS); var hi = Math.min(assets.length - 1, currentIndex + PAGER_WINDOW_RADIUS); var slides = []; for (var i = lo; i <= hi; i++) { var photo = assets[i]; slides.push(photo.type === _types.FileTypes.Video ? (0, _jsxRuntime.jsx)(_AnimatedGalleryVideo.AnimatedGalleryVideo, { attachmentId: photo.id, index: i, offsetScale: offsetScale, photo: photo, scale: scale, screenHeight: fullWindowHeight, style: [slideStyle, slide], translateX: translateX, translateY: translateY }, photo.id) : (0, _jsxRuntime.jsx)(_AnimatedGalleryImage.AnimatedGalleryImage, { accessibilityLabel: 'Image Item', index: i, offsetScale: offsetScale, photo: photo, scale: scale, screenHeight: fullWindowHeight, screenWidth: fullWindowWidth, style: [slideStyle, slide], translateX: translateX, translateY: translateY }, photo.id)); } return (0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, { children: [lo > 0 ? (0, _jsxRuntime.jsx)(_reactNative.View, { style: { width: lo * (fullWindowWidth * 8 + MARGIN) } }, 'gallery-pager-leading-spacer') : null, slides] }); }; var ImageGalleryWithContext = props => { var numberOfImageGalleryGridColumns = props.numberOfImageGalleryGridColumns, overlayOpacity = props.overlayOpacity, ImageGalleryHeader = props.ImageGalleryHeader, ImageGalleryFooter = props.ImageGalleryFooter, ImageGalleryGrid = props.ImageGalleryGrid; var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), isGridViewVisible = _useState2[0], setIsGridViewVisible = _useState2[1]; var _useTheme = (0, _ThemeContext.useTheme)(), _useTheme$theme = _useTheme.theme, _useTheme$theme$image = _useTheme$theme.imageGallery, backgroundColor = _useTheme$theme$image.backgroundColor, pager = _useTheme$theme$image.pager, slide = _useTheme$theme$image.slide, semantics = _useTheme$theme.semantics; var _useImageGalleryConte2 = (0, _ImageGalleryContext.useImageGalleryContext)(), imageGalleryStateStore = _useImageGalleryConte2.imageGalleryStateStore; var _useStateStore2 = (0, _hooks.useStateStore)(imageGalleryStateStore.state, imageGallerySelector), assets = _useStateStore2.assets; var _useViewport = (0, _useViewport2.useViewport)(), vh = _useViewport.vh, vw = _useViewport.vw; var fullWindowHeight = vh(100); var fullWindowWidth = vw(100); var halfScreenWidth = fullWindowWidth / 2; var halfScreenHeight = fullWindowHeight / 2; var quarterScreenHeight = fullWindowHeight / 4; var screenTranslateY = (0, _reactNativeReanimated.useSharedValue)(fullWindowHeight); var showScreen = (0, _react.useCallback)(() => { 'worklet'; screenTranslateY.value = (0, _reactNativeReanimated.withTiming)(0, { duration: 250, easing: _reactNativeReanimated.Easing.out(_reactNativeReanimated.Easing.ease) }); }, [screenTranslateY]); (0, _react.useEffect)(() => { (0, _KeyboardCompatibleView.dismissKeyboard)(); showScreen(); }, [showScreen]); var currentImageHeight = (0, _useCurrentImageHeight.useCurrentImageHeight)({ assets, fullWindowHeight, fullWindowWidth, imageGalleryStateStore }); var headerFooterVisible = (0, _reactNativeReanimated.useSharedValue)(1); var translateX = (0, _reactNativeReanimated.useSharedValue)(0); var translateY = (0, _reactNativeReanimated.useSharedValue)(0); var offsetScale = (0, _reactNativeReanimated.useSharedValue)(1); var scale = (0, _reactNativeReanimated.useSharedValue)(1); var translationX = (0, _reactNativeReanimated.useSharedValue)(-(fullWindowWidth + MARGIN) * imageGalleryStateStore.state.getLatestValue().currentIndex); var currentIndexShared = imageGalleryStateStore.currentIndexShared; (0, _reactNativeReanimated.useAnimatedReaction)(() => currentIndexShared.value, index => { translationX.value = -(fullWindowWidth + MARGIN) * index; }, [fullWindowWidth]); var _useImageGalleryGestu = (0, _useImageGalleryGestures.useImageGalleryGestures)({ currentImageHeight, halfScreenHeight, halfScreenWidth, headerFooterVisible, offsetScale, overlayOpacity, scale, screenHeight: fullWindowHeight, screenWidth: fullWindowWidth, translateX, translateY, translationX }), doubleTap = _useImageGalleryGestu.doubleTap, pan = _useImageGalleryGestu.pan, pinch = _useImageGalleryGestu.pinch, singleTap = _useImageGalleryGestu.singleTap; var headerFooterOpacity = (0, _reactNativeReanimated.useDerivedValue)(() => { var imageHeight = currentImageHeight.value; return imageHeight * scale.value < fullWindowHeight && translateY.value > 0 ? 1 - translateY.value / quarterScreenHeight : imageHeight * scale.value > fullWindowHeight && translateY.value > imageHeight / 2 * scale.value - halfScreenHeight ? 1 - (translateY.value - (imageHeight / 2 * scale.value - halfScreenHeight)) / quarterScreenHeight : 1; }, []); var pagerStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({ transform: [{ scaleX: 1 }, { translateX: translationX.value }] }), []); var containerBackground = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({ backgroundColor: backgroundColor || semantics.backgroundCoreApp, opacity: headerFooterOpacity.value }), [headerFooterOpacity]); var showScreenStyle = (0, _reactNativeReanimated.useAnimatedStyle)(() => ({ transform: [{ translateY: screenTranslateY.value }] }), []); var closeGridView = () => { setIsGridViewVisible(false); }; var openGridView = () => { setIsGridViewVisible(true); }; var _useAccessibilityCont = (0, _AccessibilityContext.useAccessibilityContext)(), isAccessibilityEnabled = _useAccessibilityCont.enabled; (0, _react.useEffect)(() => { return () => { var handle = imageGalleryStateStore.requesterNode; if (handle == null) return; imageGalleryStateStore.requesterNode = null; if (_reactNative.Platform.OS === 'android') { _reactNative.AccessibilityInfo.setAccessibilityFocus(handle); } else { requestAnimationFrame(() => { _reactNative.AccessibilityInfo.setAccessibilityFocus(handle); }); } }; }, [imageGalleryStateStore]); return (0, _jsxRuntime.jsxs)(_reactNativeReanimated.default.View, { accessibilityViewIsModal: true, pointerEvents: 'auto', style: [_reactNative.StyleSheet.absoluteFill, showScreenStyle], children: [isAccessibilityEnabled ? (0, _jsxRuntime.jsx)(_ImageGalleryA11yProbe.ImageGalleryA11yProbe, { containerBackground: containerBackground }) : (0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, { style: [_reactNative.StyleSheet.absoluteFill, containerBackground] }), (0, _jsxRuntime.jsx)(_reactNativeGestureHandler.GestureDetector, { gesture: _reactNativeGestureHandler.Gesture.Simultaneous(singleTap, doubleTap, pinch, pan), children: (0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, { style: _reactNative.StyleSheet.absoluteFill, children: (0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, { testID: "image-gallery-pager", style: [styles.animatedContainer, pagerStyle, pager], children: (0, _jsxRuntime.jsx)(GalleryPager, { fullWindowHeight: fullWindowHeight, fullWindowWidth: fullWindowWidth, offsetScale: offsetScale, scale: scale, slide: slide, translateX: translateX, translateY: translateY }) }) }) }), ImageGalleryHeader ? (0, _jsxRuntime.jsx)(ImageGalleryHeader, { opacity: headerFooterOpacity, visible: headerFooterVisible }) : null, ImageGalleryFooter ? (0, _jsxRuntime.jsx)(ImageGalleryFooter, { accessibilityLabel: 'Image Gallery Footer', opacity: headerFooterOpacity, openGridView: openGridView, visible: headerFooterVisible }) : null, (0, _jsxRuntime.jsx)(_UIComponents.BottomSheetModal, { height: 350, onClose: () => { setIsGridViewVisible(false); }, visible: isGridViewVisible, children: ImageGalleryGrid ? (0, _jsxRuntime.jsx)(ImageGalleryGrid, { closeGridView: closeGridView, numberOfImageGalleryGridColumns: numberOfImageGalleryGridColumns }) : null })] }); }; exports.ImageGalleryWithContext = ImageGalleryWithContext; var ImageGallery = props => { var _useImageGalleryConte3 = (0, _ImageGalleryContext.useImageGalleryContext)(), numberOfImageGalleryGridColumns = _useImageGalleryConte3.numberOfImageGalleryGridColumns; var _useComponentsContext = (0, _ComponentsContext.useComponentsContext)(), ImageGalleryHeader = _useComponentsContext.ImageGalleryHeader, ImageGalleryFooter = _useComponentsContext.ImageGalleryFooter, ImageGalleryGrid = _useComponentsContext.ImageGalleryGrid; var _useOverlayContext = (0, _OverlayContext.useOverlayContext)(), overlayOpacity = _useOverlayContext.overlayOpacity; return (0, _jsxRuntime.jsx)(ImageGalleryWithContext, { numberOfImageGalleryGridColumns: numberOfImageGalleryGridColumns, overlayOpacity: overlayOpacity, ImageGalleryHeader: ImageGalleryHeader, ImageGalleryFooter: ImageGalleryFooter, ImageGalleryGrid: ImageGalleryGrid, ...props }); }; exports.ImageGallery = ImageGallery; var clamp = (value, lowerBound, upperBound) => { 'worklet'; return Math.min(Math.max(lowerBound, value), upperBound); }; exports.clamp = clamp; var styles = _reactNative.StyleSheet.create({ animatedContainer: { alignItems: 'center', direction: 'ltr', flexDirection: 'row' } }); ImageGallery.displayName = 'ImageGallery{imageGallery}'; //# sourceMappingURL=ImageGallery.js.map