820ef184d3
* wip * - Added scopes on useHotkeys - Use new EditableCellV2 - Implemented Recoil Scoped State with specific context - Implemented soft focus position - Factorized open/close editable cell - Removed editable relation old components - Broke down entity table into multiple components - Added Recoil Scope by CellContext - Added Recoil Scope by RowContext * First working version * Use a new EditableCellSoftFocusMode * Fixes * wip * wip * wip * Use company filters * Refactored FilterDropdown into multiple components * Refactored entity search select in dropdown * Renamed states * Fixed people filters * Removed unused code * Cleaned states * Cleaned state * Better naming * fixed rebase * Fix * Fixed stories and mocked data and displayName bug * Fixed cancel sort * Fixed naming * Fixed dropdown height * Fix * Fixed lint
72 lines
1.8 KiB
TypeScript
72 lines
1.8 KiB
TypeScript
import scrollIntoView from 'scroll-into-view';
|
|
|
|
import { useUpDownHotkeys } from '@/hotkeys/hooks/useUpDownHotkeys';
|
|
import { useRecoilScopedState } from '@/recoil-scope/hooks/useRecoilScopedState';
|
|
|
|
import { relationPickerHoverIndexScopedState } from '../states/relationPickerHoverIndexScopedState';
|
|
import { EntityForSelect } from '../types/EntityForSelect';
|
|
|
|
export function useEntitySelectScroll<
|
|
CustomEntityForSelect extends EntityForSelect,
|
|
>({
|
|
containerRef,
|
|
entities,
|
|
}: {
|
|
entities: CustomEntityForSelect[];
|
|
containerRef: React.RefObject<HTMLDivElement>;
|
|
}) {
|
|
const [hoveredIndex, setHoveredIndex] = useRecoilScopedState(
|
|
relationPickerHoverIndexScopedState,
|
|
);
|
|
|
|
useUpDownHotkeys(
|
|
() => {
|
|
setHoveredIndex((prevSelectedIndex) =>
|
|
Math.max(prevSelectedIndex - 1, 0),
|
|
);
|
|
|
|
const currentHoveredRef = containerRef.current?.children[
|
|
hoveredIndex
|
|
] as HTMLElement;
|
|
|
|
if (currentHoveredRef) {
|
|
scrollIntoView(currentHoveredRef, {
|
|
align: {
|
|
top: 0.5,
|
|
},
|
|
isScrollable: (target) => {
|
|
return target === containerRef.current;
|
|
},
|
|
time: 0,
|
|
});
|
|
}
|
|
},
|
|
() => {
|
|
setHoveredIndex((prevSelectedIndex) =>
|
|
Math.min(prevSelectedIndex + 1, (entities?.length ?? 0) - 1),
|
|
);
|
|
|
|
const currentHoveredRef = containerRef.current?.children[
|
|
hoveredIndex
|
|
] as HTMLElement;
|
|
|
|
if (currentHoveredRef) {
|
|
scrollIntoView(currentHoveredRef, {
|
|
align: {
|
|
top: 0.275,
|
|
},
|
|
isScrollable: (target) => {
|
|
return target === containerRef.current;
|
|
},
|
|
time: 0,
|
|
});
|
|
}
|
|
},
|
|
[setHoveredIndex, entities],
|
|
);
|
|
|
|
return {
|
|
hoveredIndex,
|
|
};
|
|
}
|