79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
import { __ } from '@wordpress/i18n'
|
|
import { addQueryArgs } from '@wordpress/url'
|
|
import { isAxiosError } from 'axios'
|
|
import { Dispatch, SetStateAction, useCallback } from 'react'
|
|
import { Notice } from '../../types/Notice'
|
|
import { Snippet } from '../../types/Snippet'
|
|
import { useSnippetsAPI } from '../../utils/api/snippets'
|
|
|
|
const getSuccessNotice = (request: Snippet, response: Snippet, active: boolean | undefined) => {
|
|
if (active === undefined) {
|
|
return 0 === request.id ?
|
|
__('Snippet created.', 'code-snippets') :
|
|
__('Snippet updated.', 'code-snippets')
|
|
}
|
|
|
|
if (0 === request.id && active) {
|
|
return __('Snippet created and activated.', 'code-snippets')
|
|
}
|
|
|
|
if (active) {
|
|
return 'single-use' === response.scope ?
|
|
__('Snippet updated and executed.', 'code-snippets') :
|
|
__('Snippet updated and activated.', 'code-snippets')
|
|
} else {
|
|
return __('Snippet updated and deactivated')
|
|
}
|
|
}
|
|
|
|
export const useSnippetSubmit = (
|
|
setSnippet: Dispatch<SetStateAction<Snippet>>,
|
|
setIsWorking: Dispatch<SetStateAction<boolean>>,
|
|
setCurrentNotice: Dispatch<SetStateAction<Notice | undefined>>
|
|
): (snippet: Snippet, active?: boolean) => Promise<Snippet | undefined> => {
|
|
const api = useSnippetsAPI()
|
|
|
|
return useCallback(async (snippet: Snippet, active?: boolean) => {
|
|
setIsWorking(true)
|
|
setCurrentNotice(undefined)
|
|
|
|
const result = await (async (): Promise<Snippet | string | undefined> => {
|
|
try {
|
|
const requestData: Snippet = { ...snippet, active: undefined === active ? snippet.active : active }
|
|
const { data } = await (0 === snippet.id ? api.create(requestData) : api.update(requestData))
|
|
setIsWorking(false)
|
|
return data.id ? data : undefined
|
|
} catch (error) {
|
|
setIsWorking(false)
|
|
return isAxiosError(error) ? error.message : undefined
|
|
}
|
|
})()
|
|
|
|
if (undefined === result || 'string' === typeof result) {
|
|
const message = [
|
|
snippet.id ?
|
|
__('Could not create snippet.', 'code-snippets') :
|
|
__('Could not update snippet.', 'code-snippets'),
|
|
result ?? __('The server did not send a valid response.', 'code-snippets')
|
|
]
|
|
|
|
setCurrentNotice(['error', message.filter(Boolean).join(' ')])
|
|
return undefined
|
|
} else {
|
|
setSnippet({ ...result })
|
|
setCurrentNotice(['updated', getSuccessNotice(snippet, result, active)])
|
|
|
|
if (snippet.id && result?.id) {
|
|
window.document.title = window.document.title.replace(
|
|
__('Add New Snippet', 'code-snippets'),
|
|
__('Edit Snippet', 'code-snippets')
|
|
)
|
|
|
|
window.history.replaceState({}, '', addQueryArgs(window.CODE_SNIPPETS?.urls.edit, { id: result.id }))
|
|
}
|
|
|
|
return result
|
|
}
|
|
}, [api, setCurrentNotice, setIsWorking, setSnippet])
|
|
}
|