From 5c00b4cb48428a32aa24f44da7a7c3e7ac6f80d7 Mon Sep 17 00:00:00 2001 From: Tony Arcangelini <33258733+arcangelini@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:43:29 +0200 Subject: [PATCH] New Zendesk Client Package (#92179) Co-authored-by: Omar Alshaker --- .../migration-error/index.tsx | 37 ++++++---- client/components/chat-button/index.tsx | 35 +++++---- .../precancellation-chat-button/index.tsx | 1 + .../educational-content-step.tsx | 17 ++--- .../step-components/upsell-step.tsx | 6 +- .../domain-transfer-domains/index.tsx | 1 + .../domain-transfer-intro/index.tsx | 1 + client/lib/presales-chat/index.ts | 26 ++++--- client/package.json | 1 + package.json | 1 + packages/help-center/package.json | 1 + .../components/help-center-contact-form.tsx | 37 ++++++---- .../components/help-center-contact-page.tsx | 34 ++++----- .../src/components/help-center.tsx | 62 ++-------------- packages/help-center/src/hooks/index.ts | 5 -- .../help-center/src/hooks/use-chat-widget.ts | 72 ------------------- .../src/hooks/use-messaging-auth.ts | 57 --------------- .../src/hooks/use-messaging-availability.ts | 48 ------------- packages/help-center/src/types.ts | 10 --- packages/help-center/tsconfig.json | 3 +- packages/tsconfig.json | 3 +- packages/zendesk-client/README.md | 66 +++++++++++++++++ packages/zendesk-client/package.json | 39 ++++++++++ packages/zendesk-client/src/constants.ts | 2 + packages/zendesk-client/src/index.ts | 7 ++ packages/zendesk-client/src/types.ts | 39 ++++++++++ .../src/use-authenticate-zendesk-messaging.ts | 57 +++++++++++++++ .../use-can-connect-to-zendesk-messaging.ts} | 2 +- .../src/use-load-zendesk-messaging.ts} | 19 ++--- .../src/use-open-zendesk-messaging.ts | 52 ++++++++++++++ .../src}/use-update-zendesk-user-fields.ts | 19 +++-- .../src/use-zendesk-messaging-availability.ts | 45 ++++++++++++ .../src/use-zendesk-messaging-bindings.ts | 60 ++++++++++++++++ packages/zendesk-client/tsconfig-cjs.json | 7 ++ packages/zendesk-client/tsconfig.json | 11 +++ packages/zendesk-client/types.d.ts | 9 +++ yarn.lock | 19 +++++ 37 files changed, 552 insertions(+), 359 deletions(-) delete mode 100644 packages/help-center/src/hooks/use-chat-widget.ts delete mode 100644 packages/help-center/src/hooks/use-messaging-auth.ts delete mode 100644 packages/help-center/src/hooks/use-messaging-availability.ts create mode 100644 packages/zendesk-client/README.md create mode 100644 packages/zendesk-client/package.json create mode 100644 packages/zendesk-client/src/constants.ts create mode 100644 packages/zendesk-client/src/index.ts create mode 100644 packages/zendesk-client/src/types.ts create mode 100644 packages/zendesk-client/src/use-authenticate-zendesk-messaging.ts rename packages/{help-center/src/hooks/use-can-connect-to-zendesk.ts => zendesk-client/src/use-can-connect-to-zendesk-messaging.ts} (85%) rename packages/{help-center/src/hooks/use-zendesk-messaging.ts => zendesk-client/src/use-load-zendesk-messaging.ts} (75%) create mode 100644 packages/zendesk-client/src/use-open-zendesk-messaging.ts rename packages/{help-center/src/data => zendesk-client/src}/use-update-zendesk-user-fields.ts (68%) create mode 100644 packages/zendesk-client/src/use-zendesk-messaging-availability.ts create mode 100644 packages/zendesk-client/src/use-zendesk-messaging-bindings.ts create mode 100644 packages/zendesk-client/tsconfig-cjs.json create mode 100644 packages/zendesk-client/tsconfig.json create mode 100644 packages/zendesk-client/types.d.ts diff --git a/client/blocks/importer/wordpress/import-everything/migration-error/index.tsx b/client/blocks/importer/wordpress/import-everything/migration-error/index.tsx index 2aebc1b27fb1d..021e15e81e97d 100644 --- a/client/blocks/importer/wordpress/import-everything/migration-error/index.tsx +++ b/client/blocks/importer/wordpress/import-everything/migration-error/index.tsx @@ -1,11 +1,11 @@ import { HelpCenter, MigrationStatusError } from '@automattic/data-stores'; -import { - useChatStatus, - useChatWidget, - useCanConnectToZendesk, - useMessagingAvailability, -} from '@automattic/help-center/src/hooks'; +import { useChatStatus } from '@automattic/help-center/src/hooks'; import { NextButton, SubTitle, Title } from '@automattic/onboarding'; +import { + useCanConnectToZendeskMessaging, + useZendeskMessagingAvailability, + useOpenZendeskMessaging, +} from '@automattic/zendesk-client'; import { useDispatch as useDataStoreDispatch } from '@wordpress/data'; import { useTranslate } from 'i18n-calypso'; import { useCallback } from 'react'; @@ -30,7 +30,8 @@ interface Props { } export const MigrationError = ( props: Props ) => { - const { setShowHelpCenter, setInitialRoute } = useDataStoreDispatch( HELP_CENTER_STORE ); + const { setShowHelpCenter, setInitialRoute, resetStore } = + useDataStoreDispatch( HELP_CENTER_STORE ); const { sourceSiteUrl, targetSiteUrl, @@ -41,12 +42,13 @@ export const MigrationError = ( props: Props ) => { } = props; const translate = useTranslate(); const { isEligibleForChat } = useChatStatus(); - const { data: canConnectToZendesk } = useCanConnectToZendesk(); - const { data: isMessagingAvailable } = useMessagingAvailability( + const { data: canConnectToZendeskMessaging } = useCanConnectToZendeskMessaging(); + const { data: isMessagingAvailable } = useZendeskMessagingAvailability( 'wpcom_messaging', isEligibleForChat ); - const { openChatWidget, isOpeningChatWidget } = useChatWidget( + const { openZendeskWidget, isOpeningZendeskWidget } = useOpenZendeskMessaging( + 'migration-error', 'zendesk_support_chat_key', isEligibleForChat ); @@ -54,21 +56,26 @@ export const MigrationError = ( props: Props ) => { useErrorDetails( status, sourceSiteUrl, targetSiteUrl ); const getHelp = useCallback( () => { - if ( isMessagingAvailable && canConnectToZendesk ) { - openChatWidget( { + if ( isMessagingAvailable && canConnectToZendeskMessaging ) { + openZendeskWidget( { siteUrl: targetSiteUrl, message: `${ status }: Import onboarding flow; migration failed`, + onSuccess: () => { + resetStore(); + setShowHelpCenter( false ); + }, } ); } else { setInitialRoute( '/contact-form?mode=CHAT' ); setShowHelpCenter( true ); } }, [ - openChatWidget, + resetStore, + openZendeskWidget, targetSiteUrl, status, isMessagingAvailable, - canConnectToZendesk, + canConnectToZendeskMessaging, setInitialRoute, setShowHelpCenter, ] ); @@ -109,7 +116,7 @@ export const MigrationError = ( props: Props ) => { { translate( 'Contact support' ) } diff --git a/client/components/chat-button/index.tsx b/client/components/chat-button/index.tsx index fb39c5b745edb..db1aa15e62924 100644 --- a/client/components/chat-button/index.tsx +++ b/client/components/chat-button/index.tsx @@ -1,16 +1,15 @@ import { Button, Gridicon, Spinner } from '@automattic/components'; import { HelpCenter } from '@automattic/data-stores'; +import { useChatStatus } from '@automattic/help-center/src/hooks'; import { - useChatStatus, - useChatWidget, - useCanConnectToZendesk, - useMessagingAvailability, -} from '@automattic/help-center/src/hooks'; + useCanConnectToZendeskMessaging, + useZendeskMessagingAvailability, + useOpenZendeskMessaging, +} from '@automattic/zendesk-client'; import { useDispatch as useDataStoreDispatch } from '@wordpress/data'; import { useI18n } from '@wordpress/react-i18n'; import clsx from 'clsx'; -import type { MessagingGroup } from '@automattic/help-center/src/hooks/use-messaging-availability'; -import type { ZendeskConfigName } from '@automattic/help-center/src/hooks/use-zendesk-messaging'; +import type { MessagingGroup, ZendeskConfigName } from '@automattic/zendesk-client'; import type { FC } from 'react'; type ChatIntent = 'SUPPORT' | 'PRESALES' | 'PRECANCELLATION'; @@ -26,6 +25,7 @@ type Props = { siteUrl?: string; children?: React.ReactNode; withHelpCenter?: boolean; + section?: string; }; const HELP_CENTER_STORE = HelpCenter.register(); @@ -65,17 +65,19 @@ const ChatButton: FC< Props > = ( { primary = false, siteUrl, withHelpCenter = true, + section = '', } ) => { const { __ } = useI18n(); const { hasActiveChats, isEligibleForChat, isPrecancellationChatOpen, isPresalesChatOpen } = useChatStatus(); const messagingGroup = getMessagingGroupForIntent( chatIntent ); - const { data: isMessagingAvailable } = useMessagingAvailability( + const { data: isMessagingAvailable } = useZendeskMessagingAvailability( messagingGroup, isEligibleForChat ); - const { setShowHelpCenter, setInitialRoute } = useDataStoreDispatch( HELP_CENTER_STORE ); - const { data: canConnectToZendesk } = useCanConnectToZendesk(); + const { setShowHelpCenter, setInitialRoute, resetStore } = + useDataStoreDispatch( HELP_CENTER_STORE ); + const { data: canConnectToZendesk } = useCanConnectToZendeskMessaging(); function shouldShowChatButton(): boolean { if ( isEligibleForChat && hasActiveChats ) { @@ -106,18 +108,23 @@ const ChatButton: FC< Props > = ( { } const configName = getConfigNameForIntent( chatIntent ); - const { isOpeningChatWidget, openChatWidget } = useChatWidget( + const { isOpeningZendeskWidget, openZendeskWidget } = useOpenZendeskMessaging( + section, configName, shouldShowChatButton() ); const handleClick = () => { if ( canConnectToZendesk ) { - openChatWidget( { + openZendeskWidget( { message: initialMessage, siteUrl, onError, - onSuccess: onClick, + onSuccess: () => { + onClick?.(); + resetStore(); + setShowHelpCenter( false ); + }, } ); } else { setInitialRoute( '/contact-form?mode=CHAT' ); @@ -133,7 +140,7 @@ const ChatButton: FC< Props > = ( { } function getChildren() { - if ( isOpeningChatWidget ) { + if ( isOpeningZendeskWidget ) { return ; } diff --git a/client/components/marketing-survey/cancel-purchase-form/precancellation-chat-button/index.tsx b/client/components/marketing-survey/cancel-purchase-form/precancellation-chat-button/index.tsx index 0888e864a22d7..8d7bdf32f1a0a 100644 --- a/client/components/marketing-survey/cancel-purchase-form/precancellation-chat-button/index.tsx +++ b/client/components/marketing-survey/cancel-purchase-form/precancellation-chat-button/index.tsx @@ -59,6 +59,7 @@ const PrecancellationChatButton: FC< Props > = ( { siteUrl={ siteUrl } className={ clsx( 'precancellation-chat-button__main-button', className ) } onClick={ handleClick } + section="pre-cancellation" > { icon && } { hasEnTranslation( 'Need help? Contact us' ) diff --git a/client/components/marketing-survey/cancel-purchase-form/step-components/educational-content-step.tsx b/client/components/marketing-survey/cancel-purchase-form/step-components/educational-content-step.tsx index ece23860826dd..bcefc80e77c1d 100644 --- a/client/components/marketing-survey/cancel-purchase-form/step-components/educational-content-step.tsx +++ b/client/components/marketing-survey/cancel-purchase-form/step-components/educational-content-step.tsx @@ -1,7 +1,7 @@ import page from '@automattic/calypso-router'; import { MaterialIcon } from '@automattic/components'; -import { useChatWidget } from '@automattic/help-center/src/hooks'; import { useHasEnTranslation, useLocalizeUrl } from '@automattic/i18n-utils'; +import { useOpenZendeskMessaging } from '@automattic/zendesk-client'; import { Button } from '@wordpress/components'; import { useTranslate } from 'i18n-calypso'; import { useState } from 'react'; @@ -74,7 +74,8 @@ export default function EducationalCotnentStep( { type, site, ...props }: StepPr const translate = useTranslate(); const hasEnTranslation = useHasEnTranslation(); const localizeUrl = useLocalizeUrl(); - const { isOpeningChatWidget, openChatWidget } = useChatWidget(); + const { isOpeningZendeskWidget, openZendeskWidget } = + useOpenZendeskMessaging( 'pre-cancellation' ); switch ( type ) { case 'education:loading-time': @@ -254,11 +255,11 @@ export default function EducationalCotnentStep( { type, site, ...props }: StepPr ), chat: (