/**
 * Internal dependencies
 */
import type { AnyConfig, StoreDescriptor, DispatchReturn } from './types';
import defaultRegistry from './default-registry';

/**
 * Given a store descriptor, returns an object of the store's action creators.
 * Calling an action creator will cause it to be dispatched, updating the state value accordingly.
 *
 * Note: Action creators returned by the dispatch will return a promise when
 * they are called.
 *
 * Warning: This global `dispatch` function only works with the default registry.
 * It will not work with custom `RegistryProvider` or `BlockEditorProvider` contexts.
 * In React components, prefer the `useDispatch` hook instead, which is registry-aware.
 *
 * @param storeNameOrDescriptor The store descriptor. The legacy calling convention of passing
 *                              the store name is also supported.
 *
 * @example
 * ```js
 * import { dispatch } from '@wordpress/data';
 * import { store as myCustomStore } from 'my-custom-store';
 *
 * dispatch( myCustomStore ).setPrice( 'hammer', 9.75 );
 * ```
 * @return Object containing the action creators.
 */
export function dispatch<
	StoreNameOrDescriptor extends StoreDescriptor< AnyConfig > | string,
>(
	storeNameOrDescriptor: StoreNameOrDescriptor
): DispatchReturn< StoreNameOrDescriptor > {
	return defaultRegistry.dispatch(
		storeNameOrDescriptor
	) as DispatchReturn< StoreNameOrDescriptor >;
}
