-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Expand file tree
/
Copy pathnotification-details.tsx
More file actions
116 lines (106 loc) · 3.58 KB
/
notification-details.tsx
File metadata and controls
116 lines (106 loc) · 3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import React, { useEffect } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import {
TRIGGER_TYPES,
type INotification,
} from '@metamask/notification-services-controller/notification-services';
import { Box } from '../../components/component-library';
import {
BlockSize,
Display,
FlexDirection,
JustifyContent,
} from '../../helpers/constants/design-system';
import { NOTIFICATIONS_ROUTE } from '../../helpers/constants/routes';
import { Content, Page } from '../../components/multichain/pages/page';
import { useMarkNotificationAsRead } from '../../hooks/metamask-notifications/useNotifications';
import { getMetamaskNotificationById } from '../../selectors/metamask-notifications/metamask-notifications';
import {
NotificationComponents,
hasNotificationComponents,
} from '../notifications/notification-components';
import { useSnapNotificationTimeouts } from '../../hooks/useNotificationTimeouts';
import { useAppSelector } from '../../store/store';
import { getExtractIdentifier } from './utils/utils';
import { NotificationDetailsHeader } from './notification-details-header/notification-details-header';
import { NotificationDetailsBody } from './notification-details-body/notification-details-body';
import { NotificationDetailsFooter } from './notification-details-footer/notification-details-footer';
function useNotificationByPath() {
const { pathname } = useLocation();
const id = getExtractIdentifier(pathname);
const notification = useAppSelector((state) =>
getMetamaskNotificationById(state, id),
);
return {
notification,
};
}
function useEffectOnNotificationView(notificationData?: INotification) {
const { markNotificationAsRead } = useMarkNotificationAsRead();
const { setNotificationTimeout } = useSnapNotificationTimeouts();
useEffect(() => {
if (notificationData) {
markNotificationAsRead([
{
id: notificationData.id,
type: notificationData.type,
isRead: notificationData.isRead,
},
]);
}
return () => {
if (notificationData?.type === TRIGGER_TYPES.SNAP) {
setNotificationTimeout(notificationData.id);
}
};
}, []);
}
// TODO: Fix in https://github.com/MetaMask/metamask-extension/issues/31860
// eslint-disable-next-line @typescript-eslint/naming-convention
export default function NotificationDetails() {
const navigate = useNavigate();
const { notification } = useNotificationByPath();
useEffectOnNotificationView(notification);
// No Notification
if (!notification) {
navigate(NOTIFICATIONS_ROUTE);
return null;
}
// Invalid Notification
if (!hasNotificationComponents(notification.type)) {
navigate(NOTIFICATIONS_ROUTE);
return null;
}
const ncs = NotificationComponents[notification.type];
if (!ncs.details) {
return null;
}
return (
<Page>
<NotificationDetailsHeader
onClickBack={() => navigate(NOTIFICATIONS_ROUTE)}
>
<ncs.details.title notification={notification} />
</NotificationDetailsHeader>
<Content padding={0}>
<Box
display={Display.Flex}
flexDirection={FlexDirection.Column}
gap={2}
width={BlockSize.Full}
height={BlockSize.Full}
justifyContent={JustifyContent.spaceBetween}
>
<NotificationDetailsBody
body={ncs.details.body}
notification={notification}
/>
<NotificationDetailsFooter
footer={ncs.details.footer}
notification={notification}
/>
</Box>
</Content>
</Page>
);
}