woocommerce/plugins/woocommerce-blocks/assets/js/data/cart/index.ts

71 lines
1.9 KiB
TypeScript

/**
* External dependencies
*/
import {
dispatch as wpDataDispatch,
registerStore,
select as wpDataSelect,
} from '@wordpress/data';
import { controls as dataControls } from '@wordpress/data-controls';
/**
* Internal dependencies
*/
import { STORE_KEY } from './constants';
import * as selectors from './selectors';
import * as actions from './actions';
import * as resolvers from './resolvers';
import reducer, { State } from './reducers';
import { controls as sharedControls } from '../shared-controls';
import { controls } from './controls';
import type { SelectFromMap, DispatchFromMap } from '../mapped-types';
import { pushChanges } from './push-changes';
import { checkPaymentMethodsCanPay } from '../payment-methods/check-payment-methods';
const registeredStore = registerStore< State >( STORE_KEY, {
reducer,
actions,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
controls: { ...dataControls, ...sharedControls, ...controls } as any,
selectors,
resolvers,
} );
registeredStore.subscribe( pushChanges );
registeredStore.subscribe( async () => {
const isInitialized =
wpDataSelect( STORE_KEY ).hasFinishedResolution( 'getCartData' );
if ( ! isInitialized ) {
return;
}
await checkPaymentMethodsCanPay();
await checkPaymentMethodsCanPay( true );
} );
const unsubscribeInitializePaymentMethodDataStore = registeredStore.subscribe(
async () => {
const cartLoaded =
wpDataSelect( STORE_KEY ).hasFinishedResolution( 'getCartTotals' );
if ( cartLoaded ) {
wpDataDispatch(
'wc/store/payment-methods'
).__internalInitializePaymentMethodDataStore();
unsubscribeInitializePaymentMethodDataStore();
}
}
);
export const CART_STORE_KEY = STORE_KEY;
declare module '@wordpress/data' {
function dispatch(
key: typeof CART_STORE_KEY
): DispatchFromMap< typeof actions >;
function select( key: typeof CART_STORE_KEY ): SelectFromMap<
typeof selectors
> & {
hasFinishedResolution: ( selector: string ) => boolean;
};
}