diff --git a/src/js/hooks/useSubmitSnippet.ts b/src/js/hooks/useSubmitSnippet.ts index 2dc3530a..bb074df7 100644 --- a/src/js/hooks/useSubmitSnippet.ts +++ b/src/js/hooks/useSubmitSnippet.ts @@ -108,17 +108,30 @@ export const useSubmitSnippet = (): UseSubmitSnippet => { setCurrentNotice(['error', message.filter(Boolean).join(' ')]) return undefined - } else { - setSnippet(createSnippetObject(result)) - setCurrentNotice(['updated', getSuccessNotice(snippet, result, action)]) + } - if (snippet.id && result.id) { - window.document.title = window.document.title.replace(snippetMessages.addNew, messages.edit) - window.history.replaceState({}, '', addQueryArgs(window.CODE_SNIPPETS?.urls.edit, { id: result.id })) - } + const updatedSnippet = createSnippetObject(result) + setSnippet(updatedSnippet) - return result + if (updatedSnippet.code_error) { + setCurrentNotice([ + 'error', + __('Snippet could not be activated because the code contains an error. See details below.', 'code-snippets') + ]) + } else { + setCurrentNotice(['updated', getSuccessNotice(snippet, updatedSnippet, action)]) } + + if (snippet.id && updatedSnippet.id) { + window.document.title = window.document.title.replace(snippetMessages.addNew, messages.edit) + window.history.replaceState( + {}, + '', + addQueryArgs(window.CODE_SNIPPETS?.urls.edit, { id: updatedSnippet.id }) + ) + } + + return updatedSnippet }, [snippetsAPI, setIsWorking, setCurrentNotice, snippet, setSnippet]) return { submitSnippet } diff --git a/src/js/utils/snippets/objects.ts b/src/js/utils/snippets/objects.ts index f542ab64..81a2a211 100644 --- a/src/js/utils/snippets/objects.ts +++ b/src/js/utils/snippets/objects.ts @@ -13,7 +13,8 @@ const defaults: Omit = { network: isNetworkAdmin(), shared_network: null, priority: 10, - conditionId: 0 + conditionId: 0, + code_error: null } const isAbsInt = (value: unknown): value is number => @@ -33,6 +34,15 @@ export const parseSnippetObject = (fields: unknown): Snippet => { return result } + const codeError = + 'code_error' in fields && + Array.isArray(fields.code_error) && + 2 === fields.code_error.length && + 'string' === typeof fields.code_error[0] && + 'number' === typeof fields.code_error[1] + ? (fields.code_error as readonly [string, number]) + : undefined + return { ...result, ...'id' in fields && isAbsInt(fields.id) && { id: fields.id }, @@ -46,6 +56,7 @@ export const parseSnippetObject = (fields: unknown): Snippet => { ...'network' in fields && 'boolean' === typeof fields.network && { network: fields.network }, ...'shared_network' in fields && 'boolean' === typeof fields.shared_network && { shared_network: fields.shared_network }, ...'priority' in fields && 'number' === typeof fields.priority && { priority: fields.priority }, - ...'condition_id' in fields && isAbsInt(fields.condition_id) && { conditionId: fields.condition_id } + ...'condition_id' in fields && isAbsInt(fields.condition_id) && { conditionId: fields.condition_id }, + ...('code_error' in fields && { code_error: codeError ?? result.code_error }) } } diff --git a/src/php/rest-api/class-snippets-rest-controller.php b/src/php/rest-api/class-snippets-rest-controller.php index bf37e60b..d1b9b6b7 100644 --- a/src/php/rest-api/class-snippets-rest-controller.php +++ b/src/php/rest-api/class-snippets-rest-controller.php @@ -325,12 +325,12 @@ public function update_item( $request ) { ); } - $item = $this->prepare_item_for_database( $request, $snippet ); + $item = $this->prepare_item_for_database( $request, $snippet ); $result = save_snippet( $item ); if ( $result ) { - $request->set_param( 'id', $result->id ); - return $this->get_item( $request ); + $data = $this->prepare_item_for_response( $result, $request ); + return rest_ensure_response( $data ); } return new WP_Error(