chonky
Version:
A File Browser component for React
41 lines (35 loc) • 1.53 kB
text/typescript
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]);
};