import { useCallback } from 'react'
import { useAsyncBatcher } from './useAsyncBatcher'
import type { ReactAsyncBatcherOptions } from './useAsyncBatcher'
/**
* A React hook that creates a batched version of an async callback function.
* This hook is a convenient wrapper around the `useAsyncBatcher` hook,
* providing a stable, batched async function reference for use in React components.
*
* The batched async function will collect individual calls into batches and execute them
* when batch conditions are met (max size reached, wait time elapsed, or custom logic).
* The returned function always returns a promise that resolves with undefined (since the
* batch function processes multiple items together).
*
* This hook provides a simpler API compared to `useAsyncBatcher`, making it ideal for basic
* async batching needs. However, it does not expose the underlying AsyncBatcher instance.
*
* For advanced usage requiring features like:
* - Manual batch execution
* - Access to batch results and state
* - Custom useCallback dependencies
*
* Consider using the `useAsyncBatcher` hook instead.
*
* @example
* ```tsx
* // Batch API requests
* const batchApiCall = useAsyncBatchedCallback(async (requests: ApiRequest[]) => {
* const results = await Promise.all(requests.map(req => fetch(req.url)));
* return results.map(res => res.json());
* }, {
* maxSize: 10, // Process when 10 requests collected
* wait: 1000 // Or after 1 second
* });
*
* // Use in event handlers
*
* ```
*/
export function useAsyncBatchedCallback(
fn: (items: Array) => Promise,
options: ReactAsyncBatcherOptions,
): (item: TValue) => Promise {
const asyncBatchedFn = useAsyncBatcher(fn, options).addItem
return useCallback((item: TValue) => asyncBatchedFn(item), [asyncBatchedFn])
}