48 lines
1.0 KiB
TypeScript
48 lines
1.0 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { controls as dataControls } from '@wordpress/data-controls';
|
|
import apiFetch, { APIFetchOptions } from '@wordpress/api-fetch';
|
|
import { AnyAction } from 'redux';
|
|
|
|
export const fetchWithHeaders = (
|
|
options: APIFetchOptions
|
|
): AnyAction & { options: APIFetchOptions } => {
|
|
return {
|
|
type: 'FETCH_WITH_HEADERS',
|
|
options,
|
|
};
|
|
};
|
|
|
|
export type FetchWithHeadersResponse< Data > = {
|
|
headers: Response[ 'headers' ];
|
|
status: Response[ 'status' ];
|
|
data: Data;
|
|
};
|
|
|
|
const controls = {
|
|
...dataControls,
|
|
FETCH_WITH_HEADERS( action: AnyAction ) {
|
|
return apiFetch< Response >( { ...action.options, parse: false } )
|
|
.then( ( response ) => {
|
|
return Promise.all( [
|
|
response.headers,
|
|
response.status,
|
|
response.json(),
|
|
] );
|
|
} )
|
|
.then( ( [ headers, status, data ] ) => ( {
|
|
headers,
|
|
status,
|
|
data,
|
|
} ) )
|
|
.catch( ( response ) => {
|
|
return response.json().then( ( data: unknown ) => {
|
|
throw data;
|
|
} );
|
|
} );
|
|
},
|
|
};
|
|
|
|
export default controls;
|