feat(notifications): provide a way to turn off sticky notifications (#4010)

This commit is contained in:
virtuacoplenny 2019-03-21 14:06:33 -07:00 committed by GitHub
parent 043d4db314
commit ac02a17943
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 8 deletions

View File

@ -193,7 +193,14 @@ var interfaceConfig = {
/** /**
* Specify the Android app package name. * Specify the Android app package name.
*/ */
// ANDROID_APP_PACKAGE: 'org.jitsi.meet' // ANDROID_APP_PACKAGE: 'org.jitsi.meet',
/**
* Override the behavior of some notifications to remain displayed until
* explicitly dismissed through a user action. The value is how long, in
* milliseconds, those notifications should remain displayed.
*/
// ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT: 15000,
}; };
/* eslint-enable no-unused-vars, no-var, max-len */ /* eslint-enable no-unused-vars, no-var, max-len */

View File

@ -13,12 +13,20 @@ export type Props = {
*/ */
_notifications: Array<Object>, _notifications: Array<Object>,
/**
* The length, in milliseconds, to use as a default timeout for all
* dismissable timeouts that do not have a timeout specified.
*/
autoDismissTimeout: number,
/** /**
* Invoked to update the redux store in order to remove notifications. * Invoked to update the redux store in order to remove notifications.
*/ */
dispatch: Function dispatch: Function
}; };
declare var interfaceConfig: Object;
/** /**
* Abstract class for {@code NotificationsContainer} component. * Abstract class for {@code NotificationsContainer} component.
*/ */
@ -78,7 +86,7 @@ export default class AbstractNotificationsContainer<P: Props>
* @private * @private
*/ */
_manageDismissTimeout(prevProps: ?P) { _manageDismissTimeout(prevProps: ?P) {
const { _notifications } = this.props; const { _notifications, autoDismissTimeout } = this.props;
if (_notifications.length) { if (_notifications.length) {
const notification = _notifications[0]; const notification = _notifications[0];
@ -90,14 +98,18 @@ export default class AbstractNotificationsContainer<P: Props>
if (notification !== previousNotification) { if (notification !== previousNotification) {
this._clearNotificationDismissTimeout(); this._clearNotificationDismissTimeout();
if (notification) { if (notification
const { timeout, uid } = notification; && (notification.timeout
|| typeof autoDismissTimeout === 'number')
&& notification.props.isDismissAllowed !== false) {
const {
timeout = autoDismissTimeout,
uid
} = notification;
this._notificationDismissTimeout = setTimeout(() => { this._notificationDismissTimeout = setTimeout(() => {
// Perform a no-op if a timeout is not specified. // Perform a no-op if a timeout is not specified.
if (Number.isInteger(timeout)) { this._onDismissed(uid);
this._onDismissed(uid);
}
}, timeout); }, timeout);
} }
} }
@ -168,6 +180,9 @@ export function _abstractMapStateToProps(state: Object) {
const _visible = areThereNotifications(state); const _visible = areThereNotifications(state);
return { return {
_notifications: _visible ? notifications : [] _notifications: _visible ? notifications : [],
autoDismissTimeout: typeof interfaceConfig === 'undefined'
? undefined // Ignore for the case of mobile
: interfaceConfig.ENFORCE_NOTIFICATION_AUTO_DISMISS_TIMEOUT
}; };
} }