const state = { admin: false, roomStatus: { roomName: '', roomCode: '', player: { timeCode: 0, timeLength: 0, playing: true }, current: { link: '', linkID: '', title: '', votes: 0, voters: [] }, playlist: [] } } const getters = { } const actions = { setRoomCode ({ commit }, roomCode) { commit('SET_ROOMCODE', roomCode) }, setRoomName ({ commit }, roomName) { commit('SET_ROOMNAME', roomName) }, setRoomStatus ({ commit }, roomStatus) { commit('SET_ROOMSTATUS', roomStatus) }, setAdmin ({ commit }) { commit('SET_ADMIN') }, setTimeCode ({ commit }, timeCode) { commit('SET_TIMECODE', timeCode) }, vote ({ commit, dispatch, state }, { title, link, linkID, isPositive, voterName }) { console.log('vote on ' + link + ' | ' + linkID + ' (' + isPositive + ') by ' + voterName) if (isPositive) { commit('ADD_VOTE', { title: title, linkID: linkID, link: link, voterName: voterName }) } else { commit('REMOVE_VOTE', { linkID: linkID, voterName: voterName }) } dispatch('rtc/broadcast', { message: state.roomStatus, type: 'status' }, { root: true }) }, removePlay ({ commit, dispatch, state }, linkID) { commit('REMOVE_PLAY', linkID) dispatch('rtc/broadcast', { message: state.roomStatus, type: 'status' }, { root: true }) }, setCurrent ({ commit, dispatch }, { playerStatus, timeCode, timeLength, title }) { switch (playerStatus) { case 0: commit('CURRENT_END') break case 1: commit('CURRENT_PLAY', timeCode) commit('SET_CURRENTTITLE', title) commit('SET_TIMELENGTH', timeLength) break case 2: commit('CURRENT_PAUSE', timeCode) break } dispatch('rtc/broadcast', { message: state.roomStatus, type: 'status' }, { root: true }) }, leave ({ commit, dispatch }) { dispatch('rtc/leave', null, { root: true }) commit('SET_ROOMSTATUS', { roomName: '', roomCode: '', player: { timeCode: 0, timeLength: 0, playing: true }, current: { link: '', linkID: '', title: '', votes: 0, voters: [] }, playlist: [] }) } } const mutations = { SET_ROOMCODE (state, code) { state.roomStatus.roomCode = code }, SET_ROOMNAME (state, name) { state.roomStatus.roomName = name }, SET_ROOMSTATUS (state, roomStatus) { state.roomStatus = roomStatus }, SET_ADMIN (state) { state.admin = true }, SET_TIMECODE (state, timeCode) { state.roomStatus.player.timeCode = timeCode }, SET_TIMELENGTH (state, timeLength) { state.roomStatus.player.timeLength = timeLength }, SET_CURRENTTITLE (state, title) { state.roomStatus.current.title = title }, ADD_VOTE (state, { title, link, linkID, voterName }) { var play = state.roomStatus.playlist.find(play => play.linkID === linkID) if (play === undefined) { play = { title: title, link: link, linkID: linkID, votes: 1, voters: [ voterName ] } if (state.roomStatus.current.votes === 0) state.roomStatus.current = play else state.roomStatus.playlist.push(play) } else { play.votes++ play.voters.push(voterName) } state.roomStatus.playlist.sort((a, b) => { return b.votes - a.votes }) }, REMOVE_VOTE (state, { linkID, voterName }) { var play = state.roomStatus.playlist.find(play => play.linkID === linkID) play.votes-- const index = play.voters.indexOf(voterName) if (index > -1) { play.voters.splice(index, 1) } if (play.votes === 0) { const index = state.roomStatus.playlist.indexOf(play) if (index > -1) { state.roomStatus.playlist.splice(index, 1) } } state.roomStatus.playlist.sort((a, b) => { return b.votes - a.votes }) }, REMOVE_PLAY (state, linkID) { var play = state.roomStatus.playlist.find(play => play.linkID === linkID) const index = state.roomStatus.playlist.indexOf(play) if (index > -1) { state.roomStatus.playlist.splice(index, 1) } }, CURRENT_END (state) { if (state.roomStatus.playlist.length === 0) { state.roomStatus.current = { link: '', linkID: '', title: '', votes: 0, voters: [] } } else { state.roomStatus.playlist.sort((a, b) => { return b.votes - a.votes }) state.roomStatus.current = state.roomStatus.playlist.shift() } }, CURRENT_PAUSE (state, timeCode) { state.roomStatus.player.playing = false state.roomStatus.player.timeCode = timeCode }, CURRENT_PLAY (state, timeCode) { state.roomStatus.player.playing = true state.roomStatus.player.timeCode = timeCode } } export default { namespaced: true, state, getters, actions, mutations }