@plusscommunities/pluss-core-app 7.0.4 → 7.1.13
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.
|
@@ -23,22 +23,22 @@ class DocumentUploader extends Component {
|
|
|
23
23
|
allowedTypes,
|
|
24
24
|
multiple
|
|
25
25
|
} = this.props;
|
|
26
|
-
try {
|
|
27
|
-
const result = {};
|
|
28
|
-
// const result = await DocumentPicker.getDocumentAsync({
|
|
29
|
-
// type: allowedTypes,
|
|
30
|
-
// copyToCacheDirectory: true,
|
|
31
|
-
// multiple: multiple || false,
|
|
32
|
-
// });
|
|
33
|
-
// console.log('pickDocument', JSON.stringify(result, null, 2));
|
|
34
26
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
27
|
+
// try {
|
|
28
|
+
// const result = await DocumentPicker.getDocumentAsync({
|
|
29
|
+
// type: allowedTypes,
|
|
30
|
+
// copyToCacheDirectory: true,
|
|
31
|
+
// multiple: multiple || false,
|
|
32
|
+
// });
|
|
33
|
+
// // console.log('pickDocument', JSON.stringify(result, null, 2));
|
|
34
|
+
|
|
35
|
+
// if (!result.canceled) {
|
|
36
|
+
// await this.handleDocumentPicked(result);
|
|
37
|
+
// }
|
|
38
|
+
// } catch (error) {
|
|
39
|
+
// console.log('Document picker error:', error);
|
|
40
|
+
// this.props.onUploadFailed(null, error.message);
|
|
41
|
+
// }
|
|
42
42
|
});
|
|
43
43
|
_defineProperty(this, "handleDocumentPicked", async documentResult => {
|
|
44
44
|
const {
|
|
@@ -57,14 +57,30 @@ class DocumentUploader extends Component {
|
|
|
57
57
|
const uploadPromises = assets.map(async asset => {
|
|
58
58
|
const {
|
|
59
59
|
name,
|
|
60
|
-
uri
|
|
60
|
+
uri,
|
|
61
|
+
mimeType
|
|
61
62
|
} = asset;
|
|
63
|
+
let file, fileExt;
|
|
64
|
+
if (name && name.includes('.')) {
|
|
65
|
+
const lastDotIndex = name.lastIndexOf('.');
|
|
66
|
+
file = name.substring(0, lastDotIndex);
|
|
67
|
+
fileExt = name.substring(lastDotIndex + 1);
|
|
68
|
+
} else {
|
|
69
|
+
// Fallback: extract extension from mimeType
|
|
70
|
+
file = name || 'document';
|
|
71
|
+
if (mimeType) {
|
|
72
|
+
const mimeTypeParts = mimeType.split('/');
|
|
73
|
+
// Handle specific MIME type mappings
|
|
74
|
+
if (mimeType === 'application/pdf') fileExt = 'pdf';else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];else if (mimeType.startsWith('text/')) fileExt = 'txt';else fileExt = mimeTypeParts[1] || 'pdf';
|
|
75
|
+
} else {
|
|
76
|
+
fileExt = 'pdf';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
62
79
|
|
|
63
80
|
// Generate a unique filename if not provided
|
|
64
|
-
const
|
|
65
|
-
const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}_${Date.now()}.${fileExt}`;
|
|
81
|
+
const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
|
|
66
82
|
const uploadUri = fileActions.getUploadUrl(userId, fileName);
|
|
67
|
-
// console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName }, null, 2));
|
|
83
|
+
// console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));
|
|
68
84
|
|
|
69
85
|
try {
|
|
70
86
|
// Notify parent component that upload has started for this file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Component","View","TouchableOpacity","Text","StyleSheet","ActivityIndicator","Icon","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","result","canceled","handleDocumentPicked","error","console","log","onUploadFailed","message","documentResult","assets","userId","setState","uploadPromises","map","asset","name","uri","file","fileExt","split","fileName","Date","now","uploadUri","getUploadUrl","onUploadStarted","toUpperCase","res","uploadUserMediaWithProgress","progress","onUploadProgress","fileUrl","env","baseUploadsUrl","key","onUploadSuccess","success","url","results","Promise","all","buttonTitle","buttonStyle","buttonTextStyle","disabled","state","mainColor","createElement","style","styles","uploadButton","borderColor","onPress","pickDocument","activeOpacity","buttonContent","color","type","size","icon","buttonText","progressContainer","progressBar","progressFill","width","progressText","Math","round","render","container","renderUploadButton","renderProgress","create","marginVertical","flexDirection","alignItems","justifyContent","paddingVertical","paddingHorizontal","borderRadius","backgroundColor","borderWidth","fontSize","fontWeight","marginLeft","marginRight","marginTop","height","overflow","mapStateToProps","user","colourBrandingMain"],"sources":["DocumentUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';\nimport { Icon } from '@rneui/themed';\n// import * as DocumentPicker from 'expo-document-picker';\nimport { connect } from 'react-redux';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { getValueOrDefault } from '../helper';\nimport { TEXT_DARK, getMainBrandingColourFromState } from '../colours';\n\nconst DEFAULT_DOCUMENT_NAME = 'document';\n\nclass DocumentUploader extends Component {\n static defaultProps = {\n allowedTypes: ['application/pdf'],\n buttonTitle: 'Upload Document',\n buttonStyle: {},\n buttonTextStyle: {},\n onUploadStarted: () => {},\n onUploadSuccess: () => {},\n onUploadFailed: () => {},\n onUploadProgress: null,\n userId: null,\n fileName: null,\n disabled: false,\n };\n\n state = {\n isUploading: false,\n uploadProgress: 0,\n };\n\n pickDocument = async () => {\n const { allowedTypes, multiple } = this.props;\n\n try {\n const result = {};\n // const result = await DocumentPicker.getDocumentAsync({\n // type: allowedTypes,\n // copyToCacheDirectory: true,\n // multiple: multiple || false,\n // });\n // console.log('pickDocument', JSON.stringify(result, null, 2));\n\n if (!result.canceled) {\n await this.handleDocumentPicked(result);\n }\n } catch (error) {\n console.log('Document picker error:', error);\n this.props.onUploadFailed(null, error.message);\n }\n };\n\n handleDocumentPicked = async documentResult => {\n const { assets } = documentResult;\n const { userId } = this.props;\n\n try {\n this.setState({ isUploading: true, uploadProgress: 0 });\n\n // Process each asset in parallel\n const uploadPromises = assets.map(async asset => {\n const { name, uri } = asset;\n\n // Generate a unique filename if not provided\n const [file, fileExt] = name.split('.');\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}_${Date.now()}.${fileExt}`;\n const uploadUri = fileActions.getUploadUrl(userId, fileName);\n // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName }, null, 2));\n\n try {\n // Notify parent component that upload has started for this file\n this.props.onUploadStarted(uploadUri, uri, file, fileExt.toUpperCase());\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n const fileUrl = Config.env.baseUploadsUrl + res.key;\n this.props.onUploadSuccess(fileUrl, uploadUri);\n console.log('Upload success', fileUrl);\n return { success: true, url: fileUrl, uploadUri };\n } catch (error) {\n console.error(`Upload failed for ${name}:`, error);\n this.props.onUploadFailed(uploadUri, error.message);\n return { success: false, error, uploadUri };\n }\n });\n\n // Wait for all uploads to complete\n const results = await Promise.all(uploadPromises);\n return results;\n } catch (error) {\n console.error('Document upload error:', error);\n return [];\n } finally {\n this.setState({ isUploading: false, uploadProgress: 0 });\n }\n };\n\n renderUploadButton = () => {\n const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;\n const { isUploading } = this.state;\n const mainColor = getMainBrandingColourFromState(this.props);\n\n return (\n <TouchableOpacity\n style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}\n onPress={this.pickDocument}\n disabled={isUploading || disabled}\n activeOpacity={0.7}\n >\n <View style={styles.buttonContent}>\n {isUploading ? (\n <ActivityIndicator color={mainColor} />\n ) : (\n <Icon name=\"attachment\" type=\"entypo\" color={mainColor} size={18} style={styles.icon} />\n )}\n <Text style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}>{buttonTitle}</Text>\n </View>\n </TouchableOpacity>\n );\n };\n\n renderProgress = () => {\n const { uploadProgress } = this.state;\n if (uploadProgress <= 0 || uploadProgress >= 1) return null;\n\n return (\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]} />\n </View>\n <Text style={styles.progressText}>{Math.round(uploadProgress * 100)}%</Text>\n </View>\n );\n };\n\n render() {\n return (\n <View style={styles.container}>\n {this.renderUploadButton()}\n {this.renderProgress()}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n marginVertical: 10,\n },\n uploadButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: '#fff',\n borderWidth: 1,\n borderColor: '#007AFF',\n },\n buttonContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n buttonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '500',\n marginLeft: 8,\n },\n icon: {\n marginRight: 8,\n },\n progressContainer: {\n marginTop: 8,\n alignItems: 'center',\n },\n progressBar: {\n height: 4,\n width: '100%',\n backgroundColor: '#E0E0E0',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#4CAF50',\n },\n progressText: {\n marginTop: 4,\n fontSize: 12,\n color: TEXT_DARK,\n },\n});\n\nconst mapStateToProps = state => {\n const { user } = state;\n return {\n user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps)(DocumentUploader);\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","Component","View","TouchableOpacity","Text","StyleSheet","ActivityIndicator","Icon","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","documentResult","assets","userId","setState","uploadPromises","map","asset","name","uri","mimeType","file","fileExt","includes","lastDotIndex","lastIndexOf","substring","mimeTypeParts","split","startsWith","fileName","uploadUri","getUploadUrl","onUploadStarted","toUpperCase","res","uploadUserMediaWithProgress","progress","onUploadProgress","fileUrl","env","baseUploadsUrl","key","onUploadSuccess","console","log","success","url","error","onUploadFailed","message","results","Promise","all","buttonTitle","buttonStyle","buttonTextStyle","disabled","state","mainColor","createElement","style","styles","uploadButton","borderColor","onPress","pickDocument","activeOpacity","buttonContent","color","type","size","icon","buttonText","progressContainer","progressBar","progressFill","width","progressText","Math","round","render","container","renderUploadButton","renderProgress","create","marginVertical","flexDirection","alignItems","justifyContent","paddingVertical","paddingHorizontal","borderRadius","backgroundColor","borderWidth","fontSize","fontWeight","marginLeft","marginRight","marginTop","height","overflow","mapStateToProps","user","colourBrandingMain"],"sources":["DocumentUploader.js"],"sourcesContent":["import React, { Component } from 'react';\nimport { View, TouchableOpacity, Text, StyleSheet, ActivityIndicator } from 'react-native';\nimport { Icon } from '@rneui/themed';\n// import * as DocumentPicker from 'expo-document-picker';\nimport { connect } from 'react-redux';\nimport Config from '../config';\nimport { fileActions } from '../apis';\nimport { getValueOrDefault } from '../helper';\nimport { TEXT_DARK, getMainBrandingColourFromState } from '../colours';\n\nconst DEFAULT_DOCUMENT_NAME = 'document';\n\nclass DocumentUploader extends Component {\n static defaultProps = {\n allowedTypes: ['application/pdf'],\n buttonTitle: 'Upload Document',\n buttonStyle: {},\n buttonTextStyle: {},\n onUploadStarted: () => {},\n onUploadSuccess: () => {},\n onUploadFailed: () => {},\n onUploadProgress: null,\n userId: null,\n fileName: null,\n disabled: false,\n };\n\n state = {\n isUploading: false,\n uploadProgress: 0,\n };\n\n pickDocument = async () => {\n const { allowedTypes, multiple } = this.props;\n\n // try {\n // const result = await DocumentPicker.getDocumentAsync({\n // type: allowedTypes,\n // copyToCacheDirectory: true,\n // multiple: multiple || false,\n // });\n // // console.log('pickDocument', JSON.stringify(result, null, 2));\n\n // if (!result.canceled) {\n // await this.handleDocumentPicked(result);\n // }\n // } catch (error) {\n // console.log('Document picker error:', error);\n // this.props.onUploadFailed(null, error.message);\n // }\n };\n\n handleDocumentPicked = async documentResult => {\n const { assets } = documentResult;\n const { userId } = this.props;\n\n try {\n this.setState({ isUploading: true, uploadProgress: 0 });\n\n // Process each asset in parallel\n const uploadPromises = assets.map(async asset => {\n const { name, uri, mimeType } = asset;\n\n let file, fileExt;\n if (name && name.includes('.')) {\n const lastDotIndex = name.lastIndexOf('.');\n file = name.substring(0, lastDotIndex);\n fileExt = name.substring(lastDotIndex + 1);\n } else {\n // Fallback: extract extension from mimeType\n file = name || 'document';\n if (mimeType) {\n const mimeTypeParts = mimeType.split('/');\n // Handle specific MIME type mappings\n if (mimeType === 'application/pdf') fileExt = 'pdf';\n else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];\n else if (mimeType.startsWith('text/')) fileExt = 'txt';\n else fileExt = mimeTypeParts[1] || 'pdf';\n } else {\n fileExt = 'pdf';\n }\n }\n\n // Generate a unique filename if not provided\n const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;\n const uploadUri = fileActions.getUploadUrl(userId, fileName);\n // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));\n\n try {\n // Notify parent component that upload has started for this file\n this.props.onUploadStarted(uploadUri, uri, file, fileExt.toUpperCase());\n\n const res = await fileActions.uploadUserMediaWithProgress(uri, uploadUri, progress => {\n if (this.props.onUploadProgress) this.props.onUploadProgress(progress);\n });\n\n const fileUrl = Config.env.baseUploadsUrl + res.key;\n this.props.onUploadSuccess(fileUrl, uploadUri);\n console.log('Upload success', fileUrl);\n return { success: true, url: fileUrl, uploadUri };\n } catch (error) {\n console.error(`Upload failed for ${name}:`, error);\n this.props.onUploadFailed(uploadUri, error.message);\n return { success: false, error, uploadUri };\n }\n });\n\n // Wait for all uploads to complete\n const results = await Promise.all(uploadPromises);\n return results;\n } catch (error) {\n console.error('Document upload error:', error);\n return [];\n } finally {\n this.setState({ isUploading: false, uploadProgress: 0 });\n }\n };\n\n renderUploadButton = () => {\n const { buttonTitle, buttonStyle, buttonTextStyle, disabled } = this.props;\n const { isUploading } = this.state;\n const mainColor = getMainBrandingColourFromState(this.props);\n\n return (\n <TouchableOpacity\n style={[styles.uploadButton, { borderColor: mainColor }, buttonStyle]}\n onPress={this.pickDocument}\n disabled={isUploading || disabled}\n activeOpacity={0.7}\n >\n <View style={styles.buttonContent}>\n {isUploading ? (\n <ActivityIndicator color={mainColor} />\n ) : (\n <Icon name=\"attachment\" type=\"entypo\" color={mainColor} size={18} style={styles.icon} />\n )}\n <Text style={[styles.buttonText, { color: mainColor }, buttonTextStyle]}>{buttonTitle}</Text>\n </View>\n </TouchableOpacity>\n );\n };\n\n renderProgress = () => {\n const { uploadProgress } = this.state;\n if (uploadProgress <= 0 || uploadProgress >= 1) return null;\n\n return (\n <View style={styles.progressContainer}>\n <View style={styles.progressBar}>\n <View style={[styles.progressFill, { width: `${uploadProgress * 100}%` }]} />\n </View>\n <Text style={styles.progressText}>{Math.round(uploadProgress * 100)}%</Text>\n </View>\n );\n };\n\n render() {\n return (\n <View style={styles.container}>\n {this.renderUploadButton()}\n {this.renderProgress()}\n </View>\n );\n }\n}\n\nconst styles = StyleSheet.create({\n container: {\n marginVertical: 10,\n },\n uploadButton: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n paddingVertical: 8,\n paddingHorizontal: 16,\n borderRadius: 6,\n backgroundColor: '#fff',\n borderWidth: 1,\n borderColor: '#007AFF',\n },\n buttonContent: {\n flexDirection: 'row',\n alignItems: 'center',\n },\n buttonText: {\n color: '#fff',\n fontSize: 16,\n fontWeight: '500',\n marginLeft: 8,\n },\n icon: {\n marginRight: 8,\n },\n progressContainer: {\n marginTop: 8,\n alignItems: 'center',\n },\n progressBar: {\n height: 4,\n width: '100%',\n backgroundColor: '#E0E0E0',\n borderRadius: 2,\n overflow: 'hidden',\n },\n progressFill: {\n height: '100%',\n backgroundColor: '#4CAF50',\n },\n progressText: {\n marginTop: 4,\n fontSize: 12,\n color: TEXT_DARK,\n },\n});\n\nconst mapStateToProps = state => {\n const { user } = state;\n return {\n user,\n colourBrandingMain: getMainBrandingColourFromState(state),\n };\n};\n\nexport default connect(mapStateToProps)(DocumentUploader);\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -33,22 +33,21 @@ class DocumentUploader extends Component {
|
|
|
33
33
|
pickDocument = async () => {
|
|
34
34
|
const { allowedTypes, multiple } = this.props;
|
|
35
35
|
|
|
36
|
-
try {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
36
|
+
// try {
|
|
37
|
+
// const result = await DocumentPicker.getDocumentAsync({
|
|
38
|
+
// type: allowedTypes,
|
|
39
|
+
// copyToCacheDirectory: true,
|
|
40
|
+
// multiple: multiple || false,
|
|
41
|
+
// });
|
|
42
|
+
// // console.log('pickDocument', JSON.stringify(result, null, 2));
|
|
43
|
+
|
|
44
|
+
// if (!result.canceled) {
|
|
45
|
+
// await this.handleDocumentPicked(result);
|
|
46
|
+
// }
|
|
47
|
+
// } catch (error) {
|
|
48
|
+
// console.log('Document picker error:', error);
|
|
49
|
+
// this.props.onUploadFailed(null, error.message);
|
|
50
|
+
// }
|
|
52
51
|
};
|
|
53
52
|
|
|
54
53
|
handleDocumentPicked = async documentResult => {
|
|
@@ -60,13 +59,32 @@ class DocumentUploader extends Component {
|
|
|
60
59
|
|
|
61
60
|
// Process each asset in parallel
|
|
62
61
|
const uploadPromises = assets.map(async asset => {
|
|
63
|
-
const { name, uri } = asset;
|
|
62
|
+
const { name, uri, mimeType } = asset;
|
|
63
|
+
|
|
64
|
+
let file, fileExt;
|
|
65
|
+
if (name && name.includes('.')) {
|
|
66
|
+
const lastDotIndex = name.lastIndexOf('.');
|
|
67
|
+
file = name.substring(0, lastDotIndex);
|
|
68
|
+
fileExt = name.substring(lastDotIndex + 1);
|
|
69
|
+
} else {
|
|
70
|
+
// Fallback: extract extension from mimeType
|
|
71
|
+
file = name || 'document';
|
|
72
|
+
if (mimeType) {
|
|
73
|
+
const mimeTypeParts = mimeType.split('/');
|
|
74
|
+
// Handle specific MIME type mappings
|
|
75
|
+
if (mimeType === 'application/pdf') fileExt = 'pdf';
|
|
76
|
+
else if (mimeType.startsWith('image/')) fileExt = mimeTypeParts[1];
|
|
77
|
+
else if (mimeType.startsWith('text/')) fileExt = 'txt';
|
|
78
|
+
else fileExt = mimeTypeParts[1] || 'pdf';
|
|
79
|
+
} else {
|
|
80
|
+
fileExt = 'pdf';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
64
83
|
|
|
65
84
|
// Generate a unique filename if not provided
|
|
66
|
-
const
|
|
67
|
-
const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}_${Date.now()}.${fileExt}`;
|
|
85
|
+
const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
|
|
68
86
|
const uploadUri = fileActions.getUploadUrl(userId, fileName);
|
|
69
|
-
// console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName }, null, 2));
|
|
87
|
+
// console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));
|
|
70
88
|
|
|
71
89
|
try {
|
|
72
90
|
// Notify parent component that upload has started for this file
|