@deepdub/react-arborist
Version:
54 lines (48 loc) • 1.55 kB
text/typescript
import { ActionTypes } from "../types/utils";
/* Types */
export type OpenMap = { [id: string]: boolean };
export type OpenSlice = { unfiltered: OpenMap; filtered: OpenMap };
/* Actions */
export const actions = {
open(id: string, filtered: boolean) {
return { type: "VISIBILITY_OPEN" as const, id, filtered };
},
close(id: string, filtered: boolean) {
return { type: "VISIBILITY_CLOSE" as const, id, filtered };
},
toggle(id: string, filtered: boolean) {
return { type: "VISIBILITY_TOGGLE" as const, id, filtered };
},
clear(filtered: boolean) {
return { type: "VISIBILITY_CLEAR" as const, filtered };
},
};
/* Reducer */
function openMapReducer(
state: OpenMap = {},
action: ActionTypes<typeof actions>
) {
if (action.type === "VISIBILITY_OPEN") {
return { ...state, [action.id]: true };
} else if (action.type === "VISIBILITY_CLOSE") {
return { ...state, [action.id]: false };
} else if (action.type === "VISIBILITY_TOGGLE") {
const prev = state[action.id];
return { ...state, [action.id]: !prev };
} else if (action.type === "VISIBILITY_CLEAR") {
return {};
} else {
return state;
}
}
export function reducer(
state: OpenSlice = { filtered: {}, unfiltered: {} },
action: ActionTypes<typeof actions>
): OpenSlice {
if (!action.type.startsWith("VISIBILITY")) return state;
if (action.filtered) {
return { ...state, filtered: openMapReducer(state.filtered, action) };
} else {
return { ...state, unfiltered: openMapReducer(state.unfiltered, action) };
}
}