woocommerce/plugins/woocommerce-admin/client/customize-store/design-with-ai/actions.ts

227 lines
4.8 KiB
TypeScript

/**
* External dependencies
*/
import { assign } from 'xstate';
import { getQuery, updateQueryString } from '@woocommerce/navigation';
import { recordEvent } from '@woocommerce/tracks';
/**
* Internal dependencies
*/
import {
ColorPaletteResponse,
designWithAiStateMachineContext,
designWithAiStateMachineEvents,
FontPairing,
LookAndToneCompletionResponse,
Header,
Footer,
} from './types';
import { aiWizardClosedBeforeCompletionEvent } from './events';
import {
businessInfoDescriptionCompleteEvent,
lookAndFeelCompleteEvent,
toneOfVoiceCompleteEvent,
} from './pages';
const assignBusinessInfoDescription = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
businessInfoDescription: ( _context, event: unknown ) => {
return {
descriptionText: ( event as businessInfoDescriptionCompleteEvent )
.payload,
};
},
} );
const assignLookAndFeel = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
lookAndFeel: ( _context, event: unknown ) => {
return {
choice: ( event as lookAndFeelCompleteEvent ).payload,
};
},
} );
const assignToneOfVoice = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
toneOfVoice: ( _context, event: unknown ) => {
return {
choice: ( event as toneOfVoiceCompleteEvent ).payload,
};
},
} );
const assignLookAndTone = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
lookAndFeel: ( _context, event: unknown ) => {
return {
choice: ( event as { data: LookAndToneCompletionResponse } ).data
.look,
};
},
toneOfVoice: ( _context, event: unknown ) => {
return {
choice: ( event as { data: LookAndToneCompletionResponse } ).data
.tone,
};
},
} );
const assignDefaultColorPalette = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
aiSuggestions: ( context, event: unknown ) => {
return {
...context.aiSuggestions,
defaultColorPalette: (
event as {
data: {
response: ColorPaletteResponse;
};
}
).data.response,
};
},
} );
const assignFontPairing = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
aiSuggestions: ( context, event: unknown ) => {
return {
...context.aiSuggestions,
fontPairing: (
event as {
data: {
response: FontPairing;
};
}
).data.response.pair_name,
};
},
} );
const assignHeader = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
aiSuggestions: ( context, event: unknown ) => {
return {
...context.aiSuggestions,
header: (
event as {
data: {
response: Header;
};
}
).data.response.slug,
};
},
} );
const assignFooter = assign<
designWithAiStateMachineContext,
designWithAiStateMachineEvents
>( {
aiSuggestions: ( context, event: unknown ) => {
return {
...context.aiSuggestions,
footer: (
event as {
data: {
response: Footer;
};
}
).data.response.slug,
};
},
} );
const logAIAPIRequestError = () => {
// log AI API request error
// eslint-disable-next-line no-console
console.log( 'API Request error' );
};
const updateQueryStep = (
_context: unknown,
_evt: unknown,
{ action }: { action: unknown }
) => {
const { path } = getQuery() as { path: string };
const step = ( action as { step: string } ).step;
const pathFragments = path.split( '/' ); // [0] '', [1] 'customize-store', [2] cys step slug [3] design-with-ai step slug
if (
pathFragments[ 1 ] === 'customize-store' &&
pathFragments[ 2 ] === 'design-with-ai'
) {
if ( pathFragments[ 3 ] !== step ) {
// this state machine is only concerned with [2], so we ignore changes to [3]
// [1] is handled by router at root of wc-admin
updateQueryString(
{},
`/customize-store/design-with-ai/${ step }`
);
}
}
};
const recordTracksStepViewed = (
_context: unknown,
_event: unknown,
{ action }: { action: unknown }
) => {
const { step } = action as { step: string };
recordEvent( 'customize_your_store_ai_wizard_step_view', {
step,
} );
};
const recordTracksStepClosed = (
_context: unknown,
event: aiWizardClosedBeforeCompletionEvent
) => {
const { step } = event.payload;
recordEvent( `customize_your_store_ai_wizard_step_close`, {
step: step.replaceAll( '-', '_' ),
} );
};
const recordTracksStepCompleted = (
_context: unknown,
_event: unknown,
{ action }: { action: unknown }
) => {
const { step } = action as { step: string };
recordEvent( 'customize_your_store_ai_wizard_step_complete', {
step,
} );
};
export const actions = {
assignBusinessInfoDescription,
assignLookAndFeel,
assignToneOfVoice,
assignLookAndTone,
assignDefaultColorPalette,
assignFontPairing,
assignHeader,
assignFooter,
logAIAPIRequestError,
updateQueryStep,
recordTracksStepViewed,
recordTracksStepClosed,
recordTracksStepCompleted,
};