mediawiki-skins-MinervaNeue/resources/skins.minerva.scripts/notifications.js
jdlrobson ef5003f310 Curtail use of mw.mobileFrontend in Minerva
The MobileFrontend dependency in Minerva is problematic.
Code that Minerva needs should live in core.
MobileFrontend should load code on all skins when they operate on
a mobile domain.
This eslint check reminds developers of this in a hope it encourages
more upstreaming to core when possible.
Of course disabling is also an option, but this check will at least
make us aware of when we are moving further away from the goal.

Change-Id: I62183c9aefc81053e4ad81fb746decef2dd24b44
2019-10-01 14:54:59 +00:00

111 lines
4.1 KiB
JavaScript

/*
* This code loads the necessary modules for the notifications overlay, not to be confused
* with the Toast notifications defined by common/toast.js.
*/
module.exports = function () {
var badge,
// eslint-disable-next-line no-restricted-properties
M = mw.mobileFrontend,
mainMenu = require( './menu.js' ),
router = require( 'mediawiki.router' ),
mobile = M.require( 'mobile.startup' ),
util = mobile.util,
NotificationBadge = require( './NotificationBadge.js' ),
overlayManager = mobile.OverlayManager.getSingleton(),
initialized = false;
function showNotificationOverlay() {
// eslint-disable-next-line no-jquery/no-global-selector
var $pageCenter = $( '#mw-mf-page-center' ),
overlay = mobile.notifications.overlay( badge.setCount.bind( badge ),
badge.markAsSeen.bind( badge ) );
mainMenu.openNavigationDrawer( 'secondary' );
overlay.on( 'hide', function () {
mainMenu.closeNavigationDrawers();
$pageCenter.off( '.secondary' );
} );
$pageCenter.one( 'click.secondary', function () {
router.back();
} );
return overlay;
}
// Once the DOM is loaded hijack the notifications button to display an overlay rather
// than linking to Special:Notifications.
util.docReady( function () {
badge = new NotificationBadge( {
onClick: function ( ev ) {
router.navigate( '#/notifications' );
// prevent navigation to original Special:Notifications URL
// DO NOT USE stopPropagation or you'll break click tracking in WikimediaEvents
ev.preventDefault();
},
// eslint-disable-next-line no-jquery/no-global-selector
el: $( '#user-notifications.user-button' ).parent()
} );
overlayManager.add( /^\/notifications$/, showNotificationOverlay );
/**
* Adds a filter button to the UI inside notificationsInboxWidget
* @method
* @ignore
*/
function addFilterButton() {
// Create filter button once the notifications overlay has been loaded
var filterStatusButton = new OO.ui.ButtonWidget(
{
href: '#/notifications-filter',
classes: [ 'mw-echo-ui-notificationsInboxWidget-main-toolbar-nav-filter-placeholder' ],
icon: 'funnel',
label: mw.msg( 'mobile-frontend-notifications-filter' )
} );
// eslint-disable-next-line no-jquery/no-global-selector
$( '.mw-echo-ui-notificationsInboxWidget-cell-placeholder' ).append(
$( '<div>' )
.addClass( 'mw-echo-ui-notificationsInboxWidget-main-toolbar-nav-filter' )
.addClass( 'mw-echo-ui-notificationsInboxWidget-cell' )
.append( filterStatusButton.$element )
);
}
// This code will currently only be invoked on Special:Notifications
// The code is bundled here since it makes use of loadModuleScript. This also allows
// the possibility of invoking the filter from outside the Special page in future.
// Once the 'ext.echo.special.onInitialize' hook has fired, load notification filter.
mw.hook( 'ext.echo.special.onInitialize' ).add( function () {
// The 'ext.echo.special.onInitialize' hook is fired whenever special page notification
// changes display on click of a filter.
// Hence the hook is restricted from firing more than once.
if ( initialized ) {
return;
}
// Load the notification filter overlay
mw.loader.using( 'mobile.notifications.overlay' ).then( function () {
// eslint-disable-next-line no-jquery/no-global-selector
var $crossWikiUnreadFilter = $( '.mw-echo-ui-crossWikiUnreadFilterWidget' ),
// eslint-disable-next-line no-jquery/no-global-selector
$notifReadState = $( '.mw-echo-ui-notificationsInboxWidget-main-toolbar-readState' ),
NotificationsFilterOverlay = M.require( 'mobile.notifications.overlay/NotificationsFilterOverlay' );
// setup the filter button (now we have OOjs UI)
addFilterButton();
// setup route
overlayManager.add( /^\/notifications-filter$/, function () {
mainMenu.openNavigationDrawer( 'secondary' );
return new NotificationsFilterOverlay( {
$notifReadState: $notifReadState,
mainMenu: mainMenu,
$crossWikiUnreadFilter: $crossWikiUnreadFilter
} );
} );
} );
initialized = true;
} );
} );
};