import { StateT, Ressource } from './provider'
import { createContext, useContext, Dispatch } from 'react'
export type Action =
| { type: 'clickOnDir'; ressource: Ressource }
| { type: 'defaultState' }
export type ReducerCtxT = {
state: StateT
dispatch: Dispatch<Action>
}
export const ReducerCtx = createContext<Partial<ReducerCtxT>>({})
export const useReducerCtx = () => useContext(ReducerCtx)
export function reducer(state: StateT, action: Action): StateT {
switch (action.type) {
case 'clickOnDir': {
const { ressources } = state
const newRessourcesFn =
(selectedDir: Ressource) => (childrenId: number[]) =>
ressources.map(ressource =>
ressource.id === selectedDir.id
? { ...ressource, isOpen: !selectedDir.isOpen }
: childrenId.includes(ressource.id)
? childrenId.push(ressource.id) && {
...ressource,
isVisible: !selectedDir.isOpen,
}
: ressource,
)
const newRessources = newRessourcesFn(action.ressource)([
...action.ressource.childrenIds,
])
return {
...state,
ressources: newRessources,
}
}
case 'defaultState': {
const { ressources, config } = state
const newRessources = ressources.map(res =>
res.depth > config.defaultDepth
? { ...res, isVisible: false, isOpen: false }
: res,
)
return {
...state,
ressources: newRessources,
}
}
default:
state
}
}