All files / DropMenu DropMenu.reducers.ts

100% Statements 20/20
83.33% Branches 10/12
100% Functions 6/6
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73        2x 2x 2x               1x                   4x               2x 2x   2x 1x 1x 1x     2x             3x 3x   3x 2x 1x 1x     3x                   4x          
import _ from 'lodash';
import { IDropMenuState } from './DropMenu';
 
export function onExpand(state: IDropMenuState): IDropMenuState {
	const { selectedIndices } = state;
	const focusedIndex = _.last(selectedIndices);
	return {
		...state,
		isExpanded: true,
		focusedIndex: _.isNil(focusedIndex) ? null : focusedIndex,
	};
}
 
export function onCollapse(state: IDropMenuState): IDropMenuState {
	return {
		...state,
		isExpanded: false,
	};
}
 
export function onSelect(
	state: IDropMenuState,
	optionIndex: number
): IDropMenuState {
	return {
		...state,
		selectedIndices: [optionIndex],
		isExpanded: false,
	};
}
 
export function onFocusNext(state: IDropMenuState): IDropMenuState {
	const { focusedIndex } = state;
	let nextFocusedIndex = focusedIndex;
 
	if (_.isNull(focusedIndex)) {
		nextFocusedIndex = 0;
	} else if (_.isNumber(focusedIndex)) {
		nextFocusedIndex = focusedIndex + 1;
	}
 
	return {
		...state,
		focusedIndex: nextFocusedIndex,
	};
}
 
export function onFocusPrev(state: IDropMenuState): IDropMenuState {
	const { focusedIndex } = state;
	let nextFocusedIndex = focusedIndex;
 
	if (_.isNull(focusedIndex) || focusedIndex === 0) {
		nextFocusedIndex = null;
	} else if (_.isNumber(focusedIndex)) {
		nextFocusedIndex = focusedIndex - 1;
	}
 
	return {
		...state,
		focusedIndex: nextFocusedIndex,
	};
}
 
export function onFocusOption(
	state: IDropMenuState,
	optionIndex: number
): IDropMenuState {
	return {
		...state,
		focusedIndex: optionIndex,
	};
}