import type { IMessage, IRoom } from '@rocket.chat/core-typings'; import type { TranslationKey } from '@rocket.chat/ui-contexts'; import type { ChatAPI } from '../../../../client/lib/chats/ChatAPI'; type MessageBoxAction = { label: TranslationKey; id: string; icon?: string; action: (params: { rid: IRoom['_id']; tmid?: IMessage['_id']; event: Event; chat: ChatAPI }) => void; condition?: () => boolean; }; class MessageBoxActions { actions: Map = new Map(); add(group: TranslationKey, label: TranslationKey, config: Omit) { if (!group && !label && !config) { return; } if (!this.actions.has(group)) { this.actions.set(group, []); } const actionExists = this.actions.get(group)?.find((action) => action.label === label); if (actionExists) { return; } this.actions.get(group)?.push({ ...config, label }); } remove(group: TranslationKey, expression: RegExp) { if (!group || !this.actions.get(group)) { return false; } this.actions.set(group, this.actions.get(group)?.filter((action) => !expression.test(action.id)) || []); return this.actions.get(group); } get(): Record; get(group: TranslationKey): MessageBoxAction[]; get(group?: TranslationKey) { if (!group) { return [...this.actions.entries()].reduce>((ret, [group, actions]) => { const filteredActions = actions.filter((action) => !action.condition || action.condition()); if (filteredActions.length) { ret[group] = filteredActions; } return ret; }, {} as Record); } return this.actions.get(group)?.filter((action) => !action.condition || action.condition()); } getById(id: MessageBoxAction['id']) { return Object.values(this.actions) .flat() .filter((action) => action.id === id); } } export const messageBox = { actions: new MessageBoxActions(), } as const;