PluginProbe
The Innovative Form Builder – IvyForms / 1.0
The Innovative Form Builder – IvyForms v1.0
1.5.1 1.5 1.4.1 1.4 trunk 0.1.2 0.2 0.2.1 0.3 0.3.1 0.4 0.5 0.6 0.6.1 0.6.1-backup 0.6.1.1 0.7 0.8 0.8.1 0.8.2 0.9 0.9.1 1.0 1.1 1.1.1 All 27 releases
ivyforms / frontend / src / composables / useApiClient.ts

useApiClient.ts in The Innovative Form Builder – IvyForms 1.0, at frontend/src/composables/useApiClient.ts

80 lines 2.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import axios from 'axios'
2 import type { AxiosRequestConfig, AxiosResponse } from 'axios'
3
4 export const useApiClient = () => {
5 const { root, nonce, namespace } = window.wpIvyApiSettings || {}
6
7 const apiClient = axios.create({
8 baseURL: root || '',
9 })
10
11 apiClient.interceptors.request.use(
12 (config) => {
13 if (nonce) {
14 if (typeof config.headers?.set === 'function') {
15 config.headers.set('X-WP-Nonce', nonce)
16 } else {
17 ;(config.headers as Record<string, string>)['X-WP-Nonce'] = nonce
18 }
19 }
20 return config
21 },
22 (error) => Promise.reject(error),
23 )
24
25 const handleResponse = async <T = unknown>(promise: Promise<AxiosResponse<T>>) => {
26 try {
27 const response = await promise
28 //console.log('API Response:', response.status, response.data)
29 return { data: response.data, error: null, status: response.status }
30 } catch (error: unknown) {
31 //console.error('API Error:', error)
32 const status =
33 typeof error === 'object' &&
34 error !== null &&
35 'response' in error &&
36 typeof (error as { response?: { status?: number } }).response?.status === 'number'
37 ? (error as { response: { status: number } }).response.status
38 : 500
39
40 // Extract error message from response if available
41 const errorData =
42 typeof error === 'object' &&
43 error !== null &&
44 'response' in error &&
45 typeof (error as { response?: { data?: unknown } }).response?.data === 'object'
46 ? (error as { response: { data: unknown } }).response.data
47 : null
48
49 return {
50 data: null,
51 error: errorData || error,
52 status,
53 }
54 }
55 }
56
57 const request = async <T = unknown>(
58 endpoint: string,
59 options: AxiosRequestConfig = {},
60 config: { useNamespace?: boolean; namespace?: string } = {},
61 ) => {
62 let url = root || ''
63 const ns = config.namespace || namespace
64 const useNs = config.useNamespace !== undefined ? config.useNamespace : true
65 if (useNs && ns) {
66 url += ns.endsWith('/') ? ns : ns + '/'
67 }
68 url += endpoint.startsWith('/') ? endpoint.slice(1) : endpoint
69 return handleResponse<T>(apiClient.request({ url, ...options }))
70 }
71
72 return {
73 request,
74 apiClient,
75 root,
76 namespace,
77 nonce,
78 }
79 }
80