diff --git a/includes/class-create-block-theme-api.php b/includes/class-create-block-theme-api.php index a620fbb0..12c42522 100644 --- a/includes/class-create-block-theme-api.php +++ b/includes/class-create-block-theme-api.php @@ -28,6 +28,7 @@ class CBT_Theme_API { */ public function __construct() { add_action( 'rest_api_init', array( $this, 'register_rest_routes' ) ); + add_filter( 'rest_prepare_theme', array( $this, 'add_additional_data_to_theme_response' ), 10, 2 ); } /** @@ -111,28 +112,6 @@ public function register_rest_routes() { }, ) ); - register_rest_route( - 'create-block-theme/v1', - '/get-readme-data', - array( - 'methods' => 'GET', - 'callback' => array( $this, 'rest_get_readme_data' ), - 'permission_callback' => function () { - return current_user_can( 'edit_theme_options' ); - }, - ) - ); - register_rest_route( - 'create-block-theme/v1', - '/get-theme-data', - array( - 'methods' => 'GET', - 'callback' => array( $this, 'rest_get_theme_data' ), - 'permission_callback' => function () { - return current_user_can( 'edit_theme_options' ); - }, - ), - ); register_rest_route( 'create-block-theme/v1', '/font-families', @@ -157,44 +136,47 @@ public function register_rest_routes() { ); } - function rest_get_theme_data() { - try { - $theme_data = CBT_Theme_JSON_Resolver::get_theme_file_contents(); - return new WP_REST_Response( - array( - 'status' => 'SUCCESS', - 'message' => __( 'Theme data retrieved.', 'create-block-theme' ), - 'data' => $theme_data, - ), - ); - } catch ( Exception $error ) { - return new WP_REST_Response( - array( - 'status' => 'FAILURE', - 'message' => $error->getMessage(), - ) - ); + /** + * Add README data and theme.json data to the current theme REST API response. + * + * @param WP_REST_Response $response The response object. + * @param WP_Theme $theme The theme object. + * @return WP_REST_Response Modified response object. + */ + function add_additional_data_to_theme_response( $response, $theme ) { + if ( ! $theme || ! $response ) { + return $response; } - } - function rest_get_readme_data() { + $current_theme = wp_get_theme(); + if ( $theme->get_stylesheet() !== $current_theme->get_stylesheet() ) { + return $response; + } + + $data = $response->get_data(); + + // Add README data and theme.json data. try { - $readme_data = CBT_Theme_Readme::get_sections(); - return new WP_REST_Response( - array( - 'status' => 'SUCCESS', - 'message' => __( 'Readme file data retrieved.', 'create-block-theme' ), - 'data' => $readme_data, - ) - ); + $data['readme'] = CBT_Theme_Readme::get_sections(); + $data['theme_json'] = CBT_Theme_JSON_Resolver::get_theme_file_contents(); } catch ( Exception $error ) { - return new WP_REST_Response( + return new WP_Error( + 'theme_data_retrieval_failed', + sprintf( + /* translators: %1$s: error message */ + __( 'Failed to retrieve theme data: %1$s', 'create-block-theme' ), + $error->getMessage() + ), array( - 'status' => 'FAILURE', - 'message' => $error->getMessage(), + 'status' => 500, + 'code' => $error->getCode(), ) ); } + + $response->set_data( $data ); + + return $response; } function rest_clone_theme( $request ) { diff --git a/src/editor-sidebar/json-editor-modal.js b/src/editor-sidebar/json-editor-modal.js index 11d367ca..fed8ecb8 100644 --- a/src/editor-sidebar/json-editor-modal.js +++ b/src/editor-sidebar/json-editor-modal.js @@ -12,24 +12,22 @@ import { useState, useEffect } from '@wordpress/element'; import { Modal } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; -/** - * Internal dependencies - */ -import { fetchThemeJson } from '../resolvers'; - const ThemeJsonEditorModal = ( { onRequestClose } ) => { const [ themeData, setThemeData ] = useState( '' ); - const themeName = useSelect( ( select ) => - select( 'core' ).getCurrentTheme() - )?.name?.raw; - const fetchThemeData = async () => { - setThemeData( await fetchThemeJson() ); - }; - const handleSave = () => {}; + const themeJsonData = useSelect( + ( select ) => select( 'core' ).getCurrentTheme(), + [] + ); useEffect( () => { - fetchThemeData(); - } ); + if ( themeJsonData ) { + setThemeData( + JSON.stringify( themeJsonData?.theme_json, null, 2 ) + ); + } + }, [ themeJsonData ] ); + + const handleSave = () => {}; return ( { title={ sprintf( // translators: %s: theme name. __( 'theme.json for %s', 'create-block-theme' ), - themeName + themeJsonData.name.raw ) } onRequestClose={ onRequestClose } className="create-block-theme__theme-json-modal" diff --git a/src/editor-sidebar/metadata-editor-modal.js b/src/editor-sidebar/metadata-editor-modal.js index 0e821583..b17b64e9 100644 --- a/src/editor-sidebar/metadata-editor-modal.js +++ b/src/editor-sidebar/metadata-editor-modal.js @@ -28,7 +28,7 @@ import { MediaUpload, MediaUploadCheck } from '@wordpress/block-editor'; /** * Internal dependencies */ -import { postUpdateThemeMetadata, fetchReadmeData } from '../resolvers'; +import { postUpdateThemeMetadata } from '../resolvers'; import { getFontsCreditsText } from '../utils/fonts'; import { generateWpVersions } from '../utils/generate-versions'; @@ -70,37 +70,21 @@ export const ThemeMetadataEditorModal = ( { onRequestClose } ) => { return; } - const fetchData = async () => { - try { - const readmeData = await fetchReadmeData(); - setTheme( { - name: themeData.name.raw, - description: themeData.description.raw, - uri: themeData.theme_uri.raw, - version: themeData.version, - requires_wp: themeData.requires_wp, - author: themeData.author.raw, - author_uri: themeData.author_uri.raw, - tags_custom: themeData.tags.rendered, - screenshot: themeData.screenshot, - recommended_plugins: readmeData.recommended_plugins, - font_credits: readmeData.fonts, - image_credits: readmeData.images, - } ); - } catch ( error ) { - createErrorNotice( - error.message || - __( - 'Failed to fetch theme data.', - 'create-block-theme' - ), - { type: 'snackbar' } - ); - } - }; - - fetchData(); - }, [ themeData, createErrorNotice ] ); + setTheme( { + name: themeData.name.raw, + description: themeData.description.raw, + uri: themeData.theme_uri.raw, + version: themeData.version, + requires_wp: themeData.requires_wp, + author: themeData.author.raw, + author_uri: themeData.author_uri.raw, + tags_custom: themeData.tags.rendered, + screenshot: themeData.screenshot, + recommended_plugins: themeData.readme.recommended_plugins || '', + font_credits: themeData.readme.fonts || '', + image_credits: themeData.readme.images || '', + } ); + }, [ themeData ] ); const handleUpdateClick = () => { postUpdateThemeMetadata( theme ) diff --git a/src/resolvers.js b/src/resolvers.js index 1a9f75ac..d0219fc8 100644 --- a/src/resolvers.js +++ b/src/resolvers.js @@ -3,25 +3,6 @@ */ import apiFetch from '@wordpress/api-fetch'; -export async function fetchThemeJson() { - return apiFetch( { - path: '/create-block-theme/v1/get-theme-data', - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - } ).then( ( response ) => { - if ( ! response?.data || 'SUCCESS' !== response?.status ) { - throw new Error( - `Failed to fetch theme data: ${ - response?.message || response?.status - }` - ); - } - return JSON.stringify( response?.data, null, 2 ); - } ); -} - export async function createBlankTheme( theme ) { return apiFetch( { path: '/create-block-theme/v1/create-blank', @@ -82,25 +63,6 @@ export async function createChildTheme( theme ) { } ); } -export async function fetchReadmeData() { - return apiFetch( { - path: '/create-block-theme/v1/get-readme-data', - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - } ).then( ( response ) => { - if ( ! response?.data || 'SUCCESS' !== response?.status ) { - throw new Error( - `Failed to fetch readme data: ${ - response?.message || response?.status - }` - ); - } - return response?.data; - } ); -} - export async function postCreateThemeVariation( preferences ) { return apiFetch( { path: '/create-block-theme/v1/create-variation',