import { produce } from 'immer' import type { ApplyPropsAction, UpdateSortAction, UpdateSortLocale, } from '../actions' import type { GridColumnSort } from '../../types' import { createReducer } from '../utils/createReducer' export type GridSortState = { initialized: boolean controlled: boolean locale: string columns: GridColumnSort[] defaultColumns?: GridColumnSort[] mode: 'internal' | 'external' multiColumnSort: boolean } const initialState: GridSortState = { initialized: false, controlled: false, mode: 'internal', locale: 'en-US', columns: [], multiColumnSort: true, } export default createReducer({ initialState, reducers: { applyProps(state, action: ApplyPropsAction) { return produce(state, (draft) => { draft.multiColumnSort = !!action.payload.multiColumnSort if (action.payload.sort) { draft.controlled = true draft.columns = action.payload.sort } else { draft.controlled = false if ( state.initialized === false && action.payload.defaultSort ) { draft.columns = action.payload.defaultSort } if (!draft.multiColumnSort && draft.columns.length > 1) { draft.columns = draft.columns.slice(-1) } } draft.defaultColumns = action.payload.defaultSort draft.initialized = true draft.mode = action.payload.sortMode || 'internal' }) }, updateSort(state, action: UpdateSortAction) { return { ...state, columns: action.payload, } }, updateSortLocale(state, action: UpdateSortLocale) { return { ...state, locale: action.payload, } }, }, }) export const selectSortMode = (state: GridSortState) => state.mode export const selectSortLocale = (state: GridSortState) => state.locale export const selectSortColumns = (state: GridSortState) => state.columns export const selectColumnSort = (state: GridSortState, columnId: string) => state.columns.find((c) => c.columnId === columnId) export const selectSort = (state: GridSortState) => state.columns export const selectDefaultSort = (state: GridSortState) => state.defaultColumns export const selectIsMultiColumnSortingEnabled = (state: GridSortState) => state.multiColumnSort export const selectIsMultiColumnSorting = (state: GridSortState) => state.columns.length > 1 export const selectColumnSortNumber = ( state: GridSortState, columnId: string ) => state.columns.length <= 1 ? 0 : state.columns.findIndex((c) => c.columnId === columnId) + 1