46 lines
1.2 KiB
TypeScript
46 lines
1.2 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;
|
||
|
if ( ! url || ! options.method || options.method !== 'POST' ) {
|
||
|
return false;
|
||
|
}
|
||
|
return /wc\/store\/cart\//.exec( url ) !== null;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* 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 );
|