mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-12-02 19:36:48 +00:00
2dd3780966
Change-Id: I01da3714b1f5d9b1926ee4394c15f594efb01245
111 lines
3.5 KiB
JavaScript
111 lines
3.5 KiB
JavaScript
const mobile = require( 'mobile.startup' );
|
|
|
|
/**
|
|
* @module module:ext.echo.mobile
|
|
*/
|
|
|
|
/**
|
|
* @fires module:ext.echo.mobile#echo.mobile every time the notifications overlay is opened
|
|
*/
|
|
function onOpenNotificationsOverlay() {
|
|
mw.hook( 'echo.mobile' ).fire( true );
|
|
}
|
|
|
|
/**
|
|
* @fires module:ext.echo.mobile#echo.mobile every time the notifications overlay is closed
|
|
*/
|
|
function onCloseNotificationsOverlay() {
|
|
mw.hook( 'echo.mobile' ).fire( false );
|
|
}
|
|
|
|
/**
|
|
* This code loads the necessary modules for the notifications overlay, not to be confused
|
|
* with the Toast notifications defined by common/toast.js.
|
|
*/
|
|
function init() {
|
|
const notificationsFilterOverlay = require( './notificationsFilterOverlay.js' ),
|
|
notificationsOverlay = require( './overlay.js' ),
|
|
overlayManager = mobile.getOverlayManager();
|
|
|
|
function showNotificationOverlay() {
|
|
const overlay = notificationsOverlay(
|
|
( exit ) => {
|
|
onCloseNotificationsOverlay();
|
|
exit();
|
|
} );
|
|
onOpenNotificationsOverlay();
|
|
|
|
return overlay;
|
|
}
|
|
|
|
let initialized = false;
|
|
// Once the DOM is loaded add the overlay and overlay manager. Minerva will handle the
|
|
// notification button that will link to Special:Notifications.
|
|
$( () => {
|
|
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
|
|
const filterStatusButton = new OO.ui.ButtonWidget(
|
|
{
|
|
href: '#/notifications-filter',
|
|
classes: [ 'mw-echo-ui-notificationsInboxWidget-main-toolbar-nav-filter-placeholder' ],
|
|
icon: 'funnel',
|
|
label: mw.msg( 'echo-mobile-notifications-filter-title' )
|
|
} );
|
|
|
|
// 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( () => {
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
const $crossWikiUnreadFilter = $( '.mw-echo-ui-crossWikiUnreadFilterWidget' ),
|
|
// eslint-disable-next-line no-jquery/no-global-selector
|
|
$notifReadState = $( '.mw-echo-ui-notificationsInboxWidget-main-toolbar-readState' );
|
|
|
|
// 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;
|
|
}
|
|
|
|
// setup the filter button (now we have OOjs UI)
|
|
addFilterButton();
|
|
|
|
// setup route
|
|
overlayManager.add( /^\/notifications-filter$/, () => {
|
|
onOpenNotificationsOverlay();
|
|
return notificationsFilterOverlay( {
|
|
onBeforeExit: function ( exit ) {
|
|
onCloseNotificationsOverlay();
|
|
exit();
|
|
},
|
|
$notifReadState: $notifReadState,
|
|
$crossWikiUnreadFilter: $crossWikiUnreadFilter
|
|
} );
|
|
} );
|
|
initialized = true;
|
|
} );
|
|
} );
|
|
|
|
}
|
|
|
|
module.exports.init = init;
|