Skip to content

Commit 6ae929a

Browse files
committed
listen for announcement
Signed-off-by: Abdelsalem <[email protected]>
1 parent df890ec commit 6ae929a

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

src/components/App/app-top-bar.tsx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from 'react';
1717
import { capitalize, Tab, Tabs, useTheme } from '@mui/material';
1818
import { Groups, ManageAccounts, PeopleAlt, NotificationImportant } from '@mui/icons-material';
19-
import { fetchAppsMetadata, logout, Metadata, TopBar } from '@gridsuite/commons-ui';
19+
import { fetchAppsMetadata, logout, Metadata, TopBar, useNotificationsListener } from '@gridsuite/commons-ui';
2020
import { useParameterState } from '../parameters';
2121
import { APP_NAME, PARAM_LANGUAGE, PARAM_THEME } from '../../utils/config-params';
2222
import { NavLink, type To, useMatches, useNavigate } from 'react-router';
@@ -29,6 +29,7 @@ import AppPackage from '../../../package.json';
2929
import { AppState } from '../../redux/reducer';
3030
import { AppDispatch } from '../../redux/store';
3131
import { MainPaths } from '../../routes/utils';
32+
import { NOTIFICATIONS_URL_KEYS } from '../../utils/notifications-provider';
3233

3334
const tabs = new Map<MainPaths, ReactElement>([
3435
[
@@ -110,6 +111,33 @@ const AppTopBar: FunctionComponent = () => {
110111
const [languageLocal, handleChangeLanguage] = useParameterState(PARAM_LANGUAGE);
111112

112113
const [appsAndUrls, setAppsAndUrls] = useState<Metadata[]>([]);
114+
115+
const [announcementInfos, setAnnouncementInfos] = useState<AnnouncementProps | null>(null);
116+
117+
useNotificationsListener(NOTIFICATIONS_URL_KEYS.GLOBAL_CONFIG, {
118+
listenerCallbackMessage: (event) => {
119+
const eventData = JSON.parse(event.data);
120+
if (eventData.headers.messageType === 'announcement') {
121+
if (
122+
announcementInfos != null &&
123+
announcementInfos.announcementId === eventData.headers.announcementId
124+
) {
125+
// If we receive a notification for an announcement that we already received we ignore it
126+
return;
127+
}
128+
const announcement = {
129+
announcementId: eventData.headers.announcementId,
130+
message: eventData.payload,
131+
severity: eventData.headers.severity,
132+
duration: eventData.headers.duration,
133+
} as AnnouncementProps;
134+
setAnnouncementInfos(announcement);
135+
} else if (eventData.headers.messageType === 'cancelAnnouncement') {
136+
setAnnouncementInfos(null);
137+
}
138+
},
139+
});
140+
113141
useEffect(() => {
114142
if (user !== null) {
115143
fetchAppsMetadata().then((res) => {
@@ -136,6 +164,7 @@ const AppTopBar: FunctionComponent = () => {
136164
onLanguageClick={handleChangeLanguage}
137165
language={languageLocal}
138166
developerMode={false} // TODO: set as optional in commons-ui
167+
announcementInfos={announcementInfos}
139168
>
140169
<Tabs
141170
component="nav"

src/utils/notifications-provider.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { APP_NAME } from './config-params';
1313

1414
export enum NOTIFICATIONS_URL_KEYS {
1515
CONFIG = 'CONFIG',
16+
GLOBAL_CONFIG = 'GLOBAL_CONFIG',
1617
}
1718

1819
export const PREFIX_CONFIG_NOTIFICATION_WS = '/config-notification';
@@ -34,6 +35,9 @@ export function useNotificationsUrlGenerator() {
3435
})}`
3536
)
3637
: undefined,
38+
[NOTIFICATIONS_URL_KEYS.GLOBAL_CONFIG]: tokenId
39+
? getUrlWithToken(`${wsBase}${PREFIX_CONFIG_NOTIFICATION_WS}/global`)
40+
: undefined,
3741
}) satisfies Record<NOTIFICATIONS_URL_KEYS, string | undefined>,
3842
[wsBase, tokenId]
3943
);

0 commit comments

Comments
 (0)