Skip to content

Commit

Permalink
Fix issue when generating excerpt for empty content (#2609)
Browse files Browse the repository at this point in the history
  • Loading branch information
vaurdan committed Jul 5, 2024
1 parent 3384816 commit 0a7f241
Show file tree
Hide file tree
Showing 9 changed files with 62 additions and 49 deletions.
2 changes: 1 addition & 1 deletion build/content-helper/dashboard-widget.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '90d10f8d4634a269395a');
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => 'a741adf6df6b723b2f3d');
2 changes: 1 addition & 1 deletion build/content-helper/dashboard-widget.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build/content-helper/editor-sidebar.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom-ready', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '189b30aafaa619830baf');
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom-ready', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '629f8616ef4e8194995e');
2 changes: 1 addition & 1 deletion build/content-helper/editor-sidebar.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build/content-helper/excerpt-generator.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-plugins', 'wp-primitives', 'wp-url', 'wp-wordcount'), 'version' => '24552cd6b0e986d2d486');
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-plugins', 'wp-primitives', 'wp-url', 'wp-wordcount'), 'version' => '020225d87d32e61d3c23');
4 changes: 2 additions & 2 deletions build/content-helper/excerpt-generator.js

Large diffs are not rendered by default.

8 changes: 7 additions & 1 deletion src/content-helper/common/base-provider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,13 @@ export abstract class BaseProvider {
);
}

return Promise.reject( new ContentHelperError( wpError.message, wpError.code ) );
let errorMessage = wpError.message;
// The error message might be an object with multiple messages.
if ( typeof wpError.message === 'object' && wpError.message[ 0 ].msg ) {
errorMessage = wpError.message[ 0 ].msg;
}

return Promise.reject( new ContentHelperError( errorMessage, wpError.code ) );
} finally {
// Clean-up the AbortController after a successful request.
this.abortControllers.delete( abortId );
Expand Down
19 changes: 13 additions & 6 deletions src/content-helper/excerpt-generator/components/excerpt-panel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import { count } from '@wordpress/wordcount';
import { external } from '@wordpress/icons';
import { GutenbergFunction } from '../../../@types/gutenberg/types';
import { Telemetry } from '../../../js/telemetry/telemetry';
import { ContentHelperError } from '../../common/content-helper-error';
import { ContentHelperError, ContentHelperErrorCode } from '../../common/content-helper-error';
import { LeafIcon } from '../../common/icons/leaf-icon';
import { ExcerptGeneratorProvider } from '../provider';

Expand Down Expand Up @@ -55,7 +55,6 @@ const PostExcerptGenerator = () => {
} );

const { editPost } = useDispatch( editorStore );
const excerptGeneratorProvider = new ExcerptGeneratorProvider();

// Get the current excerpt, post content, and post title.
const { excerpt, postContent, postTitle } = useSelect( ( select ) => {
Expand Down Expand Up @@ -124,15 +123,23 @@ const PostExcerptGenerator = () => {

try {
Telemetry.trackEvent( 'excerpt_generator_pressed' );
const requestedExcerpt = await excerptGeneratorProvider.generateExcerpt( postTitle, postContent );
const requestedExcerpt = await ExcerptGeneratorProvider.getInstance().generateExcerpt(
postTitle,
postContent
);
setExcerptData( {
currentExcerpt: requestedExcerpt,
isUnderReview: true,
newExcerptGeneratedCount: excerptData.newExcerptGeneratedCount + 1,
oldExcerpt: excerpt,
} );
} catch ( err: any ) { // eslint-disable-line @typescript-eslint/no-explicit-any
setError( err );
} catch ( err: unknown ) {
if ( err instanceof ContentHelperError ) {
setError( err );
} else {
setError( new ContentHelperError( __( 'An unknown error occurred.', 'wp-parsely' ), ContentHelperErrorCode.UnknownError ) );
console.error( err ); // eslint-disable-line no-console
}
} finally {
setLoading( false );
}
Expand Down Expand Up @@ -265,7 +272,7 @@ const PostExcerptGenerator = () => {
onClick={ generateExcerpt }
variant="primary"
isBusy={ isLoading }
disabled={ isLoading }
disabled={ isLoading || ! postContent }
>
{ isLoading && __( 'Generating Excerpt…', 'wp-parsely' ) }
{ ! isLoading && excerptData.newExcerptGeneratedCount > 0 &&
Expand Down
70 changes: 35 additions & 35 deletions src/content-helper/excerpt-generator/provider.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,41 @@
/**
* WordPress dependencies
*/
import apiFetch from '@wordpress/api-fetch';
import { addQueryArgs } from '@wordpress/url';

/**
* Internal dependencies
*/
import { ContentHelperError, ContentHelperErrorCode } from '../common/content-helper-error';

/**
* Specifies the form of the response returned by the
* `/content-suggestions/suggest-brief` WordPress REST API endpoint.
*
* @since 3.13.0
*/
interface ExcerptGeneratorApiResponse {
error?: Error;
data: string;
}
import { BaseProvider } from '../common/base-provider';

/**
* Provides the generate excerpt functionality to be used in other components.
*
* @since 3.13.0
*/
export class ExcerptGeneratorProvider {
export class ExcerptGeneratorProvider extends BaseProvider {
/**
* The singleton instance of the ExcerptGeneratorProvider.
*
* @since 3.16.0
*/
private static instance: ExcerptGeneratorProvider;

/**
* Returns the singleton instance of the TitleSuggestionsProvider.
*
* @since 3.16.0
*
* @return {ExcerptGeneratorProvider} The singleton instance.
*/
public static getInstance(): ExcerptGeneratorProvider {
if ( ! this.instance ) {
this.instance = new ExcerptGeneratorProvider();
}

return this.instance;
}

/**
* Generates an excerpt for a given post.
*
Expand All @@ -35,28 +45,18 @@ export class ExcerptGeneratorProvider {
* @return {Promise<string>} The generated excerpt.
*/
public async generateExcerpt( title: string, content: string ): Promise<string> {
let response;
try {
response = await apiFetch<ExcerptGeneratorApiResponse>( {
method: 'POST',
path: addQueryArgs( '/wp-parsely/v1/content-suggestions/suggest-brief', {
title,
} ),
data: {
content,
},
} );
} catch ( wpError: any ) { // eslint-disable-line @typescript-eslint/no-explicit-any
return Promise.reject( new ContentHelperError( wpError.message, wpError.code ) );
}

if ( response?.error ) {
return Promise.reject( new ContentHelperError(
response.error.message,
ContentHelperErrorCode.ParselyApiResponseContainsError
) );
if ( '' === title ) {
title = 'Untitled';
}

return response?.data ?? '';
return await this.fetch<string>( {
method: 'POST',
path: addQueryArgs( '/wp-parsely/v1/content-suggestions/suggest-brief', {
title,
} ),
data: {
content,
},
} );
}
}

0 comments on commit 0a7f241

Please sign in to comment.