license import { Reducer } from 'redux' ; import { createSelector } from 'reselect' ; import { REQUEST_ITEM , RECEIVE_ITEM , FAIL_ITEM } from '../actions/items.js' ; import { idSelector } from './app.js' ; import { RootAction , RootState } from '../store.js' ; export interface ItemsState { [ k ] : ItemState ; } ; export interface ItemState { id ? : string ; comments ? : Array < CommentState > ; comments_count ? : number ; content ? : string ; domain ? : string ; failure ? : boolean ; isFetching ? : boolean ; points ? : number ; time_ago ? : string ; title ? : string ; url ? : string ; user ? : string ; } ; export interface CommentState { comments ? : Array < CommentState > ; content ? : string ; time_ago ? : string ; user ? : string ; } ; const items = ( state = { } , action ) => { switch ( action . type ) { case REQUEST_ITEM : case RECEIVE_ITEM : case FAIL_ITEM : const itemId = action . itemId ; return { ... state , [ itemId ] : item ( state [ itemId ] , action ) } ; case 'RECEIVE_LIST' : return action . items . reduce ( ( obj , item ) => { obj [ item . id ] = item ; return obj ; } , { ... state } ) ; case 'ADD_FAVORITE' : return { ... state , [ action . item . id ] : action . item } ; default : return state ; } } ; const item = ( state = { } , action ) => { switch ( action . type ) { case REQUEST_ITEM : return { ... state , id : action . itemId , failure : false , isFetching : true } ; case RECEIVE_ITEM : return { ... state , failure : false , isFetching : false , ... action . data } ; case FAIL_ITEM : return { ... state , failure : true , isFetching : false } ; default : return state ; } } ; export default items ; export const itemsSelector = ( state ) => state . items ; export const currentItemSelector = createSelector ( itemsSelector , idSelector , ( items , id ) => { return id ? items [ id ] || { id } : null ; } ) ;