// @flow import {concat, findIndex, get, includes} from 'lodash/fp'; import type {Action, Config, ContentResourceViewedAction, ViewedResource} from '../types'; export default function viewedResources( config: Config ): (Array, Action) => Array { return ( currentViewedResources: Array = [], action: Action ): Array => { switch (action.type) { case 'resource': { const resourceViewAction = (action: ContentResourceViewedAction); const contentRef = resourceViewAction.payload.content.ref; const contentType = resourceViewAction.payload.content.type; const resourceRef = resourceViewAction.payload.resource.ref; const contentIndex = findIndex({ref: contentRef}, currentViewedResources); if (contentIndex === -1) { return concat(currentViewedResources)([ { ref: contentRef, type: contentType, resources: [resourceRef] } ]); } const contentResources: Array = get( 'resources', currentViewedResources[contentIndex] ); const resourceAlreadyViewed = includes(resourceRef, contentResources); if (resourceAlreadyViewed) return currentViewedResources; // return currentViewedResources, contentIndex, resourceRef; const newViewedResources = [...currentViewedResources]; newViewedResources[contentIndex] = { ...newViewedResources[contentIndex], resources: concat(newViewedResources[contentIndex].resources, [resourceRef]) }; return newViewedResources; } default: return currentViewedResources; } }; }