The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/apps/meteor/client/components/message/toolbar/useMessageActionAppsActionB...

77 lines
2.8 KiB

import { type IUIActionButton, MessageActionContext as AppsEngineMessageActionContext } from '@rocket.chat/apps-engine/definition/ui';
import type { IMessage } from '@rocket.chat/core-typings';
import { useToastMessageDispatch } from '@rocket.chat/ui-contexts';
import { useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import { UiKitTriggerTimeoutError } from '../../../../app/ui-message/client/UiKitTriggerTimeoutError';
import type { MessageActionContext, MessageActionConfig } from '../../../../app/ui-utils/client/lib/MessageAction';
import { Utilities } from '../../../../ee/lib/misc/Utilities';
import { useAppActionButtons, getIdForActionButton } from '../../../hooks/useAppActionButtons';
import { useApplyButtonFilters } from '../../../hooks/useApplyButtonFilters';
import { useUiKitActionManager } from '../../../uikit/hooks/useUiKitActionManager';
const filterActionsByContext = (context: string | undefined, action: IUIActionButton) => {
if (!context) {
return true;
}
const messageActionContext = action.when?.messageActionContext || Object.values(AppsEngineMessageActionContext);
const isContextMatch = messageActionContext.includes(context as AppsEngineMessageActionContext);
return isContextMatch;
};
export const useMessageActionAppsActionButtons = (message: IMessage, context?: MessageActionContext, category?: string) => {
const result = useAppActionButtons('messageAction');
const actionManager = useUiKitActionManager();
const applyButtonFilters = useApplyButtonFilters(category);
const dispatchToastMessage = useToastMessageDispatch();
const { t } = useTranslation();
const data = useMemo(
() =>
result.data
?.filter((action) => filterActionsByContext(context, action))
.filter((action) => applyButtonFilters(action))
.map((action) => {
const item: MessageActionConfig = {
icon: undefined as any,
id: getIdForActionButton(action),
label: Utilities.getI18nKeyForApp(action.labelI18n, action.appId),
order: 7,
type: 'apps',
variant: action.variant,
group: 'menu',
action: () => {
void actionManager
.emitInteraction(action.appId, {
type: 'actionButton',
rid: message.rid,
tmid: message.tmid,
mid: message._id,
actionId: action.actionId,
payload: { context: action.context },
})
.catch(async (reason) => {
if (reason instanceof UiKitTriggerTimeoutError) {
dispatchToastMessage({
type: 'error',
message: t('UIKit_Interaction_Timeout'),
});
return;
}
return reason;
});
},
};
return item;
}),
[actionManager, applyButtonFilters, context, dispatchToastMessage, message._id, message.rid, message.tmid, result.data, t],
);
return {
...result,
data,
};
};