stream-chat-react-native-core 5.11.3-beta.6 → 5.12.0-beta.1

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.
Files changed (33) hide show
  1. package/lib/commonjs/components/Attachment/Gallery.js +38 -22
  2. package/lib/commonjs/components/Attachment/Gallery.js.map +1 -1
  3. package/lib/commonjs/components/Attachment/ImageReloadIndicator.js +40 -0
  4. package/lib/commonjs/components/Attachment/ImageReloadIndicator.js.map +1 -0
  5. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js +15 -3
  6. package/lib/commonjs/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  7. package/lib/commonjs/hooks/useLoadingImage.js +57 -16
  8. package/lib/commonjs/hooks/useLoadingImage.js.map +1 -1
  9. package/lib/commonjs/native.js +6 -1
  10. package/lib/commonjs/native.js.map +1 -1
  11. package/lib/commonjs/version.json +1 -1
  12. package/lib/module/components/Attachment/Gallery.js +38 -22
  13. package/lib/module/components/Attachment/Gallery.js.map +1 -1
  14. package/lib/module/components/Attachment/ImageReloadIndicator.js +40 -0
  15. package/lib/module/components/Attachment/ImageReloadIndicator.js.map +1 -0
  16. package/lib/module/components/AttachmentPicker/AttachmentPicker.js +15 -3
  17. package/lib/module/components/AttachmentPicker/AttachmentPicker.js.map +1 -1
  18. package/lib/module/hooks/useLoadingImage.js +57 -16
  19. package/lib/module/hooks/useLoadingImage.js.map +1 -1
  20. package/lib/module/native.js +6 -1
  21. package/lib/module/native.js.map +1 -1
  22. package/lib/module/version.json +1 -1
  23. package/lib/typescript/components/Attachment/ImageReloadIndicator.d.ts +6 -0
  24. package/lib/typescript/hooks/useLoadingImage.d.ts +3 -3
  25. package/lib/typescript/native.d.ts +5 -0
  26. package/package.json +1 -1
  27. package/src/components/Attachment/Gallery.tsx +22 -5
  28. package/src/components/Attachment/ImageReloadIndicator.tsx +27 -0
  29. package/src/components/Attachment/__tests__/Gallery.test.js +3 -1
  30. package/src/components/AttachmentPicker/AttachmentPicker.tsx +18 -1
  31. package/src/hooks/useLoadingImage.tsx +57 -9
  32. package/src/native.ts +8 -0
  33. package/src/version.json +1 -1
@@ -0,0 +1,40 @@
1
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.ImageReloadIndicator = void 0;
6
+ var _react = _interopRequireDefault(require("react"));
7
+ var _reactNative = require("react-native");
8
+ var _ThemeContext = require("../../contexts/themeContext/ThemeContext");
9
+ var _icons = require("../../icons");
10
+ var _this = this,
11
+ _jsxFileName = "/home/runner/work/stream-chat-react-native/stream-chat-react-native/package/src/components/Attachment/ImageReloadIndicator.tsx";
12
+ var REFRESH_ICON_SIZE = 24;
13
+ var ImageReloadIndicator = function ImageReloadIndicator(_ref) {
14
+ var onReloadImage = _ref.onReloadImage,
15
+ style = _ref.style;
16
+ var _useTheme = (0, _ThemeContext.useTheme)(),
17
+ grey_dark = _useTheme.theme.colors.grey_dark;
18
+ return _react["default"].createElement(_reactNative.Pressable, {
19
+ onPress: onReloadImage,
20
+ style: style,
21
+ __self: _this,
22
+ __source: {
23
+ fileName: _jsxFileName,
24
+ lineNumber: 23,
25
+ columnNumber: 5
26
+ }
27
+ }, _react["default"].createElement(_icons.Refresh, {
28
+ height: REFRESH_ICON_SIZE,
29
+ pathFill: grey_dark,
30
+ width: REFRESH_ICON_SIZE,
31
+ __self: _this,
32
+ __source: {
33
+ fileName: _jsxFileName,
34
+ lineNumber: 24,
35
+ columnNumber: 7
36
+ }
37
+ }));
38
+ };
39
+ exports.ImageReloadIndicator = ImageReloadIndicator;
40
+ //# sourceMappingURL=ImageReloadIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_ThemeContext","_icons","_this","_jsxFileName","REFRESH_ICON_SIZE","ImageReloadIndicator","_ref","onReloadImage","style","_useTheme","useTheme","grey_dark","theme","colors","createElement","Pressable","onPress","__self","__source","fileName","lineNumber","columnNumber","Refresh","height","pathFill","width","exports"],"sources":["ImageReloadIndicator.tsx"],"sourcesContent":["import React from 'react';\nimport { Pressable } from 'react-native';\n\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { Refresh } from '../../icons';\n\nconst REFRESH_ICON_SIZE = 24;\n\nexport const ImageReloadIndicator = ({\n onReloadImage,\n style,\n}: {\n onReloadImage: () => void;\n style: React.ComponentProps<typeof Pressable>['style'];\n}) => {\n const {\n theme: {\n colors: { grey_dark },\n },\n } = useTheme();\n\n return (\n <Pressable onPress={onReloadImage} style={style}>\n <Refresh height={REFRESH_ICON_SIZE} pathFill={grey_dark} width={REFRESH_ICON_SIZE} />\n </Pressable>\n );\n};\n"],"mappings":";;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAEA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAAsC,IAAAI,KAAA;EAAAC,YAAA;AAEtC,IAAMC,iBAAiB,GAAG,EAAE;AAErB,IAAMC,oBAAoB,GAAG,SAAvBA,oBAAoBA,CAAAC,IAAA,EAM3B;EAAA,IALJC,aAAa,GAAAD,IAAA,CAAbC,aAAa;IACbC,KAAK,GAAAF,IAAA,CAALE,KAAK;EAKL,IAAAC,SAAA,GAII,IAAAC,sBAAQ,GAAE;IAFAC,SAAS,GAAAF,SAAA,CADrBG,KAAK,CACHC,MAAM,CAAIF,SAAS;EAIvB,OACEf,MAAA,YAAAkB,aAAA,CAACf,YAAA,CAAAgB,SAAS;IAACC,OAAO,EAAET,aAAc;IAACC,KAAK,EAAEA,KAAM;IAAAS,MAAA,EAAAf,KAAA;IAAAgB,QAAA;MAAAC,QAAA,EAAAhB,YAAA;MAAAiB,UAAA;MAAAC,YAAA;IAAA;EAAA,GAC9CzB,MAAA,YAAAkB,aAAA,CAACb,MAAA,CAAAqB,OAAO;IAACC,MAAM,EAAEnB,iBAAkB;IAACoB,QAAQ,EAAEb,SAAU;IAACc,KAAK,EAAErB,iBAAkB;IAAAa,MAAA,EAAAf,KAAA;IAAAgB,QAAA;MAAAC,QAAA,EAAAhB,YAAA;MAAAiB,UAAA;MAAAC,YAAA;IAAA;EAAA,EAAG,CAC3E;AAEhB,CAAC;AAACK,OAAA,CAAArB,oBAAA,GAAAA,oBAAA"}
@@ -114,6 +114,18 @@ var AttachmentPicker = _react["default"].forwardRef(function (props, ref) {
114
114
  }
115
115
  }, _callee, null, [[4, 13]]);
116
116
  })), [currentIndex, selectedPicker, loadingPhotos]);
117
+ var getMorePhotosRef = (0, _react.useRef)(getMorePhotos);
118
+ getMorePhotosRef.current = getMorePhotos;
119
+ (0, _react.useEffect)(function () {
120
+ if (selectedPicker !== 'images') return;
121
+ var _oniOS14GalleryLibrar = (0, _native.oniOS14GalleryLibrarySelectionChange)(function () {
122
+ hasNextPageRef.current = true;
123
+ endCursorRef.current = undefined;
124
+ getMorePhotosRef.current();
125
+ }),
126
+ unsubscribe = _oniOS14GalleryLibrar.unsubscribe;
127
+ return unsubscribe;
128
+ }, [selectedPicker]);
117
129
  (0, _react.useEffect)(function () {
118
130
  var backAction = function backAction() {
119
131
  if (selectedPicker) {
@@ -221,7 +233,7 @@ var AttachmentPicker = _react["default"].forwardRef(function (props, ref) {
221
233
  __self: _this,
222
234
  __source: {
223
235
  fileName: _jsxFileName,
224
- lineNumber: 264,
236
+ lineNumber: 281,
225
237
  columnNumber: 9
226
238
  }
227
239
  }, _react["default"].createElement(_bottomSheet.BottomSheetFlatList, {
@@ -240,7 +252,7 @@ var AttachmentPicker = _react["default"].forwardRef(function (props, ref) {
240
252
  __self: _this,
241
253
  __source: {
242
254
  fileName: _jsxFileName,
243
- lineNumber: 280,
255
+ lineNumber: 297,
244
256
  columnNumber: 11
245
257
  }
246
258
  })), selectedPicker === 'images' && photoError && _react["default"].createElement(AttachmentPickerError, {
@@ -251,7 +263,7 @@ var AttachmentPicker = _react["default"].forwardRef(function (props, ref) {
251
263
  __self: _this,
252
264
  __source: {
253
265
  fileName: _jsxFileName,
254
- lineNumber: 295,
266
+ lineNumber: 312,
255
267
  columnNumber: 11
256
268
  }
257
269
  }));
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_bottomSheet","_dayjs","_interopRequireDefault","_duration","_AttachmentPickerItem","_AttachmentPickerContext","_ThemeContext","_native","_utils","_this","_jsxFileName","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","dayjs","extend","duration","styles","StyleSheet","create","container","flexGrow","screenHeight","vh","fullScreenHeight","Dimensions","height","AttachmentPicker","React","forwardRef","props","ref","AttachmentPickerBottomSheetHandle","attachmentPickerBottomSheetHandleHeight","attachmentPickerBottomSheetHeight","AttachmentPickerError","attachmentPickerErrorButtonText","AttachmentPickerErrorImage","attachmentPickerErrorText","ImageOverlaySelectedComponent","numberOfAttachmentImagesToLoadPerCall","numberOfAttachmentPickerImageColumns","translucentStatusBar","_useTheme","useTheme","_useTheme$theme","theme","bottomSheetContentContainer","attachmentPicker","white","colors","_useAttachmentPickerC","useAttachmentPickerContext","closePicker","maxNumberOfFiles","selectedFiles","selectedImages","selectedPicker","setSelectedFiles","setSelectedImages","setSelectedPicker","topInset","_useState","useState","_useState2","_slicedToArray2","currentIndex","setCurrentIndex","endCursorRef","useRef","_useState3","_useState4","photoError","setPhotoError","hasNextPageRef","_useState5","_useState6","loadingPhotos","setLoadingPhotos","_useState7","_useState8","photos","setPhotos","attemptedToLoadPhotosOnOpenRef","getMorePhotos","useCallback","_asyncToGenerator2","_regenerator","mark","_callee","endCursor","results","wrap","_callee$","_context","prev","next","current","getPhotos","after","first","sent","prevPhotos","concat","_toConsumableArray2","assets","hasNextPage","t0","stop","useEffect","backAction","undefined","backHandler","BackHandler","addEventListener","remove","keyboardShowEvent","Platform","OS","keyboardSubscription","Keyboard","addListener","removeListener","selectedPhotos","map","asset","numberOfUploads","length","selected","some","image","uri","file","handleHeight","getAndroidBottomBarHeightAdjustment","_StatusBar$currentHei","statusBarHeight","StatusBar","currentHeight","bottomBarHeight","getInitialSnapPoint","initialSnapPoint","finalSnapPoint","snapPoints","useMemo","createElement","Fragment","containerHeight","enablePanDownToClose","handleComponent","index","onChange","__self","__source","fileName","lineNumber","columnNumber","BottomSheetFlatList","contentContainerStyle","backgroundColor","opacity","data","keyExtractor","item","numColumns","onEndReached","renderItem","renderAttachmentPickerItem","exports","displayName"],"sources":["AttachmentPicker.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { BackHandler, Dimensions, Keyboard, Platform, StatusBar, StyleSheet } from 'react-native';\n\nimport BottomSheet, { BottomSheetFlatList, BottomSheetHandleProps } from '@gorhom/bottom-sheet';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\n\nimport type { AttachmentPickerErrorProps } from './components/AttachmentPickerError';\n\nimport { renderAttachmentPickerItem } from './components/AttachmentPickerItem';\n\nimport { useAttachmentPickerContext } from '../../contexts/attachmentPickerContext/AttachmentPickerContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { getPhotos } from '../../native';\nimport type { Asset } from '../../types/types';\nimport { vh } from '../../utils/utils';\n\ndayjs.extend(duration);\n\nconst styles = StyleSheet.create({\n container: {\n flexGrow: 1,\n },\n});\n\nconst screenHeight = vh(100);\nconst fullScreenHeight = Dimensions.get('window').height;\n\nexport type AttachmentPickerProps = {\n /**\n * Custom UI component to render [draggable handle](https://github.com/GetStream/stream-chat-react-native/blob/main/screenshots/docs/1.png) of attachment picker.\n *\n * **Default** [AttachmentPickerBottomSheetHandle](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerBottomSheetHandle.tsx)\n */\n AttachmentPickerBottomSheetHandle: React.FC<BottomSheetHandleProps>;\n /**\n * Custom UI component to render error component while opening attachment picker.\n *\n * **Default** [AttachmentPickerError](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerError.tsx)\n */\n AttachmentPickerError: React.ComponentType<AttachmentPickerErrorProps>;\n /**\n * Custom UI component to render error image for attachment picker\n *\n * **Default** [AttachmentPickerErrorImage](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerErrorImage.tsx)\n */\n AttachmentPickerErrorImage: React.ComponentType;\n /**\n * Custom UI component to render overlay component, that shows up on top of [selected image](https://github.com/GetStream/stream-chat-react-native/blob/main/screenshots/docs/1.png) (with tick mark)\n *\n * **Default** [ImageOverlaySelectedComponent](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/ImageOverlaySelectedComponent.tsx)\n */\n ImageOverlaySelectedComponent: React.ComponentType;\n attachmentPickerBottomSheetHandleHeight?: number;\n attachmentPickerBottomSheetHeight?: number;\n attachmentPickerErrorButtonText?: string;\n attachmentPickerErrorText?: string;\n numberOfAttachmentImagesToLoadPerCall?: number;\n numberOfAttachmentPickerImageColumns?: number;\n translucentStatusBar?: boolean;\n};\n\nexport const AttachmentPicker = React.forwardRef(\n (props: AttachmentPickerProps, ref: React.ForwardedRef<BottomSheet>) => {\n const {\n AttachmentPickerBottomSheetHandle,\n attachmentPickerBottomSheetHandleHeight,\n attachmentPickerBottomSheetHeight,\n AttachmentPickerError,\n attachmentPickerErrorButtonText,\n AttachmentPickerErrorImage,\n attachmentPickerErrorText,\n ImageOverlaySelectedComponent,\n numberOfAttachmentImagesToLoadPerCall,\n numberOfAttachmentPickerImageColumns,\n translucentStatusBar,\n } = props;\n\n const {\n theme: {\n attachmentPicker: { bottomSheetContentContainer },\n colors: { white },\n },\n } = useTheme();\n const {\n closePicker,\n maxNumberOfFiles,\n selectedFiles,\n selectedImages,\n selectedPicker,\n setSelectedFiles,\n setSelectedImages,\n setSelectedPicker,\n topInset,\n } = useAttachmentPickerContext();\n\n const [currentIndex, setCurrentIndex] = useState(-1);\n const endCursorRef = useRef<string>();\n const [photoError, setPhotoError] = useState(false);\n const hasNextPageRef = useRef(true);\n const [loadingPhotos, setLoadingPhotos] = useState(false);\n const [photos, setPhotos] = useState<Asset[]>([]);\n const attemptedToLoadPhotosOnOpenRef = useRef(false);\n\n const getMorePhotos = useCallback(async () => {\n if (\n hasNextPageRef.current &&\n !loadingPhotos &&\n currentIndex > -1 &&\n selectedPicker === 'images'\n ) {\n setPhotoError(false);\n setLoadingPhotos(true);\n const endCursor = endCursorRef.current;\n try {\n const results = await getPhotos({\n after: endCursor,\n first: numberOfAttachmentImagesToLoadPerCall ?? 60,\n });\n endCursorRef.current = results.endCursor;\n setPhotos((prevPhotos) =>\n endCursor ? [...prevPhotos, ...results.assets] : results.assets,\n );\n hasNextPageRef.current = !!results.hasNextPage;\n } catch (error) {\n setPhotoError(true);\n }\n setLoadingPhotos(false);\n }\n }, [currentIndex, selectedPicker, loadingPhotos]);\n\n useEffect(() => {\n const backAction = () => {\n if (selectedPicker) {\n setSelectedPicker(undefined);\n closePicker();\n return true;\n }\n\n return false;\n };\n\n const backHandler = BackHandler.addEventListener('hardwareBackPress', backAction);\n\n return () => backHandler.remove();\n }, [selectedPicker, closePicker]);\n\n useEffect(() => {\n const keyboardShowEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';\n const keyboardSubscription = Keyboard.addListener(keyboardShowEvent, closePicker);\n\n return () => {\n if (keyboardSubscription?.remove) {\n keyboardSubscription.remove();\n return;\n }\n\n // To keep compatibility with older versions of React Native, where `remove()` is not available\n Keyboard.removeListener(keyboardShowEvent, closePicker);\n };\n }, [closePicker]);\n\n useEffect(() => {\n if (currentIndex < 0) {\n setSelectedPicker(undefined);\n if (!loadingPhotos) {\n endCursorRef.current = undefined;\n hasNextPageRef.current = true;\n attemptedToLoadPhotosOnOpenRef.current = false;\n setPhotoError(false);\n }\n }\n }, [currentIndex, loadingPhotos]);\n\n useEffect(() => {\n if (\n !attemptedToLoadPhotosOnOpenRef.current &&\n selectedPicker === 'images' &&\n endCursorRef.current === undefined &&\n currentIndex > -1 &&\n !loadingPhotos\n ) {\n getMorePhotos();\n // we do this only once on open for avoiding to request permissions in rationale dialog again and again on Android\n attemptedToLoadPhotosOnOpenRef.current = true;\n }\n }, [currentIndex, selectedPicker, getMorePhotos, loadingPhotos]);\n\n const selectedPhotos = photos.map((asset) => ({\n asset,\n ImageOverlaySelectedComponent,\n maxNumberOfFiles,\n numberOfAttachmentPickerImageColumns,\n numberOfUploads: selectedFiles.length + selectedImages.length,\n selected:\n selectedImages.some((image) => image.uri === asset.uri) ||\n selectedFiles.some((file) => file.uri === asset.uri),\n setSelectedFiles,\n setSelectedImages,\n }));\n\n const handleHeight = attachmentPickerBottomSheetHandleHeight || 20;\n\n /**\n * This is to handle issues with Android measurements coming back incorrect.\n * If the StatusBar height is perfectly 1/2 of the difference between the two\n * dimensions for screen and window, it is incorrect and we need to account for\n * this. If you use a translucent header bar more adjustments are needed.\n */\n const getAndroidBottomBarHeightAdjustment = (): number => {\n if (Platform.OS === 'android') {\n const statusBarHeight = StatusBar.currentHeight ?? 0;\n const bottomBarHeight = fullScreenHeight - screenHeight - statusBarHeight;\n if (bottomBarHeight === statusBarHeight) {\n return translucentStatusBar ? 0 : statusBarHeight;\n } else {\n if (translucentStatusBar) {\n if (bottomBarHeight > statusBarHeight) {\n return -bottomBarHeight + statusBarHeight;\n } else {\n return bottomBarHeight > 0 ? -statusBarHeight : 0;\n }\n } else {\n return bottomBarHeight > 0 ? 0 : statusBarHeight;\n }\n }\n }\n return 0;\n };\n\n const getInitialSnapPoint = (): number => {\n if (attachmentPickerBottomSheetHeight !== undefined) {\n return attachmentPickerBottomSheetHeight;\n }\n if (Platform.OS === 'android') {\n return (\n 308 +\n (fullScreenHeight - screenHeight + getAndroidBottomBarHeightAdjustment()) -\n handleHeight\n );\n } else {\n return 308 + (fullScreenHeight - screenHeight);\n }\n };\n\n const initialSnapPoint = getInitialSnapPoint();\n\n const finalSnapPoint =\n Platform.OS === 'android'\n ? fullScreenHeight - topInset - handleHeight\n : fullScreenHeight - topInset;\n\n /**\n * Snap points changing cause a rerender of the position,\n * this is an issue if you are calling close on the bottom sheet.\n */\n const snapPoints = useMemo(\n () => [initialSnapPoint, finalSnapPoint],\n [initialSnapPoint, finalSnapPoint],\n );\n\n return (\n <>\n <BottomSheet\n containerHeight={fullScreenHeight}\n enablePanDownToClose={true}\n handleComponent={\n /**\n * using `null` here instead of `style={{ opacity: photoError ? 0 : 1 }}`\n * as opacity is not an allowed style\n */\n photoError ? null : AttachmentPickerBottomSheetHandle\n }\n handleHeight={handleHeight}\n index={-1}\n onChange={setCurrentIndex}\n ref={ref}\n snapPoints={snapPoints}\n >\n <BottomSheetFlatList\n contentContainerStyle={[\n styles.container,\n { backgroundColor: white },\n bottomSheetContentContainer,\n { opacity: photoError ? 0 : 1 },\n ]}\n data={selectedPhotos}\n keyExtractor={(item) => item.asset.uri}\n numColumns={numberOfAttachmentPickerImageColumns ?? 3}\n onEndReached={getMorePhotos}\n renderItem={renderAttachmentPickerItem}\n />\n </BottomSheet>\n {selectedPicker === 'images' && photoError && (\n <AttachmentPickerError\n attachmentPickerBottomSheetHeight={initialSnapPoint}\n attachmentPickerErrorButtonText={attachmentPickerErrorButtonText}\n AttachmentPickerErrorImage={AttachmentPickerErrorImage}\n attachmentPickerErrorText={attachmentPickerErrorText}\n />\n )}\n </>\n );\n },\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n"],"mappings":"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"}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_bottomSheet","_dayjs","_interopRequireDefault","_duration","_AttachmentPickerItem","_AttachmentPickerContext","_ThemeContext","_native","_utils","_this","_jsxFileName","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","_typeof","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","dayjs","extend","duration","styles","StyleSheet","create","container","flexGrow","screenHeight","vh","fullScreenHeight","Dimensions","height","AttachmentPicker","React","forwardRef","props","ref","AttachmentPickerBottomSheetHandle","attachmentPickerBottomSheetHandleHeight","attachmentPickerBottomSheetHeight","AttachmentPickerError","attachmentPickerErrorButtonText","AttachmentPickerErrorImage","attachmentPickerErrorText","ImageOverlaySelectedComponent","numberOfAttachmentImagesToLoadPerCall","numberOfAttachmentPickerImageColumns","translucentStatusBar","_useTheme","useTheme","_useTheme$theme","theme","bottomSheetContentContainer","attachmentPicker","white","colors","_useAttachmentPickerC","useAttachmentPickerContext","closePicker","maxNumberOfFiles","selectedFiles","selectedImages","selectedPicker","setSelectedFiles","setSelectedImages","setSelectedPicker","topInset","_useState","useState","_useState2","_slicedToArray2","currentIndex","setCurrentIndex","endCursorRef","useRef","_useState3","_useState4","photoError","setPhotoError","hasNextPageRef","_useState5","_useState6","loadingPhotos","setLoadingPhotos","_useState7","_useState8","photos","setPhotos","attemptedToLoadPhotosOnOpenRef","getMorePhotos","useCallback","_asyncToGenerator2","_regenerator","mark","_callee","endCursor","results","wrap","_callee$","_context","prev","next","current","getPhotos","after","first","sent","prevPhotos","concat","_toConsumableArray2","assets","hasNextPage","t0","stop","getMorePhotosRef","useEffect","_oniOS14GalleryLibrar","oniOS14GalleryLibrarySelectionChange","undefined","unsubscribe","backAction","backHandler","BackHandler","addEventListener","remove","keyboardShowEvent","Platform","OS","keyboardSubscription","Keyboard","addListener","removeListener","selectedPhotos","map","asset","numberOfUploads","length","selected","some","image","uri","file","handleHeight","getAndroidBottomBarHeightAdjustment","_StatusBar$currentHei","statusBarHeight","StatusBar","currentHeight","bottomBarHeight","getInitialSnapPoint","initialSnapPoint","finalSnapPoint","snapPoints","useMemo","createElement","Fragment","containerHeight","enablePanDownToClose","handleComponent","index","onChange","__self","__source","fileName","lineNumber","columnNumber","BottomSheetFlatList","contentContainerStyle","backgroundColor","opacity","data","keyExtractor","item","numColumns","onEndReached","renderItem","renderAttachmentPickerItem","exports","displayName"],"sources":["AttachmentPicker.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { BackHandler, Dimensions, Keyboard, Platform, StatusBar, StyleSheet } from 'react-native';\n\nimport BottomSheet, { BottomSheetFlatList, BottomSheetHandleProps } from '@gorhom/bottom-sheet';\nimport dayjs from 'dayjs';\nimport duration from 'dayjs/plugin/duration';\n\nimport type { AttachmentPickerErrorProps } from './components/AttachmentPickerError';\n\nimport { renderAttachmentPickerItem } from './components/AttachmentPickerItem';\n\nimport { useAttachmentPickerContext } from '../../contexts/attachmentPickerContext/AttachmentPickerContext';\nimport { useTheme } from '../../contexts/themeContext/ThemeContext';\nimport { getPhotos, oniOS14GalleryLibrarySelectionChange } from '../../native';\nimport type { Asset } from '../../types/types';\nimport { vh } from '../../utils/utils';\n\ndayjs.extend(duration);\n\nconst styles = StyleSheet.create({\n container: {\n flexGrow: 1,\n },\n});\n\nconst screenHeight = vh(100);\nconst fullScreenHeight = Dimensions.get('window').height;\n\nexport type AttachmentPickerProps = {\n /**\n * Custom UI component to render [draggable handle](https://github.com/GetStream/stream-chat-react-native/blob/main/screenshots/docs/1.png) of attachment picker.\n *\n * **Default** [AttachmentPickerBottomSheetHandle](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerBottomSheetHandle.tsx)\n */\n AttachmentPickerBottomSheetHandle: React.FC<BottomSheetHandleProps>;\n /**\n * Custom UI component to render error component while opening attachment picker.\n *\n * **Default** [AttachmentPickerError](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerError.tsx)\n */\n AttachmentPickerError: React.ComponentType<AttachmentPickerErrorProps>;\n /**\n * Custom UI component to render error image for attachment picker\n *\n * **Default** [AttachmentPickerErrorImage](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/AttachmentPickerErrorImage.tsx)\n */\n AttachmentPickerErrorImage: React.ComponentType;\n /**\n * Custom UI component to render overlay component, that shows up on top of [selected image](https://github.com/GetStream/stream-chat-react-native/blob/main/screenshots/docs/1.png) (with tick mark)\n *\n * **Default** [ImageOverlaySelectedComponent](https://github.com/GetStream/stream-chat-react-native/blob/main/package/src/components/AttachmentPicker/components/ImageOverlaySelectedComponent.tsx)\n */\n ImageOverlaySelectedComponent: React.ComponentType;\n attachmentPickerBottomSheetHandleHeight?: number;\n attachmentPickerBottomSheetHeight?: number;\n attachmentPickerErrorButtonText?: string;\n attachmentPickerErrorText?: string;\n numberOfAttachmentImagesToLoadPerCall?: number;\n numberOfAttachmentPickerImageColumns?: number;\n translucentStatusBar?: boolean;\n};\n\nexport const AttachmentPicker = React.forwardRef(\n (props: AttachmentPickerProps, ref: React.ForwardedRef<BottomSheet>) => {\n const {\n AttachmentPickerBottomSheetHandle,\n attachmentPickerBottomSheetHandleHeight,\n attachmentPickerBottomSheetHeight,\n AttachmentPickerError,\n attachmentPickerErrorButtonText,\n AttachmentPickerErrorImage,\n attachmentPickerErrorText,\n ImageOverlaySelectedComponent,\n numberOfAttachmentImagesToLoadPerCall,\n numberOfAttachmentPickerImageColumns,\n translucentStatusBar,\n } = props;\n\n const {\n theme: {\n attachmentPicker: { bottomSheetContentContainer },\n colors: { white },\n },\n } = useTheme();\n const {\n closePicker,\n maxNumberOfFiles,\n selectedFiles,\n selectedImages,\n selectedPicker,\n setSelectedFiles,\n setSelectedImages,\n setSelectedPicker,\n topInset,\n } = useAttachmentPickerContext();\n\n const [currentIndex, setCurrentIndex] = useState(-1);\n const endCursorRef = useRef<string>();\n const [photoError, setPhotoError] = useState(false);\n const hasNextPageRef = useRef(true);\n const [loadingPhotos, setLoadingPhotos] = useState(false);\n const [photos, setPhotos] = useState<Asset[]>([]);\n const attemptedToLoadPhotosOnOpenRef = useRef(false);\n\n const getMorePhotos = useCallback(async () => {\n if (\n hasNextPageRef.current &&\n !loadingPhotos &&\n currentIndex > -1 &&\n selectedPicker === 'images'\n ) {\n setPhotoError(false);\n setLoadingPhotos(true);\n const endCursor = endCursorRef.current;\n try {\n const results = await getPhotos({\n after: endCursor,\n first: numberOfAttachmentImagesToLoadPerCall ?? 60,\n });\n endCursorRef.current = results.endCursor;\n setPhotos((prevPhotos) =>\n endCursor ? [...prevPhotos, ...results.assets] : results.assets,\n );\n hasNextPageRef.current = !!results.hasNextPage;\n } catch (error) {\n setPhotoError(true);\n }\n setLoadingPhotos(false);\n }\n }, [currentIndex, selectedPicker, loadingPhotos]);\n\n // we need to use ref here to avoid running effect when getMorePhotos changes\n const getMorePhotosRef = useRef(getMorePhotos);\n getMorePhotosRef.current = getMorePhotos;\n\n useEffect(() => {\n if (selectedPicker !== 'images') return;\n // ios 14 library selection change event is fired when user reselects the images that are permitted to be readable by the app\n const { unsubscribe } = oniOS14GalleryLibrarySelectionChange(() => {\n // we reset the cursor and has next page to true to facilitate fetching of the first page of photos again\n hasNextPageRef.current = true;\n endCursorRef.current = undefined;\n // fetch the first page of photos again\n getMorePhotosRef.current();\n });\n return unsubscribe;\n }, [selectedPicker]);\n\n useEffect(() => {\n const backAction = () => {\n if (selectedPicker) {\n setSelectedPicker(undefined);\n closePicker();\n return true;\n }\n\n return false;\n };\n\n const backHandler = BackHandler.addEventListener('hardwareBackPress', backAction);\n\n return () => backHandler.remove();\n }, [selectedPicker, closePicker]);\n\n useEffect(() => {\n const keyboardShowEvent = Platform.OS === 'ios' ? 'keyboardWillShow' : 'keyboardDidShow';\n const keyboardSubscription = Keyboard.addListener(keyboardShowEvent, closePicker);\n\n return () => {\n if (keyboardSubscription?.remove) {\n keyboardSubscription.remove();\n return;\n }\n\n // To keep compatibility with older versions of React Native, where `remove()` is not available\n Keyboard.removeListener(keyboardShowEvent, closePicker);\n };\n }, [closePicker]);\n\n useEffect(() => {\n if (currentIndex < 0) {\n setSelectedPicker(undefined);\n if (!loadingPhotos) {\n endCursorRef.current = undefined;\n hasNextPageRef.current = true;\n attemptedToLoadPhotosOnOpenRef.current = false;\n setPhotoError(false);\n }\n }\n }, [currentIndex, loadingPhotos]);\n\n useEffect(() => {\n if (\n !attemptedToLoadPhotosOnOpenRef.current &&\n selectedPicker === 'images' &&\n endCursorRef.current === undefined &&\n currentIndex > -1 &&\n !loadingPhotos\n ) {\n getMorePhotos();\n // we do this only once on open for avoiding to request permissions in rationale dialog again and again on Android\n attemptedToLoadPhotosOnOpenRef.current = true;\n }\n }, [currentIndex, selectedPicker, getMorePhotos, loadingPhotos]);\n\n const selectedPhotos = photos.map((asset) => ({\n asset,\n ImageOverlaySelectedComponent,\n maxNumberOfFiles,\n numberOfAttachmentPickerImageColumns,\n numberOfUploads: selectedFiles.length + selectedImages.length,\n selected:\n selectedImages.some((image) => image.uri === asset.uri) ||\n selectedFiles.some((file) => file.uri === asset.uri),\n setSelectedFiles,\n setSelectedImages,\n }));\n\n const handleHeight = attachmentPickerBottomSheetHandleHeight || 20;\n\n /**\n * This is to handle issues with Android measurements coming back incorrect.\n * If the StatusBar height is perfectly 1/2 of the difference between the two\n * dimensions for screen and window, it is incorrect and we need to account for\n * this. If you use a translucent header bar more adjustments are needed.\n */\n const getAndroidBottomBarHeightAdjustment = (): number => {\n if (Platform.OS === 'android') {\n const statusBarHeight = StatusBar.currentHeight ?? 0;\n const bottomBarHeight = fullScreenHeight - screenHeight - statusBarHeight;\n if (bottomBarHeight === statusBarHeight) {\n return translucentStatusBar ? 0 : statusBarHeight;\n } else {\n if (translucentStatusBar) {\n if (bottomBarHeight > statusBarHeight) {\n return -bottomBarHeight + statusBarHeight;\n } else {\n return bottomBarHeight > 0 ? -statusBarHeight : 0;\n }\n } else {\n return bottomBarHeight > 0 ? 0 : statusBarHeight;\n }\n }\n }\n return 0;\n };\n\n const getInitialSnapPoint = (): number => {\n if (attachmentPickerBottomSheetHeight !== undefined) {\n return attachmentPickerBottomSheetHeight;\n }\n if (Platform.OS === 'android') {\n return (\n 308 +\n (fullScreenHeight - screenHeight + getAndroidBottomBarHeightAdjustment()) -\n handleHeight\n );\n } else {\n return 308 + (fullScreenHeight - screenHeight);\n }\n };\n\n const initialSnapPoint = getInitialSnapPoint();\n\n const finalSnapPoint =\n Platform.OS === 'android'\n ? fullScreenHeight - topInset - handleHeight\n : fullScreenHeight - topInset;\n\n /**\n * Snap points changing cause a rerender of the position,\n * this is an issue if you are calling close on the bottom sheet.\n */\n const snapPoints = useMemo(\n () => [initialSnapPoint, finalSnapPoint],\n [initialSnapPoint, finalSnapPoint],\n );\n\n return (\n <>\n <BottomSheet\n containerHeight={fullScreenHeight}\n enablePanDownToClose={true}\n handleComponent={\n /**\n * using `null` here instead of `style={{ opacity: photoError ? 0 : 1 }}`\n * as opacity is not an allowed style\n */\n photoError ? null : AttachmentPickerBottomSheetHandle\n }\n handleHeight={handleHeight}\n index={-1}\n onChange={setCurrentIndex}\n ref={ref}\n snapPoints={snapPoints}\n >\n <BottomSheetFlatList\n contentContainerStyle={[\n styles.container,\n { backgroundColor: white },\n bottomSheetContentContainer,\n { opacity: photoError ? 0 : 1 },\n ]}\n data={selectedPhotos}\n keyExtractor={(item) => item.asset.uri}\n numColumns={numberOfAttachmentPickerImageColumns ?? 3}\n onEndReached={getMorePhotos}\n renderItem={renderAttachmentPickerItem}\n />\n </BottomSheet>\n {selectedPicker === 'images' && photoError && (\n <AttachmentPickerError\n attachmentPickerBottomSheetHeight={initialSnapPoint}\n attachmentPickerErrorButtonText={attachmentPickerErrorButtonText}\n AttachmentPickerErrorImage={AttachmentPickerErrorImage}\n attachmentPickerErrorText={attachmentPickerErrorText}\n />\n )}\n </>\n );\n },\n);\n\nAttachmentPicker.displayName = 'AttachmentPicker';\n"],"mappings":"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"}
@@ -4,29 +4,70 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.useLoadingImage = void 0;
6
6
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
7
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
7
8
  var _react = require("react");
8
- var _netinfo = require("@react-native-community/netinfo");
9
+ var _ChatContext = require("../contexts/chatContext/ChatContext");
10
+ function reducer(prevState, action) {
11
+ switch (action.type) {
12
+ case 'reloadImage':
13
+ return (0, _extends2["default"])({}, prevState, {
14
+ isLoadingImage: true,
15
+ isLoadingImageError: false
16
+ });
17
+ case 'setLoadingImage':
18
+ return (0, _extends2["default"])({}, prevState, {
19
+ isLoadingImage: action.isLoadingImage
20
+ });
21
+ case 'setLoadingImageError':
22
+ return (0, _extends2["default"])({}, prevState, {
23
+ isLoadingImageError: action.isLoadingImageError
24
+ });
25
+ default:
26
+ return prevState;
27
+ }
28
+ }
9
29
  var useLoadingImage = function useLoadingImage() {
10
- var _useState = (0, _react.useState)(true),
11
- _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
12
- isLoadingImage = _useState2[0],
13
- setLoadingImage = _useState2[1];
14
- var _useState3 = (0, _react.useState)(false),
15
- _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
16
- isLoadingImageError = _useState4[0],
17
- setLoadingImageError = _useState4[1];
18
- var _useNetInfo = (0, _netinfo.useNetInfo)(),
19
- isConnected = _useNetInfo.isConnected;
30
+ var _useReducer = (0, _react.useReducer)(reducer, {
31
+ isLoadingImage: true,
32
+ isLoadingImageError: false
33
+ }),
34
+ _useReducer2 = (0, _slicedToArray2["default"])(_useReducer, 2),
35
+ imageState = _useReducer2[0],
36
+ dispatch = _useReducer2[1];
37
+ var isLoadingImage = imageState.isLoadingImage,
38
+ isLoadingImageError = imageState.isLoadingImageError;
39
+ var onReloadImageRef = (0, _react.useRef)(function () {
40
+ return dispatch({
41
+ type: 'reloadImage'
42
+ });
43
+ });
44
+ var setLoadingImageRef = (0, _react.useRef)(function (isLoadingImage) {
45
+ return dispatch({
46
+ isLoadingImage: isLoadingImage,
47
+ type: 'setLoadingImage'
48
+ });
49
+ });
50
+ var setLoadingImageErrorRef = (0, _react.useRef)(function (isLoadingImageError) {
51
+ return dispatch({
52
+ isLoadingImageError: isLoadingImageError,
53
+ type: 'setLoadingImageError'
54
+ });
55
+ });
56
+ var _useChatContext = (0, _ChatContext.useChatContext)(),
57
+ isOnline = _useChatContext.isOnline;
58
+ var hasImageLoadedErroredRef = (0, _react.useRef)(isLoadingImageError);
59
+ hasImageLoadedErroredRef.current = isLoadingImageError;
20
60
  (0, _react.useEffect)(function () {
21
- if (isConnected) {
22
- setLoadingImageError(false);
61
+ if (isOnline && hasImageLoadedErroredRef.current) {
62
+ onReloadImageRef.current();
23
63
  }
24
- }, [isConnected]);
64
+ }, [isOnline]);
25
65
  return {
26
66
  isLoadingImage: isLoadingImage,
27
67
  isLoadingImageError: isLoadingImageError,
28
- setLoadingImage: setLoadingImage,
29
- setLoadingImageError: setLoadingImageError
68
+ onReloadImage: onReloadImageRef.current,
69
+ setLoadingImage: setLoadingImageRef.current,
70
+ setLoadingImageError: setLoadingImageErrorRef.current
30
71
  };
31
72
  };
32
73
  exports.useLoadingImage = useLoadingImage;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_netinfo","useLoadingImage","_useState","useState","_useState2","_slicedToArray2","isLoadingImage","setLoadingImage","_useState3","_useState4","isLoadingImageError","setLoadingImageError","_useNetInfo","useNetInfo","isConnected","useEffect","exports"],"sources":["useLoadingImage.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\n\nimport { useNetInfo } from '@react-native-community/netinfo';\n\nexport const useLoadingImage = () => {\n const [isLoadingImage, setLoadingImage] = useState(true);\n const [isLoadingImageError, setLoadingImageError] = useState(false);\n const { isConnected } = useNetInfo();\n useEffect(() => {\n if (isConnected) {\n setLoadingImageError(false);\n }\n }, [isConnected]);\n\n return { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError };\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAD,OAAA;AAEO,IAAME,eAAe,GAAG,SAAlBA,eAAeA,CAAA,EAAS;EACnC,IAAAC,SAAA,GAA0C,IAAAC,eAAQ,EAAC,IAAI,CAAC;IAAAC,UAAA,OAAAC,eAAA,aAAAH,SAAA;IAAjDI,cAAc,GAAAF,UAAA;IAAEG,eAAe,GAAAH,UAAA;EACtC,IAAAI,UAAA,GAAoD,IAAAL,eAAQ,EAAC,KAAK,CAAC;IAAAM,UAAA,OAAAJ,eAAA,aAAAG,UAAA;IAA5DE,mBAAmB,GAAAD,UAAA;IAAEE,oBAAoB,GAAAF,UAAA;EAChD,IAAAG,WAAA,GAAwB,IAAAC,mBAAU,GAAE;IAA5BC,WAAW,GAAAF,WAAA,CAAXE,WAAW;EACnB,IAAAC,gBAAS,EAAC,YAAM;IACd,IAAID,WAAW,EAAE;MACfH,oBAAoB,CAAC,KAAK,CAAC;IAC7B;EACF,CAAC,EAAE,CAACG,WAAW,CAAC,CAAC;EAEjB,OAAO;IAAER,cAAc,EAAdA,cAAc;IAAEI,mBAAmB,EAAnBA,mBAAmB;IAAEH,eAAe,EAAfA,eAAe;IAAEI,oBAAoB,EAApBA;EAAqB,CAAC;AACvF,CAAC;AAACK,OAAA,CAAAf,eAAA,GAAAA,eAAA"}
1
+ {"version":3,"names":["_react","require","_ChatContext","reducer","prevState","action","type","_extends2","isLoadingImage","isLoadingImageError","useLoadingImage","_useReducer","useReducer","_useReducer2","_slicedToArray2","imageState","dispatch","onReloadImageRef","useRef","setLoadingImageRef","setLoadingImageErrorRef","_useChatContext","useChatContext","isOnline","hasImageLoadedErroredRef","current","useEffect","onReloadImage","setLoadingImage","setLoadingImageError","exports"],"sources":["useLoadingImage.tsx"],"sourcesContent":["import { useEffect, useReducer, useRef } from 'react';\n\nimport { useChatContext } from '../contexts/chatContext/ChatContext';\n\ntype ImageState = {\n isLoadingImage: boolean;\n isLoadingImageError: boolean;\n};\n\ntype Action =\n | { type: 'reloadImage' }\n | { isLoadingImage: boolean; type: 'setLoadingImage' }\n | { isLoadingImageError: boolean; type: 'setLoadingImageError' };\n\nfunction reducer(prevState: ImageState, action: Action) {\n switch (action.type) {\n case 'reloadImage':\n return {\n ...prevState,\n isLoadingImage: true,\n isLoadingImageError: false,\n };\n case 'setLoadingImage':\n return { ...prevState, isLoadingImage: action.isLoadingImage };\n case 'setLoadingImageError':\n return { ...prevState, isLoadingImageError: action.isLoadingImageError };\n default:\n return prevState;\n }\n}\nexport const useLoadingImage = () => {\n const [imageState, dispatch] = useReducer(reducer, {\n isLoadingImage: true,\n isLoadingImageError: false,\n });\n const { isLoadingImage, isLoadingImageError } = imageState;\n const onReloadImageRef = useRef(() => dispatch({ type: 'reloadImage' }));\n const setLoadingImageRef = useRef((isLoadingImage: boolean) =>\n dispatch({ isLoadingImage, type: 'setLoadingImage' }),\n );\n const setLoadingImageErrorRef = useRef((isLoadingImageError: boolean) =>\n dispatch({ isLoadingImageError, type: 'setLoadingImageError' }),\n );\n const { isOnline } = useChatContext();\n\n // storing the value of isLoadingImageError in a ref to avoid passing as a dep to useEffect\n const hasImageLoadedErroredRef = useRef(isLoadingImageError);\n hasImageLoadedErroredRef.current = isLoadingImageError;\n\n useEffect(() => {\n if (isOnline && hasImageLoadedErroredRef.current) {\n // if there was an error previously, reload the image automatically when user comes back online\n onReloadImageRef.current();\n }\n }, [isOnline]);\n\n return {\n isLoadingImage,\n isLoadingImageError,\n onReloadImage: onReloadImageRef.current,\n setLoadingImage: setLoadingImageRef.current,\n setLoadingImageError: setLoadingImageErrorRef.current,\n };\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAD,OAAA;AAYA,SAASE,OAAOA,CAACC,SAAqB,EAAEC,MAAc,EAAE;EACtD,QAAQA,MAAM,CAACC,IAAI;IACjB,KAAK,aAAa;MAChB,WAAAC,SAAA,iBACKH,SAAS;QACZI,cAAc,EAAE,IAAI;QACpBC,mBAAmB,EAAE;MAAK;IAE9B,KAAK,iBAAiB;MACpB,WAAAF,SAAA,iBAAYH,SAAS;QAAEI,cAAc,EAAEH,MAAM,CAACG;MAAc;IAC9D,KAAK,sBAAsB;MACzB,WAAAD,SAAA,iBAAYH,SAAS;QAAEK,mBAAmB,EAAEJ,MAAM,CAACI;MAAmB;IACxE;MACE,OAAOL,SAAS;EAAC;AAEvB;AACO,IAAMM,eAAe,GAAG,SAAlBA,eAAeA,CAAA,EAAS;EACnC,IAAAC,WAAA,GAA+B,IAAAC,iBAAU,EAACT,OAAO,EAAE;MACjDK,cAAc,EAAE,IAAI;MACpBC,mBAAmB,EAAE;IACvB,CAAC,CAAC;IAAAI,YAAA,OAAAC,eAAA,aAAAH,WAAA;IAHKI,UAAU,GAAAF,YAAA;IAAEG,QAAQ,GAAAH,YAAA;EAI3B,IAAQL,cAAc,GAA0BO,UAAU,CAAlDP,cAAc;IAAEC,mBAAmB,GAAKM,UAAU,CAAlCN,mBAAmB;EAC3C,IAAMQ,gBAAgB,GAAG,IAAAC,aAAM,EAAC;IAAA,OAAMF,QAAQ,CAAC;MAAEV,IAAI,EAAE;IAAc,CAAC,CAAC;EAAA,EAAC;EACxE,IAAMa,kBAAkB,GAAG,IAAAD,aAAM,EAAC,UAACV,cAAuB;IAAA,OACxDQ,QAAQ,CAAC;MAAER,cAAc,EAAdA,cAAc;MAAEF,IAAI,EAAE;IAAkB,CAAC,CAAC;EAAA,EACtD;EACD,IAAMc,uBAAuB,GAAG,IAAAF,aAAM,EAAC,UAACT,mBAA4B;IAAA,OAClEO,QAAQ,CAAC;MAAEP,mBAAmB,EAAnBA,mBAAmB;MAAEH,IAAI,EAAE;IAAuB,CAAC,CAAC;EAAA,EAChE;EACD,IAAAe,eAAA,GAAqB,IAAAC,2BAAc,GAAE;IAA7BC,QAAQ,GAAAF,eAAA,CAARE,QAAQ;EAGhB,IAAMC,wBAAwB,GAAG,IAAAN,aAAM,EAACT,mBAAmB,CAAC;EAC5De,wBAAwB,CAACC,OAAO,GAAGhB,mBAAmB;EAEtD,IAAAiB,gBAAS,EAAC,YAAM;IACd,IAAIH,QAAQ,IAAIC,wBAAwB,CAACC,OAAO,EAAE;MAEhDR,gBAAgB,CAACQ,OAAO,EAAE;IAC5B;EACF,CAAC,EAAE,CAACF,QAAQ,CAAC,CAAC;EAEd,OAAO;IACLf,cAAc,EAAdA,cAAc;IACdC,mBAAmB,EAAnBA,mBAAmB;IACnBkB,aAAa,EAAEV,gBAAgB,CAACQ,OAAO;IACvCG,eAAe,EAAET,kBAAkB,CAACM,OAAO;IAC3CI,oBAAoB,EAAET,uBAAuB,CAACK;EAChD,CAAC;AACH,CAAC;AAACK,OAAA,CAAApB,eAAA,GAAAA,eAAA"}
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, "__esModule", {
2
2
  value: true
3
3
  });
4
- exports.triggerHaptic = exports.takePhoto = exports.shareImage = exports.setClipboardString = exports.saveFile = exports.registerNativeHandlers = exports.pickDocument = exports.isVideoPackageAvailable = exports.isAudioPackageAvailable = exports.getPhotos = exports.getLocalAssetUri = exports.deleteFile = exports.compressImage = exports.Video = exports.Sound = exports.SDK = exports.NetInfo = exports.FlatList = void 0;
4
+ exports.triggerHaptic = exports.takePhoto = exports.shareImage = exports.setClipboardString = exports.saveFile = exports.registerNativeHandlers = exports.pickDocument = exports.oniOS14GalleryLibrarySelectionChange = exports.isVideoPackageAvailable = exports.isAudioPackageAvailable = exports.getPhotos = exports.getLocalAssetUri = exports.deleteFile = exports.compressImage = exports.Video = exports.Sound = exports.SDK = exports.NetInfo = exports.FlatList = void 0;
5
5
  var _reactNative = require("react-native");
6
6
  var fail = function fail() {
7
7
  throw Error('Native handler was not registered, you should import stream-chat-expo or stream-chat-react-native');
@@ -12,6 +12,8 @@ var deleteFile = fail;
12
12
  exports.deleteFile = deleteFile;
13
13
  var getLocalAssetUri = fail;
14
14
  exports.getLocalAssetUri = getLocalAssetUri;
15
+ var oniOS14GalleryLibrarySelectionChange = fail;
16
+ exports.oniOS14GalleryLibrarySelectionChange = oniOS14GalleryLibrarySelectionChange;
15
17
  var getPhotos = fail;
16
18
  exports.getPhotos = getPhotos;
17
19
  var FlatList = _reactNative.FlatList;
@@ -58,6 +60,9 @@ var registerNativeHandlers = function registerNativeHandlers(handlers) {
58
60
  if (handlers.getPhotos) {
59
61
  exports.getPhotos = getPhotos = handlers.getPhotos;
60
62
  }
63
+ if (handlers.oniOS14GalleryLibrarySelectionChange) {
64
+ exports.oniOS14GalleryLibrarySelectionChange = oniOS14GalleryLibrarySelectionChange = handlers.oniOS14GalleryLibrarySelectionChange;
65
+ }
61
66
  if (handlers.pickDocument !== undefined) {
62
67
  exports.pickDocument = pickDocument = handlers.pickDocument;
63
68
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","fail","Error","compressImage","exports","deleteFile","getLocalAssetUri","getPhotos","FlatList","DefaultFlatList","NetInfo","addEventListener","fetch","pickDocument","saveFile","setClipboardString","shareImage","takePhoto","triggerHaptic","SDK","Sound","Video","registerNativeHandlers","handlers","undefined","isVideoPackageAvailable","isAudioPackageAvailable","Player","initializeSound"],"sources":["native.ts"],"sourcesContent":["import type React from 'react';\nimport { FlatList as DefaultFlatList, StyleProp, ViewStyle } from 'react-native';\n\nimport type { NetInfoSubscription } from '@react-native-community/netinfo';\n\nimport type { Asset, File } from './types/types';\n\nconst fail = () => {\n throw Error(\n 'Native handler was not registered, you should import stream-chat-expo or stream-chat-react-native',\n );\n};\n\ntype CompressImage = ({\n compressImageQuality,\n height,\n uri,\n width,\n}: {\n compressImageQuality: number;\n height: number;\n uri: string;\n width: number;\n}) => Promise<string> | never;\nexport let compressImage: CompressImage = fail;\n\ntype DeleteFile = ({ uri }: { uri: string }) => Promise<boolean> | never;\nexport let deleteFile: DeleteFile = fail;\n\ntype GetLocalAssetUri = (uriOrAssetId: string) => Promise<string> | never;\nexport let getLocalAssetUri: GetLocalAssetUri = fail;\n\ntype GetPhotos = ({ after, first }: { first: number; after?: string }) =>\n | Promise<{\n assets: Array<Omit<Asset, 'source'> & { source: 'picker' }>;\n endCursor: string;\n hasNextPage: boolean;\n }>\n | never;\nexport let getPhotos: GetPhotos = fail;\n\ntype NetInfo = {\n addEventListener: (listener: (isConnected: boolean) => void) => NetInfoSubscription | never;\n fetch: (requestedInterface?: string | undefined) => Promise<boolean> | never;\n};\n\nexport let FlatList = DefaultFlatList;\n\nexport let NetInfo: NetInfo = {\n addEventListener: fail,\n fetch: fail,\n};\n\ntype PickDocument = ({ maxNumberOfFiles }: { maxNumberOfFiles?: number }) =>\n | Promise<{\n cancelled: boolean;\n docs?: File[];\n }>\n | never;\nexport let pickDocument: PickDocument = fail;\n\ntype SaveFileOptions = {\n fileName: string;\n fromUrl: string;\n};\ntype SaveFile = (options: SaveFileOptions) => Promise<string> | never;\nexport let saveFile: SaveFile = fail;\n\ntype SetClipboardString = (text: string) => Promise<void> | never;\nexport let setClipboardString: SetClipboardString = fail;\n\ntype ShareOptions = {\n type?: string;\n url?: string;\n};\ntype ShareImage = (options: ShareOptions) => Promise<boolean> | never;\nexport let shareImage: ShareImage = fail;\n\ntype Photo =\n | (Omit<Asset, 'source'> & {\n cancelled: false;\n source: 'camera';\n })\n | { cancelled: true };\ntype TakePhoto = (options: { compressImageQuality?: number }) => Promise<Photo> | never;\nexport let takePhoto: TakePhoto = fail;\n\ntype HapticFeedbackMethod =\n | 'impactHeavy'\n | 'impactLight'\n | 'impactMedium'\n | 'notificationError'\n | 'notificationSuccess'\n | 'notificationWarning'\n | 'selection';\ntype TriggerHaptic = (method: HapticFeedbackMethod) => void | never;\nexport let triggerHaptic: TriggerHaptic = fail;\n\nexport type PlaybackStatus = {\n didJustFinish: boolean;\n durationMillis: number;\n error: string;\n isBuffering: boolean;\n isLoaded: boolean;\n isLooping: boolean;\n isPlaying: boolean;\n positionMillis: number;\n};\n\nexport type AVPlaybackStatusToSet = {\n isLooping: boolean;\n isMuted: boolean;\n positionMillis: number;\n progressUpdateIntervalMillis: number;\n rate: number;\n shouldCorrectPitch: boolean;\n shouldPlay: boolean;\n volume: number;\n};\n\nexport let SDK: string;\n\nexport type SoundOptions = {\n basePathOrCallback?: string;\n callback?: () => void;\n filenameOrFile?: string;\n initialStatus?: Partial<AVPlaybackStatusToSet>;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n source?: { uri: string };\n};\n\nexport type SoundReturnType = {\n paused: boolean;\n testID: string;\n getDuration?: () => number;\n isPlaying?: () => boolean;\n onBuffer?: (props: { isBuffering: boolean }) => void;\n onEnd?: () => void;\n onLoad?: (payload: VideoPayloadData) => void;\n onLoadStart?: () => void;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n onProgress?: (data: VideoProgressData) => void;\n onReadyForDisplay?: () => void;\n pauseAsync?: () => void;\n play?: () => void;\n playAsync?: () => void;\n replayAsync?: () => void;\n resizeMode?: string;\n seek?: (progress: number) => void;\n setPositionAsync?: (millis: number) => void;\n soundRef?: React.RefObject<SoundReturnType>;\n stopAsync?: () => void;\n style?: StyleProp<ViewStyle>;\n unloadAsync?: () => void;\n uri?: string;\n};\n\nexport type SoundType = {\n initializeSound: (\n source?: { uri: string },\n initialStatus?: Partial<AVPlaybackStatusToSet>,\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void,\n ) => Promise<SoundReturnType | null>;\n Player: React.ComponentType<SoundReturnType> | null;\n};\n\nexport let Sound: SoundType;\n\nexport type VideoProgressData = {\n currentTime: number;\n seekableDuration: number;\n playableDuration?: number;\n};\n\nexport type VideoPayloadData = {\n duration: number;\n audioTracks?: { index: number; language: string; title: string; type: string }[];\n currentPosition?: number;\n naturalSize?: { height: number; orientation: 'portrait' | 'landscape'; width: number };\n textTracks?: { index: number; language: string; title: string; type: string }[];\n videoTracks?: {\n bitrate: number;\n codecs: string;\n height: number;\n trackId: number;\n width: number;\n }[];\n};\n\nexport type VideoType = {\n paused: boolean;\n testID: string;\n uri: string;\n videoRef: React.RefObject<VideoType>;\n onBuffer?: (props: { isBuffering: boolean }) => void;\n onEnd?: () => void;\n onLoad?: (payload: VideoPayloadData) => void;\n onLoadStart?: () => void;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n onProgress?: (data: VideoProgressData) => void;\n onReadyForDisplay?: () => void;\n repeat?: boolean;\n replayAsync?: () => void;\n resizeMode?: string;\n seek?: (progress: number) => void;\n setPositionAsync?: (position: number) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport let Video: React.ComponentType<VideoType>;\n\ntype Handlers = {\n compressImage?: CompressImage;\n deleteFile?: DeleteFile;\n FlatList?: typeof DefaultFlatList;\n getLocalAssetUri?: GetLocalAssetUri;\n getPhotos?: GetPhotos;\n NetInfo?: NetInfo;\n pickDocument?: PickDocument;\n saveFile?: SaveFile;\n SDK?: string;\n setClipboardString?: SetClipboardString;\n shareImage?: ShareImage;\n Sound?: SoundType;\n takePhoto?: TakePhoto;\n triggerHaptic?: TriggerHaptic;\n Video?: React.ComponentType<VideoType>;\n};\n\nexport const registerNativeHandlers = (handlers: Handlers) => {\n if (handlers.compressImage) {\n compressImage = handlers.compressImage;\n }\n\n if (handlers.deleteFile) {\n deleteFile = handlers.deleteFile;\n }\n\n if (handlers.FlatList) {\n FlatList = handlers.FlatList;\n }\n if (handlers.NetInfo) {\n NetInfo = handlers.NetInfo;\n }\n\n if (handlers.getLocalAssetUri) {\n getLocalAssetUri = handlers.getLocalAssetUri;\n }\n\n if (handlers.getPhotos) {\n getPhotos = handlers.getPhotos;\n }\n\n if (handlers.pickDocument !== undefined) {\n pickDocument = handlers.pickDocument;\n }\n\n if (handlers.saveFile) {\n saveFile = handlers.saveFile;\n }\n\n if (handlers.SDK) {\n SDK = handlers.SDK;\n }\n\n if (handlers.shareImage !== undefined) {\n shareImage = handlers.shareImage;\n }\n\n if (handlers.Sound) {\n Sound = handlers.Sound;\n }\n\n if (handlers.takePhoto) {\n takePhoto = handlers.takePhoto;\n }\n\n if (handlers.triggerHaptic) {\n triggerHaptic = handlers.triggerHaptic;\n }\n\n if (handlers.Video) {\n Video = handlers.Video;\n }\n\n if (handlers.setClipboardString !== undefined) {\n setClipboardString = handlers.setClipboardString;\n }\n};\n\nexport const isVideoPackageAvailable = () => !!Video;\nexport const isAudioPackageAvailable = () => !!Sound.Player || !!Sound.initializeSound;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_reactNative","require","fail","Error","compressImage","exports","deleteFile","getLocalAssetUri","oniOS14GalleryLibrarySelectionChange","getPhotos","FlatList","DefaultFlatList","NetInfo","addEventListener","fetch","pickDocument","saveFile","setClipboardString","shareImage","takePhoto","triggerHaptic","SDK","Sound","Video","registerNativeHandlers","handlers","undefined","isVideoPackageAvailable","isAudioPackageAvailable","Player","initializeSound"],"sources":["native.ts"],"sourcesContent":["import type React from 'react';\nimport { FlatList as DefaultFlatList, StyleProp, ViewStyle } from 'react-native';\n\nimport type { NetInfoSubscription } from '@react-native-community/netinfo';\n\nimport type { Asset, File } from './types/types';\n\nconst fail = () => {\n throw Error(\n 'Native handler was not registered, you should import stream-chat-expo or stream-chat-react-native',\n );\n};\n\ntype CompressImage = ({\n compressImageQuality,\n height,\n uri,\n width,\n}: {\n compressImageQuality: number;\n height: number;\n uri: string;\n width: number;\n}) => Promise<string> | never;\nexport let compressImage: CompressImage = fail;\n\ntype DeleteFile = ({ uri }: { uri: string }) => Promise<boolean> | never;\nexport let deleteFile: DeleteFile = fail;\n\ntype GetLocalAssetUri = (uriOrAssetId: string) => Promise<string> | never;\nexport let getLocalAssetUri: GetLocalAssetUri = fail;\n\ntype OniOS14LibrarySelectionChange = (callback: () => void) => { unsubscribe: () => void };\nexport let oniOS14GalleryLibrarySelectionChange: OniOS14LibrarySelectionChange = fail;\n\ntype GetPhotos = ({ after, first }: { first: number; after?: string }) =>\n | Promise<{\n assets: Array<Omit<Asset, 'source'> & { source: 'picker' }>;\n endCursor: string;\n hasNextPage: boolean;\n }>\n | never;\nexport let getPhotos: GetPhotos = fail;\n\ntype NetInfo = {\n addEventListener: (listener: (isConnected: boolean) => void) => NetInfoSubscription | never;\n fetch: (requestedInterface?: string | undefined) => Promise<boolean> | never;\n};\n\nexport let FlatList = DefaultFlatList;\n\nexport let NetInfo: NetInfo = {\n addEventListener: fail,\n fetch: fail,\n};\n\ntype PickDocument = ({ maxNumberOfFiles }: { maxNumberOfFiles?: number }) =>\n | Promise<{\n cancelled: boolean;\n docs?: File[];\n }>\n | never;\nexport let pickDocument: PickDocument = fail;\n\ntype SaveFileOptions = {\n fileName: string;\n fromUrl: string;\n};\ntype SaveFile = (options: SaveFileOptions) => Promise<string> | never;\nexport let saveFile: SaveFile = fail;\n\ntype SetClipboardString = (text: string) => Promise<void> | never;\nexport let setClipboardString: SetClipboardString = fail;\n\ntype ShareOptions = {\n type?: string;\n url?: string;\n};\ntype ShareImage = (options: ShareOptions) => Promise<boolean> | never;\nexport let shareImage: ShareImage = fail;\n\ntype Photo =\n | (Omit<Asset, 'source'> & {\n cancelled: false;\n source: 'camera';\n })\n | { cancelled: true };\ntype TakePhoto = (options: { compressImageQuality?: number }) => Promise<Photo> | never;\nexport let takePhoto: TakePhoto = fail;\n\ntype HapticFeedbackMethod =\n | 'impactHeavy'\n | 'impactLight'\n | 'impactMedium'\n | 'notificationError'\n | 'notificationSuccess'\n | 'notificationWarning'\n | 'selection';\ntype TriggerHaptic = (method: HapticFeedbackMethod) => void | never;\nexport let triggerHaptic: TriggerHaptic = fail;\n\nexport type PlaybackStatus = {\n didJustFinish: boolean;\n durationMillis: number;\n error: string;\n isBuffering: boolean;\n isLoaded: boolean;\n isLooping: boolean;\n isPlaying: boolean;\n positionMillis: number;\n};\n\nexport type AVPlaybackStatusToSet = {\n isLooping: boolean;\n isMuted: boolean;\n positionMillis: number;\n progressUpdateIntervalMillis: number;\n rate: number;\n shouldCorrectPitch: boolean;\n shouldPlay: boolean;\n volume: number;\n};\n\nexport let SDK: string;\n\nexport type SoundOptions = {\n basePathOrCallback?: string;\n callback?: () => void;\n filenameOrFile?: string;\n initialStatus?: Partial<AVPlaybackStatusToSet>;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n source?: { uri: string };\n};\n\nexport type SoundReturnType = {\n paused: boolean;\n testID: string;\n getDuration?: () => number;\n isPlaying?: () => boolean;\n onBuffer?: (props: { isBuffering: boolean }) => void;\n onEnd?: () => void;\n onLoad?: (payload: VideoPayloadData) => void;\n onLoadStart?: () => void;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n onProgress?: (data: VideoProgressData) => void;\n onReadyForDisplay?: () => void;\n pauseAsync?: () => void;\n play?: () => void;\n playAsync?: () => void;\n replayAsync?: () => void;\n resizeMode?: string;\n seek?: (progress: number) => void;\n setPositionAsync?: (millis: number) => void;\n soundRef?: React.RefObject<SoundReturnType>;\n stopAsync?: () => void;\n style?: StyleProp<ViewStyle>;\n unloadAsync?: () => void;\n uri?: string;\n};\n\nexport type SoundType = {\n initializeSound: (\n source?: { uri: string },\n initialStatus?: Partial<AVPlaybackStatusToSet>,\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void,\n ) => Promise<SoundReturnType | null>;\n Player: React.ComponentType<SoundReturnType> | null;\n};\n\nexport let Sound: SoundType;\n\nexport type VideoProgressData = {\n currentTime: number;\n seekableDuration: number;\n playableDuration?: number;\n};\n\nexport type VideoPayloadData = {\n duration: number;\n audioTracks?: { index: number; language: string; title: string; type: string }[];\n currentPosition?: number;\n naturalSize?: { height: number; orientation: 'portrait' | 'landscape'; width: number };\n textTracks?: { index: number; language: string; title: string; type: string }[];\n videoTracks?: {\n bitrate: number;\n codecs: string;\n height: number;\n trackId: number;\n width: number;\n }[];\n};\n\nexport type VideoType = {\n paused: boolean;\n testID: string;\n uri: string;\n videoRef: React.RefObject<VideoType>;\n onBuffer?: (props: { isBuffering: boolean }) => void;\n onEnd?: () => void;\n onLoad?: (payload: VideoPayloadData) => void;\n onLoadStart?: () => void;\n onPlaybackStatusUpdate?: (playbackStatus: PlaybackStatus) => void;\n onProgress?: (data: VideoProgressData) => void;\n onReadyForDisplay?: () => void;\n repeat?: boolean;\n replayAsync?: () => void;\n resizeMode?: string;\n seek?: (progress: number) => void;\n setPositionAsync?: (position: number) => void;\n style?: StyleProp<ViewStyle>;\n};\n\nexport let Video: React.ComponentType<VideoType>;\n\ntype Handlers = {\n compressImage?: CompressImage;\n deleteFile?: DeleteFile;\n FlatList?: typeof DefaultFlatList;\n getLocalAssetUri?: GetLocalAssetUri;\n getPhotos?: GetPhotos;\n NetInfo?: NetInfo;\n oniOS14GalleryLibrarySelectionChange?: OniOS14LibrarySelectionChange;\n pickDocument?: PickDocument;\n saveFile?: SaveFile;\n SDK?: string;\n setClipboardString?: SetClipboardString;\n shareImage?: ShareImage;\n Sound?: SoundType;\n takePhoto?: TakePhoto;\n triggerHaptic?: TriggerHaptic;\n Video?: React.ComponentType<VideoType>;\n};\n\nexport const registerNativeHandlers = (handlers: Handlers) => {\n if (handlers.compressImage) {\n compressImage = handlers.compressImage;\n }\n\n if (handlers.deleteFile) {\n deleteFile = handlers.deleteFile;\n }\n\n if (handlers.FlatList) {\n FlatList = handlers.FlatList;\n }\n if (handlers.NetInfo) {\n NetInfo = handlers.NetInfo;\n }\n\n if (handlers.getLocalAssetUri) {\n getLocalAssetUri = handlers.getLocalAssetUri;\n }\n\n if (handlers.getPhotos) {\n getPhotos = handlers.getPhotos;\n }\n\n if (handlers.oniOS14GalleryLibrarySelectionChange) {\n oniOS14GalleryLibrarySelectionChange = handlers.oniOS14GalleryLibrarySelectionChange;\n }\n\n if (handlers.pickDocument !== undefined) {\n pickDocument = handlers.pickDocument;\n }\n\n if (handlers.saveFile) {\n saveFile = handlers.saveFile;\n }\n\n if (handlers.SDK) {\n SDK = handlers.SDK;\n }\n\n if (handlers.shareImage !== undefined) {\n shareImage = handlers.shareImage;\n }\n\n if (handlers.Sound) {\n Sound = handlers.Sound;\n }\n\n if (handlers.takePhoto) {\n takePhoto = handlers.takePhoto;\n }\n\n if (handlers.triggerHaptic) {\n triggerHaptic = handlers.triggerHaptic;\n }\n\n if (handlers.Video) {\n Video = handlers.Video;\n }\n\n if (handlers.setClipboardString !== undefined) {\n setClipboardString = handlers.setClipboardString;\n }\n};\n\nexport const isVideoPackageAvailable = () => !!Video;\nexport const isAudioPackageAvailable = () => !!Sound.Player || !!Sound.initializeSound;\n"],"mappings":";;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAMA,IAAMC,IAAI,GAAG,SAAPA,IAAIA,CAAA,EAAS;EACjB,MAAMC,KAAK,CACT,mGAAmG,CACpG;AACH,CAAC;AAaM,IAAIC,aAA4B,GAAGF,IAAI;AAACG,OAAA,CAAAD,aAAA,GAAAA,aAAA;AAGxC,IAAIE,UAAsB,GAAGJ,IAAI;AAACG,OAAA,CAAAC,UAAA,GAAAA,UAAA;AAGlC,IAAIC,gBAAkC,GAAGL,IAAI;AAACG,OAAA,CAAAE,gBAAA,GAAAA,gBAAA;AAG9C,IAAIC,oCAAmE,GAAGN,IAAI;AAACG,OAAA,CAAAG,oCAAA,GAAAA,oCAAA;AAS/E,IAAIC,SAAoB,GAAGP,IAAI;AAACG,OAAA,CAAAI,SAAA,GAAAA,SAAA;AAOhC,IAAIC,QAAQ,GAAGC,qBAAe;AAACN,OAAA,CAAAK,QAAA,GAAAA,QAAA;AAE/B,IAAIE,OAAgB,GAAG;EAC5BC,gBAAgB,EAAEX,IAAI;EACtBY,KAAK,EAAEZ;AACT,CAAC;AAACG,OAAA,CAAAO,OAAA,GAAAA,OAAA;AAQK,IAAIG,YAA0B,GAAGb,IAAI;AAACG,OAAA,CAAAU,YAAA,GAAAA,YAAA;AAOtC,IAAIC,QAAkB,GAAGd,IAAI;AAACG,OAAA,CAAAW,QAAA,GAAAA,QAAA;AAG9B,IAAIC,kBAAsC,GAAGf,IAAI;AAACG,OAAA,CAAAY,kBAAA,GAAAA,kBAAA;AAOlD,IAAIC,UAAsB,GAAGhB,IAAI;AAACG,OAAA,CAAAa,UAAA,GAAAA,UAAA;AASlC,IAAIC,SAAoB,GAAGjB,IAAI;AAACG,OAAA,CAAAc,SAAA,GAAAA,SAAA;AAWhC,IAAIC,aAA4B,GAAGlB,IAAI;AAACG,OAAA,CAAAe,aAAA,GAAAA,aAAA;AAwBxC,IAAIC,GAAW;AAAChB,OAAA,CAAAgB,GAAA,GAAAA,GAAA;AA8ChB,IAAIC,KAAgB;AAACjB,OAAA,CAAAiB,KAAA,GAAAA,KAAA;AA2CrB,IAAIC,KAAqC;AAAClB,OAAA,CAAAkB,KAAA,GAAAA,KAAA;AAqB1C,IAAMC,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAIC,QAAkB,EAAK;EAC5D,IAAIA,QAAQ,CAACrB,aAAa,EAAE;IAC1BC,OAAA,CAAAD,aAAA,GAAAA,aAAa,GAAGqB,QAAQ,CAACrB,aAAa;EACxC;EAEA,IAAIqB,QAAQ,CAACnB,UAAU,EAAE;IACvBD,OAAA,CAAAC,UAAA,GAAAA,UAAU,GAAGmB,QAAQ,CAACnB,UAAU;EAClC;EAEA,IAAImB,QAAQ,CAACf,QAAQ,EAAE;IACrBL,OAAA,CAAAK,QAAA,GAAAA,QAAQ,GAAGe,QAAQ,CAACf,QAAQ;EAC9B;EACA,IAAIe,QAAQ,CAACb,OAAO,EAAE;IACpBP,OAAA,CAAAO,OAAA,GAAAA,OAAO,GAAGa,QAAQ,CAACb,OAAO;EAC5B;EAEA,IAAIa,QAAQ,CAAClB,gBAAgB,EAAE;IAC7BF,OAAA,CAAAE,gBAAA,GAAAA,gBAAgB,GAAGkB,QAAQ,CAAClB,gBAAgB;EAC9C;EAEA,IAAIkB,QAAQ,CAAChB,SAAS,EAAE;IACtBJ,OAAA,CAAAI,SAAA,GAAAA,SAAS,GAAGgB,QAAQ,CAAChB,SAAS;EAChC;EAEA,IAAIgB,QAAQ,CAACjB,oCAAoC,EAAE;IACjDH,OAAA,CAAAG,oCAAA,GAAAA,oCAAoC,GAAGiB,QAAQ,CAACjB,oCAAoC;EACtF;EAEA,IAAIiB,QAAQ,CAACV,YAAY,KAAKW,SAAS,EAAE;IACvCrB,OAAA,CAAAU,YAAA,GAAAA,YAAY,GAAGU,QAAQ,CAACV,YAAY;EACtC;EAEA,IAAIU,QAAQ,CAACT,QAAQ,EAAE;IACrBX,OAAA,CAAAW,QAAA,GAAAA,QAAQ,GAAGS,QAAQ,CAACT,QAAQ;EAC9B;EAEA,IAAIS,QAAQ,CAACJ,GAAG,EAAE;IAChBhB,OAAA,CAAAgB,GAAA,GAAAA,GAAG,GAAGI,QAAQ,CAACJ,GAAG;EACpB;EAEA,IAAII,QAAQ,CAACP,UAAU,KAAKQ,SAAS,EAAE;IACrCrB,OAAA,CAAAa,UAAA,GAAAA,UAAU,GAAGO,QAAQ,CAACP,UAAU;EAClC;EAEA,IAAIO,QAAQ,CAACH,KAAK,EAAE;IAClBjB,OAAA,CAAAiB,KAAA,GAAAA,KAAK,GAAGG,QAAQ,CAACH,KAAK;EACxB;EAEA,IAAIG,QAAQ,CAACN,SAAS,EAAE;IACtBd,OAAA,CAAAc,SAAA,GAAAA,SAAS,GAAGM,QAAQ,CAACN,SAAS;EAChC;EAEA,IAAIM,QAAQ,CAACL,aAAa,EAAE;IAC1Bf,OAAA,CAAAe,aAAA,GAAAA,aAAa,GAAGK,QAAQ,CAACL,aAAa;EACxC;EAEA,IAAIK,QAAQ,CAACF,KAAK,EAAE;IAClBlB,OAAA,CAAAkB,KAAA,GAAAA,KAAK,GAAGE,QAAQ,CAACF,KAAK;EACxB;EAEA,IAAIE,QAAQ,CAACR,kBAAkB,KAAKS,SAAS,EAAE;IAC7CrB,OAAA,CAAAY,kBAAA,GAAAA,kBAAkB,GAAGQ,QAAQ,CAACR,kBAAkB;EAClD;AACF,CAAC;AAACZ,OAAA,CAAAmB,sBAAA,GAAAA,sBAAA;AAEK,IAAMG,uBAAuB,GAAG,SAA1BA,uBAAuBA,CAAA;EAAA,OAAS,CAAC,CAACJ,KAAK;AAAA;AAAClB,OAAA,CAAAsB,uBAAA,GAAAA,uBAAA;AAC9C,IAAMC,uBAAuB,GAAG,SAA1BA,uBAAuBA,CAAA;EAAA,OAAS,CAAC,CAACN,KAAK,CAACO,MAAM,IAAI,CAAC,CAACP,KAAK,CAACQ,eAAe;AAAA;AAACzB,OAAA,CAAAuB,uBAAA,GAAAA,uBAAA"}
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "5.11.3-beta.6"
2
+ "version": "5.12.0-beta.1"
3
3
  }
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { Pressable } from 'react-native';
3
+ export declare const ImageReloadIndicator: ({ onReloadImage, style, }: {
4
+ onReloadImage: () => void;
5
+ style: React.ComponentProps<typeof Pressable>['style'];
6
+ }) => JSX.Element;
@@ -1,7 +1,7 @@
1
- /// <reference types="react" />
2
1
  export declare const useLoadingImage: () => {
3
2
  isLoadingImage: boolean;
4
3
  isLoadingImageError: boolean;
5
- setLoadingImage: import("react").Dispatch<import("react").SetStateAction<boolean>>;
6
- setLoadingImageError: import("react").Dispatch<import("react").SetStateAction<boolean>>;
4
+ onReloadImage: () => void;
5
+ setLoadingImage: (isLoadingImage: boolean) => void;
6
+ setLoadingImageError: (isLoadingImageError: boolean) => void;
7
7
  };
@@ -15,6 +15,10 @@ declare type DeleteFile = ({ uri }: {
15
15
  export declare let deleteFile: DeleteFile;
16
16
  declare type GetLocalAssetUri = (uriOrAssetId: string) => Promise<string> | never;
17
17
  export declare let getLocalAssetUri: GetLocalAssetUri;
18
+ declare type OniOS14LibrarySelectionChange = (callback: () => void) => {
19
+ unsubscribe: () => void;
20
+ };
21
+ export declare let oniOS14GalleryLibrarySelectionChange: OniOS14LibrarySelectionChange;
18
22
  declare type GetPhotos = ({ after, first }: {
19
23
  first: number;
20
24
  after?: string;
@@ -193,6 +197,7 @@ declare type Handlers = {
193
197
  getLocalAssetUri?: GetLocalAssetUri;
194
198
  getPhotos?: GetPhotos;
195
199
  NetInfo?: NetInfo;
200
+ oniOS14GalleryLibrarySelectionChange?: OniOS14LibrarySelectionChange;
196
201
  pickDocument?: PickDocument;
197
202
  saveFile?: SaveFile;
198
203
  SDK?: string;
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": "5.11.3-beta.6",
4
+ "version": "5.12.0-beta.1",
5
5
  "author": {
6
6
  "company": "Stream.io Inc",
7
7
  "name": "Stream.io Inc"
@@ -4,6 +4,7 @@ import { StyleSheet, Text, TouchableOpacity, View } from 'react-native';
4
4
  import type { Attachment } from 'stream-chat';
5
5
 
6
6
  import { GalleryImage } from './GalleryImage';
7
+ import { ImageReloadIndicator } from './ImageReloadIndicator';
7
8
  import { buildGallery } from './utils/buildGallery/buildGallery';
8
9
 
9
10
  import type { Thumbnail } from './utils/buildGallery/types';
@@ -67,6 +68,11 @@ const styles = StyleSheet.create({
67
68
  justifyContent: 'center',
68
69
  position: 'absolute',
69
70
  },
71
+ imageReloadContainerStyle: {
72
+ ...StyleSheet.absoluteFillObject,
73
+ alignItems: 'center',
74
+ justifyContent: 'center',
75
+ },
70
76
  moreImagesContainer: {
71
77
  alignItems: 'center',
72
78
  justifyContent: 'center',
@@ -452,8 +458,13 @@ const GalleryImageThumbnail = <
452
458
  GalleryThumbnailProps<StreamChatGenerics>,
453
459
  'ImageLoadingFailedIndicator' | 'ImageLoadingIndicator' | 'thumbnail' | 'borderRadius'
454
460
  >) => {
455
- const { isLoadingImage, isLoadingImageError, setLoadingImage, setLoadingImageError } =
456
- useLoadingImage();
461
+ const {
462
+ isLoadingImage,
463
+ isLoadingImageError,
464
+ onReloadImage,
465
+ setLoadingImage,
466
+ setLoadingImageError,
467
+ } = useLoadingImage();
457
468
 
458
469
  const {
459
470
  theme: {
@@ -471,11 +482,17 @@ const GalleryImageThumbnail = <
471
482
  }}
472
483
  >
473
484
  {isLoadingImageError ? (
474
- <ImageLoadingFailedIndicator style={[styles.imageLoadingErrorIndicatorStyle]} />
485
+ <>
486
+ <ImageLoadingFailedIndicator style={styles.imageLoadingErrorIndicatorStyle} />
487
+ <ImageReloadIndicator
488
+ onReloadImage={onReloadImage}
489
+ style={styles.imageReloadContainerStyle}
490
+ />
491
+ </>
475
492
  ) : (
476
493
  <>
477
494
  <GalleryImage
478
- onError={(error) => {
495
+ onError={({ nativeEvent: { error } }) => {
479
496
  console.warn(error);
480
497
  setLoadingImage(false);
481
498
  setLoadingImageError(true);
@@ -494,7 +511,7 @@ const GalleryImageThumbnail = <
494
511
  uri={thumbnail.url}
495
512
  />
496
513
  {isLoadingImage && (
497
- <View style={[styles.imageLoadingIndicatorContainer]}>
514
+ <View style={styles.imageLoadingIndicatorContainer}>
498
515
  <ImageLoadingIndicator style={styles.imageLoadingIndicatorStyle} />
499
516
  </View>
500
517
  )}
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { Pressable } from 'react-native';
3
+
4
+ import { useTheme } from '../../contexts/themeContext/ThemeContext';
5
+ import { Refresh } from '../../icons';
6
+
7
+ const REFRESH_ICON_SIZE = 24;
8
+
9
+ export const ImageReloadIndicator = ({
10
+ onReloadImage,
11
+ style,
12
+ }: {
13
+ onReloadImage: () => void;
14
+ style: React.ComponentProps<typeof Pressable>['style'];
15
+ }) => {
16
+ const {
17
+ theme: {
18
+ colors: { grey_dark },
19
+ },
20
+ } = useTheme();
21
+
22
+ return (
23
+ <Pressable onPress={onReloadImage} style={style}>
24
+ <Refresh height={REFRESH_ICON_SIZE} pathFill={grey_dark} width={REFRESH_ICON_SIZE} />
25
+ </Pressable>
26
+ );
27
+ };
@@ -270,7 +270,9 @@ describe('Gallery', () => {
270
270
  expect(queryAllByTestId('gallery-container').length).toBe(1);
271
271
  });
272
272
 
273
- fireEvent(getByA11yLabel('Gallery Image'), 'error');
273
+ fireEvent(getByA11yLabel('Gallery Image'), 'error', {
274
+ nativeEvent: { error: 'error loading image' },
275
+ });
274
276
  expect(getByAccessibilityHint('image-loading-error')).toBeTruthy();
275
277
  });
276
278
 
@@ -11,7 +11,7 @@ import { renderAttachmentPickerItem } from './components/AttachmentPickerItem';
11
11
 
12
12
  import { useAttachmentPickerContext } from '../../contexts/attachmentPickerContext/AttachmentPickerContext';
13
13
  import { useTheme } from '../../contexts/themeContext/ThemeContext';
14
- import { getPhotos } from '../../native';
14
+ import { getPhotos, oniOS14GalleryLibrarySelectionChange } from '../../native';
15
15
  import type { Asset } from '../../types/types';
16
16
  import { vh } from '../../utils/utils';
17
17
 
@@ -129,6 +129,23 @@ export const AttachmentPicker = React.forwardRef(
129
129
  }
130
130
  }, [currentIndex, selectedPicker, loadingPhotos]);
131
131
 
132
+ // we need to use ref here to avoid running effect when getMorePhotos changes
133
+ const getMorePhotosRef = useRef(getMorePhotos);
134
+ getMorePhotosRef.current = getMorePhotos;
135
+
136
+ useEffect(() => {
137
+ if (selectedPicker !== 'images') return;
138
+ // ios 14 library selection change event is fired when user reselects the images that are permitted to be readable by the app
139
+ const { unsubscribe } = oniOS14GalleryLibrarySelectionChange(() => {
140
+ // we reset the cursor and has next page to true to facilitate fetching of the first page of photos again
141
+ hasNextPageRef.current = true;
142
+ endCursorRef.current = undefined;
143
+ // fetch the first page of photos again
144
+ getMorePhotosRef.current();
145
+ });
146
+ return unsubscribe;
147
+ }, [selectedPicker]);
148
+
132
149
  useEffect(() => {
133
150
  const backAction = () => {
134
151
  if (selectedPicker) {