66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
import { Platform } from "react-native";
|
|
import Compressor from "react-native-compressor";
|
|
import firebase from "../config/firebase";
|
|
|
|
export function uploadFileToFirebase({
|
|
uri,
|
|
path,
|
|
shouldCompress = false,
|
|
fileType = "",
|
|
}) {
|
|
return new Promise(async (resolve, reject) => {
|
|
try {
|
|
let workingURI = uri;
|
|
|
|
// Optionally compress before upload
|
|
try {
|
|
if (shouldCompress && Platform.OS !== "web") {
|
|
if (fileType === "VIDEO") {
|
|
console.log("Compressing video...");
|
|
workingURI = await Compressor.Video.compress(workingURI);
|
|
} else if (fileType === "IMAGE") {
|
|
// Basic image compression
|
|
workingURI = await Compressor.Image.compress(workingURI, {
|
|
compressionMethod: "auto",
|
|
});
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.warn("Compression failed, uploading original file", e?.message);
|
|
workingURI = uri;
|
|
}
|
|
|
|
const response = await fetch(workingURI);
|
|
const blob = await response.blob();
|
|
|
|
const uploadTask = firebase.storage().ref(path).put(blob);
|
|
|
|
uploadTask.on(
|
|
Platform.OS === "web"
|
|
? "state_changed"
|
|
: firebase.storage.TaskEvent.STATE_CHANGED,
|
|
(snapshot) => {
|
|
if (
|
|
Platform.OS !== "web" &&
|
|
snapshot.state === firebase.storage.TaskState.SUCCESS
|
|
) {
|
|
snapshot.ref.getDownloadURL().then((resultURI) => {
|
|
resolve({ resultURI });
|
|
});
|
|
}
|
|
},
|
|
(error) => {
|
|
reject(error);
|
|
},
|
|
async () => {
|
|
const url = await firebase.storage().ref(path).getDownloadURL();
|
|
|
|
resolve({ resultURI: url });
|
|
}
|
|
);
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
});
|
|
}
|