Skip to content

Commit

Permalink
[NEW] Action buttons registry (#446)
Browse files Browse the repository at this point in the history
* Create manager for button registry

* Refactor definitions

* Add the configuration extend

* Add regiter buttons permission

* Fix styles and add appId prop to button interface

* Add activation bridge method for new buttons

* New types

* Refactor gulpfile

* Add new interaction event

* Fix gulpfile

* Fix error when app doesn't exist

* A few refactors

* Rename label property and remove icon
  • Loading branch information
d-gubert committed Dec 20, 2021
1 parent 96897f9 commit a5683b1
Show file tree
Hide file tree
Showing 29 changed files with 335 additions and 179 deletions.
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

0 comments on commit a5683b1

Please sign in to comment.