mediawiki-extensions-Confir.../hCaptcha/resources/ve-confirmedit-hCaptcha/ve.init.mw.HCaptchaSaveErrorHandler.js
alistair3149 b5675a9068 Use ResourceLoader callback to retrieve hCaptcha config
The old method is returning null, results in error that makes
user stuck on the save your chagnes dialog in VE.

Bug: T311449
Change-Id: I124093fff4f7e69f7ec76cc6b9994d7939bc80f1
(cherry picked from commit 2de530d092)
2022-12-13 20:52:16 +00:00

67 lines
2.3 KiB
JavaScript

mw.loader.using( 'ext.visualEditor.targetLoader' ).then( function () {
mw.libs.ve.targetLoader.addPlugin( function () {
ve.init.mw.HCaptchaSaveErrorHandler = function () {};
OO.inheritClass( ve.init.mw.HCaptchaSaveErrorHandler, ve.init.mw.SaveErrorHandler );
ve.init.mw.HCaptchaSaveErrorHandler.static.name = 'confirmEditHCaptcha';
ve.init.mw.HCaptchaSaveErrorHandler.static.getReadyPromise = function () {
var onLoadFn = 'onHcaptchaLoadCallback' + Date.now(),
deferred, scriptURL, params;
if ( !this.readyPromise ) {
deferred = $.Deferred();
scriptURL = new mw.Uri( require( './config.json' ).hCaptchaScriptURL );
params = { onload: onLoadFn, render: 'explicit' };
scriptURL.query = $.extend( scriptURL.query, params );
this.readyPromise = deferred.promise();
window[ onLoadFn ] = deferred.resolve;
mw.loader.load( scriptURL.toString() );
}
return this.readyPromise;
};
ve.init.mw.HCaptchaSaveErrorHandler.static.matchFunction = function ( data ) {
var captchaData = ve.getProp( data, 'visualeditoredit', 'edit', 'captcha' );
return !!( captchaData && captchaData.type === 'hcaptcha' );
};
ve.init.mw.HCaptchaSaveErrorHandler.static.process = function ( data, target ) {
var self = this,
siteKey = require( './config.json' ).hCaptchaSiteKey,
$container = $( '<div>' );
// Register extra fields
target.saveFields.wpCaptchaWord = function () {
// eslint-disable-next-line no-jquery/no-global-selector
return $( '[name=h-captcha-response]' ).val();
};
this.getReadyPromise()
.then( function () {
// ProcessDialog's error system isn't great for this yet.
target.saveDialog.clearMessage( 'api-save-error' );
target.saveDialog.showMessage( 'api-save-error', $container, { wrap: false } );
self.widgetId = window.hcaptcha.render( $container[ 0 ], {
sitekey: siteKey,
callback: function () {
target.saveDialog.executeAction( 'save' );
},
'expired-callback': function () {},
'error-callback': function () {}
} );
target.saveDialog.popPending();
target.saveDialog.updateSize();
target.emit( 'saveErrorCaptcha' );
} );
};
ve.init.mw.saveErrorHandlerFactory.register( ve.init.mw.HCaptchaSaveErrorHandler );
} );
} );