diff --git a/apps/meteor/client/providers/CallProvider/CallProvider.tsx b/apps/meteor/client/providers/CallProvider/CallProvider.tsx index 72756543a250..00574b49faa3 100644 --- a/apps/meteor/client/providers/CallProvider/CallProvider.tsx +++ b/apps/meteor/client/providers/CallProvider/CallProvider.tsx @@ -20,7 +20,8 @@ import { OutgoingByeRequest } from 'sip.js/lib/core'; import { CustomSounds } from '../../../app/custom-sounds/client'; import { getUserPreference } from '../../../app/utils/client'; -import { WrapUpCallModal } from '../../components/voip/modal/WrapUpCallModal'; +import { useHasLicense } from '../../../ee/client/hooks/useHasLicense'; +import { WrapUpCallModal } from '../../../ee/client/voip/components/modals/WrapUpCallModal'; import { CallContext, CallContextValue } from '../../contexts/CallContext'; import { roomCoordinator } from '../../lib/rooms/roomCoordinator'; import { QueueAggregator } from '../../lib/voip/QueueAggregator'; @@ -53,6 +54,7 @@ export const CallProvider: FC = ({ children }) => { const result = useVoipClient(); const user = useUser(); const homeRoute = useRoute('home'); + const isEnterprise = useHasLicense('voip-enterprise'); const remoteAudioMediaRef = useRef(null); // TODO: Create a dedicated file for the AUDIO and make the controls accessible @@ -61,7 +63,7 @@ export const CallProvider: FC = ({ children }) => { const [roomInfo, setRoomInfo] = useState<{ v: { token?: string }; rid: string }>(); const closeRoom = useCallback( - async (data): Promise => { + async (data = {}): Promise => { roomInfo && (await voipCloseRoomEndpoint({ rid: roomInfo.rid, @@ -86,6 +88,15 @@ export const CallProvider: FC = ({ children }) => { const [networkStatus, setNetworkStatus] = useState('online'); + const handleWrapUp = useCallback(() => { + if (isEnterprise) { + openWrapUpModal(); + return; + } + + closeRoom(); + }, [isEnterprise, openWrapUpModal, closeRoom]); + useEffect(() => { if (!result?.voipClient) { return; @@ -154,12 +165,14 @@ export const CallProvider: FC = ({ children }) => { const handleCallHangup = (_event: { roomId: string }): void => { setQueueName(queueAggregator.getCurrentQueueName()); - openWrapUpModal(); + + handleWrapUp(); + dispatchEvent({ event: VoipClientEvents['VOIP-CALL-ENDED'], rid: _event.roomId }); }; return subscribeToNotifyUser(`${user._id}/call.hangup`, handleCallHangup); - }, [openWrapUpModal, queueAggregator, subscribeToNotifyUser, user, voipEnabled, dispatchEvent]); + }, [openWrapUpModal, queueAggregator, subscribeToNotifyUser, user, voipEnabled, dispatchEvent, handleWrapUp]); useEffect(() => { if (!result.voipClient) { diff --git a/apps/meteor/ee/app/license/server/bundles.ts b/apps/meteor/ee/app/license/server/bundles.ts index 2297d2560433..2b4d332dd206 100644 --- a/apps/meteor/ee/app/license/server/bundles.ts +++ b/apps/meteor/ee/app/license/server/bundles.ts @@ -3,6 +3,7 @@ export type BundleFeature = | 'canned-responses' | 'ldap-enterprise' | 'livechat-enterprise' + | 'voip-enterprise' | 'omnichannel-mobile-enterprise' | 'engagement-dashboard' | 'push-privacy' @@ -21,6 +22,7 @@ const bundles: IBundle = { 'canned-responses', 'ldap-enterprise', 'livechat-enterprise', + 'voip-enterprise', 'omnichannel-mobile-enterprise', 'engagement-dashboard', 'push-privacy', diff --git a/apps/meteor/ee/client/hooks/useHasLicense.js b/apps/meteor/ee/client/hooks/useHasLicense.js deleted file mode 100644 index 0e41499f0269..000000000000 --- a/apps/meteor/ee/client/hooks/useHasLicense.js +++ /dev/null @@ -1,18 +0,0 @@ -import { useState, useEffect } from 'react'; - -import { hasLicense } from '../../app/license/client'; - -export const useHasLicense = (licenseName) => { - const [license, setLicense] = useState('loading'); - - useEffect(() => { - hasLicense(licenseName).then((enabled) => { - if (enabled) { - return setLicense(true); - } - setLicense(false); - }); - }, [licenseName]); - - return license; -}; diff --git a/apps/meteor/ee/client/hooks/useHasLicense.ts b/apps/meteor/ee/client/hooks/useHasLicense.ts new file mode 100644 index 000000000000..8aea5be9a279 --- /dev/null +++ b/apps/meteor/ee/client/hooks/useHasLicense.ts @@ -0,0 +1,14 @@ +import { useState, useEffect } from 'react'; + +import { hasLicense } from '../../app/license/client'; +import { BundleFeature } from '../../app/license/server/bundles'; + +export const useHasLicense = (licenseName: BundleFeature): 'loading' | boolean => { + const [license, setLicense] = useState<'loading' | boolean>('loading'); + + useEffect(() => { + hasLicense(licenseName).then(setLicense); + }, [licenseName]); + + return license; +}; diff --git a/apps/meteor/client/components/voip/modal/WrapUpCallModal.tsx b/apps/meteor/ee/client/voip/components/modals/WrapUpCallModal.tsx similarity index 95% rename from apps/meteor/client/components/voip/modal/WrapUpCallModal.tsx rename to apps/meteor/ee/client/voip/components/modals/WrapUpCallModal.tsx index b8b54a795b68..702d9b74cb61 100644 --- a/apps/meteor/client/components/voip/modal/WrapUpCallModal.tsx +++ b/apps/meteor/ee/client/voip/components/modals/WrapUpCallModal.tsx @@ -3,7 +3,7 @@ import { useSetModal, useTranslation } from '@rocket.chat/ui-contexts'; import React, { ReactElement, useEffect } from 'react'; import { useForm, SubmitHandler } from 'react-hook-form'; -import Tags from '../../Omnichannel/Tags'; +import Tags from '../../../../../client/components/Omnichannel/Tags'; type WrapUpCallPayload = { comment: string; @@ -42,8 +42,6 @@ export const WrapUpCallModal = ({ closeRoom }: WrapUpCallModalProps): ReactEleme closeModal(); }; - useEffect(() => closeRoom, [closeRoom]); - return (