UNPKG

chonky

Version:

A File Browser component for React

41 lines (35 loc) 1.53 kB
import { useEffect } from 'react'; import watch from 'redux-watch'; import { Store } from '@reduxjs/toolkit'; import { ChonkyActions } from '../action-definitions'; import { RootState } from '../types/redux.types'; import { FileSelection } from '../types/selection.types'; import { selectSelectedFileIds, selectSelectionMap } from './selectors'; import { thunkRequestFileAction } from './thunks/dispatchers.thunks'; export const useStoreWatchers = (store: Store<RootState>) => { useEffect(() => { const selectionWatcher = watch(() => selectSelectionMap(store.getState())); const onSelectionChange = ( newSelection: FileSelection, oldSelection: FileSelection ) => { // We don't check for deep equality here as we expect the // reducers to prevent all unnecessary updates. if (newSelection === oldSelection) return; // Notify users the selection has changed. const selectedFilesIds = selectSelectedFileIds(store.getState()); const selection = new Set<string>(selectedFilesIds); store.dispatch( thunkRequestFileAction(ChonkyActions.ChangeSelection, { selection, }) as any ); }; const unsubscribeCallbacks = [ store.subscribe(selectionWatcher(onSelectionChange)), ]; return () => { for (const unsubscribe of unsubscribeCallbacks) unsubscribe(); }; }, [store]); };