| 1 |
import { isNetworkAdmin } from '../../utils/screen' |
| 2 |
import type { SnippetSchema } from '../../types/schema/SnippetSchema' |
| 3 |
import type { Snippet, SnippetScope } from '../../types/Snippet' |
| 4 |
|
| 5 |
export interface ResponseData<T = unknown> { |
| 6 |
success: boolean |
| 7 |
data?: T |
| 8 |
} |
| 9 |
|
| 10 |
export type SuccessCallback = (response: ResponseData) => void |
| 11 |
|
| 12 |
const sendSnippetRequest = (query: string, onSuccess?: SuccessCallback) => { |
| 13 |
const request = new XMLHttpRequest() |
| 14 |
request.open('POST', window.ajaxurl, true) |
| 15 |
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8') |
| 16 |
|
| 17 |
request.onload = () => { |
| 18 |
const success = 200 |
| 19 |
const errorStart = 400 |
| 20 |
if (success > request.status || errorStart <= request.status) { |
| 21 |
return |
| 22 |
} |
| 23 |
|
| 24 |
console.info(request.responseText) |
| 25 |
onSuccess?.(<ResponseData> JSON.parse(request.responseText)) |
| 26 |
} |
| 27 |
|
| 28 |
request.send(query) |
| 29 |
} |
| 30 |
|
| 31 |
/** |
| 32 |
* Update the data of a given snippet using AJAX |
| 33 |
* @param field |
| 34 |
* @param row |
| 35 |
* @param snippet |
| 36 |
* @param successCallback |
| 37 |
*/ |
| 38 |
export const updateSnippet = (field: keyof Snippet, row: Element, snippet: Partial<Snippet>, successCallback?: SuccessCallback) => { |
| 39 |
const nonce = <HTMLInputElement | null> document.getElementById('code_snippets_ajax_nonce') |
| 40 |
const columnId = row.querySelector('.column-id') |
| 41 |
|
| 42 |
if (!nonce || !columnId?.textContent || !parseInt(columnId.textContent, 10)) { |
| 43 |
return |
| 44 |
} |
| 45 |
|
| 46 |
const updatedSnippet: Partial<SnippetSchema> = { |
| 47 |
id: parseInt(columnId.textContent, 10), |
| 48 |
shared_network: null !== /\bshared-network-snippet\b/.exec(row.className), |
| 49 |
network: snippet.shared_network ?? isNetworkAdmin(), |
| 50 |
scope: <SnippetScope | null> row.getAttribute('data-snippet-scope') ?? snippet.scope, |
| 51 |
...snippet |
| 52 |
} |
| 53 |
|
| 54 |
const queryString = `action=update_code_snippet&_ajax_nonce=${nonce.value}&field=${field}&snippet=${JSON.stringify(updatedSnippet)}` |
| 55 |
sendSnippetRequest(queryString, successCallback) |
| 56 |
} |
| 57 |
|