mutations.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import Vue from 'vue'
  2. import defaultState from '@/store/state'
  3. import Experiments from '@/router/experiments'
  4. const checkProgression = (state, experimentName, sceneName) => {
  5. if (!state.progression[experimentName])
  6. state.progression[experimentName] = {}
  7. if (!state.progression[experimentName][sceneName])
  8. state.progression[experimentName][sceneName] = { done: false, data: {} }
  9. }
  10. const createProgressionObj = (state, scenes) => {
  11. const progressionObj = Experiments.reduce((accExpe, expe) => {
  12. const scenesProgressObj = scenes.reduce((accScene, scene) => {
  13. // Do not overwrite current progression
  14. if (state.progression[expe.name] && state.progression[expe.name][scene])
  15. accScene[scene] = state.progression[expe.name][scene]
  16. else accScene[scene] = { done: false, data: {} }
  17. return accScene
  18. }, {})
  19. accExpe[expe.name] = scenesProgressObj
  20. return accExpe
  21. }, {})
  22. state.progression = progressionObj
  23. }
  24. export default {
  25. setGdprValidated(state) {
  26. state.gdprConsent = true
  27. },
  28. setAppUniqueId(state) {
  29. state.uuid = [...Array(30)].map(() => Math.random().toString(36)[2]).join('')
  30. },
  31. resetApp(state, { gdprConsent, hostConfig, progression }) {
  32. const defaultStateObj = defaultState()
  33. if (gdprConsent) {
  34. state.gdprConsent = false
  35. delete state.userId
  36. delete state.experimentId
  37. delete state.hostConfig
  38. delete state.progression
  39. delete state.scenesList
  40. return
  41. }
  42. if (hostConfig) {
  43. if (state.socket.isConnected)
  44. this._vm.$disconnect()
  45. state.hostConfig = defaultStateObj.hostConfig
  46. state.userId = defaultStateObj.userId
  47. state.experimentId = defaultStateObj.experimentId
  48. }
  49. if (progression) {
  50. // Reset progression and recreate the progression object
  51. state.progression = defaultStateObj.progression
  52. if (state.scenesList) createProgressionObj(state, state.scenesList)
  53. }
  54. },
  55. setHostConfig(state, newConfig) {
  56. state.hostConfig = newConfig
  57. },
  58. setUserExperimentId(state, { userId, experimentId }) {
  59. state.userId = userId
  60. state.experimentId = experimentId
  61. },
  62. setListScenes(state, scenes) {
  63. state.scenesList = scenes
  64. createProgressionObj(state, scenes)
  65. },
  66. setExperimentProgress(state, { experimentName, sceneName, data }) {
  67. checkProgression(state, experimentName, sceneName)
  68. state.progression[experimentName][sceneName].data = data
  69. },
  70. setExperimentDone(state, { experimentName, sceneName, done }) {
  71. checkProgression(state, experimentName, sceneName)
  72. state.progression[experimentName][sceneName].done = done
  73. },
  74. SOCKET_ONOPEN(state, event) {
  75. if (event === null) return
  76. console.info('Connected to WebSocket server')
  77. Vue.prototype.$socket = event.currentTarget
  78. state.socket.isConnected = true
  79. },
  80. SOCKET_ONCLOSE(state, _event) {
  81. console.info('Disconnected from WebSocket server')
  82. state.hostConfig = defaultState().hostConfig
  83. state.socket.isConnected = false
  84. },
  85. SOCKET_ONERROR(state, event) {
  86. console.error('WebSocket connection error', state, event)
  87. },
  88. // default handler called for all methods
  89. SOCKET_ONMESSAGE(state, { data: rawMessage }) {
  90. const message = JSON.parse(rawMessage)
  91. state.socket.message = message
  92. },
  93. // mutations for reconnect methods
  94. SOCKET_RECONNECT(state, count) {
  95. console.info('Reconnect to WebSocket server', state, count)
  96. },
  97. SOCKET_RECONNECT_ERROR(state) {
  98. console.error('Could not reconnect to WebSocket server')
  99. state.socket.reconnectError = true
  100. }
  101. }