Skip to content

Commit d096256

Browse files
Help Center: Add loading state when transferring to Zendesk (#107875)
* Remove transfer messages * Use thinking placeholder * Add zendesk staging * Change copy * Better copy * Refactor code * Get message from const * No Odie transfer needed * Reitnroduce transfer messages * Better user message * Change copy
1 parent e52e873 commit d096256

File tree

12 files changed

+77
-68
lines changed

12 files changed

+77
-68
lines changed

packages/odie-client/src/components/message/messages-cluster/messages-cluster.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { isCSATMessage } from '../../../utils';
66
import {
77
hasFeedbackForm,
88
isAttachment,
9-
isTransitionToSupportMessage,
9+
isZendeskChatStartedMessage,
1010
isZendeskIntroMessage,
1111
} from '../../../utils/csat';
1212
import ChatWithSupportLabel from '../../chat-with-support';
@@ -110,7 +110,7 @@ export function MessagesClusterizer( { messages }: { messages: Message[] } ) {
110110
const groups = clusterMessagesBySender( messages );
111111

112112
return groups.map( ( group ) => {
113-
const startingHumanSupport = group.messages.some( isTransitionToSupportMessage );
113+
const startingHumanSupport = group.messages.some( isZendeskChatStartedMessage );
114114
const endingHumanSupport = group.messages.some( isCSATMessage );
115115

116116
const messageHeader = () => {

packages/odie-client/src/components/message/messages-cluster/style.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@
4040
.odie-chatbox-message {
4141
margin-bottom: 16px;
4242
}
43+
44+
.odie-chatbox-message-meta {
45+
margin-bottom: 0;
46+
}
4347
}
4448

4549
&.role-business {

packages/odie-client/src/components/message/messages-container.tsx

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import { isTestModeEnvironment } from '@automattic/zendesk-client';
12
import { Spinner } from '@wordpress/components';
3+
import { __ } from '@wordpress/i18n';
24
import clx from 'classnames';
35
import { useEffect, useRef, useState } from 'react';
46
import { NavigationType, useNavigate, useNavigationType, useSearchParams } from 'react-router-dom';
@@ -27,6 +29,7 @@ interface ChatMessagesProps {
2729
export const MessagesContainer = ( { currentUser }: ChatMessagesProps ) => {
2830
const { chat, isChatLoaded, isUserEligibleForPaidSupport, forceEmailSupport } =
2931
useOdieAssistantContext();
32+
const isTestMode = isTestModeEnvironment();
3033
const createZendeskConversation = useCreateZendeskConversation();
3134
const [ searchParams, setSearchParams ] = useSearchParams();
3235
const navigate = useNavigate();
@@ -141,13 +144,14 @@ export const MessagesContainer = ( { currentUser }: ChatMessagesProps ) => {
141144
{ chat.messages?.length > 0 && <MessagesClusterizer messages={ chat.messages } /> }
142145
<JumpToRecent containerReference={ messagesContainerRef } />
143146

144-
{ chat.provider === 'odie' && chat.status === 'sending' && (
145-
<div
146-
className="odie-chatbox__action-message"
147-
ref={ ( div ) => div?.scrollIntoView( { behavior: 'smooth', block: 'end' } ) }
148-
>
149-
<ThinkingPlaceholder />
150-
</div>
147+
{ chat.provider === 'odie' && chat.status === 'sending' && <ThinkingPlaceholder /> }
148+
{ chat.provider === 'odie' && chat.status === 'transfer' && (
149+
<ThinkingPlaceholder
150+
content={
151+
__( 'Requesting human support', __i18n_text_domain__ ) +
152+
( isTestMode ? '… (ZENDESK STAGING)' : '…' )
153+
}
154+
/>
151155
) }
152156
{ chat.provider.startsWith( 'zendesk' ) && (
153157
<ZendeskTypingIndicator conversationId={ chat.conversationId } />

packages/odie-client/src/components/message/style.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@ $blueberry-color: #3858e9;
5454
display: none;
5555
}
5656
}
57+
58+
.odie-chatbox-thinking-placeholder {
59+
align-items: center;
60+
}
5761
}
5862

5963
.odie-chatbox-message {
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
import { ThinkingMessage } from '@automattic/agenttic-ui';
22

3-
export const ThinkingPlaceholder = () => {
3+
export const ThinkingPlaceholder = ( { content }: { content?: string } ) => {
44
return (
5-
<div className="agenttic">
6-
<ThinkingMessage />
5+
<div
6+
className="odie-chatbox__action-message"
7+
ref={ ( div ) => div?.scrollIntoView( { behavior: 'smooth', block: 'end' } ) }
8+
>
9+
<div className="odie-chatbox-thinking-placeholder agenttic">
10+
<ThinkingMessage content={ content } />
11+
</div>
712
</div>
813
);
914
};

packages/odie-client/src/components/message/user-message.tsx

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,31 @@ export const UserMessage = ( {
8787
const showGetSupport = isLastBotMessage && ( isRequestingHumanSupport || isErrorMessage );
8888
const showActionButtons = ! isRequestingHumanSupport && ! isErrorMessage;
8989

90-
const shouldOverrideWithForwardMessage = isRequestingHumanSupport && chat.provider !== 'zendesk';
90+
const messageContent = () => {
91+
if ( ! isRequestingHumanSupport ) {
92+
return message.content;
93+
}
9194

92-
const messageContent = shouldOverrideWithForwardMessage
93-
? getDisplayMessage(
94-
!! hasRecentOpenConversation,
95-
isUserEligibleForPaidSupport,
96-
canConnectToZendesk,
97-
forceEmailSupport,
98-
isChatRestricted,
99-
message?.context?.flags?.is_error_message,
100-
isChatLoaded
101-
)
102-
: message.content;
95+
if ( chat.provider === 'zendesk' ) {
96+
return '';
97+
}
98+
99+
return getDisplayMessage(
100+
!! hasRecentOpenConversation,
101+
isUserEligibleForPaidSupport,
102+
canConnectToZendesk,
103+
forceEmailSupport,
104+
isChatRestricted,
105+
message?.context?.flags?.is_error_message,
106+
isChatLoaded
107+
);
108+
};
103109

104110
return (
105111
<>
106112
<div className="odie-chatbox-message__content">
107113
<MarkdownOrChildren
108-
messageContent={ messageContent }
114+
messageContent={ messageContent() }
109115
components={ {
110116
a: ( props: React.ComponentProps< 'a' > ) => <CustomALink { ...props } />,
111117
} }

packages/odie-client/src/constants.tsx

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export function getFlowFromBotSlug( botSlug?: OdieAllBotSlugs ): string {
5454
return 'wpcom';
5555
}
5656

57-
export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] => {
57+
export const getOdieTransferMessages = ( botSlug?: OdieAllBotSlugs ): Message[] => {
5858
const isTestMode = isTestModeEnvironment();
5959
const flow = getFlowFromBotSlug( botSlug );
6060

@@ -73,7 +73,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
7373
context: {
7474
flags: {
7575
hide_disclaimer_content: true,
76-
show_contact_support_msg: true,
7776
show_ai_avatar: false,
7877
},
7978
site_id: null,
@@ -91,7 +90,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
9190
context: {
9291
flags: {
9392
hide_disclaimer_content: true,
94-
show_contact_support_msg: false,
9593
show_ai_avatar: false,
9694
},
9795
site_id: null,
@@ -111,7 +109,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
111109
context: {
112110
flags: {
113111
hide_disclaimer_content: true,
114-
show_contact_support_msg: true,
115112
show_ai_avatar: false,
116113
},
117114
site_id: null,
@@ -132,7 +129,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
132129
context: {
133130
flags: {
134131
hide_disclaimer_content: true,
135-
show_contact_support_msg: true,
136132
show_ai_avatar: false,
137133
},
138134
site_id: null,
@@ -148,7 +144,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
148144
context: {
149145
flags: {
150146
hide_disclaimer_content: true,
151-
show_contact_support_msg: true,
152147
show_ai_avatar: false,
153148
},
154149
site_id: null,
@@ -157,22 +152,6 @@ export const getOdieTransferMessage = ( botSlug?: OdieAllBotSlugs ): Message[] =
157152
];
158153
};
159154

160-
export const getOdieOnErrorTransferMessage = (): Message[] => [
161-
{
162-
content: getOdieErrorMessage(),
163-
role: 'bot',
164-
type: 'message',
165-
context: {
166-
flags: {
167-
hide_disclaimer_content: true,
168-
show_contact_support_msg: false,
169-
show_ai_avatar: true,
170-
},
171-
site_id: null,
172-
},
173-
},
174-
];
175-
176155
export const getOdieThirdPartyMessageContent = (): string =>
177156
`${ __(
178157
'I’m happy to connect you to a human! However, it looks like 3rd party cookies are disabled in your browser. Please turn them on for our live chat to work properly. [Use our guide](https://wordpress.com/support/third-party-cookies/)',
@@ -203,7 +182,6 @@ export const getOdieEmailFallbackMessage = (): Message => ( {
203182
type: 'message',
204183
context: {
205184
flags: {
206-
show_contact_support_msg: false,
207185
forward_to_human_support: true,
208186
},
209187
question_tags: {
@@ -330,6 +308,20 @@ export const getOdieZendeskConnectionErrorMessage = (): Message => {
330308
};
331309
};
332310

311+
export const getZendeskChatStartedMetaMessage = (): Message => ( {
312+
content: null,
313+
role: 'bot',
314+
type: 'meta',
315+
internal_message_id: 'zendesk-chat-started',
316+
context: {
317+
site_id: null,
318+
flags: {
319+
hide_disclaimer_content: true,
320+
show_ai_avatar: false,
321+
},
322+
},
323+
} );
324+
333325
export const ODIE_THUMBS_DOWN_RATING_VALUE = 0;
334326
export const ODIE_THUMBS_UP_RATING_VALUE = 1;
335327

packages/odie-client/src/data/use-send-odie-message.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ const getErrorMessageForSiteIdAndInternalMessageId = (
4848
flags: {
4949
forward_to_human_support: true,
5050
hide_disclaimer_content: false,
51-
show_contact_support_msg: true,
5251
show_ai_avatar: true,
5352
is_error_message: true,
5453
},

packages/odie-client/src/hooks/use-create-zendesk-conversation.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@ import { useUpdateZendeskUserFields, type ZendeskConversation } from '@automatti
22
import { useLocation, useNavigate } from 'react-router-dom';
33
import Smooch from 'smooch';
44
import {
5-
getOdieOnErrorTransferMessage,
6-
getOdieTransferMessage,
75
getErrorTryAgainLaterMessage,
6+
getOdieTransferMessages,
7+
getZendeskChatStartedMetaMessage,
88
} from '../constants';
99
import { useOdieAssistantContext } from '../context';
1010
import { useManageSupportInteraction } from '../data';
1111
import { useCurrentSupportInteraction } from '../data/use-current-support-interaction';
12-
import type { OdieAllBotSlugs } from '../types';
1312

1413
export const useCreateZendeskConversation = () => {
1514
const {
@@ -81,10 +80,9 @@ export const useCreateZendeskConversation = () => {
8180
active_interaction_id: activeInteractionId || null,
8281
is_chat_loaded: isChatLoaded,
8382
} );
84-
const errorMessageObj = getErrorTryAgainLaterMessage();
8583

8684
setChat( {
87-
messages: [ ...previousMessages, errorMessageObj ],
85+
messages: [ ...previousMessages, getErrorTryAgainLaterMessage() ],
8886
status: 'loaded',
8987
provider: previousProvider,
9088
conversationId: previousConversationId,
@@ -94,14 +92,8 @@ export const useCreateZendeskConversation = () => {
9492
} );
9593
};
9694

97-
// Get transfer messages to identify and remove them on error
98-
const transferMessages = isFromError
99-
? getOdieOnErrorTransferMessage()
100-
: getOdieTransferMessage( currentSupportInteraction?.bot_slug as OdieAllBotSlugs );
101-
10295
setChat( ( prevChat ) => ( {
10396
...prevChat,
104-
messages: [ ...prevChat.messages, ...transferMessages ],
10597
status: 'transfer',
10698
} ) );
10799

@@ -186,6 +178,11 @@ export const useCreateZendeskConversation = () => {
186178
setChat( ( prevChat ) => ( {
187179
...prevChat,
188180
conversationId: conversationId,
181+
messages: [
182+
...prevChat.messages,
183+
...getOdieTransferMessages( currentSupportInteraction?.bot_slug ),
184+
getZendeskChatStartedMetaMessage(),
185+
],
189186
provider: 'zendesk',
190187
status: 'loaded',
191188
} ) );

packages/odie-client/src/hooks/use-get-combined-chat.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useIsMutating } from '@tanstack/react-query';
55
import { useSelect } from '@wordpress/data';
66
import { useState, useEffect, useRef } from '@wordpress/element';
77
import { getMessageUniqueIdentifier } from '../components/message/utils/get-message-unique-identifier';
8-
import { getOdieTransferMessage } from '../constants';
8+
import { getOdieTransferMessages, getZendeskChatStartedMetaMessage } from '../constants';
99
import { emptyChat } from '../context';
1010
import { useGetZendeskConversation, useManageSupportInteraction, useOdieChat } from '../data';
1111
import { useCurrentSupportInteraction } from '../data/use-current-support-interaction';
@@ -14,7 +14,7 @@ import {
1414
getOdieIdFromInteraction,
1515
getIsRequestingHumanSupport,
1616
} from '../utils';
17-
import type { Chat, Message, OdieAllBotSlugs } from '../types';
17+
import type { Chat, Message } from '../types';
1818

1919
function isEqual( message1: Message, message2: Message ) {
2020
const message1Id = getMessageUniqueIdentifier( message1 );
@@ -142,9 +142,8 @@ export const useGetCombinedChat = (
142142
conversationId: conversation.id,
143143
messages: [
144144
...( odieChat ? filteredOdieMessages : [] ),
145-
...getOdieTransferMessage(
146-
currentSupportInteraction?.bot_slug as OdieAllBotSlugs
147-
),
145+
...getOdieTransferMessages( currentSupportInteraction?.bot_slug ),
146+
getZendeskChatStartedMetaMessage(),
148147
...( deduplicateZDMessages( [
149148
// During connection recovery, the user queued messages can be deleted. This ensure they remain. And `deduplicateZDMessages` takes of duplication.
150149
...( isSameConversation

0 commit comments

Comments
 (0)