mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-11-25 00:05:29 +00:00
56c82f3f9d
This is to wrap the mobile notifications in MobileFrontend with a pendingElement and organize the API calls specifically for the mixed popup in mobile. Also added a specific 'ext.echo.ui.mobile' module so we don't load unnecessary files for mobile. Bug: T124188 Change-Id: I4a8be19a79b9e38c21907bb9d4123540a648c535
145 lines
4.7 KiB
JavaScript
145 lines
4.7 KiB
JavaScript
( function ( mw, $ ) {
|
|
/*global moment:false */
|
|
'use strict';
|
|
|
|
mw.echo = mw.echo || {};
|
|
|
|
// Activate ooui
|
|
$( document ).ready( function () {
|
|
var myWidget, echoApi,
|
|
$existingAlertLink = $( '#pt-notifications-alert a' ),
|
|
$existingMessageLink = $( '#pt-notifications-message a' ),
|
|
numAlerts = $existingAlertLink.text(),
|
|
numMessages = $existingMessageLink.text(),
|
|
hasUnseenAlerts = $existingAlertLink.hasClass( 'mw-echo-unseen-notifications' ),
|
|
hasUnseenMessages = $existingMessageLink.hasClass( 'mw-echo-unseen-notifications' ),
|
|
// Store links
|
|
links = {
|
|
notifications: $( '#pt-notifications-alert a' ).attr( 'href' ),
|
|
preferences: $( '#pt-preferences a' ).attr( 'href' ) + '#mw-prefsection-echo'
|
|
};
|
|
|
|
// Respond to click on the notification button and load the UI on demand
|
|
$( '.mw-echo-notification-badge-nojs' ).click( function ( e ) {
|
|
var myType = $( this ).parent().prop( 'id' ) === 'pt-notifications-alert' ? 'alert' : 'message',
|
|
time = mw.now();
|
|
|
|
if ( e.which !== 1 ) {
|
|
return;
|
|
}
|
|
|
|
// Dim the button while we load
|
|
$( this ).addClass( 'mw-echo-notifications-badge-dimmed' );
|
|
|
|
// Fire the notification API requests
|
|
echoApi = new mw.echo.api.EchoApi();
|
|
echoApi.fetchNotifications( myType )
|
|
.then( function ( data ) {
|
|
mw.track( 'timing.MediaWiki.echo.overlay.api', mw.now() - time );
|
|
return data;
|
|
} );
|
|
|
|
// Load the ui
|
|
mw.loader.using( 'ext.echo.ui.desktop', function () {
|
|
var messageNotificationsModel, alertNotificationsModel,
|
|
momentOrigLocale = moment.locale();
|
|
|
|
// Set up new 'short relative time' locale strings for momentjs
|
|
moment.defineLocale( 'echo-shortRelativeTime', {
|
|
relativeTime: function ( number, withoutSuffix, key ) {
|
|
var keymap = {
|
|
s: 'seconds',
|
|
m: 'minutes',
|
|
mm: 'minutes',
|
|
h: 'hours',
|
|
hh: 'hours',
|
|
d: 'days',
|
|
dd: 'days',
|
|
M: 'months',
|
|
MM: 'months',
|
|
y: 'years',
|
|
yy: 'years'
|
|
};
|
|
return mw.msg( 'notification-timestamp-ago-' + keymap[ key ], number );
|
|
} } );
|
|
// Reset back to original locale
|
|
moment.locale( momentOrigLocale );
|
|
|
|
// Overlay
|
|
$( 'body' ).append( mw.echo.ui.$overlay );
|
|
|
|
// Load message button and popup if messages exist
|
|
if ( $existingMessageLink.length ) {
|
|
messageNotificationsModel = new mw.echo.dm.NotificationsModel(
|
|
echoApi,
|
|
{
|
|
type: 'message'
|
|
}
|
|
);
|
|
mw.echo.ui.messageWidget = new mw.echo.ui.NotificationBadgeWidget( messageNotificationsModel, {
|
|
markReadWhenSeen: false,
|
|
$overlay: mw.echo.ui.$overlay,
|
|
numItems: numMessages,
|
|
hasUnseen: hasUnseenMessages,
|
|
badgeIcon: 'speechBubbles',
|
|
links: links,
|
|
href: $existingMessageLink.attr( 'href' )
|
|
} );
|
|
// HACK: avoid late debouncedUpdateThemeClasses
|
|
mw.echo.ui.messageWidget.badgeButton.debouncedUpdateThemeClasses();
|
|
// Replace the link button with the ooui button
|
|
$existingMessageLink.parent().replaceWith( mw.echo.ui.messageWidget.$element );
|
|
|
|
mw.echo.ui.messageWidget.getModel().on( 'allTalkRead', function () {
|
|
// If there was a talk page notification, get rid of it
|
|
$( '#pt-mytalk a' )
|
|
.removeClass( 'mw-echo-alert' )
|
|
.text( mw.msg( 'mytalk' ) );
|
|
} );
|
|
}
|
|
// Load alerts popup and button
|
|
alertNotificationsModel = new mw.echo.dm.NotificationsModel(
|
|
echoApi,
|
|
{
|
|
type: 'alert'
|
|
}
|
|
);
|
|
mw.echo.ui.alertWidget = new mw.echo.ui.NotificationBadgeWidget( alertNotificationsModel, {
|
|
markReadWhenSeen: true,
|
|
numItems: numAlerts,
|
|
hasUnseen: hasUnseenAlerts,
|
|
badgeIcon: {
|
|
seen: 'bell',
|
|
unseen: 'bellOn'
|
|
},
|
|
links: links,
|
|
$overlay: mw.echo.ui.$overlay,
|
|
href: $existingAlertLink.attr( 'href' )
|
|
} );
|
|
// HACK: avoid late debouncedUpdateThemeClasses
|
|
mw.echo.ui.alertWidget.badgeButton.debouncedUpdateThemeClasses();
|
|
// Replace the link button with the ooui button
|
|
$existingAlertLink.parent().replaceWith( mw.echo.ui.alertWidget.$element );
|
|
|
|
// HACK: Now that the module loaded, show the popup
|
|
myWidget = myType === 'alert' ? mw.echo.ui.alertWidget : mw.echo.ui.messageWidget;
|
|
myWidget.once( 'finishLoading', function () {
|
|
// Log timing after notifications are shown
|
|
mw.track( 'timing.MediaWiki.echo.overlay', mw.now() - time );
|
|
} );
|
|
myWidget.popup.toggle( true );
|
|
mw.track( 'timing.MediaWiki.echo.overlay.ooui', mw.now() - time );
|
|
} );
|
|
|
|
if ( hasUnseenAlerts || hasUnseenMessages ) {
|
|
// Clicked on the flyout due to having unread notifications
|
|
mw.track( 'counter.MediaWiki.echo.unseen.click' );
|
|
}
|
|
|
|
// Prevent default
|
|
return false;
|
|
} );
|
|
} );
|
|
|
|
} )( mediaWiki, jQuery );
|