diff --git a/src/ParseFile.js b/src/ParseFile.js index eb69c6289..6c7030485 100644 --- a/src/ParseFile.js +++ b/src/ParseFile.js @@ -233,7 +233,17 @@ class ParseFile { * be used for this request. *
  • sessionToken: A valid session token, used for making a request on * behalf of a specific user. - *
  • progress: In Browser only, callback for upload progress + *
  • progress: In Browser only, callback for upload progress. For example: + *
    +   * let parseFile = new Parse.File(name, file);
    +   * parseFile.save({
    +   *   progress: (progressValue, loaded, total, { type }) => {
    +   *     if (type === "upload" && progressValue !== null) {
    +   *       // Update the UI using progressValue
    +   *     }
    +   *   }
    +   * });
    +   * 
    * * @return {Promise} Promise that is resolved when the save finishes. */ diff --git a/src/RESTController.js b/src/RESTController.js index d24226b15..1b3006a6d 100644 --- a/src/RESTController.js +++ b/src/RESTController.js @@ -159,27 +159,28 @@ const RESTController = { headers[key] = customHeaders[key]; } - function handleProgress(event) { + function handleProgress(type, event) { if (options && typeof options.progress === 'function') { if (event.lengthComputable) { options.progress( event.loaded / event.total, event.loaded, - event.total + event.total, + { type } ); } else { - options.progress(null); + options.progress(null, null, null, { type }); } } } xhr.onprogress = (event) => { - handleProgress(event); + handleProgress('download', event); }; if (xhr.upload) { xhr.upload.onprogress = (event) => { - handleProgress(event); + handleProgress('upload', event); } } diff --git a/src/__tests__/ParseFile-test.js b/src/__tests__/ParseFile-test.js index 4c14d50ee..5497c521c 100644 --- a/src/__tests__/ParseFile-test.js +++ b/src/__tests__/ParseFile-test.js @@ -30,7 +30,7 @@ jest.setMock('../LocalDatastore', mockLocalDatastore); function generateSaveMock(prefix) { return function(name, payload, options) { if (options && typeof options.progress === 'function') { - options.progress(0.5, 5, 10); + options.progress(0.5, 5, 10, { type: 'upload' }); } return Promise.resolve({ name: name, @@ -236,7 +236,7 @@ describe('ParseFile', () => { jest.spyOn(options, 'progress'); return file.save(options).then(function(f) { - expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10); + expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10, { type: 'upload' }); expect(f).toBe(file); expect(f.name()).toBe('progress.txt'); expect(f.url()).toBe('http://files.parsetfss.com/a/progress.txt'); diff --git a/src/__tests__/RESTController-test.js b/src/__tests__/RESTController-test.js index 7859a1289..89352ab13 100644 --- a/src/__tests__/RESTController-test.js +++ b/src/__tests__/RESTController-test.js @@ -444,8 +444,8 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10); - expect(options.progress).toHaveBeenCalledTimes(2); + expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10, { type: 'download' }); + expect(options.progress).toHaveBeenCalledWith(0.5, 5, 10, { type: 'upload' }); expect(response).toEqual({ success: true }); expect(status).toBe(200); done(); @@ -468,7 +468,7 @@ describe('RESTController', () => { jest.spyOn(options, 'progress'); RESTController.ajax('POST', 'files/upload.txt', {}, {}, options).then(({ response, status }) => { - expect(options.progress).toHaveBeenCalledWith(null); + expect(options.progress).toHaveBeenCalledWith(null, null, null, { type: 'upload' }); expect(response).toEqual({ success: true }); expect(status).toBe(200); done();