/** * External dependencies */ import classnames from 'classnames'; import { useEffect, useState } from '@wordpress/element'; import { EllipsisMenu } from '@woocommerce/components'; import { recordEvent } from '@woocommerce/tracks'; import { useDispatch, useSelect } from '@wordpress/data'; import { OPTIONS_STORE_NAME, WCDataSelector, WEEK } from '@woocommerce/data'; import { Button, Card, CardHeader } from '@wordpress/components'; import { Text } from '@woocommerce/experimental'; import { CustomerFeedbackModal, CustomerFeedbackSimple, } from '@woocommerce/customer-effort-score'; import { __ } from '@wordpress/i18n'; /** * Internal dependencies */ import './completed-header.scss'; import HeaderImage from './completed-celebration-header.svg'; type TaskListCompletedHeaderProps = { hideTasks: () => void; keepTasks: () => void; customerEffortScore: boolean; }; const ADMIN_INSTALL_TIMESTAMP_OPTION_NAME = 'woocommerce_admin_install_timestamp'; const SHOWN_FOR_ACTIONS_OPTION_NAME = 'woocommerce_ces_shown_for_actions'; const CUSTOMER_EFFORT_SCORE_ACTION = 'store_setup'; const ALLOW_TRACKING_OPTION_NAME = 'woocommerce_allow_tracking'; function getStoreAgeInWeeks( adminInstallTimestamp: number ) { if ( adminInstallTimestamp === 0 ) { return null; } // Date.now() is ms since Unix epoch, adminInstallTimestamp is in // seconds since Unix epoch. const storeAgeInMs = Date.now() - adminInstallTimestamp * 1000; const storeAgeInWeeks = Math.round( storeAgeInMs / WEEK ); return storeAgeInWeeks; } export const TaskListCompletedHeader: React.FC< TaskListCompletedHeaderProps > = ( { hideTasks, keepTasks, customerEffortScore } ) => { const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); const [ showCesModal, setShowCesModal ] = useState( false ); const [ hasSubmittedScore, setHasSubmittedScore ] = useState( false ); const [ score, setScore ] = useState( NaN ); const [ hideCustomerEffortScore, setHideCustomerEffortScore ] = useState( false ); const { storeAgeInWeeks, cesShownForActions, canShowCustomerEffortScore } = useSelect( ( select: WCDataSelector ) => { const { getOption, hasFinishedResolution } = select( OPTIONS_STORE_NAME ); if ( customerEffortScore ) { const allowTracking = getOption( ALLOW_TRACKING_OPTION_NAME ); const adminInstallTimestamp: number = getOption( ADMIN_INSTALL_TIMESTAMP_OPTION_NAME ) || 0; const cesActions = getOption< string[] >( SHOWN_FOR_ACTIONS_OPTION_NAME ); const loadingOptions = ! hasFinishedResolution( 'getOption', [ SHOWN_FOR_ACTIONS_OPTION_NAME, ] ) || ! hasFinishedResolution( 'getOption', [ ADMIN_INSTALL_TIMESTAMP_OPTION_NAME, ] ); return { storeAgeInWeeks: getStoreAgeInWeeks( adminInstallTimestamp ), cesShownForActions: cesActions, canShowCustomerEffortScore: ! loadingOptions && allowTracking && ! ( cesActions || [] ).includes( 'store_setup' ), loading: loadingOptions, }; } return {}; } ); useEffect( () => { if ( hasSubmittedScore ) { setTimeout( () => { setHideCustomerEffortScore( true ); }, 1200 ); } }, [ hasSubmittedScore ] ); const submitScore = ( { firstScore, secondScore, comments, }: { firstScore: number; secondScore?: number; comments?: string; } ) => { recordEvent( 'ces_feedback', { action: CUSTOMER_EFFORT_SCORE_ACTION, score: firstScore, score_second_question: secondScore ?? null, score_combined: firstScore + ( secondScore ?? 0 ), comments: comments || '', store_age: storeAgeInWeeks, } ); updateOptions( { [ SHOWN_FOR_ACTIONS_OPTION_NAME ]: [ CUSTOMER_EFFORT_SCORE_ACTION, ...( cesShownForActions || [] ), ], } ); setHasSubmittedScore( true ); }; const recordScore = ( recordedScore: number ) => { if ( recordedScore > 2 ) { setScore( recordedScore ); submitScore( { firstScore: recordedScore } ); } else { setScore( recordedScore ); setShowCesModal( true ); recordEvent( 'ces_view', { action: CUSTOMER_EFFORT_SCORE_ACTION, store_age: storeAgeInWeeks, } ); } }; const recordModalScore = ( firstScore: number, secondScore: number, comments: string ) => { setShowCesModal( false ); submitScore( { firstScore, secondScore, comments } ); }; return ( <>