29 lines
879 B
TypeScript
29 lines
879 B
TypeScript
import { useEffect } from 'react';
|
|
|
|
import { useStoreApi } from './useStore';
|
|
import type { OnSelectionChangeFunc } from '../types';
|
|
|
|
export type UseOnSelectionChangeOptions = {
|
|
onChange: OnSelectionChangeFunc;
|
|
};
|
|
|
|
/**
|
|
* Hook for registering an onSelectionChange handler.
|
|
*
|
|
* @public
|
|
* @param params.onChange - The handler to register
|
|
*/
|
|
export function useOnSelectionChange({ onChange }: UseOnSelectionChangeOptions) {
|
|
const store = useStoreApi();
|
|
|
|
useEffect(() => {
|
|
const nextOnSelectionChangeHandlers = [...store.getState().onSelectionChangeHandlers, onChange];
|
|
store.setState({ onSelectionChangeHandlers: nextOnSelectionChangeHandlers });
|
|
|
|
return () => {
|
|
const nextHandlers = store.getState().onSelectionChangeHandlers.filter((fn) => fn !== onChange);
|
|
store.setState({ onSelectionChangeHandlers: nextHandlers });
|
|
};
|
|
}, [onChange]);
|
|
}
|