Skip to content

Commit cc34997

Browse files
committed
Preserve snippet code_error in REST responses and show error notices
1 parent 072b97c commit cc34997

File tree

3 files changed

+40
-16
lines changed

3 files changed

+40
-16
lines changed

src/js/hooks/useSubmitSnippet.ts

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export const useSubmitSnippet = (): UseSubmitSnippet => {
8686
const submitSnippet = useCallback(async (action: SubmitSnippetAction = SubmitSnippetAction.SAVE) => {
8787
setCurrentNotice(undefined)
8888

89-
const result = await (async (): Promise<Snippet | string | undefined> => {
89+
const rawResult = await (async (): Promise<Snippet | string | undefined> => {
9090
try {
9191
const request: Snippet = { ...snippet, ...SUBMIT_ACTION_DELTA[action] }
9292
const response = await (0 === request.id ? snippetsAPI.create(request) : snippetsAPI.update(request))
@@ -100,25 +100,38 @@ export const useSubmitSnippet = (): UseSubmitSnippet => {
100100

101101
const messages = isCondition(snippet) ? conditionMessages : snippetMessages
102102

103-
if (undefined === result || 'string' === typeof result) {
103+
if (undefined === rawResult || 'string' === typeof rawResult) {
104104
const message = [
105105
snippet.id ? messages.failedUpdate : messages.failedCreate,
106-
result ?? __('The server did not send a valid response.', 'code-snippets')
106+
rawResult ?? __('The server did not send a valid response.', 'code-snippets')
107107
]
108108

109109
setCurrentNotice(['error', message.filter(Boolean).join(' ')])
110110
return undefined
111-
} else {
112-
setSnippet(createSnippetObject(result))
113-
setCurrentNotice(['updated', getSuccessNotice(snippet, result, action)])
111+
}
114112

115-
if (snippet.id && result.id) {
116-
window.document.title = window.document.title.replace(snippetMessages.addNew, messages.edit)
117-
window.history.replaceState({}, '', addQueryArgs(window.CODE_SNIPPETS?.urls.edit, { id: result.id }))
118-
}
113+
const updatedSnippet = createSnippetObject(rawResult)
114+
setSnippet(updatedSnippet)
119115

120-
return result
116+
if (updatedSnippet.code_error) {
117+
setCurrentNotice([
118+
'error',
119+
__('Snippet could not be activated because the code contains an error. See details below.', 'code-snippets')
120+
])
121+
} else {
122+
setCurrentNotice(['updated', getSuccessNotice(snippet, updatedSnippet, action)])
121123
}
124+
125+
if (snippet.id && updatedSnippet.id) {
126+
window.document.title = window.document.title.replace(snippetMessages.addNew, messages.edit)
127+
window.history.replaceState(
128+
{},
129+
'',
130+
addQueryArgs(window.CODE_SNIPPETS?.urls.edit, { id: updatedSnippet.id })
131+
)
132+
}
133+
134+
return updatedSnippet
122135
}, [snippetsAPI, setIsWorking, setCurrentNotice, snippet, setSnippet])
123136

124137
return { submitSnippet }

src/js/utils/snippets/objects.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ const defaults: Omit<Snippet, 'tags'> = {
1313
network: isNetworkAdmin(),
1414
shared_network: null,
1515
priority: 10,
16-
conditionId: 0
16+
conditionId: 0,
17+
code_error: null
1718
}
1819

1920
const isAbsInt = (value: unknown): value is number =>
@@ -33,6 +34,15 @@ export const parseSnippetObject = (fields: unknown): Snippet => {
3334
return result
3435
}
3536

37+
const codeError =
38+
'code_error' in fields &&
39+
Array.isArray(fields.code_error) &&
40+
2 === fields.code_error.length &&
41+
'string' === typeof fields.code_error[0] &&
42+
'number' === typeof fields.code_error[1]
43+
? (fields.code_error as readonly [string, number])
44+
: undefined
45+
3646
return {
3747
...result,
3848
...'id' in fields && isAbsInt(fields.id) && { id: fields.id },
@@ -46,6 +56,7 @@ export const parseSnippetObject = (fields: unknown): Snippet => {
4656
...'network' in fields && 'boolean' === typeof fields.network && { network: fields.network },
4757
...'shared_network' in fields && 'boolean' === typeof fields.shared_network && { shared_network: fields.shared_network },
4858
...'priority' in fields && 'number' === typeof fields.priority && { priority: fields.priority },
49-
...'condition_id' in fields && isAbsInt(fields.condition_id) && { conditionId: fields.condition_id }
59+
...'condition_id' in fields && isAbsInt(fields.condition_id) && { conditionId: fields.condition_id },
60+
...('code_error' in fields && { code_error: codeError ?? result.code_error })
5061
}
5162
}

src/php/rest-api/class-snippets-rest-controller.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,12 +325,12 @@ public function update_item( $request ) {
325325
);
326326
}
327327

328-
$item = $this->prepare_item_for_database( $request, $snippet );
328+
$item = $this->prepare_item_for_database( $request, $snippet );
329329
$result = save_snippet( $item );
330330

331331
if ( $result ) {
332-
$request->set_param( 'id', $result->id );
333-
return $this->get_item( $request );
332+
$data = $this->prepare_item_for_response( $result, $request );
333+
return rest_ensure_response( $data );
334334
}
335335

336336
return new WP_Error(

0 commit comments

Comments
 (0)