Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[NEW] Action buttons registry #465

Merged
merged 14 commits into from
Dec 20, 2021
28 changes: 7 additions & 21 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,7 @@ function lint_ts() {
return tsp.src().pipe(tslint({ formatter: 'verbose' })).pipe(tslint.report());
}

function perform_patches() {
const FileTypeDeClarationPath = './node_modules/file-type/core.d.ts';

if (fs.existsSync(FileTypeDeClarationPath)) {
const patched = fs.readFileSync(FileTypeDeClarationPath)
.toString() // Our TypeScript version is too old that doesn't support ReadOnly type
.replace('readonly core.MimeType[]', 'core.MimeType[]');
fs.writeFileSync(FileTypeDeClarationPath, patched);
}
}

function compile_ts() {
perform_patches();

return tsp.src().pipe(sourcemaps.init())
.pipe(tsp())
.pipe(sourcemaps.write('.'))
Expand All @@ -64,34 +51,33 @@ function ts_definition_module_files() {
}

function watch() {
gulp.watch('src/**/*.ts', gulp.series(lint_ts, compile_ts));
gulp.watch('package.json', gulp.series(update_ts_definition_version, ts_definition_module_files));
gulp.watch('src/**/*.ts', gulp.series(compile_ts));
}

const compile = gulp.series(clean_generated, lint_ts, compile_ts, update_ts_definition_version, ts_definition_module_files);
const compile = gulp.series(clean_generated, compile_ts, update_ts_definition_version, ts_definition_module_files);

gulp.task('bundle', bundle_sdk);

gulp.task('clean', clean_generated);

gulp.task('compile', compile);
gulp.task('compile', gulp.series(compile));

gulp.task('default', gulp.series(compile, watch));

gulp.task('pack', gulp.series(clean_generated, lint_ts, compile_ts, shell.task([
gulp.task('pack', gulp.series(lint_ts, compile, shell.task([
'npm pack'
])));

gulp.task('publish', gulp.series(clean_generated, lint_ts, compile_ts, bundle_sdk, shell.task([
gulp.task('publish', gulp.series(lint_ts, compile, bundle_sdk, shell.task([
'npm publish --access public && npm pack'
], [
'cd definition && npm publish --access public && npm pack'
])));

gulp.task('publish-beta', gulp.series(clean_generated, lint_ts, compile_ts, bundle_sdk, shell.task([
gulp.task('publish-beta', gulp.series(lint_ts, compile, bundle_sdk, shell.task([
'npm publish --access public --tag beta'
])));

gulp.task('publish-alpha', gulp.series(clean_generated, lint_ts, compile_ts, bundle_sdk, shell.task([
gulp.task('publish-alpha', gulp.series(lint_ts, compile, bundle_sdk, shell.task([
'npm publish --access public --tag alpha'
])));
3 changes: 3 additions & 0 deletions src/definition/accessors/IConfigurationExtend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { IHttpExtend } from './IHttp';
import { ISchedulerExtend } from './ISchedulerExtend';
import { ISettingsExtend } from './ISettingsExtend';
import { ISlashCommandsExtend } from './ISlashCommandsExtend';
import { IUIExtend } from './IUIExtend';

/**
* This accessor provides methods for declaring the configuration
Expand All @@ -26,4 +27,6 @@ export interface IConfigurationExtend {

/** Accessor for declaring tasks that can be scheduled (like cron) */
readonly scheduler: ISchedulerExtend;
/** Accessor for registering different elements in the host UI */
readonly ui: IUIExtend;
}
5 changes: 5 additions & 0 deletions src/definition/accessors/IUIExtend.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { IUIActionButtonDescriptor } from '../ui';

export interface IUIExtend {
registerButton(button: IUIActionButtonDescriptor): void;
}
150 changes: 47 additions & 103 deletions src/definition/accessors/index.ts
Original file line number Diff line number Diff line change
@@ -1,103 +1,47 @@
import { IApiExtend } from './IApiExtend';
import { IAppAccessors } from './IAppAccessors';
import { IAppInstallationContext } from './IAppInstallationContext';
import { IAppUninstallationContext } from './IAppUninstallationContext';
import { ICloudWorkspaceRead } from './ICloudWorkspaceRead';
import { IConfigurationExtend } from './IConfigurationExtend';
import { IConfigurationModify } from './IConfigurationModify';
import { IDiscussionBuilder } from './IDiscussionBuilder';
import { IEnvironmentalVariableRead } from './IEnvironmentalVariableRead';
import { IEnvironmentRead } from './IEnvironmentRead';
import { IExternalComponentsExtend } from './IExternalComponentsExtend';
import { HttpStatusCode, IHttp, IHttpExtend, IHttpPreRequestHandler, IHttpPreResponseHandler, IHttpRequest, IHttpResponse, RequestMethod } from './IHttp';
import { ILivechatCreator } from './ILivechatCreator';
import { ILivechatMessageBuilder } from './ILivechatMessageBuilder';
import { ILivechatRead } from './ILivechatRead';
import { ILivechatUpdater } from './ILivechatUpdater';
import { ILogEntry, LogMessageSeverity } from './ILogEntry';
import { ILogger } from './ILogger';
import { IMessageBuilder } from './IMessageBuilder';
import { IMessageExtender } from './IMessageExtender';
import { IMessageRead } from './IMessageRead';
import { IModify } from './IModify';
import { IModifyCreator } from './IModifyCreator';
import { IModifyDeleter } from './IModifyDeleter';
import { IModifyExtender } from './IModifyExtender';
import { IModifyUpdater } from './IModifyUpdater';
import { INotifier } from './INotifier';
import { IPersistence } from './IPersistence';
import { IPersistenceRead } from './IPersistenceRead';
import { IRead } from './IRead';
import { IRoomBuilder } from './IRoomBuilder';
import { IRoomExtender } from './IRoomExtender';
import { IRoomRead } from './IRoomRead';
import { ISchedulerExtend } from './ISchedulerExtend';
import { ISchedulerModify } from './ISchedulerModify';
import { IServerSettingRead } from './IServerSettingRead';
import { IServerSettingsModify } from './IServerSettingsModify';
import { ISettingRead } from './ISettingRead';
import { ISettingsExtend } from './ISettingsExtend';
import { ISlashCommandsExtend } from './ISlashCommandsExtend';
import { ISlashCommandsModify } from './ISlashCommandsModify';
import { IUIController } from './IUIController';
import { IUploadCreator } from './IUploadCreator';
import { IUploadRead } from './IUploadRead';
import { IUserBuilder } from './IUserBuilder';
import { IUserRead } from './IUserRead';

export {
HttpStatusCode,
IAppAccessors,
IAppUninstallationContext,
IAppInstallationContext,
ICloudWorkspaceRead,
IConfigurationExtend,
IConfigurationModify,
IDiscussionBuilder,
IEnvironmentalVariableRead,
IEnvironmentRead,
IExternalComponentsExtend,
IHttp,
IHttpExtend,
IHttpPreRequestHandler,
IHttpPreResponseHandler,
IHttpRequest,
IHttpResponse,
ILivechatCreator,
ILivechatMessageBuilder,
ILivechatRead,
ILivechatUpdater,
ILogEntry,
ILogger,
IMessageBuilder,
IMessageExtender,
IMessageRead,
IModify,
IModifyCreator,
IModifyDeleter,
IModifyExtender,
IModifyUpdater,
INotifier,
IPersistence,
IPersistenceRead,
IRead,
IRoomBuilder,
IRoomExtender,
IRoomRead,
IServerSettingRead,
IServerSettingsModify,
ISettingRead,
ISettingsExtend,
ISlashCommandsExtend,
ISlashCommandsModify,
IUIController,
IUploadRead,
IUploadCreator,
IUserBuilder,
IUserRead,
LogMessageSeverity,
RequestMethod,
IApiExtend,
ISchedulerModify,
ISchedulerExtend,
};
export * from './IApiExtend';
export * from './IAppAccessors';
export * from './IAppInstallationContext';
export * from './IAppUninstallationContext';
export * from './ICloudWorkspaceRead';
export * from './IConfigurationExtend';
export * from './IConfigurationModify';
export * from './IDiscussionBuilder';
export * from './IEnvironmentalVariableRead';
export * from './IEnvironmentRead';
export * from './IExternalComponentsExtend';
export * from './IHttp';
export * from './ILivechatCreator';
export * from './ILivechatMessageBuilder';
export * from './ILivechatRead';
export * from './ILivechatUpdater';
export * from './ILogEntry';
export * from './ILogger';
export * from './IMessageBuilder';
export * from './IMessageExtender';
export * from './IMessageRead';
export * from './IModify';
export * from './IModifyCreator';
export * from './IModifyDeleter';
export * from './IModifyExtender';
export * from './IModifyUpdater';
export * from './INotifier';
export * from './IPersistence';
export * from './IPersistenceRead';
export * from './IRead';
export * from './IRoomBuilder';
export * from './IRoomExtender';
export * from './IRoomRead';
export * from './ISchedulerExtend';
export * from './ISchedulerModify';
export * from './IServerSettingRead';
export * from './IServerSettingsModify';
export * from './ISettingRead';
export * from './ISettingsExtend';
export * from './ISlashCommandsExtend';
export * from './ISlashCommandsModify';
export * from './IUIController';
export * from './IUIExtend';
export * from './IUploadCreator';
export * from './IUploadRead';
export * from './IUserBuilder';
export * from './IUserRead';
1 change: 1 addition & 0 deletions src/definition/metadata/AppMethod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ export enum AppMethod {
UIKIT_BLOCK_ACTION = 'executeBlockActionHandler',
UIKIT_VIEW_SUBMIT = 'executeViewSubmitHandler',
UIKIT_VIEW_CLOSE = 'executeViewClosedHandler',
UIKIT_ACTION_BUTTON = 'executeActionButtonHandler',
UIKIT_LIVECHAT_BLOCK_ACTION = 'executeLivechatBlockActionHandler',
// Livechat
EXECUTE_POST_LIVECHAT_ROOM_STARTED = 'executePostLivechatRoomStarted',
Expand Down
2 changes: 1 addition & 1 deletion src/definition/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@rocket.chat/apps-ts-definition",
"version": "1.28.0-alpha",
"version": "1.29.0-alpha.0",
"description": "Contains the TypeScript definitions for the Rocket.Chat Applications.",
"main": "index.js",
"typings": "index",
Expand Down
40 changes: 40 additions & 0 deletions src/definition/ui/IUIActionButtonDescriptor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { UIActionButtonContext } from './UIActionButtonContext';

export enum RoomTypeFilter {
PUBLIC_CHANNEL = 'public_channel',
PRIVATE_CHANNEL = 'private_channel',
PUBLIC_TEAM = 'public_team',
PRIVATE_TEAM = 'private_team',
PUBLIC_DISCUSSION = 'public_discussion',
PRIVATE_DISCUSSION = 'private_discussion',
DIRECT = 'direct',
DIRECT_MULTIPLE = 'direct_multiple',
LIVE_CHAT = 'livechat',
}

export enum MessageActionContext {
MESSAGE = 'message',
MESSAGE_MOBILE = 'message-mobile',
THREADS = 'threads',
STARRED = 'starred',
}

export interface IUIActionButtonDescriptor {
actionId: string;
labelI18n: string;
context: UIActionButtonContext;
when?: {
roomTypes?: Array<RoomTypeFilter>;
messageActionContext?: Array<MessageActionContext>;
// How do we provide suggestions for permissions?
hasOnePermission?: Array<string>;
hasAllPermissions?: Array<string>;
// How do we provide suggestions for roles?
hasOneRole?: Array<string>;
hasAllRoles?: Array<string>;
};
}

export interface IUIActionButton extends IUIActionButtonDescriptor {
appId: string;
}
5 changes: 5 additions & 0 deletions src/definition/ui/UIActionButtonContext.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export enum UIActionButtonContext {
MESSAGE_ACTION = 'messageAction',
ROOM_ACTION = 'roomAction',
MESSAGE_BOX_ACTION = 'messageBoxAction',
}
2 changes: 2 additions & 0 deletions src/definition/ui/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './IUIActionButtonDescriptor';
export * from './UIActionButtonContext';
19 changes: 18 additions & 1 deletion src/definition/uikit/IUIKitActionHandler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { IHttp, IModify, IPersistence, IRead } from '../accessors';
import { AppMethod } from '../metadata';
import { IUIKitResponse } from './IUIKitInteractionType';
import { UIKitBlockInteractionContext, UIKitViewCloseInteractionContext, UIKitViewSubmitInteractionContext } from './UIKitInteractionContext';
import {
UIKitActionButtonInteractionContext,
UIKitBlockInteractionContext,
UIKitViewCloseInteractionContext,
UIKitViewSubmitInteractionContext,
} from './UIKitInteractionContext';

/** Handler for after a message is sent. */
export interface IUIKitInteractionHandler {
Expand Down Expand Up @@ -37,4 +42,16 @@ export interface IUIKitInteractionHandler {
*/
[AppMethod.UIKIT_VIEW_CLOSE]?(context: UIKitViewCloseInteractionContext, read: IRead, http: IHttp, persistence: IPersistence, modify: IModify):
Promise<IUIKitResponse>;

/**
* Method called when an action button is clicked.
*
* @param context
* @param read An accessor to the environment
* @param http An accessor to the outside world
* @param persistence An accessor to the App's persistence
* @param modify An accessor to the App's persistence
*/
[AppMethod.UIKIT_ACTION_BUTTON]?(context: UIKitActionButtonInteractionContext, read: IRead, http: IHttp, persistence: IPersistence, modify: IModify):
Promise<IUIKitResponse>;
}
1 change: 1 addition & 0 deletions src/definition/uikit/IUIKitIncomingInteraction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export enum UIKitIncomingInteractionType {
BLOCK = 'blockAction',
VIEW_SUBMIT = 'viewSubmit',
VIEW_CLOSED = 'viewClosed',
ACTION_BUTTON = 'actionButton',
}

export interface IUIKitIncomingInteraction {
Expand Down
9 changes: 9 additions & 0 deletions src/definition/uikit/UIKitIncomingInteractionTypes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { IMessage } from '../messages';
import { IRoom } from '../rooms';
import { UIActionButtonContext } from '../ui';
import { IUser } from '../users';
import { IUIKitSurface } from './IUIKitSurface';
import {
Expand Down Expand Up @@ -35,3 +36,11 @@ export interface IUIKitViewCloseIncomingInteraction extends IUIKitBaseIncomingIn
view: IUIKitSurface;
isCleared: boolean;
}

export interface IUIKitActionButtonIncomingInteraction extends IUIKitBaseIncomingInteraction {
buttonContext: UIActionButtonContext;
actionId: string;
triggerId: string;
room: IRoom;
message?: IMessage;
}
12 changes: 11 additions & 1 deletion src/definition/uikit/UIKitInteractionContext.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// tslint:disable:max-classes-per-file
import { IUIKitBaseIncomingInteraction, IUIKitBlockIncomingInteraction, IUIKitViewCloseIncomingInteraction, IUIKitViewSubmitIncomingInteraction } from './UIKitIncomingInteractionTypes';
import { IUIKitActionButtonIncomingInteraction, IUIKitBaseIncomingInteraction, IUIKitBlockIncomingInteraction, IUIKitViewCloseIncomingInteraction, IUIKitViewSubmitIncomingInteraction } from './UIKitIncomingInteractionTypes';
import { UIKitInteractionResponder } from './UIKitInteractionResponder';

export abstract class UIKitInteractionContext {
Expand Down Expand Up @@ -49,3 +49,13 @@ export class UIKitViewCloseInteractionContext extends UIKitInteractionContext {
return this.interactionData;
}
}

export class UIKitActionButtonInteractionContext extends UIKitInteractionContext {
constructor(private readonly interactionData: IUIKitActionButtonIncomingInteraction) {
super(interactionData);
}

public getInteractionData(): IUIKitActionButtonIncomingInteraction {
return this.interactionData;
}
}
Loading