mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
36 lines
1019 B
TypeScript
36 lines
1019 B
TypeScript
import { useSyncExternalStore } from 'react';
|
|
import type { TasksRecord } from '../../core/queue';
|
|
import type { AnyStore, InferStoreTasks } from '../../core/store';
|
|
|
|
/**
|
|
* Subscribe to queue task changes.
|
|
*
|
|
* Returns a record of all tasks keyed by request name.
|
|
* Re-renders when any task is added, updated, or removed.
|
|
*
|
|
* @example
|
|
* ```tsx
|
|
* function TaskStatus() {
|
|
* const tasks = useQueue(store);
|
|
* const playTask = tasks.play;
|
|
*
|
|
* if (playTask?.status === 'pending') {
|
|
* return <span>Loading...</span>;
|
|
* }
|
|
*
|
|
* return <span>Ready</span>;
|
|
* }
|
|
* ```
|
|
*/
|
|
export function useQueue<Store extends AnyStore>(store: Store): TasksRecord<InferStoreTasks<Store>> {
|
|
return useSyncExternalStore(
|
|
(cb) => store.queue.subscribe(cb),
|
|
() => store.queue.tasks as TasksRecord<InferStoreTasks<Store>>,
|
|
() => store.queue.tasks as TasksRecord<InferStoreTasks<Store>>
|
|
);
|
|
}
|
|
|
|
export namespace useQueue {
|
|
export type Result<Store extends AnyStore> = TasksRecord<InferStoreTasks<Store>>;
|
|
}
|