import { TodoListModule } from '../actions/todo-list.action' ; import { TodoListState , Todo } from '../../models/todo' ; import { createEntityAdapter , EntityAdapter , EntityState } from '@ngrx/entity' ; export interface TodoListStateEntity extends EntityState < Todo > { loading : boolean ; loaded : boolean ; selectedTodo : Todo ; logs : { type : string ; message : string ; } ; } export const TodoListAdapter = createEntityAdapter < Todo > ( { sortComparer : false } ) ; export const initialState = TodoListAdapter . getInitialState ( { loading : false , loaded : false , selectedTodo : undefined , logs : undefined } ) ; export const { selectIds : selectTodosIds , selectEntities : selectTodosEntities , selectAll : selectTodos , selectTotal : selectTotalTodos } = TodoListAdapter . getSelectors ( ) ; export function todosReducer ( state = initialState , action ) { switch ( action . type ) { case TodoListModule . ActionTypes . LOAD_INIT_TODOS : return { ... state , loading : true } ; case TodoListModule . ActionTypes . SUCCESS_INIT_TODOS : return { ... TodoListAdapter . addMany ( action . payload , state ) , loading : false , loaded : true } ; case TodoListModule . ActionTypes . LOAD_CREATE_TODO : return { ... state , loading : true } ; case TodoListModule . ActionTypes . SUCCESS_CREATE_TODO : return { ... TodoListAdapter . addOne ( action . payload , state ) , loading : false , logs : { type : 'SUCCESS' , message : 'La todo à été crée avec succès' } } ; case TodoListModule . ActionTypes . SELECT_TODO : return { ... state , selectedTodo : action . payload } ; case TodoListModule . ActionTypes . LOAD_UPDATE_TODO : return { ... state , loading : true } ; case TodoListModule . ActionTypes . SUCCESS_UPDATE_TODO : const { id , ... changes } = action . payload ; return { ... TodoListAdapter . updateOne ( { id : id , changes : changes } , state ) , loading : false , logs : { type : 'SUCCESS' , message : 'La todo à été mise à jour avec succès' } } ; case TodoListModule . ActionTypes . LOAD_DELETE_TODO : return { ... state , loading : true } ; case TodoListModule . ActionTypes . SUCCESS_DELETE_TODO : return { ... TodoListAdapter . removeOne ( action . payload , state ) , logs : { type : 'SUCCESS' , message : 'La todo à été suprimmé avec succès' } } ; case TodoListModule . ActionTypes . ERROR_LOAD_ACTION : return { ... state , loading : false , logs : { type : 'ERROR' , message : action . payload . message } } ; default : return state ; } }