Viewing File: /home/fshjisk/mimikoparis/wp-content/plugins/code-snippets/js/Edit/actions.ts

import { __ } from '@wordpress/i18n'
import { addQueryArgs } from '@wordpress/url'
import { AxiosError, AxiosResponse } from 'axios'
import { Dispatch, SetStateAction, useCallback, useMemo } from 'react'
import { ExportSnippets } from '../types/ExportSnippets'
import { Snippet } from '../types/Snippet'
import { useSnippetsAPI } from '../utils/api/snippets'
import { downloadSnippetExportFile } from '../utils/general'
import { Notice } from '../types/Notice'

export interface SnippetActionsProps {
	setSnippet: Dispatch<SetStateAction<Snippet>>
	setIsWorking: Dispatch<SetStateAction<boolean>>
	setCurrentNotice: Dispatch<SetStateAction<Notice | undefined>>
}

export interface SnippetActionsValue {
	submit: (snippet: Snippet) => void
	submitAndActivate: (snippet: Snippet, activate: boolean) => void
	delete: (snippet: Snippet) => void
	export: (snippet: Snippet) => void
	exportCode: (snippet: Snippet) => void
}

// eslint-disable-next-line max-lines-per-function
export const useSnippetActions = ({
	setSnippet,
	setIsWorking,
	setCurrentNotice
}: SnippetActionsProps): SnippetActionsValue => {
	const api = useSnippetsAPI()

	const displayRequestErrors = useCallback((error: AxiosError, message?: string) => {
		console.error('Request failed', error)
		setIsWorking(false)
		setCurrentNotice(['error', message ? `${message} ${error.message}` : error.message])
	}, [setIsWorking, setCurrentNotice])

	const doSnippetRequest = useCallback((
		createRequest: () => Promise<AxiosResponse<Snippet>>,
		getNotice: (result: Snippet) => string,
		// translators: %s: error message.
		errorNotice: string = __('Something went wrong.', 'code-snippets')
	) => {
		setIsWorking(true)
		setCurrentNotice(undefined)

		createRequest()
			.then(({ data }) => {
				setIsWorking(false)

				if (data.id) {
					setSnippet({ ...data })
					setCurrentNotice(['updated', getNotice(data)])
				} else {
					setCurrentNotice(['error', `${errorNotice} ${__('The server did not send a valid response.', 'code-snippets')}`])
				}
			})
			.catch(error => displayRequestErrors(error, errorNotice))
	}, [displayRequestErrors, setIsWorking, setSnippet, setCurrentNotice])

	const doFileRequest = useCallback((snippet: Snippet, createRequest: () => Promise<AxiosResponse<string | ExportSnippets>>) => {
		setIsWorking(true)

		createRequest()
			.then(response => {
				const data = response.data
				setIsWorking(false)
				console.info('file response', response)

				if ('string' === typeof data) {
					downloadSnippetExportFile(data, snippet)
				} else {
					const JSON_INDENT_SPACES = 2
					downloadSnippetExportFile(JSON.stringify(data, undefined, JSON_INDENT_SPACES), snippet, 'json')
				}
			})
			// translators: %s: error message.
			.catch(error => displayRequestErrors(error, __('Could not download export file.', 'code-snippets')))
	}, [displayRequestErrors, setIsWorking])

	const submitSnippet = useCallback((
		snippet: Snippet,
		getCreateNotice: (result: Snippet) => string,
		getUpdateNotice: (result: Snippet) => string
	) => {
		if (snippet.id) {
			doSnippetRequest(
				() => api.update(snippet),
				getUpdateNotice,
				__('Could not update snippet.', 'code-snippets')
			)
		} else {
			doSnippetRequest(
				() => api.create(snippet),
				getCreateNotice,
				__('Could not create snippet.', 'code-snippets')
			)
		}
	}, [api, doSnippetRequest])

	return useMemo(() => ({
		submit: (snippet: Snippet) => {
			submitSnippet(
				snippet,
				() => __('Snippet created.', 'code-snippets'),
				() => __('Snippet updated.', 'code-snippets')
			)
		},

		submitAndActivate: (snippet: Snippet, activate: boolean) => {
			submitSnippet(
				{ ...snippet, active: activate },
				result => result.active ?
					__('Snippet created and activated.', 'code-snippets') :
					__('Snippet created.', 'code-snippets'),
				result => result.active ?
					'single-use' === result.scope ?
						__('Snippet updated and executed.', 'code-snippets') :
						__('Snippet updated and activated.', 'code-snippets') :
					__('Snippet updated.', 'code-snippets')
			)
		},

		delete: (snippet: Snippet) => {
			api.delete(snippet)
				.then(() => {
					window.location.replace(addQueryArgs(window?.CODE_SNIPPETS_EDIT?.menuUrl, { result: 'deleted' }))
				})
				.catch(error => displayRequestErrors(error, __('Could not delete snippet.', 'code-snippets')))
		},

		export: (snippet: Snippet) =>
			doFileRequest(snippet, () => api.export(snippet)),

		exportCode: (snippet: Snippet) =>
			doFileRequest(snippet, () => api.exportCode(snippet))

	}), [api, displayRequestErrors, doFileRequest, setCurrentNotice, submitSnippet])
}
Back to Directory File Manager