PluginProbe
Code Snippets / 4.0.0-beta.3
Code Snippets v4.0.0-beta.3
4.0.0-beta.3 4.0.0-beta.2 3.10.2 3.10.1 3.10.0 3.10.0-beta.2 3.10.0-beta.1 4.0.0-beta.1 3.9.6 trunk 2.10.0 2.10.1 2.12.0 2.12.1 2.13.0 2.13.1 2.13.2 2.13.3 2.14.0 2.14.1 2.14.2 2.14.3 2.14.4 2.14.5 2.14.6 All 66 releases
← All changes | js/hooks/useSubmitSnippet.tsx +43 -11 3.10.0-beta.2 → 4.0.0-beta.3 View file →
@@ -1,7 +1,8 @@
1 1 import { __ } from '@wordpress/i18n'
2 2 import { isAxiosError } from 'axios'
3 3 import React, { useCallback } from 'react'
4 +import { describeRequestError, isUnconfirmedRequest } from '../utils/errors'
4 5 import { useSnippetForm } from '../components/EditMenu/SnippetForm/WithSnippetFormContext'
5 6 import { createSnippetObject, isCondition } from '../utils/snippets/snippets'
6 7 import { buildUrl } from '../utils/urls'
7 8 import { useSnippetsAPI } from './useSnippetsAPI'
@@ -23,8 +24,38 @@
23 24
24 25 const conditionCreated = __('Condition <strong>created</strong>.', 'code-snippets')
25 26 const conditionUpdated = __('Condition <strong>updated</strong>.', 'code-snippets')
26 27
28 +/** A save that did not produce a snippet, and whether its outcome is actually known. */
29 +interface SubmitFailure {
30 + message?: string
31 + unconfirmed: boolean
32 +}
33 +
34 +const isSubmitFailure = (result: Snippet | SubmitFailure): result is SubmitFailure =>
35 + 'unconfirmed' in result
36 +
37 +interface SubmitFailureNotice {
38 + failure: SubmitFailure
39 + messages: typeof snippetMessages
40 + isUpdate: boolean
41 +}
42 +
43 +/**
44 + * Word a save that did not return a snippet.
45 + *
46 + * A request that never received a response says nothing about whether the write
47 + * happened, so it is reported on its own rather than behind a heading stating
48 + * the snippet was not saved.
49 + */
50 +const describeSubmitFailure = ({ failure, messages, isUpdate }: SubmitFailureNotice): string =>
51 + failure.unconfirmed
52 + ? failure.message ?? ''
53 + : [
54 + isUpdate ? messages.failedUpdate : messages.failedCreate,
55 + failure.message ?? __('The server did not send a valid response.', 'code-snippets')
56 + ].filter(Boolean).join(' ')
57 +
27 58 const conditionMessages: typeof snippetMessages = {
28 59 addNew: __('Create New Condition', 'code-snippets'),
29 60 edit: __('Edit Condition', 'code-snippets'),
30 61 created: conditionCreated,
@@ -103,9 +134,9 @@
103 134 } else if (SubmitSnippetAction.SAVE_AND_DEACTIVATE === action) {
104 135 request.active = false
105 136 }
106 137
107 - const result = await (async (): Promise<Snippet | string | undefined> => {
138 + const result = await (async (): Promise<Snippet | SubmitFailure> => {
108 139 try {
109 140 const { id } = request
110 141
111 142 const response = await (undefined === id || 0 === id
@@ -111,11 +142,14 @@
111 142 const response = await (undefined === id || 0 === id
112 143 ? api.create(request)
113 144 : api.update({ ...request, id }))
114 145
115 - return response.id ? createSnippetObject(response) : undefined
116 - } catch (error) {
117 - return isAxiosError(error) ? error.message : undefined
146 + return response.id ? createSnippetObject(response) : { unconfirmed: false }
147 + } catch (error: unknown) {
148 + return {
149 + message: isAxiosError(error) ? describeRequestError(error) : undefined,
150 + unconfirmed: isUnconfirmedRequest(error)
151 + }
118 152 } finally {
119 153 setIsWorking(false)
120 154 }
121 155 })()
@@ -121,15 +155,13 @@
121 155 })()
122 156
123 157 const messages = isCondition(snippet) ? conditionMessages : snippetMessages
124 158
125 - if (undefined === result || 'string' === typeof result) {
126 - const message = [
127 - request.id ? messages.failedUpdate : messages.failedCreate,
128 - result ?? __('The server did not send a valid response.', 'code-snippets')
129 - ]
130 -
131 - setCurrentNotice(['error', message.filter(Boolean).join(' ')])
159 + if (isSubmitFailure(result)) {
160 + setCurrentNotice([
161 + 'error',
162 + describeSubmitFailure({ failure: result, messages, isUpdate: Boolean(request.id) })
163 + ])
132 164 return undefined
133 165 }
134 166
135 167 acceptSnippet(result)