UNPKG

@1771technologies/lytenyte-pro

Version:

Blazingly fast headless React data grid with 100s of features.

57 lines (56 loc) 2.25 kB
import { useCallback, useEffect, useRef, useState } from "react"; import { sortModelToSortItems } from "../utils/sort-model-to-sort-items.js"; import { itemsWithIdToMap } from "@1771technologies/lytenyte-shared"; import { useSortRowItems } from "./use-sort-row-item.js"; import { useEvent } from "@1771technologies/lytenyte-core/yinternal"; export function useSortManager({ grid, pivotMode }) { const statePivotMode = grid.state.columnPivotMode.useValue(); const mode = pivotMode ?? statePivotMode; const cb = useCallback(() => { if (mode) { const pivotSortModel = grid.state.columnPivotModel.get().sorts; const lookup = itemsWithIdToMap(grid.state.columnPivotColumns.get()); const model = sortModelToSortItems(pivotSortModel, lookup); if (!model.length) return [{ sortDirection: "ascending", isCustom: false }]; return model; } else { const sortModel = grid.state.sortModel.get(); const lookup = itemsWithIdToMap(grid.state.columns.get()); const model = sortModelToSortItems(sortModel, lookup); if (!model.length) return [{ sortDirection: "ascending", isCustom: false }]; return model; } }, [ grid.state.columnPivotColumns, grid.state.columnPivotModel, grid.state.columns, grid.state.sortModel, mode, ]); const fn = useEvent(() => cb()); const [sortItems, setSortItems] = useState(() => { return cb(); }); const prevMode = useRef(mode); useEffect(() => { if (prevMode.current !== mode) { setSortItems(fn()); prevMode.current = mode; } if (mode) { return grid.state.columnPivotModel.watch(() => { setSortItems(fn()); }); } else { return grid.state.sortModel.watch(() => { setSortItems(fn()); }); } }, [fn, grid.state.columnPivotModel, grid.state.sortModel, mode]); const sortRows = useSortRowItems(sortItems, setSortItems, grid, mode); return { rootProps: { sortItems, setSortItems, mode, grid }, rows: sortRows }; }