android doesnt like base64 files for sharesheet

This commit is contained in:
Roland Osborne 2023-04-21 11:46:11 -07:00
parent af75902343
commit 6bcdef60e8
3 changed files with 88 additions and 8 deletions

View File

@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"> xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"

View File

@ -14,6 +14,7 @@
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:name=".MainApplication" android:name=".MainApplication"

View File

@ -1,4 +1,4 @@
import { KeyboardAvoidingView, FlatList, View, Text, TextInput, Modal, Image, Alert } from 'react-native'; import { Platform, KeyboardAvoidingView, FlatList, View, Text, TextInput, Modal, Image, Alert } from 'react-native';
import { TouchableOpacity } from 'react-native-gesture-handler'; import { TouchableOpacity } from 'react-native-gesture-handler';
import { useTopicItem } from './useTopicItem.hook'; import { useTopicItem } from './useTopicItem.hook';
import { styles } from './TopicItem.styled'; import { styles } from './TopicItem.styled';
@ -16,6 +16,64 @@ import Carousel from 'react-native-reanimated-carousel';
import Share from 'react-native-share'; import Share from 'react-native-share';
import RNFetchBlob from "rn-fetch-blob"; import RNFetchBlob from "rn-fetch-blob";
function getExtension(mime) {
if (mime === 'image/gif') {
return 'gif';
}
if (mime === 'image/jpeg') {
return 'jpg';
}
if (mime === 'text/plain') {
return 'txt';
}
if (mime === 'image/png') {
return 'png';
}
if (mime === 'image/bmp') {
return 'bmp';
}
if (mime === 'image/svg+xml') {
return 'svg';
}
if (mime === 'application/msword') {
return 'doc';
}
if (mime === 'application/pdf') {
return 'pdf';
}
if (mime === 'application/vnd.ms-excel') {
return 'xls';
}
if (mime === 'application/vnd.ms-powerpoint') {
return 'ppt';
}
if (mime === 'application/zip') {
return 'zip';
}
if (mime === 'audio/mpeg') {
return 'mp3';
}
if (mime === 'audio/ogg') {
return 'ogg';
}
if (mime === 'video/mpeg') {
return 'mpg';
}
if (mime === 'video/quicktime') {
return 'mov';
}
if (mime === 'video/x-ms-wmv') {
return 'wmv';
}
if (mime === 'video/x-msvideo') {
return 'avi';
}
if (mime === 'video/mp4') {
return 'mp4';
}
return 'bin'
}
export function TopicItem({ item, focused, focus, hosting, remove, update, block, report, contentKey }) { export function TopicItem({ item, focused, focus, hosting, remove, update, block, report, contentKey }) {
const { state, actions } = useTopicItem(item, hosting, remove, contentKey); const { state, actions } = useTopicItem(item, hosting, remove, contentKey);
@ -51,29 +109,49 @@ export function TopicItem({ item, focused, focus, hosting, remove, update, block
try { try {
const files = [] const files = []
const unlink = []
const fs = RNFetchBlob.fs; const fs = RNFetchBlob.fs;
const data = JSON.parse(item.detail.data) const data = JSON.parse(item.detail.data)
const assets = data.assets || [] const assets = data.assets || []
for (let i = 0; i < assets.length; i++) { for (let i = 0; i < assets.length; i++) {
if (assets[i].image) { if (assets[i].image) {
const url = actions.getTopicAssetUrl(item.topicId, assets[i].image.full); const url = actions.getTopicAssetUrl(item.topicId, assets[i].image.full);
const blob = await RNFetchBlob.config({ fileCache: true }).fetch("GET", url); const blob = await RNFetchBlob.config({ fileCache: true }).fetch("GET", url);
const type = blob.respInfo.headers["Content-Type"]; const type = blob.respInfo.headers["Content-Type"] || blob.respInfo.headers["content-type"]
if (Platform.OS === 'ios') {
const file = await blob.readFile("base64"); const file = await blob.readFile("base64");
fs.unlink(blob.path());
files.push(`data:${type};base64,${file}`) files.push(`data:${type};base64,${file}`)
unlink.push(blob.path());
}
else {
const src = blob.path();
const dir = src.split('/').slice(0,-1).join('/')
const dst = dir + '/' + assets[i].image.full + '.' + getExtension(type);
await RNFetchBlob.fs.mv(src, dst);
files.push(`file://${dst}`);
unlink.push(dst);
}
} }
} }
Share.open({ urls: files, message: data.text }) await Share.open({ urls: files, message: data.text, title: 'Databag', subject: 'Shared from Databag' })
try {
for (let i = 0; i < unlink.length; i++) {
await fs.unlink(unlink[i])
}
}
catch(err) {
console.log(err);
}
} }
catch(err) { catch(err) {
console.log(err); console.log(err);
Alert.alert( Alert.alert(
'Failed to Share Message', 'Failed to Share Message',
'Please try again.' err.toSring()
) )
} }
} }