| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 | /* * << * Davinci * == * Copyright (C) 2016 - 2017 EDP * == * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * >> */import produce from 'immer'import { ActionTypes } from './constants'import { VizActionType } from './actions'import { IVizState, ISlideFormed } from './types'import { LOCATION_CHANGE, LocationChangeAction } from 'connected-react-router'import { matchPortalPath, matchDisplaySlidePath } from 'utils/router'const initialState: IVizState = {  portals: [],  displays: [],  portalDashboards: {},  displaySlides: {},  currentPortalId: 0,  currentDisplay: null,  currentSlide: null,  loading: {    portal: false,    display: false,    editing: false,    dashboards: false,    slides: false  }}const vizReducer = (  state = initialState,  action: VizActionType | LocationChangeAction) =>  produce(state, (draft: IVizState) => {    let displayId: number    let slide: ISlideFormed    let slides: ISlideFormed[]    let slideId: number    switch (action.type) {      case ActionTypes.LOAD_PORTALS:        draft.loading.portal = true        break      case ActionTypes.LOAD_PORTALS_SUCCESS:        draft.portals = action.payload.result        draft.loading.portal = false        break      case ActionTypes.LOAD_PORTALS_FAILURE:        draft.loading.portal = false        break      case ActionTypes.ADD_PORTAL:        draft.loading.editing = true        break      case ActionTypes.ADD_PORTAL_SUCCESS:        draft.portals.unshift(action.payload.result)        draft.loading.editing = false        break      case ActionTypes.ADD_PORTAL_FAILURE:        draft.loading.editing = false        break      case ActionTypes.DELETE_PORTAL:        break      case ActionTypes.DELETE_PORTAL_SUCCESS:        draft.portals = draft.portals.filter((g) => g.id !== action.payload.id)        break      case ActionTypes.DELETE_PORTAL_FAILURE:        break      case ActionTypes.EDIT_PORTAL:        draft.loading.editing = true        break      case ActionTypes.EDIT_PORTAL_SUCCESS:        draft.portals.splice(          draft.portals.findIndex((g) => g.id === action.payload.result.id),          1,          action.payload.result        )        draft.loading.editing = false        break      case ActionTypes.EDIT_PORTAL_FAILURE:        draft.loading.editing = true        break      case ActionTypes.LOAD_PORTAL_DASHBOARDS:        draft.loading.dashboards = true        break      case ActionTypes.LOAD_PORTAL_DASHBOARDS_SUCCESS:        draft.portalDashboards[action.payload.portalId] =          action.payload.dashboards        draft.loading.dashboards = false        if (!draft.currentPortalId) {          draft.currentPortalId = action.payload.portalId        }        break      case ActionTypes.LOAD_PORTAL_DASHBOARDS_FAILURE:        delete draft.portalDashboards[action.payload.portalId]        draft.loading.dashboards = false        break      case ActionTypes.ADD_DASHBOARD:        draft.loading.editing = true        break      case ActionTypes.ADD_DASHBOARD_SUCCESS:        draft.portalDashboards[action.payload.result.dashboardPortalId].push(          action.payload.result        )        draft.loading.editing = false        break      case ActionTypes.ADD_DASHBOARD_FAILURE:        draft.loading.editing = false        break      case ActionTypes.EDIT_DASHBOARD:        draft.loading.editing = true        break      case ActionTypes.EDIT_DASHBOARD_SUCCESS:        const { result, formType } = action.payload        if (formType === 'edit') {          result.forEach((r) => {            draft.portalDashboards[r.dashboardPortalId].splice(              draft.portalDashboards[r.dashboardPortalId].findIndex(                (d) => d.id === r.id              ),              1,              r            )          })        } else if (formType === 'move') {          draft.portalDashboards[            result[0].dashboardPortalId          ] = draft.portalDashboards[result[0].dashboardPortalId].filter(            (d) => result.findIndex(({ id }) => id === d.id) < 0          )          draft.portalDashboards[            result[0].dashboardPortalId          ] = draft.portalDashboards[result[0].dashboardPortalId].concat(result)        }        draft.loading.editing = false        break      case ActionTypes.EDIT_DASHBOARD_FAILURE:        draft.loading.editing = false        break      case ActionTypes.DELETE_DASHBOARD_SUCCESS:        draft.portalDashboards[          action.payload.portalId        ] = draft.portalDashboards[action.payload.portalId].filter(          ({ id }) => id !== action.payload.id        )        break      case ActionTypes.LOAD_DISPLAYS:        draft.loading.display = true        break      case ActionTypes.LOAD_DISPLAYS_SUCCESS:        draft.displays = action.payload.displays        draft.loading.display = false        break      case ActionTypes.LOAD_DISPLAYS_FAILURE:        draft.loading.display = false        break      case ActionTypes.ADD_DISPLAY:      case ActionTypes.EDIT_DISPLAY:      case ActionTypes.COPY_DISPLAY:        draft.loading.editing = true        break      case ActionTypes.ADD_DISPLAY_SUCCESS:        draft.displays.unshift(action.payload.result)        draft.loading.editing = false        break      case ActionTypes.EDIT_DISPLAY_SUCCESS:        draft.displays.splice(          draft.displays.findIndex(({ id }) => id === action.payload.result.id),          1,          action.payload.result        )        if (          draft.currentDisplay &&          action.payload.result.id === draft.currentDisplay.id        ) {          draft.currentDisplay = action.payload.result        }        draft.loading.editing = false        break      case ActionTypes.COPY_DISPLAY_SUCCESS:        draft.displays.unshift(action.payload.display)        break      case ActionTypes.ADD_DISPLAY_FAILURE:      case ActionTypes.EDIT_DISPLAY_FAILURE:      case ActionTypes.COPY_DISPLAY_FAILURE:        draft.loading.editing = false        break      case ActionTypes.DELETE_DISPLAY_SUCCESS:        draft.displays = draft.displays.filter(          (d) => d.id !== action.payload.id        )        break      case ActionTypes.DELETE_DISPLAY_FAILURE:        break      case ActionTypes.UPDATE_CURRENT_DISPLAY:        draft.currentDisplay = action.payload.display        break      case ActionTypes.LOAD_DISPLAY_SLIDES:        draft.loading.slides = true        break      case ActionTypes.LOAD_DISPLAY_SLIDES_SUCCESS:        draft.displaySlides[action.payload.display.id] = action.payload.slides        draft.loading.slides = false        break      case ActionTypes.LOAD_DISPLAY_SLIDES_FAILURE:        delete draft.displaySlides[action.payload.displayId]        draft.loading.slides = false        break      case ActionTypes.ADD_SLIDE_SUCCESS:        slide = action.payload.slide        const { insertIdx, afterSlides } = action.payload        displayId = slide.displayId        draft.displaySlides[displayId].splice(insertIdx)        draft.displaySlides[displayId].push(slide)        draft.displaySlides[displayId] = draft.displaySlides[displayId].concat(          afterSlides        )        break      case ActionTypes.EDIT_SLIDES_SUCCESS:        slides = action.payload.slides        displayId = action.payload.displayId        const editedSlideIds = slides.map(({ id }) => id)        draft.displaySlides[displayId] = draft.displaySlides[displayId]          .filter(({ id }) => !editedSlideIds.includes(id))          .concat(slides)          .sort((s1, s2) => s1.index - s2.index)        if (editedSlideIds.includes(draft.currentSlide.id)) {          draft.currentSlide = slides.find(            ({ id }) => id === draft.currentSlide.id          )        }        break      case ActionTypes.DELETE_SLIDES_SUCCESS:        displayId = action.payload.displayId        action.payload.slideIds.forEach((deleteId) => {          draft.displaySlides[displayId].splice(            draft.displaySlides[displayId].findIndex(              ({ id }) => id === deleteId            ),            1          )        })        break      case LOCATION_CHANGE:        const matchPortal = matchPortalPath(action.payload.location.pathname)        if (matchPortal) {          draft.currentPortalId = +matchPortal.params.portalId || 0          break        }        const matchDisplaySlide = matchDisplaySlidePath(          action.payload.location.pathname        )        if (matchDisplaySlide) {          const nextDisplayId = +matchDisplaySlide.params.displayId          const nextSlides = draft.displaySlides[nextDisplayId]          if (nextSlides) {            const nextSlideId = +matchDisplaySlide.params.slideId            const nextSlide = nextSlides.find(({ id }) => id === nextSlideId)            draft.currentSlide = nextSlide          } else {            draft.currentSlide = null          }        } else {          draft.currentDisplay = null          draft.currentSlide = null        }        break    }  })export { initialState as vizInitialState}export default vizReducer
 |