From 09862cba7c6f127054912c04a7523323e623e468 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Tue, 22 Feb 2022 12:41:32 +0100 Subject: [PATCH] MOBILE-3990 notifications: Support notification links --- .../notifications/notifications.module.ts | 5 ++ .../services/handlers/notifications-link.ts | 49 ++++++++++++++ .../services/handlers/preferences-link.ts | 64 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 src/addons/notifications/services/handlers/notifications-link.ts create mode 100644 src/addons/notifications/services/handlers/preferences-link.ts diff --git a/src/addons/notifications/notifications.module.ts b/src/addons/notifications/notifications.module.ts index 7a4cac5df..d62457eea 100644 --- a/src/addons/notifications/notifications.module.ts +++ b/src/addons/notifications/notifications.module.ts @@ -28,6 +28,9 @@ import { AddonNotificationsSettingsHandler, AddonNotificationsSettingsHandlerSer import { CoreSitePreferencesRoutingModule } from '@features/settings/pages/site/site-routing'; import { AddonNotificationsProvider } from './services/notifications'; import { AddonNotificationsHelperProvider } from './services/notifications-helper'; +import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; +import { AddonNotificationsPreferencesLinkHandler } from './services/handlers/preferences-link'; +import { AddonNotificationsLinkHandler } from './services/handlers/notifications-link'; export const ADDON_NOTIFICATIONS_SERVICES: Type[] = [ AddonNotificationsProvider, @@ -63,6 +66,8 @@ const preferencesRoutes: Routes = [ CoreCronDelegate.register(AddonNotificationsCronHandler.instance); CorePushNotificationsDelegate.registerClickHandler(AddonNotificationsPushClickHandler.instance); CoreSettingsDelegate.registerHandler(AddonNotificationsSettingsHandler.instance); + CoreContentLinksDelegate.registerHandler(AddonNotificationsLinkHandler.instance); + CoreContentLinksDelegate.registerHandler(AddonNotificationsPreferencesLinkHandler.instance); AddonNotificationsMainMenuHandler.initialize(); }, diff --git a/src/addons/notifications/services/handlers/notifications-link.ts b/src/addons/notifications/services/handlers/notifications-link.ts new file mode 100644 index 000000000..9d560d165 --- /dev/null +++ b/src/addons/notifications/services/handlers/notifications-link.ts @@ -0,0 +1,49 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; + +import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; +import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreNavigator } from '@services/navigator'; +import { makeSingleton } from '@singletons'; +import { AddonNotificationsMainMenuHandlerService } from './mainmenu'; + +/** + * Handler to treat links to notifications. + */ +@Injectable({ providedIn: 'root' }) +export class AddonNotificationsLinkHandlerService extends CoreContentLinksHandlerBase { + + name = 'AddonNotificationsLinkHandler'; + pattern = /\/message\/output\/popup\/notifications\.php/; + featureName = 'CoreMainMenuDelegate_AddonNotifications'; + + /** + * @inheritdoc + */ + getActions(): CoreContentLinksAction[] { + return [{ + action: (siteId: string): void => { + CoreNavigator.navigateToSitePath(AddonNotificationsMainMenuHandlerService.PAGE_NAME, { + preferCurrentTab: false, + siteId, + }); + }, + }]; + } + +} + +export const AddonNotificationsLinkHandler = makeSingleton(AddonNotificationsLinkHandlerService); diff --git a/src/addons/notifications/services/handlers/preferences-link.ts b/src/addons/notifications/services/handlers/preferences-link.ts new file mode 100644 index 000000000..a2ab6da07 --- /dev/null +++ b/src/addons/notifications/services/handlers/preferences-link.ts @@ -0,0 +1,64 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; + +import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; +import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreNavigator } from '@services/navigator'; +import { CoreSites } from '@services/sites'; +import { makeSingleton } from '@singletons'; +import { AddonNotificationsSettingsHandlerService } from './settings'; + +/** + * Handler to treat links to notification preferences. + */ +@Injectable({ providedIn: 'root' }) +export class AddonNotificationsPreferencesLinkHandlerService extends CoreContentLinksHandlerBase { + + name = 'AddonNotificationsPreferencesLinkHandler'; + pattern = /\/message\/notificationpreferences\.php/; + checkAllUsers = true; + featureName = 'CoreMainMenuDelegate_AddonNotifications'; + + /** + * @inheritdoc + */ + getActions(): CoreContentLinksAction[] { + return [{ + action: (siteId: string): void => { + CoreNavigator.navigateToSitePath(`preferences/${AddonNotificationsSettingsHandlerService.PAGE_NAME}`, { siteId }); + }, + }]; + } + + /** + * @inheritdoc + */ + async isEnabled(siteId: string, url: string, params: Record): Promise { + if (params.userid) { + // Check it's current user ID. + const site = await CoreSites.getSite(siteId); + + if (Number(params.userid) !== site.getUserId()) { + return false; + } + } + + return true; + } + +} + +export const AddonNotificationsPreferencesLinkHandler = makeSingleton(AddonNotificationsPreferencesLinkHandlerService);