diff --git a/client/views/room/Header/Omnichannel/OmnichannelRoomHeader.tsx b/client/views/room/Header/Omnichannel/OmnichannelRoomHeader.tsx index a40ba036957..4c936b0cc4f 100644 --- a/client/views/room/Header/Omnichannel/OmnichannelRoomHeader.tsx +++ b/client/views/room/Header/Omnichannel/OmnichannelRoomHeader.tsx @@ -4,15 +4,21 @@ import TemplateHeader from '../../../../components/Header'; import { useLayout } from '../../../../contexts/LayoutContext'; import { useCurrentRoute } from '../../../../contexts/RouterContext'; import { useOmnichannelRoom } from '../../contexts/RoomContext'; +import { ToolboxActionConfig } from '../../lib/Toolbox'; +import { ToolboxContext, useToolboxContext } from '../../lib/Toolbox/ToolboxContext'; import Burger from '../Burger'; import RoomHeader, { RoomHeaderProps } from '../RoomHeader'; import BackButton from './BackButton'; import QuickActions from './QuickActions'; +import { useQuickActions } from './QuickActions/hooks/useQuickActions'; const OmnichannelRoomHeader: FC = ({ slots: parentSlot }) => { const [name] = useCurrentRoute(); const { isMobile } = useLayout(); const room = useOmnichannelRoom(); + const { visibleActions, getAction } = useQuickActions(room); + const context = useToolboxContext(); + const slots = useMemo( () => ({ ...parentSlot, @@ -22,11 +28,35 @@ const OmnichannelRoomHeader: FC = ({ slots: parentSlot }) => { {name === 'omnichannel-directory' && } ), - insideContent: , + ...(!isMobile && { insideContent: }), }), [isMobile, name, parentSlot, room], ); - return ; + return ( + ({ + ...context, + actions: new Map([ + ...(isMobile + ? (visibleActions.map((action) => [ + action.id, + { + ...action, + action: (): unknown => getAction(action.id), + order: (action.order || 0) - 10, + }, + ]) as [string, ToolboxActionConfig][]) + : []), + ...(Array.from(context.actions.entries()) as [string, ToolboxActionConfig][]), + ]), + }), + [context, isMobile, visibleActions, getAction], + )} + > + + + ); }; export default OmnichannelRoomHeader; diff --git a/client/views/room/Header/Omnichannel/QuickActions/QuickActions.tsx b/client/views/room/Header/Omnichannel/QuickActions/QuickActions.tsx index 0857985721e..2056a97c4b4 100644 --- a/client/views/room/Header/Omnichannel/QuickActions/QuickActions.tsx +++ b/client/views/room/Header/Omnichannel/QuickActions/QuickActions.tsx @@ -1,38 +1,10 @@ import { Box, ButtonGroup } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { FlowRouter } from 'meteor/kadira:flow-router'; -import { Session } from 'meteor/session'; -import React, { - memo, - useContext, - useCallback, - useState, - useEffect, - FC, - ComponentProps, -} from 'react'; -import toastr from 'toastr'; +import React, { memo, FC, ComponentProps } from 'react'; -import { RoomManager } from '../../../../../../app/ui-utils/client'; -import { handleError } from '../../../../../../app/utils/client'; import { IOmnichannelRoom } from '../../../../../../definition/IRoom'; -import PlaceChatOnHoldModal from '../../../../../../ee/app/livechat-enterprise/client/components/modals/PlaceChatOnHoldModal'; import Header from '../../../../../components/Header'; -import CloseChatModal from '../../../../../components/Omnichannel/modals/CloseChatModal'; -import CloseChatModalData from '../../../../../components/Omnichannel/modals/CloseChatModalData'; -import ForwardChatModal from '../../../../../components/Omnichannel/modals/ForwardChatModal'; -import ReturnChatQueueModal from '../../../../../components/Omnichannel/modals/ReturnChatQueueModal'; -import TranscriptModal from '../../../../../components/Omnichannel/modals/TranscriptModal'; -import { usePermission, useRole } from '../../../../../contexts/AuthorizationContext'; -import { useLayout } from '../../../../../contexts/LayoutContext'; -import { useSetModal } from '../../../../../contexts/ModalContext'; -import { useOmnichannelRouteConfig } from '../../../../../contexts/OmnichannelContext'; -import { useEndpoint, useMethod } from '../../../../../contexts/ServerContext'; -import { useSetting } from '../../../../../contexts/SettingsContext'; import { useTranslation } from '../../../../../contexts/TranslationContext'; -import { useUserId } from '../../../../../contexts/UserContext'; -import { QuickActionsActionConfig, QuickActionsEnum } from '../../../lib/QuickActions'; -import { QuickActionsContext } from '../../../lib/QuickActions/QuickActionsContext'; +import { useQuickActions } from './hooks/useQuickActions'; type QuickActionsProps = { room: IOmnichannelRoom; @@ -40,256 +12,8 @@ type QuickActionsProps = { }; const QuickActions: FC = ({ room, className }) => { - const setModal = useSetModal(); - const { isMobile } = useLayout(); const t = useTranslation(); - const { actions: mapActions } = useContext(QuickActionsContext); - const actions = (Array.from(mapActions.values()) as QuickActionsActionConfig[]).sort( - (a, b) => (a.order || 0) - (b.order || 0), - ); - const visibleActions = isMobile ? [] : actions.slice(0, 6); - const [email, setEmail] = useState(''); - const visitorRoomId = room.v._id; - const rid = room._id; - const uid = useUserId(); - - const getVisitorInfo = useEndpoint('GET', 'livechat/visitors.info'); - - const getVisitorEmail = useMutableCallback(async () => { - if (!visitorRoomId) { - return; - } - const { - visitor: { visitorEmails }, - } = await getVisitorInfo({ visitorId: visitorRoomId }); - if (visitorEmails?.length && visitorEmails[0].address) { - setEmail(visitorEmails[0].address); - } - }); - - useEffect(() => { - getVisitorEmail(); - }, [visitorRoomId, getVisitorEmail]); - - const closeModal = useCallback(() => setModal(null), [setModal]); - - const methodReturn = useMethod('livechat:returnAsInquiry'); - - const handleMoveChat = useCallback(async () => { - try { - await methodReturn(rid); - closeModal(); - Session.set('openedRoom', null); - FlowRouter.go('/home'); - } catch (error) { - handleError(error); - } - }, [closeModal, methodReturn, rid]); - - const requestTranscript = useMethod('livechat:requestTranscript'); - - const handleRequestTranscript = useCallback( - async (email: string, subject: string) => { - try { - await requestTranscript(rid, email, subject); - closeModal(); - RoomManager.close(`l${rid}`); - toastr.success(t('Livechat_transcript_has_been_requested')); - } catch (error) { - handleError(error); - } - }, - [closeModal, requestTranscript, rid, t], - ); - - const sendTranscript = useMethod('livechat:sendTranscript'); - - const handleSendTranscript = useCallback( - async (email: string, subject: string, token: string) => { - try { - await sendTranscript(token, rid, email, subject); - closeModal(); - } catch (error) { - handleError(error); - } - }, - [closeModal, rid, sendTranscript], - ); - - const discardTranscript = useMethod('livechat:discardTranscript'); - - const handleDiscardTranscript = useCallback(async () => { - try { - await discardTranscript(rid); - toastr.success(t('Livechat_transcript_request_has_been_canceled')); - closeModal(); - } catch (error) { - handleError(error); - } - }, [closeModal, discardTranscript, rid, t]); - - const forwardChat = useMethod('livechat:transfer'); - - const handleForwardChat = useCallback( - async (departmentId?: string, userId?: string, comment?: string) => { - if (departmentId && userId) { - return; - } - const transferData: { - roomId: string; - clientAction: boolean; - comment?: string; - departmentId?: string; - userId?: string; - } = { - roomId: rid, - comment, - clientAction: true, - }; - - if (departmentId) { - transferData.departmentId = departmentId; - } - if (userId) { - transferData.userId = userId; - } - - try { - const result = await forwardChat(transferData); - if (!result) { - throw new Error( - departmentId ? t('error-no-agents-online-in-department') : t('error-forwarding-chat'), - ); - } - toastr.success(t('Transferred')); - FlowRouter.go('/'); - closeModal(); - } catch (error) { - handleError(error); - } - }, - [closeModal, forwardChat, rid, t], - ); - - const closeChat = useMethod('livechat:closeRoom'); - - const handleClose = useCallback( - async (comment: string, tags: string[]) => { - try { - await closeChat(rid, comment, { clientAction: true, tags }); - closeModal(); - toastr.success(t('Chat_closed_successfully')); - } catch (error) { - handleError(error); - } - }, - [closeChat, closeModal, rid, t], - ); - - const onHoldChat = useEndpoint('POST', 'livechat/room.onHold'); - - const handleOnHoldChat = useCallback(async () => { - try { - await onHoldChat({ roomId: rid } as any); - closeModal(); - toastr.success(t('Chat_On_Hold_Successfully')); - } catch (error) { - handleError(error); - } - }, [onHoldChat, closeModal, rid, t]); - - const openModal = useMutableCallback((id: string) => { - switch (id) { - case QuickActionsEnum.MoveQueue: - setModal(); - break; - case QuickActionsEnum.Transcript: - setModal( - , - ); - break; - case QuickActionsEnum.ChatForward: - setModal( - , - ); - break; - case QuickActionsEnum.CloseChat: - setModal( - room.departmentId ? ( - - ) : ( - - ), - ); - break; - case QuickActionsEnum.OnHoldChat: - setModal(); - break; - default: - break; - } - }); - - const actionDefault = useMutableCallback((e) => { - const index = e.currentTarget.getAttribute('data-quick-actions'); - const { id } = actions[index]; - openModal(id); - }); - - const omnichannelRouteConfig = useOmnichannelRouteConfig(); - - const manualOnHoldAllowed = useSetting('Livechat_allow_manual_on_hold'); - - const hasManagerRole = useRole('livechat-manager'); - - const roomOpen = - room?.open && - (room.u?._id === uid || hasManagerRole) && - room?.lastMessage?.t !== 'livechat-close'; - - const canForwardGuest = usePermission('transfer-livechat-guest'); - - const canSendTranscript = usePermission('send-omnichannel-chat-transcript'); - - const canCloseOthersRoom = usePermission('close-others-livechat-room'); - - const canCloseRoom = usePermission('close-livechat-room'); - - const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined; - - const canPlaceChatOnHold = (!room.onHold && - room.u && - !(room as any).lastMessage?.token && - manualOnHoldAllowed) as boolean; - - const hasPermissionButtons = (id: string): boolean => { - switch (id) { - case QuickActionsEnum.MoveQueue: - return !!roomOpen && canMoveQueue; - case QuickActionsEnum.ChatForward: - return !!roomOpen && canForwardGuest; - case QuickActionsEnum.Transcript: - return !!email && canSendTranscript; - case QuickActionsEnum.CloseChat: - return !!roomOpen && (canCloseRoom || canCloseOthersRoom); - case QuickActionsEnum.OnHoldChat: - return !!roomOpen && canPlaceChatOnHold; - default: - break; - } - return false; - }; + const { visibleActions, actionDefault } = useQuickActions(room); return ( @@ -298,7 +22,7 @@ const QuickActions: FC = ({ room, className }) => { id, icon, color, - 'title': t(title as any), + 'title': t(title), className, index, 'primary': false, @@ -307,10 +31,6 @@ const QuickActions: FC = ({ room, className }) => { 'key': id, }; - if (!hasPermissionButtons(id)) { - return; - } - return ; })} diff --git a/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx b/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx new file mode 100644 index 00000000000..73a4fc81caf --- /dev/null +++ b/client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx @@ -0,0 +1,289 @@ +import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { FlowRouter } from 'meteor/kadira:flow-router'; +import { Session } from 'meteor/session'; +import React, { useCallback, useState, useEffect } from 'react'; +import toastr from 'toastr'; + +import { RoomManager } from '../../../../../../../app/ui-utils/client'; +import { handleError } from '../../../../../../../app/utils/client'; +import { IOmnichannelRoom } from '../../../../../../../definition/IRoom'; +import PlaceChatOnHoldModal from '../../../../../../../ee/app/livechat-enterprise/client/components/modals/PlaceChatOnHoldModal'; +import CloseChatModal from '../../../../../../components/Omnichannel/modals/CloseChatModal'; +import CloseChatModalData from '../../../../../../components/Omnichannel/modals/CloseChatModalData'; +import ForwardChatModal from '../../../../../../components/Omnichannel/modals/ForwardChatModal'; +import ReturnChatQueueModal from '../../../../../../components/Omnichannel/modals/ReturnChatQueueModal'; +import TranscriptModal from '../../../../../../components/Omnichannel/modals/TranscriptModal'; +import { usePermission, useRole } from '../../../../../../contexts/AuthorizationContext'; +import { useSetModal } from '../../../../../../contexts/ModalContext'; +import { useOmnichannelRouteConfig } from '../../../../../../contexts/OmnichannelContext'; +import { useEndpoint, useMethod } from '../../../../../../contexts/ServerContext'; +import { useSetting } from '../../../../../../contexts/SettingsContext'; +import { useTranslation } from '../../../../../../contexts/TranslationContext'; +import { useUserId } from '../../../../../../contexts/UserContext'; +import { QuickActionsActionConfig, QuickActionsEnum } from '../../../../lib/QuickActions'; +import { useQuickActionsContext } from '../../../../lib/QuickActions/QuickActionsContext'; + +export const useQuickActions = ( + room: IOmnichannelRoom, +): { + visibleActions: QuickActionsActionConfig[]; + actionDefault: (e: unknown) => void; + getAction: (id: string) => void; +} => { + const setModal = useSetModal(); + + const t = useTranslation(); + const context = useQuickActionsContext(); + const actions = (Array.from(context.actions.values()) as QuickActionsActionConfig[]).sort( + (a, b) => (a.order || 0) - (b.order || 0), + ); + const [email, setEmail] = useState(''); + const visitorRoomId = room.v._id; + const rid = room._id; + const uid = useUserId(); + + const getVisitorInfo = useEndpoint('GET', 'livechat/visitors.info'); + + const getVisitorEmail = useMutableCallback(async () => { + if (!visitorRoomId) { + return; + } + const { + visitor: { visitorEmails }, + } = await getVisitorInfo({ visitorId: visitorRoomId }); + if (visitorEmails?.length && visitorEmails[0].address) { + setEmail(visitorEmails[0].address); + } + }); + + useEffect(() => { + getVisitorEmail(); + }, [visitorRoomId, getVisitorEmail]); + + const closeModal = useCallback(() => setModal(null), [setModal]); + + const methodReturn = useMethod('livechat:returnAsInquiry'); + + const handleMoveChat = useCallback(async () => { + try { + await methodReturn(rid); + closeModal(); + Session.set('openedRoom', null); + FlowRouter.go('/home'); + } catch (error) { + handleError(error); + } + }, [closeModal, methodReturn, rid]); + + const requestTranscript = useMethod('livechat:requestTranscript'); + + const handleRequestTranscript = useCallback( + async (email: string, subject: string) => { + try { + await requestTranscript(rid, email, subject); + closeModal(); + RoomManager.close(`l${rid}`); + toastr.success(t('Livechat_transcript_has_been_requested')); + } catch (error) { + handleError(error); + } + }, + [closeModal, requestTranscript, rid, t], + ); + + const sendTranscript = useMethod('livechat:sendTranscript'); + + const handleSendTranscript = useCallback( + async (email: string, subject: string, token: string) => { + try { + await sendTranscript(token, rid, email, subject); + closeModal(); + } catch (error) { + handleError(error); + } + }, + [closeModal, rid, sendTranscript], + ); + + const discardTranscript = useMethod('livechat:discardTranscript'); + + const handleDiscardTranscript = useCallback(async () => { + try { + await discardTranscript(rid); + toastr.success(t('Livechat_transcript_request_has_been_canceled')); + closeModal(); + } catch (error) { + handleError(error); + } + }, [closeModal, discardTranscript, rid, t]); + + const forwardChat = useMethod('livechat:transfer'); + + const handleForwardChat = useCallback( + async (departmentId?: string, userId?: string, comment?: string) => { + if (departmentId && userId) { + return; + } + const transferData: { + roomId: string; + clientAction: boolean; + comment?: string; + departmentId?: string; + userId?: string; + } = { + roomId: rid, + comment, + clientAction: true, + }; + + if (departmentId) { + transferData.departmentId = departmentId; + } + if (userId) { + transferData.userId = userId; + } + + try { + const result = await forwardChat(transferData); + if (!result) { + throw new Error( + departmentId ? t('error-no-agents-online-in-department') : t('error-forwarding-chat'), + ); + } + toastr.success(t('Transferred')); + FlowRouter.go('/'); + closeModal(); + } catch (error) { + handleError(error); + } + }, + [closeModal, forwardChat, rid, t], + ); + + const closeChat = useMethod('livechat:closeRoom'); + + const handleClose = useCallback( + async (comment: string, tags: string[]) => { + try { + await closeChat(rid, comment, { clientAction: true, tags }); + closeModal(); + toastr.success(t('Chat_closed_successfully')); + } catch (error) { + handleError(error); + } + }, + [closeChat, closeModal, rid, t], + ); + + const onHoldChat = useEndpoint('POST', 'livechat/room.onHold'); + + const handleOnHoldChat = useCallback(async () => { + try { + await onHoldChat({ roomId: rid } as any); + closeModal(); + toastr.success(t('Chat_On_Hold_Successfully')); + } catch (error) { + handleError(error); + } + }, [onHoldChat, closeModal, rid, t]); + + const openModal = useMutableCallback((id: string) => { + switch (id) { + case QuickActionsEnum.MoveQueue: + setModal(); + break; + case QuickActionsEnum.Transcript: + setModal( + , + ); + break; + case QuickActionsEnum.ChatForward: + setModal( + , + ); + break; + case QuickActionsEnum.CloseChat: + setModal( + room.departmentId ? ( + + ) : ( + + ), + ); + break; + case QuickActionsEnum.OnHoldChat: + setModal(); + break; + default: + break; + } + }); + + const omnichannelRouteConfig = useOmnichannelRouteConfig(); + + const manualOnHoldAllowed = useSetting('Livechat_allow_manual_on_hold'); + + const hasManagerRole = useRole('livechat-manager'); + + const roomOpen = + room?.open && + (room.u?._id === uid || hasManagerRole) && + room?.lastMessage?.t !== 'livechat-close'; + + const canForwardGuest = usePermission('transfer-livechat-guest'); + + const canSendTranscript = usePermission('send-omnichannel-chat-transcript'); + + const canCloseOthersRoom = usePermission('close-others-livechat-room'); + + const canCloseRoom = usePermission('close-livechat-room'); + + const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined; + + const canPlaceChatOnHold = Boolean( + !room.onHold && room.u && !(room as any).lastMessage?.token && manualOnHoldAllowed, + ); + + const hasPermissionButtons = (id: string): boolean => { + switch (id) { + case QuickActionsEnum.MoveQueue: + return !!roomOpen && canMoveQueue; + case QuickActionsEnum.ChatForward: + return !!roomOpen && canForwardGuest; + case QuickActionsEnum.Transcript: + return !!email && canSendTranscript; + case QuickActionsEnum.CloseChat: + return !!roomOpen && (canCloseRoom || canCloseOthersRoom); + case QuickActionsEnum.OnHoldChat: + return !!roomOpen && canPlaceChatOnHold; + default: + break; + } + return false; + }; + + const visibleActions = actions.filter(({ id }) => hasPermissionButtons(id)); + + const actionDefault = useMutableCallback((e) => { + const index = e.currentTarget.getAttribute('data-quick-actions'); + const { id } = visibleActions[index]; + openModal(id); + }); + + const getAction = useMutableCallback((id) => { + openModal(id); + }); + + return { visibleActions, actionDefault, getAction }; +}; diff --git a/client/views/room/Header/RoomHeader.tsx b/client/views/room/Header/RoomHeader.tsx index ab80d5393b6..89a053785cc 100644 --- a/client/views/room/Header/RoomHeader.tsx +++ b/client/views/room/Header/RoomHeader.tsx @@ -21,6 +21,11 @@ export type RoomHeaderProps = { insideContent?: unknown; posContent?: unknown; end?: unknown; + toolbox?: { + pre?: unknown; + content?: unknown; + pos?: unknown; + }; }; }; @@ -51,7 +56,9 @@ const RoomHeader: FC = ({ room, topic = '', slots = {} }) => ( {slots?.posContent} - + {slots?.toolbox?.pre} + {slots?.toolbox?.content || } + {slots?.toolbox?.pos} {slots?.end} diff --git a/client/views/room/Header/ToolBox/ToolBox.tsx b/client/views/room/Header/ToolBox/ToolBox.tsx index ea2a9c616a5..3c96c73bf07 100644 --- a/client/views/room/Header/ToolBox/ToolBox.tsx +++ b/client/views/room/Header/ToolBox/ToolBox.tsx @@ -1,6 +1,6 @@ import { Menu, Option, MenuProps, Box } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import React, { memo, useContext, ReactNode, useRef, ComponentProps, FC } from 'react'; +import React, { memo, ReactNode, useRef, ComponentProps, FC } from 'react'; // import tinykeys from 'tinykeys'; // used to open the menu option by keyboard @@ -9,7 +9,7 @@ import Header from '../../../../components/Header'; import { useLayout } from '../../../../contexts/LayoutContext'; import { useTranslation } from '../../../../contexts/TranslationContext'; import { ToolboxActionConfig, OptionRenderer } from '../../lib/Toolbox'; -import { ToolboxContext } from '../../lib/Toolbox/ToolboxContext'; +import { useToolboxContext } from '../../lib/Toolbox/ToolboxContext'; import { useTab, useTabBarOpen } from '../../providers/ToolboxProvider'; const renderMenuOption: OptionRenderer = ({ label: { title, icon }, ...props }: any): ReactNode => ( @@ -28,7 +28,8 @@ const ToolBox: FC = ({ className }) => { const t = useTranslation(); const hiddenActionRenderers = useRef<{ [key: string]: OptionRenderer }>({}); - const { actions: mapActions } = useContext(ToolboxContext); + const { actions: mapActions } = useToolboxContext(); + const actions = (Array.from(mapActions.values()) as ToolboxActionConfig[]).sort( (a, b) => (a.order || 0) - (b.order || 0), ); diff --git a/client/views/room/lib/QuickActions/QuickActionsContext.tsx b/client/views/room/lib/QuickActions/QuickActionsContext.tsx index addfb5970c7..ba55a4f6396 100644 --- a/client/views/room/lib/QuickActions/QuickActionsContext.tsx +++ b/client/views/room/lib/QuickActions/QuickActionsContext.tsx @@ -1,17 +1,20 @@ import { EventHandlerOf } from '@rocket.chat/emitter'; -import { createContext } from 'react'; +import { createContext, useContext } from 'react'; import { actions, listen, QuickActionsActionConfig, QuickActionsAction, Events } from '.'; + import './defaultActions'; export type QuickActionsEventHandler = (handler: EventHandlerOf) => Function; -export type ChannelContextValue = { +export type QuickActionsContext = { actions: Map; listen: QuickActionsEventHandler; }; -export const QuickActionsContext = createContext({ +export const QuickActionsContext = createContext({ actions, listen, }); + +export const useQuickActionsContext = (): QuickActionsContext => useContext(QuickActionsContext); diff --git a/client/views/room/lib/QuickActions/index.tsx b/client/views/room/lib/QuickActions/index.tsx index 4fe4346de8b..8e8db9b53c3 100644 --- a/client/views/room/lib/QuickActions/index.tsx +++ b/client/views/room/lib/QuickActions/index.tsx @@ -1,7 +1,8 @@ import { Box, Option } from '@rocket.chat/fuselage'; -import { ComponentProps, ReactNode, MouseEvent } from 'react'; +import { ComponentProps, ReactNode } from 'react'; import { IRoom } from '../../../../../definition/IRoom'; +import { ToolboxActionConfig } from '../Toolbox'; import { generator, Events as GeneratorEvents } from '../Toolbox/generator'; type QuickActionsHook = ({ room }: { room: IRoom }) => QuickActionsActionConfig | null; @@ -18,16 +19,9 @@ type OptionRendererProps = ComponentProps; export type OptionRenderer = (props: OptionRendererProps) => ReactNode; -export type QuickActionsActionConfig = { - id: string; - icon: string; - color?: string; - title: string; - full?: true; - order?: number; - renderAction?: ActionRenderer; +export type QuickActionsActionConfig = ToolboxActionConfig & { groups: Array<'live'>; - action?: (e: MouseEvent) => void; + color?: string; }; export type QuickActionsAction = QuickActionsHook | QuickActionsActionConfig; diff --git a/client/views/room/lib/Toolbox/ToolboxContext.tsx b/client/views/room/lib/Toolbox/ToolboxContext.tsx index c3ddb8ba9c8..773163ca0bd 100644 --- a/client/views/room/lib/Toolbox/ToolboxContext.tsx +++ b/client/views/room/lib/Toolbox/ToolboxContext.tsx @@ -1,12 +1,12 @@ import { EventHandlerOf } from '@rocket.chat/emitter'; -import { createContext, MouseEventHandler } from 'react'; +import { createContext, MouseEventHandler, useContext } from 'react'; import { actions, listen, ToolboxActionConfig, ToolboxAction, Events } from '.'; import './defaultActions'; export type ToolboxEventHandler = (handler: EventHandlerOf) => Function; -export type ChannelContextValue = { +export type ToolboxContextValue = { actions: Map; listen: ToolboxEventHandler; tabBar?: any; @@ -17,10 +17,12 @@ export type ChannelContextValue = { activeTabBar?: ToolboxActionConfig; }; -export const ToolboxContext = createContext({ +export const ToolboxContext = createContext({ actions, listen, open: () => null, openUserInfo: () => null, close: () => null, }); + +export const useToolboxContext = (): ToolboxContextValue => useContext(ToolboxContext);