File: /wordpress/plugins/jetpack/16.0/_inc/content-guidelines-ai/hooks/use-generate-all.js
import { useAiFeature } from '@automattic/jetpack-ai-client';
import { useDispatch, useSelect } from '@wordpress/data';
import { useCallback } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { store as noticesStore } from '@wordpress/notices';
import { STORE_NAME, VALID_SECTIONS } from '../constants';
import { suggestGuidelines } from '../lib/api';
import { recordGuidelinesEvent } from '../lib/tracks';
import { AI_STORE_NAME } from '../store';
/**
* Hook that returns a callback to generate suggestions for all sections.
*
* @return {{ generate: Function, loading: boolean }} Generate callback and loading state.
*/
export default function useGenerateAll() {
const { createErrorNotice } = useDispatch( noticesStore );
const { startLoading, stopLoading, setSuggestion } = useDispatch( AI_STORE_NAME );
const loading = useSelect( select => select( AI_STORE_NAME ).isLoading(), [] );
const { hasFeature } = useAiFeature();
const allGuidelines = useSelect( select => {
const store = select( STORE_NAME );
return Object.fromEntries( VALID_SECTIONS.map( slug => [ slug, store.getGuideline( slug ) ] ) );
}, [] );
const generate = useCallback( async () => {
if ( ! hasFeature ) {
return;
}
const allEmpty = VALID_SECTIONS.every( slug => ! allGuidelines[ slug ] );
recordGuidelinesEvent( 'generate_all', {
action: allEmpty ? 'generate' : 'improve',
} );
startLoading();
try {
const existingContent = Object.fromEntries(
VALID_SECTIONS.filter( slug => allGuidelines[ slug ] ).map( slug => [
slug,
allGuidelines[ slug ],
] )
);
const response = await suggestGuidelines( VALID_SECTIONS, existingContent );
const suggestions = response?.suggestions || {};
const appliedSlugs = VALID_SECTIONS.filter( slug => suggestions[ slug ] );
// No usable suggestions came back — surface it like any other failure.
if ( appliedSlugs.length === 0 ) {
throw new Error( 'No suggestions returned.' );
}
appliedSlugs.forEach( slug => setSuggestion( slug, suggestions[ slug ] ) );
} catch {
createErrorNotice( __( 'Failed to generate guidelines. Please try again.', 'jetpack' ), {
type: 'snackbar',
} );
} finally {
stopLoading();
}
}, [ hasFeature, allGuidelines, startLoading, stopLoading, setSuggestion, createErrorNotice ] );
return { generate, loading, hasFeature };
}