import axios from "axios"; import { store } from "../redux/store"; import mime from "mime"; import * as MediaLibrary from "expo-media-library"; import * as ImageManipulator from "expo-image-manipulator"; axios.interceptors.request.use( function (config) { config.metadata = { startTime: new Date() }; return config; }, function (error) { return Promise.reject(error); } ); axios.interceptors.response.use( function (response) { response.config.metadata.endTime = new Date(); response.duration = response.config.metadata.endTime - response.config.metadata.startTime; return response; }, function (error) { error.config.metadata.endTime = new Date(); error.duration = error.config.metadata.endTime - error.config.metadata.startTime; return Promise.reject(error); } ); export const handleLocalUpload = async ({ ev, context }) => { const { onError, onSuccess, onProgress, filename, mediaId } = ev; const { jobid, invoice_number, vendorid, callbackAfterUpload } = context; const bodyshop = store.getState().user.bodyshop; try { var options = { headers: { "Content-Type": "multipart/form-data", ims_token: bodyshop.localmediatoken, }, onUploadProgress: (e) => { if (onProgress) onProgress({ percent: (e.loaded / e.total) * 100 }); }, }; const formData = new FormData(); formData.append("jobid", jobid); if (invoice_number) { formData.append("invoice_number", invoice_number); formData.append("vendorid", vendorid); } const imageData = await MediaLibrary.getAssetInfoAsync(mediaId); const mimeType = mime.getType(imageData.uri); let thumb; let fileData = { uri: null, type: null, name: null, }; if (mimeType === "image/heic") { try { thumb = await ImageManipulator.manipulateAsync(imageData.uri, [], { format: "jpeg", base64: true, compress: 0.75, }); const name = imageData.filename.split("."); name.pop(); fileData = { uri: thumb.uri, type: "image/jpeg", name: name.join("") + ".jpeg", }; } catch (error) { console.log(error); onError && onError(error.message); } } else { fileData = { uri: imageData.localUri || imageData.uri, type: mimeType, name: filename, }; } console.log("Got past reading the media.", formData); formData.append("file", fileData); formData.append("skip_thumbnail", true); try { const imexMediaServerResponse = await axios.post( `${bodyshop.localmediaserverhttp}/${ invoice_number ? "bills" : "jobs" }/upload`, formData, { ...options, } ); console.log( "Response Time ", imexMediaServerResponse.headers["x-response-time"] ); if (imexMediaServerResponse.status !== 200) { if (onError) { console.log(imexMediaServerResponse); onError( imexMediaServerResponse.data || imexMediaServerResponse.statusText ); } } else { onSuccess && onSuccess(); console.log("Succesful upload", imageData.filename); } if (callbackAfterUpload) { callbackAfterUpload(); } } catch (error) { console.log("Error uploading documents:", error); onError && onError(error.message); } } catch (error) { console.log("Uncaught error", error); onError && onError(error.message); } };