-
Notifications
You must be signed in to change notification settings - Fork 0
/
RocketChatAppsBirthdayApp.ts
117 lines (103 loc) · 3.27 KB
/
RocketChatAppsBirthdayApp.ts
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
117
import {
IAppAccessors,
IConfigurationExtend,
IEnvironmentRead,
IHttp,
ILogger,
IModify,
IPersistence,
IRead
} from "@rocket.chat/apps-engine/definition/accessors";
import { App } from "@rocket.chat/apps-engine/definition/App";
import { IAppInfo } from "@rocket.chat/apps-engine/definition/metadata";
import {
IUIKitInteractionHandler,
IUIKitResponse,
UIKitViewSubmitInteractionContext
} from "@rocket.chat/apps-engine/definition/uikit";
import { Birthday } from "./slashCommands/Birthday";
import {
BIRTHDAY_FORM_ID,
BIRTHDAY_INPUT_ACTION_ID,
BIRTHDAY_INPUT_BLOCK_ID,
NOTIFY_SELECT_ACTION_ID,
NOTIFY_SELECT_BLOCK_ID
} from "./uikit/birthday-form";
import { getLocalizer } from "./helpers/localization-helper";
import { saveBirthday, saveShouldNotifyRoom } from "./helpers/birthday-persistence-helper";
import { renderConfigNotification } from "./uikit/config-notification";
export class RocketChatAppsBirthdayApp extends App implements IUIKitInteractionHandler {
constructor(info: IAppInfo, logger: ILogger, accessors: IAppAccessors) {
super(info, logger, accessors);
}
protected async extendConfiguration(
configuration: IConfigurationExtend,
environmentRead: IEnvironmentRead
): Promise<void> {
await super.extendConfiguration(configuration, environmentRead);
await configuration.slashCommands.provideSlashCommand(new Birthday(this));
}
async executeViewSubmitHandler(
context: UIKitViewSubmitInteractionContext,
read: IRead,
http: IHttp,
persistence: IPersistence,
modify: IModify
): Promise<IUIKitResponse> {
const interactionData = context.getInteractionData();
const { view, user, room } = interactionData;
const localizer = getLocalizer();
switch (view.id) {
case BIRTHDAY_FORM_ID: {
const state = view.state as any;
const roomId = (view as any).roomId;
if (!state || !roomId) {
return context.getInteractionResponder().viewErrorResponse({
viewId: view.id,
errors: {
[BIRTHDAY_INPUT_ACTION_ID]: localizer("birthdayForm_error_general")
}
});
}
const birthday = state[BIRTHDAY_INPUT_BLOCK_ID]?.[BIRTHDAY_INPUT_ACTION_ID];
const shouldNotifyRoom = state[NOTIFY_SELECT_BLOCK_ID]?.[NOTIFY_SELECT_ACTION_ID];
if (!birthday || !shouldNotifyRoom) {
return context.getInteractionResponder().viewErrorResponse({
viewId: view.id,
errors: {
[BIRTHDAY_INPUT_ACTION_ID]: localizer("birthdayForm_error_input")
}
});
}
await saveBirthday(user.id, birthday, persistence);
await saveShouldNotifyRoom(
user.id,
roomId,
shouldNotifyRoom === "yes",
read.getPersistenceReader(),
persistence
);
const appUser = await read.getUserReader().getAppUser();
const notifiedRoom = await read.getRoomReader().getById(roomId);
if (notifiedRoom && appUser) {
const builder = modify
.getNotifier()
.getMessageBuilder()
.setRoom(notifiedRoom)
.setSender(appUser)
.setBlocks(renderConfigNotification({ blockBuilder: modify.getCreator().getBlockBuilder() }));
await modify.getNotifier().notifyUser(user, builder.getMessage());
}
return { success: true };
}
default: {
return { success: false };
}
}
}
async executeViewClosedHandler(): Promise<IUIKitResponse> {
return {
success: true
};
}
}