|  | @@ -4,6 +4,7 @@
 | 
	
		
			
			| 4 | 4 |   */
 | 
	
		
			
			| 5 | 5 |  
 | 
	
		
			
			| 6 | 6 |  import { NativeModules } from 'react-native'
 | 
	
		
			
			|  | 7 | +import { DeviceEventEmitter } from 'react-native';
 | 
	
		
			
			| 7 | 8 |  import base64 from 'base-64'
 | 
	
		
			
			| 8 | 9 |  
 | 
	
		
			
			| 9 | 10 |  const RNFetchBlob = NativeModules.RNFetchBlob
 | 
	
	
		
			
			|  | @@ -20,20 +21,37 @@ if(RNFetchBlob === void 0) {
 | 
	
		
			
			| 20 | 21 |  // Promise wrapper function
 | 
	
		
			
			| 21 | 22 |  const fetch = (...args) => {
 | 
	
		
			
			| 22 | 23 |  
 | 
	
		
			
			|  | 24 | +  // create task ID for receiving progress event
 | 
	
		
			
			|  | 25 | +  let taskId = getUUID()
 | 
	
		
			
			| 23 | 26 |    let promise = new Promise((resolve, reject) => {
 | 
	
		
			
			| 24 | 27 |  
 | 
	
		
			
			| 25 | 28 |      let [method, url, headers, body] = [...args]
 | 
	
		
			
			| 26 | 29 |      let nativeMethodName = Array.isArray(body) ? 'fetchBlobForm' : 'fetchBlob'
 | 
	
		
			
			| 27 | 30 |  
 | 
	
		
			
			| 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 | +
 | 
	
		
			
			| 29 | 44 |        if(err)
 | 
	
		
			
			| 30 | 45 |          reject(new Error(err, ...data))
 | 
	
		
			
			| 31 | 46 |        else
 | 
	
		
			
			| 32 | 47 |          resolve(new FetchBlobResponse(...data))
 | 
	
		
			
			|  | 48 | +
 | 
	
		
			
			| 33 | 49 |      })
 | 
	
		
			
			| 34 | 50 |  
 | 
	
		
			
			| 35 | 51 |    })
 | 
	
		
			
			| 36 | 52 |  
 | 
	
		
			
			|  | 53 | +  promise.onProgress = null
 | 
	
		
			
			|  | 54 | +
 | 
	
		
			
			| 37 | 55 |    return promise
 | 
	
		
			
			| 38 | 56 |  
 | 
	
		
			
			| 39 | 57 |  }
 | 
	
	
		
			
			|  | @@ -81,6 +99,13 @@ class FetchBlobResponse {
 | 
	
		
			
			| 81 | 99 |  
 | 
	
		
			
			| 82 | 100 |  }
 | 
	
		
			
			| 83 | 101 |  
 | 
	
		
			
			|  | 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 | +
 | 
	
		
			
			| 84 | 109 |  export default {
 | 
	
		
			
			| 85 | 110 |    fetch, FetchBlobResponse, base64
 | 
	
		
			
			| 86 | 111 |  }
 |