diff --git a/packages/help-center/src/data/use-support-status.ts b/packages/help-center/src/data/use-support-status.ts index 1ab92b8365f3..89cfa733f006 100644 --- a/packages/help-center/src/data/use-support-status.ts +++ b/packages/help-center/src/data/use-support-status.ts @@ -1,6 +1,7 @@ import { keepPreviousData, useQuery } from '@tanstack/react-query'; import apiFetch from '@wordpress/api-fetch'; import wpcomRequest, { canAccessWpcomApis } from 'wpcom-proxy-request'; +import { useHelpCenterContext } from '../contexts/HelpCenterContext'; import { SupportStatus } from '../types'; // Bump me to invalidate the cache. @@ -12,13 +13,15 @@ interface APIFetchOptions { } export function useSupportStatus( enabled = true ) { + const { currentUser } = useHelpCenterContext(); + return useQuery< SupportStatus, Error >( { queryKey: [ 'support-status', VERSION ], queryFn: async () => canAccessWpcomApis() ? await wpcomRequest( { path: '/help/support-status', apiNamespace: 'wpcom/v2' } ) : await apiFetch( { path: 'help-center/support-status', global: true } as APIFetchOptions ), - enabled, + enabled: enabled && !! currentUser?.ID, refetchOnWindowFocus: false, placeholderData: keepPreviousData, staleTime: 180000, // 3mins. diff --git a/packages/odie-client/src/index.tsx b/packages/odie-client/src/index.tsx index 07b18c860b36..fde5f1369c7d 100644 --- a/packages/odie-client/src/index.tsx +++ b/packages/odie-client/src/index.tsx @@ -36,3 +36,4 @@ export { useOdieAssistantContext } from './context'; export type { Conversations, OdieConversation, OdieMessage, SupportInteraction } from './types'; export type { ZendeskConversation, ZendeskMessage } from '@automattic/zendesk-client'; export { useManagedOdieChat } from './data/use-managed-odie-chat'; +export { convertOdieChatToOdieConversation } from './utils/chat-utils'; diff --git a/packages/odie-client/src/types.ts b/packages/odie-client/src/types.ts index 68c92650a025..722c3f4f9e97 100644 --- a/packages/odie-client/src/types.ts +++ b/packages/odie-client/src/types.ts @@ -56,7 +56,7 @@ export type CurrentUser = { display_name: string; avatar_URL?: string; email?: string; - id?: number; + ID?: number; }; export type Source = { @@ -159,6 +159,7 @@ export type Message = { created_at?: string; feedbackOptions?: MessageAction[]; metadata?: Record< string, any >; + ts?: number; payload?: string; /** * Timestamp of the message. @@ -215,6 +216,7 @@ type Metadata = { createdAt: number; supportInteractionId: string; status: InteractionStatus; + botSlug?: string; }; export type OdieConversation = { @@ -224,13 +226,21 @@ export type OdieConversation = { metadata?: Metadata; }; +export type LoggedOutOdieConversation = OdieConversation & { + metadata: { + sessionId: string; + } & Metadata; +}; + export type SupportInteractionDraft = { bot_slug: OdieAllowedBots; event_external_id: string; event_source: SupportProvider; }; -export type Conversations = Array< OdieConversation | ZendeskConversation >; +export type Conversations = Array< + OdieConversation | LoggedOutOdieConversation | ZendeskConversation +>; export type SupportInteractionUser = { user_id: string; diff --git a/packages/odie-client/src/utils/chat-utils.ts b/packages/odie-client/src/utils/chat-utils.ts index 34b3d6d39cd3..50a4361f04c3 100644 --- a/packages/odie-client/src/utils/chat-utils.ts +++ b/packages/odie-client/src/utils/chat-utils.ts @@ -1,5 +1,5 @@ import { getTimestamp } from './get-timestamp'; -import type { Chat } from '../types'; +import type { Chat, OdieChat, OdieMessage, Message, LoggedOutOdieConversation } from '../types'; const MAX_ESCALATION_ATTEMPT_TIME = 3 * 24 * 60 * 60 * 1000; // three days @@ -30,3 +30,31 @@ export const hasRecentEscalationAttempt = ( chat: Chat ) => { return false; }; + +function convertMessageToOdieMessage( message: Message ): OdieMessage { + return { + received: message.ts || 0, + role: message.role, + text: message.content as string, + }; +} + +export const convertOdieChatToOdieConversation = ( + odieChat: OdieChat, + sessionId: string, + botSlug: string +): LoggedOutOdieConversation => { + return { + id: odieChat.odieId?.toString() || '', + messages: odieChat.messages.map( ( message ) => convertMessageToOdieMessage( message ) ), + createdAt: odieChat.messages[ 0 ].ts || 0, + metadata: { + odieChatId: odieChat.odieId || 0, + createdAt: odieChat.messages[ 0 ].ts || 0, + supportInteractionId: '', + status: 'open', + botSlug, + sessionId, + }, + }; +}; diff --git a/packages/wpcom-proxy-request/src/index.js b/packages/wpcom-proxy-request/src/index.js index 292b11d2eeb9..e5eafa49a938 100644 --- a/packages/wpcom-proxy-request/src/index.js +++ b/packages/wpcom-proxy-request/src/index.js @@ -210,6 +210,25 @@ export function requestAllBlogsAccess() { return request( { metaAPI: { accessAllUsersBlogs: true } } ); } +/** + * Set localStorage item in the proxy iframe. + * @param {string} key - The key to set. + * @param {string} value - The value to set. + * @returns {Promise} - A promise that resolves when the item is set. + */ +export function setCrossOriginStorageItem( key, value ) { + return request( { metaAPI: { setCrossOriginStorageItem: { key, value } } } ); +} + +/** + * Get localStorage item in the proxy iframe. + * @param {string} key - The key to get. + * @returns {Promise} - A promise that resolves when the item is set. + */ +export function getCrossOriginStorageItem( key ) { + return request( { metaAPI: { getCrossOriginStorageItem: { key } } } ); +} + /** * Calls the `postMessage()` function on the