[FIX] Omnichannel transcript button without user's email (#23150)

* fix

* different approach

* use async await

* useEndpoint

* fix

Co-authored-by: Kevin Aleman <kevin.aleman@rocket.chat>
pull/23204/head^2
Tiago Evangelista Pinto 4 years ago committed by GitHub
parent d40c8e76fb
commit 046fcd84ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      client/views/omnichannel/directory/contacts/contextualBar/ContactNewEdit.js
  2. 48
      client/views/room/Header/Omnichannel/QuickActions/hooks/useQuickActions.tsx
  3. 1
      packages/rocketchat-i18n/i18n/en.i18n.json

@ -8,11 +8,11 @@ import { isEmail } from '../../../../../../app/utils/client';
import CustomFieldsForm from '../../../../../components/CustomFieldsForm'; import CustomFieldsForm from '../../../../../components/CustomFieldsForm';
import VerticalBar from '../../../../../components/VerticalBar'; import VerticalBar from '../../../../../components/VerticalBar';
import { createToken } from '../../../../../components/helpers'; import { createToken } from '../../../../../components/helpers';
import { useEndpoint } from '../../../../../contexts/ServerContext';
import { useToastMessageDispatch } from '../../../../../contexts/ToastMessagesContext'; import { useToastMessageDispatch } from '../../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../contexts/TranslationContext'; import { useTranslation } from '../../../../../contexts/TranslationContext';
import { AsyncStatePhase } from '../../../../../hooks/useAsyncState'; import { AsyncStatePhase } from '../../../../../hooks/useAsyncState';
import { useComponentDidUpdate } from '../../../../../hooks/useComponentDidUpdate'; import { useComponentDidUpdate } from '../../../../../hooks/useComponentDidUpdate';
import { useEndpointAction } from '../../../../../hooks/useEndpointAction';
import { useEndpointData } from '../../../../../hooks/useEndpointData'; import { useEndpointData } from '../../../../../hooks/useEndpointData';
import { useForm } from '../../../../../hooks/useForm'; import { useForm } from '../../../../../hooks/useForm';
import { formsSubscription } from '../../../additionalForms'; import { formsSubscription } from '../../../additionalForms';
@ -107,15 +107,9 @@ function ContactNewEdit({ id, data, close }) {
[allCustomFields], [allCustomFields],
); );
const saveContact = useEndpointAction('POST', 'omnichannel/contact'); const saveContact = useEndpoint('POST', 'omnichannel/contact');
const emailAlreadyExistsAction = useEndpointAction( const emailAlreadyExistsAction = useEndpoint('GET', `omnichannel/contact.search?email=${email}`);
'GET', const phoneAlreadyExistsAction = useEndpoint('GET', `omnichannel/contact.search?phone=${phone}`);
`omnichannel/contact.search?email=${email}`,
);
const phoneAlreadyExistsAction = useEndpointAction(
'GET',
`omnichannel/contact.search?phone=${phone}`,
);
const checkEmailExists = useMutableCallback(async () => { const checkEmailExists = useMutableCallback(async () => {
if (!isEmail(email)) { if (!isEmail(email)) {

@ -17,6 +17,7 @@ import { useSetModal } from '../../../../../../contexts/ModalContext';
import { useOmnichannelRouteConfig } from '../../../../../../contexts/OmnichannelContext'; import { useOmnichannelRouteConfig } from '../../../../../../contexts/OmnichannelContext';
import { useEndpoint, useMethod } from '../../../../../../contexts/ServerContext'; import { useEndpoint, useMethod } from '../../../../../../contexts/ServerContext';
import { useSetting } from '../../../../../../contexts/SettingsContext'; import { useSetting } from '../../../../../../contexts/SettingsContext';
import { useToastMessageDispatch } from '../../../../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../../../../contexts/TranslationContext'; import { useTranslation } from '../../../../../../contexts/TranslationContext';
import { useUserId } from '../../../../../../contexts/UserContext'; import { useUserId } from '../../../../../../contexts/UserContext';
import { handleError } from '../../../../../../lib/utils/handleError'; import { handleError } from '../../../../../../lib/utils/handleError';
@ -33,13 +34,13 @@ export const useQuickActions = (
const setModal = useSetModal(); const setModal = useSetModal();
const t = useTranslation(); const t = useTranslation();
const dispatchToastMessage = useToastMessageDispatch();
const context = useQuickActionsContext(); const context = useQuickActionsContext();
const actions = (Array.from(context.actions.values()) as QuickActionsActionConfig[]).sort( const actions = (Array.from(context.actions.values()) as QuickActionsActionConfig[]).sort(
(a, b) => (a.order || 0) - (b.order || 0), (a, b) => (a.order || 0) - (b.order || 0),
); );
const [onHoldModalActive, setOnHoldModalActive] = useState(false); const [onHoldModalActive, setOnHoldModalActive] = useState(false);
const [email, setEmail] = useState('');
const visitorRoomId = room.v._id; const visitorRoomId = room.v._id;
const rid = room._id; const rid = room._id;
@ -52,18 +53,16 @@ export const useQuickActions = (
if (!visitorRoomId) { if (!visitorRoomId) {
return; return;
} }
const { const {
visitor: { visitorEmails }, visitor: { visitorEmails },
} = await getVisitorInfo({ visitorId: visitorRoomId }); } = await getVisitorInfo({ visitorId: visitorRoomId });
if (visitorEmails?.length && visitorEmails[0].address) { if (visitorEmails?.length && visitorEmails[0].address) {
setEmail(visitorEmails[0].address); return visitorEmails[0].address;
} }
}); });
useEffect(() => {
getVisitorEmail();
}, [visitorRoomId, getVisitorEmail]);
useEffect(() => { useEffect(() => {
if (onHoldModalActive && roomLastMessage?.token) { if (onHoldModalActive && roomLastMessage?.token) {
setModal(null); setModal(null);
@ -85,7 +84,7 @@ export const useQuickActions = (
closeModal(); closeModal();
Session.set('openedRoom', null); Session.set('openedRoom', null);
FlowRouter.go('/home'); FlowRouter.go('/home');
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, [closeModal, methodReturn, rid]); }, [closeModal, methodReturn, rid]);
@ -99,7 +98,7 @@ export const useQuickActions = (
closeModal(); closeModal();
RoomManager.close(`l${rid}`); RoomManager.close(`l${rid}`);
toastr.success(t('Livechat_transcript_has_been_requested')); toastr.success(t('Livechat_transcript_has_been_requested'));
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, },
@ -113,7 +112,7 @@ export const useQuickActions = (
try { try {
await sendTranscript(token, rid, email, subject); await sendTranscript(token, rid, email, subject);
closeModal(); closeModal();
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, },
@ -127,7 +126,7 @@ export const useQuickActions = (
await discardTranscript(rid); await discardTranscript(rid);
toastr.success(t('Livechat_transcript_request_has_been_canceled')); toastr.success(t('Livechat_transcript_request_has_been_canceled'));
closeModal(); closeModal();
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, [closeModal, discardTranscript, rid, t]); }, [closeModal, discardTranscript, rid, t]);
@ -168,7 +167,7 @@ export const useQuickActions = (
toastr.success(t('Transferred')); toastr.success(t('Transferred'));
FlowRouter.go('/'); FlowRouter.go('/');
closeModal(); closeModal();
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, },
@ -183,7 +182,7 @@ export const useQuickActions = (
await closeChat(rid, comment, { clientAction: true, tags }); await closeChat(rid, comment, { clientAction: true, tags });
closeModal(); closeModal();
toastr.success(t('Chat_closed_successfully')); toastr.success(t('Chat_closed_successfully'));
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, },
@ -197,21 +196,28 @@ export const useQuickActions = (
await onHoldChat({ roomId: rid }); await onHoldChat({ roomId: rid });
closeModal(); closeModal();
toastr.success(t('Chat_On_Hold_Successfully')); toastr.success(t('Chat_On_Hold_Successfully'));
} catch (error) { } catch (error: any) {
handleError(error); handleError(error);
} }
}, [onHoldChat, closeModal, rid, t]); }, [onHoldChat, closeModal, rid, t]);
const openModal = useMutableCallback((id: string) => { const openModal = useMutableCallback(async (id: string) => {
switch (id) { switch (id) {
case QuickActionsEnum.MoveQueue: case QuickActionsEnum.MoveQueue:
setModal(<ReturnChatQueueModal onMoveChat={handleMoveChat} onCancel={closeModal} />); setModal(<ReturnChatQueueModal onMoveChat={handleMoveChat} onCancel={closeModal} />);
break; break;
case QuickActionsEnum.Transcript: case QuickActionsEnum.Transcript:
const visitorEmail = await getVisitorEmail();
if (!visitorEmail) {
dispatchToastMessage({ type: 'error', message: t('Customer_without_registered_email') });
break;
}
setModal( setModal(
<TranscriptModal <TranscriptModal
room={room} room={room}
email={email} email={visitorEmail}
onRequest={handleRequestTranscript} onRequest={handleRequestTranscript}
onSend={handleSendTranscript} onSend={handleSendTranscript}
onDiscard={handleDiscardTranscript} onDiscard={handleDiscardTranscript}
@ -258,17 +264,11 @@ export const useQuickActions = (
room?.open && room?.open &&
(room.u?._id === uid || hasManagerRole) && (room.u?._id === uid || hasManagerRole) &&
room?.lastMessage?.t !== 'livechat-close'; room?.lastMessage?.t !== 'livechat-close';
const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined;
const canForwardGuest = usePermission('transfer-livechat-guest'); const canForwardGuest = usePermission('transfer-livechat-guest');
const canSendTranscript = usePermission('send-omnichannel-chat-transcript'); const canSendTranscript = usePermission('send-omnichannel-chat-transcript');
const canCloseOthersRoom = usePermission('close-others-livechat-room');
const canCloseRoom = usePermission('close-livechat-room'); const canCloseRoom = usePermission('close-livechat-room');
const canCloseOthersRoom = usePermission('close-others-livechat-room');
const canMoveQueue = !!omnichannelRouteConfig?.returnQueue && room?.u !== undefined;
const canPlaceChatOnHold = Boolean( const canPlaceChatOnHold = Boolean(
!room.onHold && room.u && !(room as any).lastMessage?.token && manualOnHoldAllowed, !room.onHold && room.u && !(room as any).lastMessage?.token && manualOnHoldAllowed,
); );
@ -280,7 +280,7 @@ export const useQuickActions = (
case QuickActionsEnum.ChatForward: case QuickActionsEnum.ChatForward:
return !!roomOpen && canForwardGuest; return !!roomOpen && canForwardGuest;
case QuickActionsEnum.Transcript: case QuickActionsEnum.Transcript:
return !!email && canSendTranscript; return canSendTranscript;
case QuickActionsEnum.CloseChat: case QuickActionsEnum.CloseChat:
return !!roomOpen && (canCloseRoom || canCloseOthersRoom); return !!roomOpen && (canCloseRoom || canCloseOthersRoom);
case QuickActionsEnum.OnHoldChat: case QuickActionsEnum.OnHoldChat:

@ -1314,6 +1314,7 @@
"Custom_User_Status_Has_Been_Deleted": "Custom User Status Has Been Deleted", "Custom_User_Status_Has_Been_Deleted": "Custom User Status Has Been Deleted",
"Custom_User_Status_Info": "Custom User Status Info", "Custom_User_Status_Info": "Custom User Status Info",
"Custom_User_Status_Updated_Successfully": "Custom User Status Updated Successfully", "Custom_User_Status_Updated_Successfully": "Custom User Status Updated Successfully",
"Customer_without_registered_email": "The customer does not have a registered email address",
"Customize": "Customize", "Customize": "Customize",
"CustomSoundsFilesystem": "Custom Sounds Filesystem", "CustomSoundsFilesystem": "Custom Sounds Filesystem",
"Daily_Active_Users": "Daily Active Users", "Daily_Active_Users": "Daily Active Users",

Loading…
Cancel
Save