70 lines
1.7 KiB
TypeScript
70 lines
1.7 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import apiFetch, { APIFetchOptions } from '@wordpress/api-fetch';
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
import { LAST_CART_UPDATE_TIMESTAMP_KEY } from '../data/cart/constants';
|
|
|
|
/**
|
|
* Checks if this request is a POST to the wc/store/cart endpoint.
|
|
*/
|
|
const isCartUpdatePostRequest = ( options: APIFetchOptions ) => {
|
|
const url = options.url || options.path || '';
|
|
const method = options.method || 'GET';
|
|
|
|
// Return false if there is no endpoint provided, or the request is not a POST request.
|
|
if ( ! url || method !== 'POST' ) {
|
|
return false;
|
|
}
|
|
|
|
const cartRegExp = /wc\/store\/cart\//;
|
|
const batchRegExp = /wc\/store\/batch/;
|
|
|
|
const isCart = cartRegExp.exec( url ) !== null;
|
|
const isBatch = batchRegExp.exec( url ) !== null;
|
|
|
|
if ( isCart ) {
|
|
return true;
|
|
}
|
|
|
|
if ( isBatch ) {
|
|
const requests = options?.data?.requests || [];
|
|
|
|
return requests.some( ( request: { path: string } ) => {
|
|
const requestUrl = request.path || '';
|
|
|
|
return cartRegExp.exec( requestUrl ) !== null;
|
|
} );
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
/**
|
|
* Middleware which saves the time that the cart was last modified in
|
|
* the browser's Local Storage
|
|
*
|
|
* @param {Object} options Fetch options.
|
|
* @param {Function} next The next middleware or fetchHandler to call.
|
|
*
|
|
* @return {*} The evaluated result of the remaining middleware chain.
|
|
*/
|
|
const cartUpdateMiddleware = (
|
|
options: APIFetchOptions,
|
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
next: ( arg0: APIFetchOptions, arg1: any ) => any
|
|
) => {
|
|
if ( isCartUpdatePostRequest( options ) ) {
|
|
window.localStorage.setItem(
|
|
LAST_CART_UPDATE_TIMESTAMP_KEY,
|
|
( Date.now() / 1000 ).toString()
|
|
);
|
|
}
|
|
return next( options, next );
|
|
};
|
|
|
|
apiFetch.use( cartUpdateMiddleware );
|