@chem-po/react-native 0.0.26 → 0.0.28

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 (43) hide show
  1. package/lib/commonjs/components/form/input/file/index.js +53 -6
  2. package/lib/commonjs/components/form/input/file/index.js.map +1 -1
  3. package/lib/commonjs/components/image/ImageViewModal.js +52 -2
  4. package/lib/commonjs/components/image/ImageViewModal.js.map +1 -1
  5. package/lib/commonjs/components/loading/LoadingImage.js +8 -2
  6. package/lib/commonjs/components/loading/LoadingImage.js.map +1 -1
  7. package/lib/commonjs/utils/downloadFile.js +43 -0
  8. package/lib/commonjs/utils/downloadFile.js.map +1 -0
  9. package/lib/module/components/form/input/file/index.js +54 -7
  10. package/lib/module/components/form/input/file/index.js.map +1 -1
  11. package/lib/module/components/image/ImageViewModal.js +53 -3
  12. package/lib/module/components/image/ImageViewModal.js.map +1 -1
  13. package/lib/module/components/loading/LoadingImage.js +8 -2
  14. package/lib/module/components/loading/LoadingImage.js.map +1 -1
  15. package/lib/module/utils/downloadFile.js +35 -0
  16. package/lib/module/utils/downloadFile.js.map +1 -0
  17. package/lib/typescript/components/form/input/file/index.d.ts +2 -1
  18. package/lib/typescript/components/form/input/file/index.d.ts.map +1 -1
  19. package/lib/typescript/components/image/ImageViewModal.d.ts +3 -0
  20. package/lib/typescript/components/image/ImageViewModal.d.ts.map +1 -1
  21. package/lib/typescript/components/loading/LoadingImage.d.ts +4 -1
  22. package/lib/typescript/components/loading/LoadingImage.d.ts.map +1 -1
  23. package/lib/typescript/utils/downloadFile.d.ts +4 -0
  24. package/lib/typescript/utils/downloadFile.d.ts.map +1 -0
  25. package/package.json +4 -3
  26. package/src/components/form/input/file/index.tsx +52 -3
  27. package/src/components/image/ImageViewModal.tsx +57 -2
  28. package/src/components/loading/LoadingImage.tsx +16 -1
  29. package/src/utils/downloadFile.ts +36 -0
  30. package/lib/commonjs/components/image/ImageViewModal.backup.js +0 -285
  31. package/lib/commonjs/components/image/ImageViewModal.backup.js.map +0 -1
  32. package/lib/commonjs/components/image/ImageViewModal.old.js +0 -285
  33. package/lib/commonjs/components/image/ImageViewModal.old.js.map +0 -1
  34. package/lib/module/components/image/ImageViewModal.backup.js +0 -277
  35. package/lib/module/components/image/ImageViewModal.backup.js.map +0 -1
  36. package/lib/module/components/image/ImageViewModal.old.js +0 -277
  37. package/lib/module/components/image/ImageViewModal.old.js.map +0 -1
  38. package/lib/typescript/components/image/ImageViewModal.backup.d.ts +0 -9
  39. package/lib/typescript/components/image/ImageViewModal.backup.d.ts.map +0 -1
  40. package/lib/typescript/components/image/ImageViewModal.old.d.ts +0 -9
  41. package/lib/typescript/components/image/ImageViewModal.old.d.ts.map +0 -1
  42. package/src/components/image/ImageViewModal.backup.tsx +0 -261
  43. package/src/components/image/ImageViewModal.old.tsx +0 -261
@@ -1,14 +1,18 @@
1
- import { useScreen } from '@chem-po/react';
1
+ import { useScreen, useToast } from '@chem-po/react';
2
2
  import { Ionicons } from '@expo/vector-icons';
3
3
  import React, { useCallback, useEffect, useMemo, useState } from 'react';
4
4
  import { Image, Modal, StyleSheet, TouchableOpacity, View } from 'react-native';
5
5
  import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler';
6
6
  import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated';
7
+ import { downloadFile } from '../../utils/downloadFile';
7
8
  import { LoadingLogo } from '../loading/Loading';
8
9
  export const ImageViewModal = ({
9
10
  isOpen,
10
11
  onClose,
11
- src
12
+ src,
13
+ filename,
14
+ fileType,
15
+ withDownload
12
16
  }) => {
13
17
  const [loading, setLoading] = useState(true);
14
18
  const screenWidth = useScreen(s => s.width);
@@ -17,6 +21,10 @@ export const ImageViewModal = ({
17
21
  width: screenWidth / 2,
18
22
  height: screenHeight / 2
19
23
  });
24
+ const {
25
+ showError,
26
+ showSuccess
27
+ } = useToast();
20
28
 
21
29
  // Shared values for zoom and pan (reanimated)
22
30
  const scale = useSharedValue(1);
@@ -74,6 +82,30 @@ export const ImageViewModal = ({
74
82
  }
75
83
  }, [isOpen, src, resetTransform]);
76
84
 
85
+ // Download functionality
86
+ const handleDownload = useCallback(async () => {
87
+ if (!src) {
88
+ showError('Image URL is not available');
89
+ return;
90
+ }
91
+ if (!fileType) {
92
+ showError('File type is not available');
93
+ return;
94
+ }
95
+ try {
96
+ const usedName = filename ?? `image_${Date.now()}.jpg`;
97
+ await downloadFile(src, usedName, fileType);
98
+ showSuccess('Image downloaded successfully');
99
+ } catch (error) {
100
+ if (error instanceof Error) {
101
+ console.error('Error downloading image:', error.message);
102
+ } else {
103
+ console.error('Error downloading image:', String(error));
104
+ }
105
+ showError('Failed to download image');
106
+ }
107
+ }, [src, showError, showSuccess, filename, fileType]);
108
+
77
109
  // Pan gesture with worklet
78
110
  const panGesture = Gesture.Pan().onUpdate(event => {
79
111
  'worklet';
@@ -198,7 +230,14 @@ export const ImageViewModal = ({
198
230
  onLoadStart: onLoadStart,
199
231
  onLoad: onLoad,
200
232
  resizeMode: "contain"
201
- }))), /*#__PURE__*/React.createElement(TouchableOpacity, {
233
+ }))), withDownload && /*#__PURE__*/React.createElement(TouchableOpacity, {
234
+ style: styles.downloadButton,
235
+ onPress: () => void handleDownload()
236
+ }, /*#__PURE__*/React.createElement(Ionicons, {
237
+ name: "download",
238
+ size: 24,
239
+ color: "white"
240
+ })), /*#__PURE__*/React.createElement(TouchableOpacity, {
202
241
  style: styles.closeButton,
203
242
  onPress: onClose
204
243
  }, /*#__PURE__*/React.createElement(Ionicons, {
@@ -237,6 +276,17 @@ const styles = StyleSheet.create({
237
276
  width: '100%',
238
277
  height: '100%'
239
278
  },
279
+ downloadButton: {
280
+ position: 'absolute',
281
+ top: 16,
282
+ right: 64,
283
+ width: 40,
284
+ height: 40,
285
+ borderRadius: 20,
286
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
287
+ justifyContent: 'center',
288
+ alignItems: 'center'
289
+ },
240
290
  closeButton: {
241
291
  position: 'absolute',
242
292
  top: 16,
@@ -1 +1 @@
1
- {"version":3,"names":["useScreen","Ionicons","React","useCallback","useEffect","useMemo","useState","Image","Modal","StyleSheet","TouchableOpacity","View","Gesture","GestureDetector","GestureHandlerRootView","Animated","useAnimatedStyle","useSharedValue","withSpring","LoadingLogo","ImageViewModal","isOpen","onClose","src","loading","setLoading","screenWidth","s","width","screenHeight","height","imageSize","setImageSize","scale","translateX","translateY","savedScale","savedTranslateX","savedTranslateY","ratio","h","Math","min","w","onLoadStart","onLoad","e","naturalWidth","naturalHeight","nativeEvent","source","resetTransform","value","panGesture","Pan","onUpdate","event","newTranslateX","translationX","newTranslateY","translationY","maxTranslateX","maxTranslateY","boundedTranslateX","max","boundedTranslateY","onEnd","pinchGesture","Pinch","newScale","boundedScale","doubleTapGesture","Tap","numberOfTaps","combinedGestures","Race","Simultaneous","animatedStyle","transform","createElement","visible","transparent","animationType","onRequestClose","style","styles","gestureRoot","modalOverlay","backgroundTouchable","activeOpacity","onPress","contentContainer","gesture","imageContainer","opacity","uri","undefined","image","resizeMode","closeButton","name","size","color","loadingContainer","isLoading","create","flex","backgroundColor","absoluteFillObject","justifyContent","alignItems","padding","overflow","borderRadius","position","top","right"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/image/ImageViewModal.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useScreen","useToast","Ionicons","React","useCallback","useEffect","useMemo","useState","Image","Modal","StyleSheet","TouchableOpacity","View","Gesture","GestureDetector","GestureHandlerRootView","Animated","useAnimatedStyle","useSharedValue","withSpring","downloadFile","LoadingLogo","ImageViewModal","isOpen","onClose","src","filename","fileType","withDownload","loading","setLoading","screenWidth","s","width","screenHeight","height","imageSize","setImageSize","showError","showSuccess","scale","translateX","translateY","savedScale","savedTranslateX","savedTranslateY","ratio","h","Math","min","w","onLoadStart","onLoad","e","naturalWidth","naturalHeight","nativeEvent","source","resetTransform","value","handleDownload","usedName","Date","now","error","Error","console","message","String","panGesture","Pan","onUpdate","event","newTranslateX","translationX","newTranslateY","translationY","maxTranslateX","maxTranslateY","boundedTranslateX","max","boundedTranslateY","onEnd","pinchGesture","Pinch","newScale","boundedScale","doubleTapGesture","Tap","numberOfTaps","combinedGestures","Race","Simultaneous","animatedStyle","transform","createElement","visible","transparent","animationType","onRequestClose","style","styles","gestureRoot","modalOverlay","backgroundTouchable","activeOpacity","onPress","contentContainer","gesture","imageContainer","opacity","uri","undefined","image","resizeMode","downloadButton","name","size","color","closeButton","loadingContainer","isLoading","create","flex","backgroundColor","absoluteFillObject","justifyContent","alignItems","padding","overflow","borderRadius","position","top","right"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/image/ImageViewModal.tsx"],"mappings":"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","ignoreList":[]}
@@ -9,10 +9,13 @@ export const LoadingImage = ({
9
9
  src,
10
10
  loadingOverride,
11
11
  onLoad,
12
+ filename,
13
+ fileType,
12
14
  width,
13
15
  height,
14
16
  withFullView,
15
17
  buttonFullView,
18
+ withDownload,
16
19
  style
17
20
  }) => {
18
21
  const [imageLoading, setImageLoading] = useState(!!src);
@@ -71,11 +74,14 @@ export const LoadingImage = ({
71
74
  }, /*#__PURE__*/React.createElement(LoadingLogo, {
72
75
  isLoading: loading,
73
76
  size: 10
74
- })), viewing && /*#__PURE__*/React.createElement(ImageViewModal, {
77
+ })), viewing ? /*#__PURE__*/React.createElement(ImageViewModal, {
78
+ withDownload: withDownload,
79
+ filename: filename,
80
+ fileType: fileType,
75
81
  isOpen: true,
76
82
  src: src ?? emptyPng,
77
83
  onClose: () => setViewing(false)
78
- }));
84
+ }) : null);
79
85
  };
80
86
  const styles = StyleSheet.create({
81
87
  container: {
@@ -1 +1 @@
1
- {"version":3,"names":["useMounted","Ionicons","React","useCallback","useEffect","useMemo","useRef","useState","Image","StyleSheet","TouchableOpacity","View","ImageViewModal","LoadingLogo","emptyPng","LoadingImage","src","loadingOverride","onLoad","width","height","withFullView","buttonFullView","style","imageLoading","setImageLoading","imageRef","viewing","setViewing","mounted","handleImageLoad","e","prevSrc","setPrevSrc","loading","ImageComponent","createElement","ref","source","uri","styles","image","opacity","onLoadEnd","resizeMode","container","activeOpacity","onPress","undefined","fullViewButton","name","size","color","fullViewIcon","loadingContainer","pointerEvents","isLoading","isOpen","onClose","create","overflow","position","imageContainer","absoluteFillObject","justifyContent","alignItems","top","right","borderRadius","backgroundColor"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/loading/LoadingImage.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMounted","Ionicons","React","useCallback","useEffect","useMemo","useRef","useState","Image","StyleSheet","TouchableOpacity","View","ImageViewModal","LoadingLogo","emptyPng","LoadingImage","src","loadingOverride","onLoad","filename","fileType","width","height","withFullView","buttonFullView","withDownload","style","imageLoading","setImageLoading","imageRef","viewing","setViewing","mounted","handleImageLoad","e","prevSrc","setPrevSrc","loading","ImageComponent","createElement","ref","source","uri","styles","image","opacity","onLoadEnd","resizeMode","container","activeOpacity","onPress","undefined","fullViewButton","name","size","color","fullViewIcon","loadingContainer","pointerEvents","isLoading","isOpen","onClose","create","overflow","position","imageContainer","absoluteFillObject","justifyContent","alignItems","top","right","borderRadius","backgroundColor"],"sourceRoot":"..\\..\\..\\..\\src","sources":["components/loading/LoadingImage.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,35 @@
1
+ import * as FileSystem from 'expo-file-system';
2
+ export const downloadFile = async (uri, filename, fileType) => {
3
+ const permissions = await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync();
4
+ if (!permissions.granted) {
5
+ return;
6
+ }
7
+
8
+ // Download to temporary location first
9
+ const tempFileUri = `${FileSystem.cacheDirectory}${filename}`;
10
+
11
+ // Download the file to temporary location
12
+ await FileSystem.downloadAsync(uri, tempFileUri);
13
+
14
+ // Read the temporary file as base64
15
+ const base64Content = await FileSystem.readAsStringAsync(tempFileUri, {
16
+ encoding: FileSystem.EncodingType.Base64
17
+ });
18
+
19
+ // Create a file within the selected directory using SAF
20
+ const fileUri = await FileSystem.StorageAccessFramework.createFileAsync(permissions.directoryUri, filename, fileType);
21
+
22
+ // Write the content to the SAF file
23
+ await FileSystem.StorageAccessFramework.writeAsStringAsync(fileUri, base64Content, {
24
+ encoding: FileSystem.EncodingType.Base64
25
+ });
26
+
27
+ // Clean up temporary file
28
+ await FileSystem.deleteAsync(tempFileUri, {
29
+ idempotent: true
30
+ });
31
+ return {
32
+ uri: fileUri
33
+ };
34
+ };
35
+ //# sourceMappingURL=downloadFile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FileSystem","downloadFile","uri","filename","fileType","permissions","StorageAccessFramework","requestDirectoryPermissionsAsync","granted","tempFileUri","cacheDirectory","downloadAsync","base64Content","readAsStringAsync","encoding","EncodingType","Base64","fileUri","createFileAsync","directoryUri","writeAsStringAsync","deleteAsync","idempotent"],"sourceRoot":"..\\..\\..\\src","sources":["utils/downloadFile.ts"],"mappings":"AAAA,OAAO,KAAKA,UAAU,MAAM,kBAAkB;AAE9C,OAAO,MAAMC,YAAY,GAAG,MAAAA,CAAOC,GAAW,EAAEC,QAAgB,EAAEC,QAAgB,KAAK;EACrF,MAAMC,WAAW,GAAG,MAAML,UAAU,CAACM,sBAAsB,CAACC,gCAAgC,CAAC,CAAC;EAC9F,IAAI,CAACF,WAAW,CAACG,OAAO,EAAE;IACxB;EACF;;EAEA;EACA,MAAMC,WAAW,GAAG,GAAGT,UAAU,CAACU,cAAc,GAAGP,QAAQ,EAAE;;EAE7D;EACA,MAAMH,UAAU,CAACW,aAAa,CAACT,GAAG,EAAEO,WAAW,CAAC;;EAEhD;EACA,MAAMG,aAAa,GAAG,MAAMZ,UAAU,CAACa,iBAAiB,CAACJ,WAAW,EAAE;IACpEK,QAAQ,EAAEd,UAAU,CAACe,YAAY,CAACC;EACpC,CAAC,CAAC;;EAEF;EACA,MAAMC,OAAO,GAAG,MAAMjB,UAAU,CAACM,sBAAsB,CAACY,eAAe,CACrEb,WAAW,CAACc,YAAY,EACxBhB,QAAQ,EACRC,QACF,CAAC;;EAED;EACA,MAAMJ,UAAU,CAACM,sBAAsB,CAACc,kBAAkB,CAACH,OAAO,EAAEL,aAAa,EAAE;IACjFE,QAAQ,EAAEd,UAAU,CAACe,YAAY,CAACC;EACpC,CAAC,CAAC;;EAEF;EACA,MAAMhB,UAAU,CAACqB,WAAW,CAACZ,WAAW,EAAE;IAAEa,UAAU,EAAE;EAAK,CAAC,CAAC;EAE/D,OAAO;IAAEpB,GAAG,EAAEe;EAAQ,CAAC;AACzB,CAAC","ignoreList":[]}
@@ -3,12 +3,13 @@ import { FileField } from '@chem-po/react';
3
3
  import React from 'react';
4
4
  import { StyleProp, ViewStyle } from 'react-native';
5
5
  import { FieldProps } from '../../types';
6
- export declare const FileView: ({ value, hasUpload, imageOptions, withFullView, nonImageContainerStyle, }: {
6
+ export declare const FileView: ({ value, hasUpload, imageOptions, withFullView, nonImageContainerStyle, withDownload, }: {
7
7
  value?: FileValue | null;
8
8
  hasUpload?: boolean;
9
9
  imageOptions?: ImageViewOptions;
10
10
  withFullView?: boolean;
11
11
  nonImageContainerStyle?: StyleProp<ViewStyle>;
12
+ withDownload?: boolean;
12
13
  }) => React.JSX.Element;
13
14
  export declare const FileComponent: React.ForwardRefExoticComponent<FieldProps<FileField> & React.RefAttributes<InputRef>>;
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/input/file/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,SAAS,EAOV,MAAM,gBAAgB,CAAA;AAIvB,OAAO,KAA0E,MAAM,OAAO,CAAA;AAC9F,OAAO,EAAE,SAAS,EAA4C,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+BxC,eAAO,MAAM,QAAQ,GAAI,2EAMtB;IACD,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAC9C,sBAuCA,CAAA;AAED,eAAO,MAAM,aAAa,wFA2FzB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/form/input/file/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,QAAQ,EAAkB,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,SAAS,EAQV,MAAM,gBAAgB,CAAA;AAIvB,OAAO,KAA0E,MAAM,OAAO,CAAA;AAC9F,OAAO,EAAE,SAAS,EAA4C,SAAS,EAAE,MAAM,cAAc,CAAA;AAG7F,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AA+BxC,eAAO,MAAM,QAAQ,GAAI,yFAOtB;IACD,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,sBAAsB,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,sBAkFA,CAAA;AAED,eAAO,MAAM,aAAa,wFA2FzB,CAAA"}
@@ -3,6 +3,9 @@ interface ImageViewModalProps {
3
3
  isOpen: boolean;
4
4
  onClose: () => void;
5
5
  src: string | null;
6
+ filename?: string;
7
+ fileType?: string;
8
+ withDownload?: boolean;
6
9
  }
7
10
  export declare const ImageViewModal: React.FC<ImageViewModalProps>;
8
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"ImageViewModal.d.ts","sourceRoot":"","sources":["../../../../src/components/image/ImageViewModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAMxE,UAAU,mBAAmB;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CACnB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAoMxD,CAAA"}
1
+ {"version":3,"file":"ImageViewModal.d.ts","sourceRoot":"","sources":["../../../../src/components/image/ImageViewModal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAoD,MAAM,OAAO,CAAA;AAOxE,UAAU,mBAAmB;IAC3B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA4OxD,CAAA"}
@@ -4,11 +4,14 @@ export interface LoadingImageProps {
4
4
  src?: string | null;
5
5
  loadingOverride?: boolean;
6
6
  onLoad?: (e: any) => void;
7
+ filename?: string;
8
+ fileType?: string;
7
9
  withFullView?: boolean;
8
10
  buttonFullView?: boolean;
9
11
  style?: ViewStyle;
10
12
  width?: DimensionValue;
11
13
  height?: DimensionValue;
14
+ withDownload?: boolean;
12
15
  }
13
- export declare const LoadingImage: ({ src, loadingOverride, onLoad, width, height, withFullView, buttonFullView, style, }: LoadingImageProps) => React.JSX.Element;
16
+ export declare const LoadingImage: ({ src, loadingOverride, onLoad, filename, fileType, width, height, withFullView, buttonFullView, withDownload, style, }: LoadingImageProps) => React.JSX.Element;
14
17
  //# sourceMappingURL=LoadingImage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LoadingImage.d.ts","sourceRoot":"","sources":["../../../../src/components/loading/LoadingImage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,EAAE,cAAc,EAA6C,SAAS,EAAE,MAAM,cAAc,CAAA;AAInG,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,MAAM,CAAC,EAAE,cAAc,CAAA;CACxB;AAKD,eAAO,MAAM,YAAY,GAAI,uFAS1B,iBAAiB,sBAmFnB,CAAA"}
1
+ {"version":3,"file":"LoadingImage.d.ts","sourceRoot":"","sources":["../../../../src/components/loading/LoadingImage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,EAAE,cAAc,EAA6C,SAAS,EAAE,MAAM,cAAc,CAAA;AAInG,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB,MAAM,CAAC,EAAE,cAAc,CAAA;IACvB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAKD,eAAO,MAAM,YAAY,GAAI,yHAY1B,iBAAiB,sBA4FnB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const downloadFile: (uri: string, filename: string, fileType: string) => Promise<{
2
+ uri: string;
3
+ } | undefined>;
4
+ //# sourceMappingURL=downloadFile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloadFile.d.ts","sourceRoot":"","sources":["../../../src/utils/downloadFile.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,GAAU,KAAK,MAAM,EAAE,UAAU,MAAM,EAAE,UAAU,MAAM;;cAiCjF,CAAA"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@chem-po/react-native",
3
3
  "author": "Elan Canfield",
4
4
  "license": "MIT",
5
- "version": "0.0.26",
5
+ "version": "0.0.28",
6
6
  "main": "lib/commonjs/index.js",
7
7
  "types": "lib/typescript/index.d.ts",
8
8
  "source": "src/index.ts",
@@ -36,6 +36,7 @@
36
36
  "@react-native-community/slider": "4.5.6",
37
37
  "expo-constants": "~17.1.7",
38
38
  "expo-document-picker": "~13.1.6",
39
+ "expo-file-system": "~18.1.11",
39
40
  "expo-image-picker": "~16.1.4",
40
41
  "lottie-react-native": "7.2.2",
41
42
  "nested-property": "^4.0.0",
@@ -50,8 +51,8 @@
50
51
  "react-native-paper-dates": "^0.22.42",
51
52
  "react-native-svg": "15.11.2",
52
53
  "zustand": "^4.3.3",
53
- "@chem-po/react": "0.0.26",
54
- "@chem-po/core": "0.0.26"
54
+ "@chem-po/core": "0.0.28",
55
+ "@chem-po/react": "0.0.28"
55
56
  },
56
57
  "devDependencies": {
57
58
  "@babel/core": "^7.26.0",
@@ -7,12 +7,14 @@ import {
7
7
  useObjectUrl,
8
8
  usePlaceholderColor,
9
9
  useTextColor,
10
+ useToast,
10
11
  } from '@chem-po/react'
11
12
  import { Ionicons } from '@expo/vector-icons'
12
13
  import * as DocumentPicker from 'expo-document-picker'
13
14
  import * as ImagePicker from 'expo-image-picker'
14
15
  import React, { forwardRef, useCallback, useImperativeHandle, useMemo, useState } from 'react'
15
16
  import { StyleProp, StyleSheet, Text, TouchableOpacity, View, ViewStyle } from 'react-native'
17
+ import { downloadFile } from '../../../../utils/downloadFile'
16
18
  import { LoadingImage } from '../../../loading/LoadingImage'
17
19
  import { FieldProps } from '../../types'
18
20
 
@@ -51,22 +53,56 @@ export const FileView = ({
51
53
  imageOptions,
52
54
  withFullView,
53
55
  nonImageContainerStyle,
56
+ withDownload,
54
57
  }: {
55
58
  value?: FileValue | null
56
59
  hasUpload?: boolean
57
60
  imageOptions?: ImageViewOptions
58
61
  withFullView?: boolean
59
62
  nonImageContainerStyle?: StyleProp<ViewStyle>
63
+ withDownload?: boolean
60
64
  }) => {
61
65
  const { storagePath, dataUrl } = value ?? {}
62
66
  const missingFile = !dataUrl && !storagePath
63
67
 
64
68
  const { url, loading } = useObjectUrl(value)
69
+ const { showError, showSuccess } = useToast()
65
70
 
66
71
  const iconColor = useIconColor()
67
72
  const fileNameColor = useTextColor()
68
73
  const borderColor = useBorderColor()
69
74
  const backgroundColor = useBackgroundColor(100)
75
+
76
+ const handleDownload = useCallback(async () => {
77
+ if (!url) {
78
+ showError('File URL is not available')
79
+ return
80
+ }
81
+
82
+ const filename = value?.filename?.split('/').pop()?.replace(/\s+/g, '_')
83
+ if (!filename) {
84
+ showError('Filename is not available')
85
+ return
86
+ }
87
+
88
+ const fileType = value?.type
89
+ if (!fileType) {
90
+ showError('File type is not available')
91
+ return
92
+ }
93
+
94
+ try {
95
+ await downloadFile(url, filename, fileType)
96
+ showSuccess('File downloaded successfully')
97
+ } catch (error: unknown) {
98
+ if (error instanceof Error) {
99
+ console.error('Error downloading file:', error.message)
100
+ } else {
101
+ console.error('Error downloading file:', String(error))
102
+ }
103
+ showError('Failed to download file')
104
+ }
105
+ }, [url, value, showError, showSuccess])
70
106
  if (!value || missingFile) {
71
107
  return <NoFileView hasUpload={hasUpload} />
72
108
  }
@@ -74,7 +110,10 @@ export const FileView = ({
74
110
  if (value.type?.startsWith('image/')) {
75
111
  return (
76
112
  <LoadingImage
113
+ withDownload={withDownload}
114
+ filename={value.filename}
77
115
  src={url}
116
+ fileType={value.type}
78
117
  loadingOverride={loading}
79
118
  width={imageOptions?.width ?? 120}
80
119
  height={imageOptions?.height ?? 120}
@@ -94,6 +133,14 @@ export const FileView = ({
94
133
  {value.filename}
95
134
  </Text>
96
135
  </View>
136
+ {withDownload && (
137
+ <TouchableOpacity
138
+ style={styles.downloadButton}
139
+ onPress={() => void handleDownload()}
140
+ disabled={loading}>
141
+ <Ionicons name="download" size={20} color={iconColor} />
142
+ </TouchableOpacity>
143
+ )}
97
144
  </View>
98
145
  )
99
146
  }
@@ -238,16 +285,18 @@ const styles = StyleSheet.create({
238
285
  filenameContainer: {
239
286
  flex: 1,
240
287
  paddingRight: 4,
241
- alignItems: 'center',
288
+ justifyContent: 'center',
242
289
  },
243
290
  filename: {
244
291
  fontSize: 14,
245
- lineHeight: 30,
246
- flex: 1,
247
292
  },
248
293
  iconContainer: {
249
294
  padding: 4,
250
295
  },
296
+ downloadButton: {
297
+ padding: 8,
298
+ marginLeft: 4,
299
+ },
251
300
  image: {
252
301
  borderRadius: 4,
253
302
  overflow: 'hidden',
@@ -1,22 +1,34 @@
1
- import { useScreen } from '@chem-po/react'
1
+ import { useScreen, useToast } from '@chem-po/react'
2
2
  import { Ionicons } from '@expo/vector-icons'
3
3
  import React, { useCallback, useEffect, useMemo, useState } from 'react'
4
4
  import { Image, Modal, StyleSheet, TouchableOpacity, View } from 'react-native'
5
5
  import { Gesture, GestureDetector, GestureHandlerRootView } from 'react-native-gesture-handler'
6
6
  import Animated, { useAnimatedStyle, useSharedValue, withSpring } from 'react-native-reanimated'
7
+ import { downloadFile } from '../../utils/downloadFile'
7
8
  import { LoadingLogo } from '../loading/Loading'
8
9
 
9
10
  interface ImageViewModalProps {
10
11
  isOpen: boolean
11
12
  onClose: () => void
12
13
  src: string | null
14
+ filename?: string
15
+ fileType?: string
16
+ withDownload?: boolean
13
17
  }
14
18
 
15
- export const ImageViewModal: React.FC<ImageViewModalProps> = ({ isOpen, onClose, src }) => {
19
+ export const ImageViewModal: React.FC<ImageViewModalProps> = ({
20
+ isOpen,
21
+ onClose,
22
+ src,
23
+ filename,
24
+ fileType,
25
+ withDownload,
26
+ }) => {
16
27
  const [loading, setLoading] = useState(true)
17
28
  const screenWidth = useScreen(s => s.width)
18
29
  const screenHeight = useScreen(s => s.height)
19
30
  const [imageSize, setImageSize] = useState({ width: screenWidth / 2, height: screenHeight / 2 })
31
+ const { showError, showSuccess } = useToast()
20
32
 
21
33
  // Shared values for zoom and pan (reanimated)
22
34
  const scale = useSharedValue(1)
@@ -64,6 +76,32 @@ export const ImageViewModal: React.FC<ImageViewModalProps> = ({ isOpen, onClose,
64
76
  }
65
77
  }, [isOpen, src, resetTransform])
66
78
 
79
+ // Download functionality
80
+ const handleDownload = useCallback(async () => {
81
+ if (!src) {
82
+ showError('Image URL is not available')
83
+ return
84
+ }
85
+ if (!fileType) {
86
+ showError('File type is not available')
87
+ return
88
+ }
89
+
90
+ try {
91
+ const usedName = filename ?? `image_${Date.now()}.jpg`
92
+
93
+ await downloadFile(src, usedName, fileType)
94
+ showSuccess('Image downloaded successfully')
95
+ } catch (error: unknown) {
96
+ if (error instanceof Error) {
97
+ console.error('Error downloading image:', error.message)
98
+ } else {
99
+ console.error('Error downloading image:', String(error))
100
+ }
101
+ showError('Failed to download image')
102
+ }
103
+ }, [src, showError, showSuccess, filename, fileType])
104
+
67
105
  // Pan gesture with worklet
68
106
  const panGesture = Gesture.Pan()
69
107
  .onUpdate(event => {
@@ -194,6 +232,12 @@ export const ImageViewModal: React.FC<ImageViewModalProps> = ({ isOpen, onClose,
194
232
  </Animated.View>
195
233
  </GestureDetector>
196
234
 
235
+ {withDownload && (
236
+ <TouchableOpacity style={styles.downloadButton} onPress={() => void handleDownload()}>
237
+ <Ionicons name="download" size={24} color="white" />
238
+ </TouchableOpacity>
239
+ )}
240
+
197
241
  <TouchableOpacity style={styles.closeButton} onPress={onClose}>
198
242
  <Ionicons name="close" size={24} color="white" />
199
243
  </TouchableOpacity>
@@ -235,6 +279,17 @@ const styles = StyleSheet.create({
235
279
  width: '100%',
236
280
  height: '100%',
237
281
  },
282
+ downloadButton: {
283
+ position: 'absolute',
284
+ top: 16,
285
+ right: 64,
286
+ width: 40,
287
+ height: 40,
288
+ borderRadius: 20,
289
+ backgroundColor: 'rgba(0, 0, 0, 0.5)',
290
+ justifyContent: 'center',
291
+ alignItems: 'center',
292
+ },
238
293
  closeButton: {
239
294
  position: 'absolute',
240
295
  top: 16,
@@ -9,11 +9,14 @@ export interface LoadingImageProps {
9
9
  src?: string | null
10
10
  loadingOverride?: boolean
11
11
  onLoad?: (e: any) => void
12
+ filename?: string
13
+ fileType?: string
12
14
  withFullView?: boolean
13
15
  buttonFullView?: boolean
14
16
  style?: ViewStyle
15
17
  width?: DimensionValue
16
18
  height?: DimensionValue
19
+ withDownload?: boolean
17
20
  }
18
21
 
19
22
  const emptyPng =
@@ -23,10 +26,13 @@ export const LoadingImage = ({
23
26
  src,
24
27
  loadingOverride,
25
28
  onLoad,
29
+ filename,
30
+ fileType,
26
31
  width,
27
32
  height,
28
33
  withFullView,
29
34
  buttonFullView,
35
+ withDownload,
30
36
  style,
31
37
  }: LoadingImageProps) => {
32
38
  const [imageLoading, setImageLoading] = useState(!!src)
@@ -108,7 +114,16 @@ export const LoadingImage = ({
108
114
  ]}>
109
115
  <LoadingLogo isLoading={loading} size={10} />
110
116
  </View>
111
- {viewing && <ImageViewModal isOpen src={src ?? emptyPng} onClose={() => setViewing(false)} />}
117
+ {viewing ? (
118
+ <ImageViewModal
119
+ withDownload={withDownload}
120
+ filename={filename}
121
+ fileType={fileType}
122
+ isOpen
123
+ src={src ?? emptyPng}
124
+ onClose={() => setViewing(false)}
125
+ />
126
+ ) : null}
112
127
  </View>
113
128
  )
114
129
  }
@@ -0,0 +1,36 @@
1
+ import * as FileSystem from 'expo-file-system'
2
+
3
+ export const downloadFile = async (uri: string, filename: string, fileType: string) => {
4
+ const permissions = await FileSystem.StorageAccessFramework.requestDirectoryPermissionsAsync()
5
+ if (!permissions.granted) {
6
+ return
7
+ }
8
+
9
+ // Download to temporary location first
10
+ const tempFileUri = `${FileSystem.cacheDirectory}${filename}`
11
+
12
+ // Download the file to temporary location
13
+ await FileSystem.downloadAsync(uri, tempFileUri)
14
+
15
+ // Read the temporary file as base64
16
+ const base64Content = await FileSystem.readAsStringAsync(tempFileUri, {
17
+ encoding: FileSystem.EncodingType.Base64,
18
+ })
19
+
20
+ // Create a file within the selected directory using SAF
21
+ const fileUri = await FileSystem.StorageAccessFramework.createFileAsync(
22
+ permissions.directoryUri,
23
+ filename,
24
+ fileType,
25
+ )
26
+
27
+ // Write the content to the SAF file
28
+ await FileSystem.StorageAccessFramework.writeAsStringAsync(fileUri, base64Content, {
29
+ encoding: FileSystem.EncodingType.Base64,
30
+ })
31
+
32
+ // Clean up temporary file
33
+ await FileSystem.deleteAsync(tempFileUri, { idempotent: true })
34
+
35
+ return { uri: fileUri }
36
+ }