Skip to content
This repository was archived by the owner on Mar 16, 2019. It is now read-only.

Commit eb70391

Browse files
committed
#1 Change js interface for progress implementation
1 parent d41ed22 commit eb70391

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

src/index.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
import { NativeModules } from 'react-native'
7+
import { DeviceEventEmitter } from 'react-native';
78
import base64 from 'base-64'
89

910
const RNFetchBlob = NativeModules.RNFetchBlob
@@ -20,20 +21,37 @@ if(RNFetchBlob === void 0) {
2021
// Promise wrapper function
2122
const fetch = (...args) => {
2223

24+
// create task ID for receiving progress event
25+
let taskId = getUUID()
2326
let promise = new Promise((resolve, reject) => {
2427

2528
let [method, url, headers, body] = [...args]
2629
let nativeMethodName = Array.isArray(body) ? 'fetchBlobForm' : 'fetchBlob'
2730

28-
RNFetchBlob[nativeMethodName](method, url, headers || {}, body, (err, ...data) => {
31+
let progressEventHandler = (e) => {
32+
if(e.taskId === taskId && promise.onProgress) {
33+
promise.onProgress(e.written, e.total)
34+
}
35+
}
36+
37+
DeviceEventEmitter.addListener('RNFetchBlobProgress' + taskId, progressEventHandler)
38+
39+
RNFetchBlob[nativeMethodName](taskId, method, url, headers || {}, body, (err, ...data) => {
40+
41+
// task done, remove event listener
42+
DeviceEventEmitter.removeAllListeners('RNFetchBlobProgress'+taskId)
43+
2944
if(err)
3045
reject(new Error(err, ...data))
3146
else
3247
resolve(new FetchBlobResponse(...data))
48+
3349
})
3450

3551
})
3652

53+
promise.onProgress = null
54+
3755
return promise
3856

3957
}
@@ -81,6 +99,13 @@ class FetchBlobResponse {
8199

82100
}
83101

102+
function getUUID(){
103+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
104+
let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
105+
return v.toString(16);
106+
});
107+
}
108+
84109
export default {
85110
fetch, FetchBlobResponse, base64
86111
}

0 commit comments

Comments
 (0)