diff --git a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx index 499a07588e743..2b100ea471fb3 100644 --- a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx @@ -21,12 +21,12 @@ import { ModalContent, } from '@rocket.chat/fuselage'; import { GenericModal } from '@rocket.chat/ui-client'; -import { usePermission, useSetting, useTranslation, useUserPreference } from '@rocket.chat/ui-contexts'; +import { usePermission, useSetting, useUserPreference, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useCallback, useState, useEffect, useMemo } from 'react'; import { useForm } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; -import { dispatchToastMessage } from '../../../lib/toast'; import Tags from '../Tags'; type CloseChatModalFormData = { @@ -50,7 +50,8 @@ type CloseChatModalProps = { }; const CloseChatModal = ({ department, visitorEmail, onCancel, onConfirm }: CloseChatModalProps) => { - const t = useTranslation(); + const { t } = useTranslation(); + const dispatchToastMessage = useToastMessageDispatch(); const { formState: { errors }, @@ -147,7 +148,7 @@ const CloseChatModal = ({ department, visitorEmail, onCancel, onConfirm }: Close } setValue('subject', subject || customSubject || t('Transcript_of_your_livechat_conversation')); } - }, [transcriptEmail, setValue, visitorEmail, subject, t, customSubject]); + }, [transcriptEmail, setValue, visitorEmail, subject, t, customSubject, dispatchToastMessage]); if (commentRequired || tagRequired || canSendTranscript) { return ( diff --git a/apps/meteor/client/hooks/roomActions/useE2EERoomAction.spec.ts b/apps/meteor/client/hooks/roomActions/useE2EERoomAction.spec.ts index c9b891d7539c4..66bfadaa55f35 100644 --- a/apps/meteor/client/hooks/roomActions/useE2EERoomAction.spec.ts +++ b/apps/meteor/client/hooks/roomActions/useE2EERoomAction.spec.ts @@ -5,20 +5,18 @@ import { act, renderHook, waitFor } from '@testing-library/react'; import { E2EEState } from '../../../app/e2e/client/E2EEState'; import { e2e } from '../../../app/e2e/client/rocketchat.e2e'; import { OtrRoomState } from '../../../app/otr/lib/OtrRoomState'; -import { dispatchToastMessage } from '../../lib/toast'; import { useRoom, useRoomSubscription } from '../../views/room/contexts/RoomContext'; import { useE2EEState } from '../../views/room/hooks/useE2EEState'; import { useOTR } from '../useOTR'; import { useE2EERoomAction } from './useE2EERoomAction'; +const dispatchToastMessage = jest.fn(); + jest.mock('@rocket.chat/ui-contexts', () => ({ useSetting: jest.fn(), usePermission: jest.fn(), useEndpoint: jest.fn(), -})); - -jest.mock('../../lib/toast', () => ({ - dispatchToastMessage: jest.fn(), + useToastMessageDispatch: jest.fn(() => dispatchToastMessage), })); jest.mock('@rocket.chat/ui-client', () => ({ diff --git a/apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts b/apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts index c27ef23a5ae48..10630e513dd0a 100644 --- a/apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts +++ b/apps/meteor/client/hooks/roomActions/useE2EERoomAction.ts @@ -1,7 +1,7 @@ import { isRoomFederated } from '@rocket.chat/core-typings'; import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { imperativeModal } from '@rocket.chat/ui-client'; -import { useSetting, usePermission, useEndpoint } from '@rocket.chat/ui-contexts'; +import { useSetting, usePermission, useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; @@ -9,7 +9,6 @@ import { E2EEState } from '../../../app/e2e/client/E2EEState'; import { E2ERoomState } from '../../../app/e2e/client/E2ERoomState'; import { OtrRoomState } from '../../../app/otr/lib/OtrRoomState'; import { getRoomTypeTranslation } from '../../lib/getRoomTypeTranslation'; -import { dispatchToastMessage } from '../../lib/toast'; import { useRoom, useRoomSubscription } from '../../views/room/contexts/RoomContext'; import type { RoomToolboxActionConfig } from '../../views/room/contexts/RoomToolboxContext'; import { useE2EERoomState } from '../../views/room/hooks/useE2EERoomState'; @@ -31,6 +30,7 @@ export const useE2EERoomAction = () => { const permitted = (room.t === 'd' || (permittedToEditRoom && permittedToToggleEncryption)) && readyToEncrypt; const federated = isRoomFederated(room); const { t } = useTranslation(); + const dispatchToastMessage = useToastMessageDispatch(); const { otrState } = useOTR(); const isE2EERoomNotReady = () => { diff --git a/apps/meteor/client/hooks/useDialModal.tsx b/apps/meteor/client/hooks/useDialModal.tsx index 9c7ae5ad1663c..a71d31d51efd6 100644 --- a/apps/meteor/client/hooks/useDialModal.tsx +++ b/apps/meteor/client/hooks/useDialModal.tsx @@ -1,9 +1,8 @@ -import { useSetModal } from '@rocket.chat/ui-contexts'; +import { useSetModal, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { Suspense, lazy, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useIsVoipEnterprise } from '../contexts/CallContext'; -import { dispatchToastMessage } from '../lib/toast'; const DialPadModal = lazy(() => import('../voip/modal/DialPad/DialPadModal')); @@ -19,8 +18,9 @@ type DialModalControls = { export const useDialModal = (): DialModalControls => { const setModal = useSetModal(); - const isEnterprise = useIsVoipEnterprise(); const { t } = useTranslation(); + const dispatchToastMessage = useToastMessageDispatch(); + const isEnterprise = useIsVoipEnterprise(); const closeDialModal = useCallback(() => setModal(null), [setModal]); @@ -39,7 +39,7 @@ export const useDialModal = (): DialModalControls => { , ); }, - [setModal, isEnterprise, t, closeDialModal], + [isEnterprise, setModal, closeDialModal, dispatchToastMessage, t], ); return useMemo( diff --git a/apps/meteor/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx b/apps/meteor/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx index 2477341565dfa..7c8759c42241a 100644 --- a/apps/meteor/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx +++ b/apps/meteor/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx @@ -1,13 +1,12 @@ import type { IRoom } from '@rocket.chat/core-typings'; import { LivechatPriorityWeight } from '@rocket.chat/core-typings'; -import { useEndpoint } from '@rocket.chat/ui-contexts'; +import { useEndpoint, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useOmnichannelPriorities } from './useOmnichannelPriorities'; import { roomsQueryKeys } from '../../lib/queryKeys'; -import { dispatchToastMessage } from '../../lib/toast'; import { PRIORITY_ICONS } from '../priorities/PriorityIcon'; export const useOmnichannelPrioritiesMenu = (rid: IRoom['_id']) => { @@ -16,6 +15,7 @@ export const useOmnichannelPrioritiesMenu = (rid: IRoom['_id']) => { const updateRoomPriority = useEndpoint('POST', '/v1/livechat/room/:rid/priority', { rid }); const removeRoomPriority = useEndpoint('DELETE', '/v1/livechat/room/:rid/priority', { rid }); const { data: priorities } = useOmnichannelPriorities(); + const dispatchToastMessage = useToastMessageDispatch(); return useMemo(() => { const handlePriorityChange = (priorityId: string) => async () => { diff --git a/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslateWithData.tsx b/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslateWithData.tsx index 7d9bc31e8ba87..061fbd7722a3b 100644 --- a/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslateWithData.tsx +++ b/apps/meteor/client/views/room/contextualBar/AutoTranslate/AutoTranslateWithData.tsx @@ -1,5 +1,5 @@ import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; -import { useEndpoint, useLanguage } from '@rocket.chat/ui-contexts'; +import { useEndpoint, useLanguage, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import type { ChangeEvent, ReactElement } from 'react'; import { useEffect, useState, memo } from 'react'; @@ -8,7 +8,6 @@ import { useTranslation } from 'react-i18next'; import AutoTranslate from './AutoTranslate'; import { useEndpointAction } from '../../../../hooks/useEndpointAction'; import { miscQueryKeys } from '../../../../lib/queryKeys'; -import { dispatchToastMessage } from '../../../../lib/toast'; import { useRoom, useRoomSubscription } from '../../contexts/RoomContext'; import { useRoomToolbox } from '../../contexts/RoomToolboxContext'; @@ -32,6 +31,8 @@ const AutoTranslateWithData = (): ReactElement => { const languagesDict = supportedLanguages ? Object.fromEntries(supportedLanguages.map((lang) => [lang.language, lang.name])) : {}; + const dispatchToastMessage = useToastMessageDispatch(); + const handleChangeLanguage = useEffectEvent((value: string) => { setCurrentLanguage(value); diff --git a/apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx b/apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx index 001629c924c3d..3471a084949ac 100644 --- a/apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx +++ b/apps/meteor/client/views/room/modals/E2EEModals/ResetKeysE2EEModal.tsx @@ -1,9 +1,9 @@ import { Box, ModalFooterAnnotation, ModalIcon } from '@rocket.chat/fuselage'; import { ExternalLink, GenericModal } from '@rocket.chat/ui-client'; +import { useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import { Trans, useTranslation } from 'react-i18next'; -import { dispatchToastMessage } from '../../../../lib/toast'; import { useE2EEResetRoomKey } from '../../hooks/useE2EEResetRoomKey'; const E2EE_RESET_KEY_LINK = 'https://go.rocket.chat/i/e2ee-guide'; @@ -18,6 +18,8 @@ const ResetKeysE2EEModal = ({ roomType, roomId, onCancel }: ResetKeysE2EEModalPr const { t } = useTranslation(); const resetRoomKeyMutation = useE2EEResetRoomKey(); + const dispatchToastMessage = useToastMessageDispatch(); + const handleResetRoomKey = () => { resetRoomKeyMutation.mutate( { roomId }, diff --git a/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx b/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx index 2740063a25bb7..7c0ce9ac2f6ff 100644 --- a/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx +++ b/apps/meteor/client/views/setupWizard/steps/RegisterServerStep.tsx @@ -1,12 +1,11 @@ import { RegisterServerPage, RegisterOfflinePage } from '@rocket.chat/onboarding-ui'; -import { useEndpoint, useMethod } from '@rocket.chat/ui-contexts'; +import { useEndpoint, useMethod, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useMutation, useQuery } from '@tanstack/react-query'; import type { ReactElement, ComponentProps } from 'react'; import { useState } from 'react'; import { I18nextProvider, useTranslation } from 'react-i18next'; import { useInvalidateLicense } from '../../../hooks/useLicense'; -import { dispatchToastMessage } from '../../../lib/toast'; import { useSetupWizardContext } from '../contexts/SetupWizardContext'; const SERVER_OPTIONS = { @@ -53,6 +52,8 @@ const RegisterServerStep = (): ReactElement => { select: (data) => data.offline, }); + const dispatchToastMessage = useToastMessageDispatch(); + const { mutate } = useMutation({ mutationKey: ['setupWizard/confirmOfflineRegistration'], mutationFn: async (token: string) => registerManually({ cloudBlob: token }), @@ -79,13 +80,13 @@ const RegisterServerStep = (): ReactElement => { termsHref='https://rocket.chat/terms' policyHref='https://rocket.chat/privacy' clientKey={clientKey || ''} - onCopySecurityCode={(): void => dispatchToastMessage({ type: 'success', message: t('Copied') })} - onBackButtonClick={(): void => setServerOption(SERVER_OPTIONS.REGISTERED)} + onCopySecurityCode={() => dispatchToastMessage({ type: 'success', message: t('Copied') })} + onBackButtonClick={() => setServerOption(SERVER_OPTIONS.REGISTERED)} onSubmit={handleConfirmOffline} /> ) : ( setServerOption(SERVER_OPTIONS.OFFLINE)} + onClickRegisterOffline={() => setServerOption(SERVER_OPTIONS.OFFLINE)} stepCount={maxSteps} onSubmit={handleRegister} currentStep={currentStep}