@plusscommunities/pluss-core-app 6.1.12-beta.0 → 6.1.12

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.
@@ -56,14 +56,30 @@ class DocumentUploader extends Component {
56
56
  const uploadPromises = assets.map(async asset => {
57
57
  const {
58
58
  name,
59
- uri
59
+ uri,
60
+ mimeType
60
61
  } = asset;
62
+ let file, fileExt;
63
+ if (name && name.includes('.')) {
64
+ const lastDotIndex = name.lastIndexOf('.');
65
+ file = name.substring(0, lastDotIndex);
66
+ fileExt = name.substring(lastDotIndex + 1);
67
+ } else {
68
+ // Fallback: extract extension from mimeType
69
+ file = name || 'document';
70
+ if (mimeType) {
71
+ const mimeTypeParts = mimeType.split('/');
72
+ // Handle specific MIME type mappings
73
+ 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';
74
+ } else {
75
+ fileExt = 'pdf';
76
+ }
77
+ }
61
78
 
62
79
  // Generate a unique filename if not provided
63
- const [file, fileExt] = name.split('.');
64
- const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}_${Date.now()}.${fileExt}`;
80
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
65
81
  const uploadUri = fileActions.getUploadUrl(userId, fileName);
66
- // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName }, null, 2));
82
+ // console.log('handleDocumentPicked', JSON.stringify({ uploadUri, uri, name, fileName, mimeType, file, fileExt }, null, 2));
67
83
 
68
84
  try {
69
85
  // Notify parent component that upload has started for this file
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","View","TouchableOpacity","Text","StyleSheet","ActivityIndicator","Icon","DocumentPicker","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","result","getDocumentAsync","type","copyToCacheDirectory","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","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 'react-native-elements';\nimport * 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 } = 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","DocumentPicker","connect","Config","fileActions","getValueOrDefault","TEXT_DARK","getMainBrandingColourFromState","DEFAULT_DOCUMENT_NAME","DocumentUploader","constructor","args","_defineProperty","isUploading","uploadProgress","allowedTypes","multiple","props","result","getDocumentAsync","type","copyToCacheDirectory","canceled","handleDocumentPicked","error","console","log","onUploadFailed","message","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","success","url","results","Promise","all","buttonTitle","buttonStyle","buttonTextStyle","disabled","state","mainColor","createElement","style","styles","uploadButton","borderColor","onPress","pickDocument","activeOpacity","buttonContent","color","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 'react-native-elements';\nimport * 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-core-app",
3
- "version": "6.1.12-beta.0",
3
+ "version": "6.1.12",
4
4
  "description": "Core extension package for Pluss Communities platform",
5
5
  "main": "dist/module/index.js",
6
6
  "module": "dist/module/index.js",
@@ -59,13 +59,32 @@ class DocumentUploader extends Component {
59
59
 
60
60
  // Process each asset in parallel
61
61
  const uploadPromises = assets.map(async asset => {
62
- 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
+ }
63
83
 
64
84
  // Generate a unique filename if not provided
65
- const [file, fileExt] = name.split('.');
66
- const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}_${Date.now()}.${fileExt}`;
85
+ const fileName = `${getValueOrDefault(this.props.fileName, DEFAULT_DOCUMENT_NAME)}.${fileExt}`;
67
86
  const uploadUri = fileActions.getUploadUrl(userId, fileName);
68
- // 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));
69
88
 
70
89
  try {
71
90
  // Notify parent component that upload has started for this file