2023-09-11 11:25:10 +03:00
import { isObject } from '../utils.js' ;
const { csrfToken } = window . config ;
2023-09-19 03:50:30 +03:00
// safe HTTP methods that don't need a csrf token
const safeMethods = new Set ( [ 'GET' , 'HEAD' , 'OPTIONS' , 'TRACE' ] ) ;
2023-09-11 11:25:10 +03:00
// fetch wrapper, use below method name functions and the `data` option to pass in data
2023-09-19 03:50:30 +03:00
// which will automatically set an appropriate headers. For json content, only object
// and array types are currently supported.
2024-02-16 16:27:00 +03:00
export function request ( url , { method = 'GET' , data , headers = { } , ... other } = { } ) {
let body , contentType ;
if ( data instanceof FormData || data instanceof URLSearchParams ) {
body = data ;
} else if ( isObject ( data ) || Array . isArray ( data ) ) {
contentType = 'application/json' ;
body = JSON . stringify ( data ) ;
2023-09-11 11:25:10 +03:00
}
2023-09-19 03:50:30 +03:00
const headersMerged = new Headers ( {
2024-02-16 16:27:00 +03:00
... ( ! safeMethods . has ( method ) && { 'x-csrf-token' : csrfToken } ) ,
2023-09-19 03:50:30 +03:00
... ( contentType && { 'content-type' : contentType } ) ,
} ) ;
for ( const [ name , value ] of Object . entries ( headers ) ) {
headersMerged . set ( name , value ) ;
}
2023-09-11 11:25:10 +03:00
return fetch ( url , {
2023-09-19 03:50:30 +03:00
method ,
headers : headersMerged ,
2023-09-11 11:25:10 +03:00
... other ,
2024-02-16 16:27:00 +03:00
... ( body && { body } ) ,
2023-09-11 11:25:10 +03:00
} ) ;
}
export const GET = ( url , opts ) => request ( url , { method : 'GET' , ... opts } ) ;
export const POST = ( url , opts ) => request ( url , { method : 'POST' , ... opts } ) ;
export const PATCH = ( url , opts ) => request ( url , { method : 'PATCH' , ... opts } ) ;
export const PUT = ( url , opts ) => request ( url , { method : 'PUT' , ... opts } ) ;
export const DELETE = ( url , opts ) => request ( url , { method : 'DELETE' , ... opts } ) ;