95 lines
2.7 KiB
TypeScript
95 lines
2.7 KiB
TypeScript
/**
|
|
* External dependencies
|
|
*/
|
|
import { __ } from '@wordpress/i18n';
|
|
import type { Options as NoticeOptions } from '@wordpress/notices';
|
|
import { select, dispatch } from '@wordpress/data';
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
import { noticeContexts } from '../context/event-emit/utils';
|
|
|
|
export const DEFAULT_ERROR_MESSAGE = __(
|
|
'Something went wrong. Please contact us to get assistance.',
|
|
'woo-gutenberg-products-block'
|
|
);
|
|
|
|
export const hasStoreNoticesContainer = ( container: string ): boolean => {
|
|
const containers = select( 'wc/store/store-notices' ).getContainers();
|
|
return containers.includes( container );
|
|
};
|
|
|
|
const findParentContainer = ( container: string ): string => {
|
|
if ( container.includes( noticeContexts.CHECKOUT + '/' ) ) {
|
|
return noticeContexts.CHECKOUT;
|
|
}
|
|
if ( container.includes( noticeContexts.CART + '/' ) ) {
|
|
return hasStoreNoticesContainer( noticeContexts.CART )
|
|
? noticeContexts.CART
|
|
: noticeContexts.CHECKOUT;
|
|
}
|
|
return container;
|
|
};
|
|
|
|
/**
|
|
* Wrapper for @wordpress/notices createNotice.
|
|
*
|
|
* This is used to create the correct type of notice based on the provided context, and to ensure the notice container
|
|
* exists first, otherwise it uses the default context instead.
|
|
*/
|
|
export const createNotice = (
|
|
status: 'error' | 'warning' | 'info' | 'success',
|
|
message: string,
|
|
options: Partial< NoticeOptions >
|
|
) => {
|
|
const noticeContext = options?.context;
|
|
const suppressNotices =
|
|
select( 'wc/store/payment' ).isExpressPaymentMethodActive();
|
|
|
|
if ( suppressNotices || noticeContext === undefined ) {
|
|
return;
|
|
}
|
|
|
|
const { createNotice: dispatchCreateNotice } = dispatch( 'core/notices' );
|
|
|
|
dispatchCreateNotice( status, message, {
|
|
isDismissible: true,
|
|
...options,
|
|
context: hasStoreNoticesContainer( noticeContext )
|
|
? noticeContext
|
|
: findParentContainer( noticeContext ),
|
|
} );
|
|
};
|
|
|
|
/**
|
|
* Creates a notice only if the Store Notice Container is visible.
|
|
*/
|
|
export const createNoticeIfVisible = (
|
|
status: 'error' | 'warning' | 'info' | 'success',
|
|
message: string,
|
|
options: Partial< NoticeOptions >
|
|
) => {
|
|
if ( options?.context && hasStoreNoticesContainer( options.context ) ) {
|
|
createNotice( status, message, options );
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Remove notices from all contexts.
|
|
*
|
|
* @todo Remove this when supported in Gutenberg.
|
|
* @see https://github.com/WordPress/gutenberg/pull/44059
|
|
*/
|
|
export const removeAllNotices = () => {
|
|
const containers = select( 'wc/store/store-notices' ).getContainers();
|
|
const { removeNotice } = dispatch( 'core/notices' );
|
|
const { getNotices } = select( 'core/notices' );
|
|
|
|
containers.forEach( ( container ) => {
|
|
getNotices( container ).forEach( ( notice ) => {
|
|
removeNotice( notice.id, container );
|
|
} );
|
|
} );
|
|
};
|