MediaWiki:Gadget-GlobalRenameQueueCheckNotes.js

/**
 * Author : [[:en:User:DreamRimer]]
 * Based on [[MediaWiki:Gadget-GlobalRenameQueueCheckAntiSpoof.js]]
 */ 
( function ( mw, $ ) {
	'use strict';

	const specialPage = mw.config.get( 'wgCanonicalSpecialPageName' );
	if ( specialPage !== 'GlobalRenameQueue' ) {
		return;
	}

	if ( !$( '#mw-renamequeue-approve, #mw-renamequeue-approve-vanish' ).length ) {
		return;
	}

	const pathMatch = window.location.pathname.match( /\/request\/(\d+)$/ );
	if ( !pathMatch ) {
		return;
	}
	const requestId = pathMatch[ 1 ];
	const notesPage = 'Meta:GlobalRenameQueue/Notes/' + requestId;

	const waitForAntiSpoofResult = () => {
		const deferred = $.Deferred();
		let attempts = 0;

		const timer = setInterval( () => {
			attempts++;

			if ( $( '#EXT_rxy_antispoof_conflict' ).length ) {
				clearInterval( timer );
				deferred.resolve( true );
				return;
			}

			if ( $( '#EXT_rxy_antispoof_enableApproveButton' ).length ) {
				clearInterval( timer );
				deferred.resolve( false );
				return;
			}

			if ( attempts >= 20 ) {
				clearInterval( timer );
				deferred.resolve( false );
			}
		}, 100 );

		return deferred.promise();
	};

	mw.loader.using(
		[ 'mediawiki.util', 'mediawiki.api', 'oojs-ui-core', 'oojs-ui-widgets', 'oojs-ui-windows' ],
		function () {
			const $approveButton = $( 'button[name="approve"]' )[ 0 ];
			const $approveWidget = $( '#mw-renamequeue-approve, #mw-renamequeue-approve-vanish' );

			$approveButton.disabled = true;
			$approveWidget
				.addClass( 'oo-ui-widget-disabled' )
				.removeClass( 'oo-ui-widget-enabled' );

			const api = new mw.Api();

			$.when(
				api.get( {
					action: 'query',
					titles: notesPage,
					prop: 'info',
					formatversion: 2
				} ),
				waitForAntiSpoofResult()
			).done( function ( apiData, antiSpoofConflict ) {
				const data = apiData[ 0 ];
				const page = data.query && data.query.pages && data.query.pages[ 0 ];
				const notesExist = page && !page.missing;

				if ( notesExist ) {
					$( '#GlobalRenameQueueNotes' ).css( { 'background-color': 'yellow', 'color': '#333' } );
					mw.util.addCSS(
						'@media screen {' +
							'html.skin-theme-clientpref-night #GlobalRenameQueueNotes { background-color: #7a6d00; color: #fff; }' +
						'}' +
						'@media screen and (prefers-color-scheme: dark) {' +
							'html.skin-theme-clientpref-os #GlobalRenameQueueNotes { background-color: #7a6d00; color: #fff; }' +
						'}'
					);

					if ( antiSpoofConflict ) {
						return;
					}

					$approveButton.disabled = true;
					$approveWidget
						.addClass( 'oo-ui-widget-disabled' )
						.removeClass( 'oo-ui-widget-enabled' );
					$approveWidget.off( 'click' );

					$.when(
						mw.loader.using( [ 'mediawiki.util', 'mediawiki.api', 'mediawiki.jqueryMsg' ] ),
						$.ready
					).then( function () {
						return new mw.Api().loadMessagesIfMissing( [
							'Gadget-GlobalRenameQueueCheckNotes-enableApproveButton',
							'Gadget-GlobalRenameQueueCheckNotes-confirm'
						] );
					} ).then( function () {

						const enableButton = new OO.ui.ButtonWidget( {
							id: 'EXT_notes_enableApproveButton',
							label: mw.message( 'Gadget-GlobalRenameQueueCheckNotes-enableApproveButton' ).exists()
								? mw.message( 'Gadget-GlobalRenameQueueCheckNotes-enableApproveButton' ).escaped()
								: 'Enable Approve Button',
							flags: [ 'primary', 'progressive' ]
						} );

						const notesPageURL = mw.util.getUrl( notesPage );
						const $notesLink = $(
							'<a>',
							{
								id: 'EXT_notes_detailLink',
								href: notesPageURL,
								text: '(' + notesPage + ')',
								target: '_blank',
								style: 'margin-right: 0.5em;'
							}
						);

						$( '#mw-globalrenamequeue-request' ).prepend(
							$(
								'<div>',
								{
									id: 'EXT_notes_warning',
									class: 'mw-message-box mw-message-box-warning'
								}
							).append(
								$( '<strong>' ).text( '[Notes] ' ),
								document.createTextNode(
									'This request has notes. Please review them before approving. '
								),
								enableButton.$element
							)
						);

						$( 'body' ).on( 'click', '#EXT_notes_enableApproveButton', function () {
							const confirmMsg = mw.message( 'Gadget-GlobalRenameQueueCheckNotes-confirm' ).exists()
								? mw.message( 'Gadget-GlobalRenameQueueCheckNotes-confirm' ).escaped()
								: 'This request contains notes. Are you sure you have reviewed them and wish to approve it?';

							OO.ui.confirm(
								confirmMsg,
								{ size: 'large' }
							).done( function ( yes ) {
								const leaveByDialogCancel = typeof Gadget_GlobalRenameQueueCheckNotes_leaveByDialogCancel !== 'undefined'
									? Gadget_GlobalRenameQueueCheckNotes_leaveByDialogCancel
									: false;

								if ( yes ) {
									enableApproveButton( $approveButton );
									$( '#EXT_notes_enableApproveButton' ).remove();
								} else if ( leaveByDialogCancel ) {
									window.location = '/wiki/Special:GlobalRenameQueue/open';
								}
							} );
						} );

					} );

				} else {
					if ( !antiSpoofConflict ) {
						enableApproveButton( $approveButton );
					}
				}

			} ).fail( function () {
				if ( !$( '#EXT_rxy_antispoof_conflict' ).length ) {
					enableApproveButton( $approveButton );
				}
			} );

			function enableApproveButton( approveButton ) {
				approveButton.disabled = false;
				$approveWidget
					.addClass( 'oo-ui-widget-enabled' )
					.removeClass( 'oo-ui-widget-disabled' );
			}
		}
	);

}( mediaWiki, jQuery ) );