/** * External dependencies */ import { __ } from '@wordpress/i18n'; import { useEffect, useState } from '@wordpress/element'; import { Stepper } from '@woocommerce/components'; import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies */ import SelectWorkflowStep from './select-workflow-step'; import FindItemsStep from './find-items-step'; import QueueStep from './queue-step'; import { getWorkflowQuickFilterData } from './api-utils'; import { getWorkflow, handleFetchError } from '../base/utils'; import { getTotalPossibleResults } from './utils'; import './index.scss'; import { TRACKS_PREFIX } from '../settings'; /** * @param {string} primaryDataType * @return {string} The plural name of the data type. */ const getDataTypePluralName = ( primaryDataType ) => { const names = { order: __( 'orders', 'automatewoo' ), subscription: __( 'subscriptions', 'automatewoo' ), }; return names.hasOwnProperty( primaryDataType ) ? names[ primaryDataType ] : __( 'items', 'automatewoo' ); }; const ManualWorkflowRunner = ( { query } ) => { const [ workflow, setWorkflow ] = useState( {} ); const [ quickFilterData, setQuickFilterData ] = useState( false ); const [ foundItems, setFoundItems ] = useState( {} ); const [ currentStep, setCurrentStep ] = useState( 'select' ); const [ stepperIsPending, setStepperIsPending ] = useState( false ); const [ isPreFillingWorkflow, setIsPreFillingWorkflow ] = useState( true ); /** * Handle select workflow step completion. * * Load extra data about the selected workflow. */ const onSelectStepComplete = async () => { setStepperIsPending( true ); recordEvent( TRACKS_PREFIX + 'manual_workflow_runner_select_workflow', { conversion_tracking_enabled: workflow.is_conversion_tracking_enabled, tracking_enabled: workflow.is_tracking_enabled, title: workflow.title, type: workflow.type, trigger_name: workflow.trigger.name, } ); try { const { possibleResultCounts, primaryDataType } = await getWorkflowQuickFilterData( workflow.id ); setQuickFilterData( { possibleResultCounts, primaryDataType, primaryDataTypePluralName: getDataTypePluralName( primaryDataType ), } ); setCurrentStep( 'find' ); setStepperIsPending( false ); } catch ( error ) { handleFetchError( __( 'Error loading the workflow data.', 'automatewoo' ), error ); } }; /** * Pre-fill the selected workflow based on the query. */ useEffect( () => { const maybePreFillWorkflow = async () => { setIsPreFillingWorkflow( true ); const workflowId = typeof query.workflowId !== 'undefined' ? parseInt( query.workflowId, 10 ) : 0; if ( workflowId !== 0 ) { try { const newWorkflow = await getWorkflow( workflowId ); if ( ! newWorkflow.title ) { newWorkflow.title = __( '(no title)', 'automatewoo' ); } setWorkflow( newWorkflow ); } catch ( error ) { handleFetchError( __( "The workflow couldn't be loaded from the URL.", 'automatewoo' ), error ); } } setIsPreFillingWorkflow( false ); }; maybePreFillWorkflow(); }, [ query.workflowId ] ); const onFindStepComplete = ( newFoundItems ) => { recordEvent( TRACKS_PREFIX + 'manual_run_workflow_button_clicked', { items_count: Object.keys( newFoundItems ).length, } ); setCurrentStep( 'queue' ); setFoundItems( newFoundItems ); }; const onFindStepCancel = () => { recordEvent( TRACKS_PREFIX + 'manual_find_matching_cancel_button_clicked', {} ); setCurrentStep( 'select' ); }; const onQueueStepCancel = () => { recordEvent( TRACKS_PREFIX + 'manual_queue_items_cancel_button_clicked', {} ); setCurrentStep( 'select' ); setFoundItems( {} ); }; const findItemsStepContent = () => { if ( currentStep === 'find' && workflow && quickFilterData ) { const possibleResults = getTotalPossibleResults( quickFilterData.possibleResultCounts ); return ( ); } return ''; }; const steps = [ { key: 'select', label: __( 'Select', 'automatewoo' ), content: ( ), }, { key: 'find', label: __( 'Find', 'automatewoo' ), content: findItemsStepContent(), }, { key: 'queue', label: __( 'Queue', 'automatewoo' ), content: workflow && quickFilterData && ( ), }, ]; return ( ); }; export default ManualWorkflowRunner;