Skip to content

Commit c93e8d7

Browse files
committed
chore: update NotificationUserConfigTab
1 parent 751daff commit c93e8d7

17 files changed

+825
-835
lines changed

scripts/open-api-type-generator.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { generateApi } from 'swagger-typescript-api'
22
import path from 'path'
33

44
const openApiSpecificationFileUrl =
5-
'https://raw.githubusercontent.com/pagopa/interop-be-monorepo/refs/heads/update-bff-api/packages/api-clients/open-api/bffApi.yml'
5+
'https://raw.githubusercontent.com/pagopa/interop-be-monorepo/refs/heads/develop/packages/api-clients/open-api/bffApi.yml'
66

77
const apiFolderPath = path.resolve('./src/api/')
88

src/api/api.generatedTypes.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2730,6 +2730,10 @@ export interface GetNotificationsParams {
27302730
limit: number
27312731
}
27322732

2733+
export interface DeleteNotificationsPayload {
2734+
ids: string[]
2735+
}
2736+
27332737
export interface MarkNotificationsAsReadPayload {
27342738
ids: string[]
27352739
}
@@ -7312,6 +7316,21 @@ export namespace InAppNotifications {
73127316
export type RequestHeaders = {}
73137317
export type ResponseBody = void
73147318
}
7319+
/**
7320+
* @description Delete bulk notifications
7321+
* @tags inAppNotifications
7322+
* @name DeleteNotifications
7323+
* @summary Delete bulk notifications
7324+
* @request DELETE:/inAppNotifications
7325+
* @secure
7326+
*/
7327+
export namespace DeleteNotifications {
7328+
export type RequestParams = {}
7329+
export type RequestQuery = {}
7330+
export type RequestBody = DeleteNotificationsPayload
7331+
export type RequestHeaders = {}
7332+
export type ResponseBody = void
7333+
}
73157334
/**
73167335
* @description Mark a list of notifications as read
73177336
* @tags inAppNotifications
@@ -7345,6 +7364,39 @@ export namespace InAppNotifications {
73457364
export type RequestHeaders = {}
73467365
export type ResponseBody = void
73477366
}
7367+
/**
7368+
* @description Mark a notification as unread
7369+
* @tags inAppNotifications
7370+
* @name MarkNotificationAsUnread
7371+
* @summary Mark a notification as unread
7372+
* @request POST:/inAppNotifications/:notificationId/markAsUnread
7373+
* @secure
7374+
*/
7375+
export namespace MarkNotificationAsUnread {
7376+
export type RequestParams = {
7377+
/** @format uuid */
7378+
notificationId: string
7379+
}
7380+
export type RequestQuery = {}
7381+
export type RequestBody = never
7382+
export type RequestHeaders = {}
7383+
export type ResponseBody = void
7384+
}
7385+
/**
7386+
* @description Mark a list of notifications as unread
7387+
* @tags inAppNotifications
7388+
* @name MarkNotificationsAsUnread
7389+
* @summary Mark a list of notifications as unread
7390+
* @request POST:/inAppNotifications/bulk/markAsUnread
7391+
* @secure
7392+
*/
7393+
export namespace MarkNotificationsAsUnread {
7394+
export type RequestParams = {}
7395+
export type RequestQuery = {}
7396+
export type RequestBody = never
7397+
export type RequestHeaders = {}
7398+
export type ResponseBody = void
7399+
}
73487400
/**
73497401
* @description Delete a notification
73507402
* @tags inAppNotifications

src/api/notification/notification.mutations.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { useMutation } from '@tanstack/react-query'
22
import { NotificationServices } from './index'
33
function useUpdateNotificationUserConfigs() {
44
return useMutation({
5-
mutationFn: NotificationServices.updateUserNotificationConfiguration,
5+
mutationFn: NotificationServices.updateUserNotificationConfigs,
66
})
77
}
88

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { queryOptions } from '@tanstack/react-query'
22
import { NotificationServices } from './notification.services'
33

4-
function getUserNotificationConfiguration() {
4+
function getUserNotificationConfigs() {
55
return queryOptions({
66
queryKey: ['getUserNotificationConfiguration'],
7-
queryFn: () => NotificationServices.getUserNotificationConfiguration(),
7+
queryFn: () => NotificationServices.getUserNotificationConfigs(),
88
})
99
}
1010

1111
export const NotificationQueries = {
12-
getUserNotificationConfiguration,
12+
getUserNotificationConfigs,
1313
}

src/api/notification/notification.services.ts

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,35 @@ import type {
55
UserNotificationConfig,
66
UserNotificationConfigUpdateSeed,
77
} from '../api.generatedTypes'
8-
import * as crypto from 'crypto'
98

10-
async function updateUserNotificationConfiguration(payload: UserNotificationConfigUpdateSeed) {
9+
async function updateUserNotificationConfigs(payload: UserNotificationConfigUpdateSeed) {
1110
return await axiosInstance.post<void>(
12-
`${BACKEND_FOR_FRONTEND_URL}/notification-config/userNotificationConfigs`,
11+
`${BACKEND_FOR_FRONTEND_URL}/userNotificationConfigs`,
1312
payload
1413
)
1514
}
1615

17-
async function getUserNotificationConfiguration() {
18-
// const response = await axiosInstance.get<UserNotificationConfig>(
19-
// `${BACKEND_FOR_FRONTEND_URL}/notification-config/userNotificationConfigs`
20-
// )
21-
// return response.data
16+
async function getUserNotificationConfigs() {
17+
const response = await axiosInstance.get<UserNotificationConfig>(
18+
`${BACKEND_FOR_FRONTEND_URL}/userNotificationConfigs`
19+
)
20+
return response.data
2221

23-
return new Promise<UserNotificationConfig>((resolve) => {
24-
setTimeout(() => {
25-
resolve({
26-
emailConfig: getNotificationConfig(crypto.randomBytes(1)[0] < 128),
27-
inAppConfig: getNotificationConfig(false),
28-
})
29-
}, 5000)
30-
})
22+
// return new Promise<UserNotificationConfig>((resolve) => {
23+
// setTimeout(() => {
24+
// resolve({
25+
// emailConfig: getNotificationConfig(crypto.randomBytes(1)[0] < 128),
26+
// inAppConfig: getNotificationConfig(false),
27+
// })
28+
// }, 5000)
29+
// })
3130
}
3231

3332
export const NotificationServices = {
34-
updateUserNotificationConfiguration,
35-
getUserNotificationConfiguration,
33+
updateUserNotificationConfigs,
34+
getUserNotificationConfigs,
3635
}
3736

38-
//TODO: To delete:
39-
4037
function getNotificationConfig(randomValue: boolean): NotificationConfig {
4138
return {
4239
agreementSuspendedUnsuspendedToProducer: randomValue, // 04

src/components/sidebar/useGetSidebarItems.tsx

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,9 @@ import React from 'react'
77
import type { RouteKey } from '@/router'
88
import { routes } from '@/router'
99
import DnsIcon from '@mui/icons-material/Dns'
10-
import {
11-
ConsumerIcon,
12-
ProviderIcon,
13-
CatalogIcon,
14-
DeveloperToolIcon,
15-
MyTenantIcon,
16-
MessageIcon,
17-
} from '@/icons'
10+
import { ConsumerIcon, ProviderIcon, CatalogIcon, DeveloperToolIcon, MyTenantIcon } from '@/icons'
11+
import NotificationsIcon from '@mui/icons-material/Notifications'
1812
import { useTranslation } from 'react-i18next'
19-
import { Message } from '@mui/icons-material'
2013

2114
export function useGetSidebarItems(): SidebarRoutes {
2215
const { t } = useTranslation('sidebar', { keyPrefix: 'menuItem' })
@@ -31,6 +24,12 @@ export function useGetSidebarItems(): SidebarRoutes {
3124
icon: CatalogIcon,
3225
label: t('eserviceCatalog'),
3326
children: [],
27+
},
28+
{
29+
icon: NotificationsIcon,
30+
rootRouteKey: 'NOTIFICATIONS',
31+
label: 'Notifiche ',
32+
children: [],
3433
divider: true,
3534
},
3635
{
@@ -95,12 +94,6 @@ export function useGetSidebarItems(): SidebarRoutes {
9594
label: 'Tool per lo sviluppo',
9695
children: [],
9796
},
98-
{
99-
icon: MessageIcon,
100-
rootRouteKey: 'NOTIFICATIONS',
101-
label: 'Notifiche ',
102-
children: [],
103-
},
10497
]
10598

10699
const userHasRouteRoles = (routeKey: RouteKey) => {

src/pages/NotificationUserConfigPage/NotificationUserConfig.page.tsx

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@ import { PageContainer, SectionContainerSkeleton } from '@/components/layout/con
33
import { useActiveTab } from '@/hooks/useActiveTab'
44
import { TabContext, TabList, TabPanel } from '@mui/lab'
55
import { Tab } from '@mui/material'
6-
import { EmailNotificationUserConfigTab } from './components/EmailNotificationUserConfigTab'
7-
import { InAppNotificationUserConfigTab } from './components/InAppNotificationUserConfigTab'
6+
import { NotificationConfigUserTab } from './components/NotificationUserConfigTab'
87
import { useTranslation } from 'react-i18next'
9-
import { NotificationQueries } from '@/api/notification'
10-
import { useSuspenseQuery } from '@tanstack/react-query'
8+
import { NotificationMutations, NotificationQueries } from '@/api/notification'
9+
import { useQuery } from '@tanstack/react-query'
10+
import { match } from 'ts-pattern'
11+
import {
12+
type NotificationConfig,
13+
type UserNotificationConfigUpdateSeed,
14+
} from '@/api/api.generatedTypes'
15+
import type { NotificationConfigType } from './types'
1116

1217
const NotificationUserConfigPage: React.FC = () => {
1318
const { activeTab, updateActiveTab } = useActiveTab('inApp')
19+
1420
const { t } = useTranslation('notification', { keyPrefix: 'configurationPage' })
1521

1622
return (
@@ -35,9 +41,43 @@ const NotificationUserConfigTabs: React.FC<{
3541
}> = ({ activeTab, updateActiveTab }) => {
3642
const { t } = useTranslation('notification', { keyPrefix: 'configurationPage' })
3743

38-
const { data } = useSuspenseQuery({
39-
...NotificationQueries.getUserNotificationConfiguration(),
44+
const { data } = useQuery({
45+
...NotificationQueries.getUserNotificationConfigs(),
4046
})
47+
48+
const { mutate: updateUserNotificationConfigs } =
49+
NotificationMutations.useUpdateNotificationUserConfigs()
50+
51+
const handleUpdate = (notificationConfig: NotificationConfig, type: NotificationConfigType) => {
52+
const unnecessaryKeys = ['enableAllNotification']
53+
const removeUnnecessaryKeys = (config: NotificationConfig) => {
54+
return Object.fromEntries(
55+
Object.entries(config).filter(([key]) => !unnecessaryKeys.includes(key))
56+
) as NotificationConfig
57+
}
58+
59+
const notificationConfigSeed = match(type)
60+
.with(
61+
'inApp',
62+
() =>
63+
({
64+
inAppConfig: removeUnnecessaryKeys(notificationConfig),
65+
emailConfig: data?.emailConfig as NotificationConfig,
66+
}) as UserNotificationConfigUpdateSeed
67+
)
68+
.with(
69+
'email',
70+
() =>
71+
({
72+
inAppConfig: data?.inAppConfig as NotificationConfig,
73+
emailConfig: removeUnnecessaryKeys(notificationConfig),
74+
}) as UserNotificationConfigUpdateSeed
75+
)
76+
.exhaustive()
77+
78+
updateUserNotificationConfigs(notificationConfigSeed)
79+
}
80+
4181
return (
4282
<TabContext value={activeTab}>
4383
<TabList sx={{ mt: 3 }} onChange={updateActiveTab} variant="fullWidth">
@@ -46,10 +86,22 @@ const NotificationUserConfigTabs: React.FC<{
4686
</TabList>
4787

4888
<TabPanel value="inApp">
49-
{data?.inAppConfig && <InAppNotificationUserConfigTab inAppConfig={data.inAppConfig} />}
89+
{data?.inAppConfig && (
90+
<NotificationConfigUserTab
91+
type="inApp"
92+
notificationConfig={data.inAppConfig}
93+
handleUpdateNotificationConfigs={(notification) => handleUpdate(notification, 'inApp')}
94+
/>
95+
)}
5096
</TabPanel>
5197
<TabPanel value="email">
52-
{data?.emailConfig && <EmailNotificationUserConfigTab emailConfig={data.emailConfig} />}{' '}
98+
{data?.emailConfig && (
99+
<NotificationConfigUserTab
100+
type="email"
101+
notificationConfig={data.inAppConfig}
102+
handleUpdateNotificationConfigs={(notification) => handleUpdate(notification, 'inApp')}
103+
/>
104+
)}
53105
</TabPanel>
54106
</TabContext>
55107
)

src/pages/NotificationUserConfigPage/__test__/EmailAppNotificationUserconfigTab.test.tsx

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)