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 +42 -11 4.0.0-beta.2 → 4.0.0-beta.3 View file →
@@ -1,8 +1,8 @@
1 1 import { __ } from '@wordpress/i18n'
2 2 import { isAxiosError } from 'axios'
3 3 import React, { useCallback } from 'react'
4 -import { describeRequestError } from '../utils/errors'
4 +import { describeRequestError, isUnconfirmedRequest } from '../utils/errors'
5 5 import { useSnippetForm } from '../components/EditMenu/SnippetForm/WithSnippetFormContext'
6 6 import { createSnippetObject, isCondition } from '../utils/snippets/snippets'
7 7 import { buildUrl } from '../utils/urls'
8 8 import { useSnippetsAPI } from './useSnippetsAPI'
@@ -24,8 +24,38 @@
24 24
25 25 const conditionCreated = __('Condition <strong>created</strong>.', 'code-snippets')
26 26 const conditionUpdated = __('Condition <strong>updated</strong>.', 'code-snippets')
27 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 +
28 58 const conditionMessages: typeof snippetMessages = {
29 59 addNew: __('Create New Condition', 'code-snippets'),
30 60 edit: __('Edit Condition', 'code-snippets'),
31 61 created: conditionCreated,
@@ -104,9 +134,9 @@
104 134 } else if (SubmitSnippetAction.SAVE_AND_DEACTIVATE === action) {
105 135 request.active = false
106 136 }
107 137
108 - const result = await (async (): Promise<Snippet | string | undefined> => {
138 + const result = await (async (): Promise<Snippet | SubmitFailure> => {
109 139 try {
110 140 const { id } = request
111 141
112 142 const response = await (undefined === id || 0 === id
@@ -112,11 +142,14 @@
112 142 const response = await (undefined === id || 0 === id
113 143 ? api.create(request)
114 144 : api.update({ ...request, id }))
115 145
116 - return response.id ? createSnippetObject(response) : undefined
146 + return response.id ? createSnippetObject(response) : { unconfirmed: false }
117 147 } catch (error: unknown) {
118 - return isAxiosError(error) ? describeRequestError(error) : undefined
148 + return {
149 + message: isAxiosError(error) ? describeRequestError(error) : undefined,
150 + unconfirmed: isUnconfirmedRequest(error)
151 + }
119 152 } finally {
120 153 setIsWorking(false)
121 154 }
122 155 })()
@@ -122,15 +155,13 @@
122 155 })()
123 156
124 157 const messages = isCondition(snippet) ? conditionMessages : snippetMessages
125 158
126 - if (undefined === result || 'string' === typeof result) {
127 - const message = [
128 - request.id ? messages.failedUpdate : messages.failedCreate,
129 - result ?? __('The server did not send a valid response.', 'code-snippets')
130 - ]
131 -
132 - setCurrentNotice(['error', message.filter(Boolean).join(' ')])
159 + if (isSubmitFailure(result)) {
160 + setCurrentNotice([
161 + 'error',
162 + describeSubmitFailure({ failure: result, messages, isUpdate: Boolean(request.id) })
163 + ])
133 164 return undefined
134 165 }
135 166
136 167 acceptSnippet(result)