Skip to content
Snippets Groups Projects
shows.js 6.96 KiB
Newer Older
  • Learn to ignore specific revisions
  • import axios from 'axios'
    import handleApiError from '../handleApiError'
    
    
    const cloneMinimalShowObject = function (show) {
      /* returns a new minimal object from the current show object with all
      properties needed for a PUT request to the /show/ endpoint */
      let s = {}
      s.name = show.name
      s.slug = show.slug
      s.short_description = show.short_description
      s.fundingcategory = show.fundingcategory
      s.type = show.type
      // we do not want the arrays do be passed as references, because the
      // current show object should not get modified when the update object
      // gets modified, therefore we use slice to clone the arrays
      s.category = show.category.slice()
      s.hosts = show.hosts.slice()
      s.owners = show.owners.slice()
      s.language = show.language.slice()
      s.topic = show.topic.slice()
      s.musicfocus = show.musicfocus.slice()
      return s
    }
    
    
      shows: [],
      timeslots: [],
      loaded: {
        shows: false,
        timeslots: false,
    
      selected: {
        index: 0, // index of the currently selected show in our shows array
        id: 0,    // actual id of the currently selected show
      }
    
      selectedShow: state => state.shows[state.selected.index],
      getShowByDataParam: state => data => {
        let show
        if (data.id !== undefined) {
          show = state.shows.find(s => s.id === data.id)
          if (show === undefined) { this.$log.error('getShowByDataParam: ID not found in store!') }
        } else if (data.index !== undefined) {
          show = state.shows[data.index]
        } else {
          this.$log.error('getShowByDataParam: no ID or index was provided')
        }
        return show
      }
    
    const mutations = {
      loading(state, item) {
        state.loaded[item] = false
      },
      finishLoading(state, item) {
        state.loaded[item] = true
      },
    
      setShows(state, shows) {
        state.shows = shows
      },
      setTimeslots(state, slots) {
        state.timeslots = slots
    
      setName (state, data) {
        let index = state.shows.findIndex(s => s.id === data.id)
        state.shows[index].name = data.text
      },
      setShortDescription (state, data) {
        let index = state.shows.findIndex(s => s.id === data.id)
        state.shows[index].short_description = data.text
      },
      setDescription (state, data) {
        let index = state.shows.findIndex(s => s.id === data.id)
        state.shows[index].description = data.text
      },
      setActive (state, data) {
        let index = state.shows.findIndex(s => s.id === data.id)
        state.shows[index].is_active = data.active
      },
    
      switchShow (state, index) {
    
        state.selected.index = index
        state.selected.id = state.shows[index].id
    
    const actions = {
      fetchShows (ctx, data) {
        ctx.commit('loading', 'shows')
        let uri = process.env.VUE_APP_API_STEERING + 'shows'
        axios.get(uri, {
          withCredentials: true,
          headers: { 'Authorization': 'Bearer ' + ctx.rootState.auth.user.access_token }
        }).then(response => {
          ctx.commit('setShows', response.data)
          ctx.commit('finishLoading', 'shows')
          if (data && typeof(data.callback) === 'function') { data.callback() }
        }).catch(error => {
          handleApiError(this, error, 'could not load shows')
    
          if (data && typeof(data.callbackCancel) === 'function') { data.callbackCancel() }
    
        })
      },
    
      fetchTimeslots (ctx, data) {
        ctx.commit('loading', 'timeslots')
        let uri = process.env.VUE_APP_API_STEERING + 'timeslots?start=' + data.start + '&end=' + data.end
        axios.get(uri, {
          withCredentials: true,
          headers: { 'Authorization': 'Bearer ' + ctx.rootState.auth.user.access_token }
        }).then(response => {
          ctx.commit('setTimeslots', response.data)
          ctx.commit('finishLoading', 'timeslots')
          if (data && typeof(data.callback) === 'function') { data.callback() }
        }).catch(error => {
          handleApiError(this, error, 'could not load timeslots')
    
          if (data && typeof(data.callbackCancel) === 'function') { data.callbackCancel() }
    
    
      submitSchedule (ctx, data) {
        ctx.commit('loading', 'schedules')
        let uri = process.env.VUE_APP_API_STEERING_SHOWS + data.showId + '/schedules/'
        axios.post(uri, data.schedule, {
          withCredentials: true,
          headers: { 'Authorization': 'Bearer ' + ctx.rootState.auth.user.access_token }
        }).then(response => {
          ctx.commit('finishLoading', 'schedules')
          if (data && typeof(data.callback) === 'function') { data.callback(response) }
        }).catch(error => {
          handleApiError(this, error, 'could not load timeslots')
          if (data && typeof(data.callbackCancel) === 'function') { data.callbackCancel() }
        })
    
      },
    
      updateShow (ctx, data) {
        ctx.commit('loading', 'shows')
        let uri = process.env.VUE_APP_API_STEERING_SHOWS + data.id + '/'
        axios.put(uri, data.show , {
          withCredentials: true,
          headers: { 'Authorization': 'Bearer ' + ctx.rootState.auth.user.access_token }
        }).then(response => {
          ctx.commit('finishLoading', 'shows')
          if (data && typeof(data.callback) === 'function') { data.callback(response) }
        }).catch(error => {
          handleApiError(this, error, 'could not update show')
          if (data && typeof(data.callbackCancel) === 'function') { data.callbackCancel() }
        })
      },
    
      updateName (ctx, data) {
        let show = cloneMinimalShowObject(ctx.getters.getShowByDataParam(data))
        show.name = data.text
        ctx.dispatch('updateShow', {
          id: data.id,
          show: show,
          callback: () => {
            ctx.commit('setName', {
              id: data.id,
              text: data.text
            })
            if (typeof(data.callback) === 'function') { data.callback() }
          }
        })
      },
    
      updateShortDescription (ctx, data) {
        let show = cloneMinimalShowObject(ctx.getters.getShowByDataParam(data))
        show.short_description = data.text
        ctx.dispatch('updateShow', {
          id: data.id,
          show: show,
          callback: () => {
            ctx.commit('setShortDescription', {
              id: data.id,
              text: data.text
            })
          }
        })
      },
    
      updateDescription (ctx, data) {
        let show = cloneMinimalShowObject(ctx.getters.getShowByDataParam(data))
        show.description = data.text
        ctx.dispatch('updateShow', {
          id: data.id,
          show: show,
          callback: () => {
            ctx.commit('setDescription', {
              id: data.id,
              text: data.text
            })
          }
        })
      },
    
      activateShow (ctx, data) {
        let show = cloneMinimalShowObject(ctx.getters.getShowByDataParam(data))
        show.is_active = true
        ctx.dispatch('updateShow', {
          id: data.id,
          show: show,
          callback: () => {
            ctx.commit('setActive', {
              id: data.id,
              active: true
            })
          }
        })
      },
    
      deactivateShow (ctx, data) {
        let show = cloneMinimalShowObject(ctx.getters.getShowByDataParam(data))
        show.is_active = false
        ctx.dispatch('updateShow', {
          id: data.id,
          show: show,
          callback: () => {
            ctx.commit('setActive', {
              id: data.id,
              active: false
            })
          }
        })
      },
    
    }
    
    export default {
      namespaced: true,
      state,
      getters,
      actions,
      mutations,
    }