summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/UploadWizard/resources/handlers/mw.ApiUploadFormDataHandler.js
blob: 1d60a6d871b04b24bbdf45793816a5a06ef4fc7d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
( function ( mw, OO ) {
	/**
	 * Represents an object which configures an html5 FormData object to upload.
	 * Large files are uploaded in chunks.
	 *
	 * @param {mw.UploadWizardUpload} upload
	 * @param {mw.Api} api
	 */
	mw.ApiUploadFormDataHandler = function ( upload, api ) {
		mw.ApiUploadHandler.call( this, upload, api );

		this.formData = {
			action: 'upload',
			stash: 1,
			format: 'json'
		};

		this.transport = new mw.FormDataTransport(
			this.api,
			this.formData
		).on( 'update-stage', function ( stage ) {
			upload.ui.setStatus( 'mwe-upwiz-' + stage );
		} );
	};

	OO.inheritClass( mw.ApiUploadFormDataHandler, mw.ApiUploadHandler );

	mw.ApiUploadFormDataHandler.prototype.abort = function () {
		this.transport.abort();
	};

	/**
	 * @return {jQuery.Promise}
	 */
	mw.ApiUploadFormDataHandler.prototype.submit = function () {
		var handler = this;

		return this.configureEditToken().then( function () {
			handler.beginTime = ( new Date() ).getTime();
			handler.upload.ui.setStatus( 'mwe-upwiz-transport-started' );
			handler.upload.ui.showTransportProgress();

			return handler.transport.upload( handler.upload.file, handler.upload.title.getMainText() )
				.progress( function ( fraction ) {
					if ( handler.upload.state === 'aborted' ) {
						handler.abort();
						return;
					}

					if ( fraction !== null ) {
						handler.upload.setTransportProgress( fraction );
					}
				} );
		} );
	};

	/**
	 * Obtain a fresh edit token.
	 * If successful, store token and call a callback.
	 *
	 * @return {jQuery.Promise}
	 */
	mw.ApiUploadFormDataHandler.prototype.configureEditToken = function () {
		var handler = this;

		return this.api.getEditToken().then( function ( token ) {
			handler.formData.token = token;
		} );
	};
}( mediaWiki, OO ) );