-
Notifications
You must be signed in to change notification settings - Fork 120
/
notification.tsx
107 lines (97 loc) · 3.46 KB
/
notification.tsx
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
import 'reflect-metadata';
import { container, singleton } from 'tsyringe';
import React from 'react';
import { connect } from 'mo/react';
import { Float, IStatusBarItem } from 'mo/model';
import { Controller } from 'mo/react/controller';
import { IActionBarItemProps } from 'mo/components/actionBar';
import { INotificationItem } from 'mo/model/notification';
import { NotificationStatusBarView } from 'mo/workbench/notification';
import {
IStatusBarService,
StatusBarService,
INotificationService,
NotificationService,
IBuiltinService,
BuiltinService,
} from 'mo/services';
export interface INotificationController extends Partial<Controller> {
onCloseNotification(item: INotificationItem): void;
onClick?: (e: React.MouseEvent, item: IStatusBarItem) => void;
onActionBarClick?(
event: React.MouseEvent<Element, MouseEvent>,
item: IActionBarItemProps<any>
): void;
/**
* Toggle the Notifications visibility
*/
toggleNotifications(): void;
}
@singleton()
export class NotificationController
extends Controller
implements INotificationController
{
private readonly notificationService: INotificationService;
private readonly statusBarService: IStatusBarService;
private readonly builtinService: IBuiltinService;
constructor() {
super();
this.notificationService = container.resolve(NotificationService);
this.statusBarService = container.resolve(StatusBarService);
this.builtinService = container.resolve(BuiltinService);
}
public onCloseNotification = (item: INotificationItem<any>): void => {
this.notificationService.remove(item.id);
};
public toggleNotifications() {
this.notificationService.toggleNotification();
}
public onClick = (e: React.MouseEvent, item: IStatusBarItem) => {
this.toggleNotifications();
};
public onActionBarClick = (
event: React.MouseEvent<Element, MouseEvent>,
item: IActionBarItemProps<any>
) => {
const action = item.id;
const { NOTIFICATION_CLEAR_ALL_ID, NOTIFICATION_HIDE_ID } =
this.builtinService.getConstants();
if (action === NOTIFICATION_CLEAR_ALL_ID) {
this.notificationService.clear();
} else if (action === NOTIFICATION_HIDE_ID) {
this.toggleNotifications();
}
};
public initView() {
const {
builtInNotification,
NOTIFICATION_CLEAR_ALL,
NOTIFICATION_HIDE,
} = this.builtinService.getModules();
if (builtInNotification) {
const NotificationView = connect(
this.notificationService,
NotificationStatusBarView
);
/* istanbul ignore next */
const defaultNotification = {
...builtInNotification,
actionBar: [NOTIFICATION_CLEAR_ALL, NOTIFICATION_HIDE].filter(
Boolean
) as IActionBarItemProps[],
render: () => (
<NotificationView
onClick={this.onClick}
onActionBarClick={this.onActionBarClick}
onCloseNotification={this.onCloseNotification}
/>
),
};
this.notificationService.setState({
...defaultNotification,
});
this.statusBarService.add(defaultNotification, Float.right);
}
}
}