import { produce } from 'immer' import type { ApplyPropsAction, UpdateFocusAction, UpdateRangeSelectionAction, } from '../actions' import type { GridRangeSelection } from '../../types' import { createReducer } from '../utils/createReducer' import { ACTIONS_COLUMN_ID, SELECTION_COLUMN_ID } from '../../constants' export type GridRangeSelectionState = { controlled: boolean enabled: boolean rangeSelection: null | GridRangeSelection rangeSelectionPreview: null | GridRangeSelection } const initialState: GridRangeSelectionState = { enabled: false, controlled: false, rangeSelection: null, rangeSelectionPreview: null, } export default createReducer({ initialState, reducers: { applyProps(state, action: ApplyPropsAction) { return produce(state, (draft) => { draft.enabled = action.payload.spreadsheet === true draft.controlled = action.payload.rangeSelection !== undefined if (action.payload.rangeSelection !== undefined) { draft.rangeSelection = action.payload.rangeSelection } }) }, updateRangeSelection(state, actions: UpdateRangeSelectionAction) { return { ...state, rangeSelection: actions.payload, } }, updateRangeSelectionPreview( state, actions: UpdateRangeSelectionAction ) { return { ...state, rangeSelectionPreview: actions.payload, } }, updateFocus(state, actions: UpdateFocusAction) { if (!state.enabled) { return state } if ( actions.payload.area !== 'body' || actions.payload.columnId === SELECTION_COLUMN_ID || actions.payload.columnId === ACTIONS_COLUMN_ID ) { return { ...state, rangeSelection: null, } } return { ...state, rangeSelection: { from: { columnId: actions.payload.columnId, rowId: actions.payload.rowId, }, to: { columnId: actions.payload.columnId, rowId: actions.payload.rowId, }, }, } }, }, }) export const selectRangeSelection = ( state: GridRangeSelectionState ): GridRangeSelection | null => state.rangeSelection export const selectRangeSelectionPreview = ( state: GridRangeSelectionState ): GridRangeSelection | null => state.rangeSelectionPreview export const selectIsSpreadsheet = (state: GridRangeSelectionState) => state.enabled export const selectIsRangeSelectionControlled = ( state: GridRangeSelectionState ) => state.controlled