index.vue 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <template>
  2. <div>
  3. <slot></slot>
  4. </div>
  5. </template>
  6. <script>
  7. import './style.css'
  8. import ExperimentBase from '@/mixins/ExperimentBase'
  9. import { mapGetters } from 'vuex'
  10. import { rand } from '@/functions'
  11. import { EXPERIMENT as experimentMsgId } from '@/../config.messagesId'
  12. export default {
  13. name: 'ExperimentBaseAreSameImages',
  14. mixins: [ExperimentBase],
  15. data() {
  16. return {
  17. maxTestCount: null,
  18. testCount: 1,
  19. leftImage: { link: null, quality: null },
  20. rightImage: { link: null, quality: null }
  21. }
  22. },
  23. computed: {
  24. ...mapGetters(['getHostURI'])
  25. },
  26. methods: {
  27. async getTest(leftQuality, rightQuality) {
  28. const left = this.qualities[leftQuality]
  29. const right = this.qualities[rightQuality]
  30. const res = await Promise.all([this.getImage(left), this.getImage(right)])
  31. const [leftImage, rightImage] = res.map(x => {
  32. x.link = `${this.getHostURI}${x.link}`
  33. return x
  34. })
  35. return { leftImage, rightImage }
  36. },
  37. getRandomTest() {
  38. return this.getTest(rand(0, this.qualities.length - 1), rand(0, this.qualities.length - 1))
  39. },
  40. // An action was triggered, load extracts and save progression
  41. async areTheSameActionRandom(areTheSame) {
  42. this.loadingMessage = 'Loading new test...'
  43. this.loadingErrorMessage = null
  44. try {
  45. this.testCount++
  46. const obj = {
  47. leftImage: this.leftImage,
  48. rightImage: this.rightImage,
  49. areTheSame,
  50. experimentName: this.experimentName,
  51. sceneName: this.sceneName
  52. }
  53. this.sendMessage({ msgId: experimentMsgId.DATA, msg: obj })
  54. const { leftImage, rightImage } = await this.getRandomTest()
  55. this.leftImage = leftImage
  56. this.rightImage = rightImage
  57. // Experiment end
  58. if (this.testCount >= this.maxTestCount) this.finishExperiment()
  59. }
  60. catch (err) {
  61. console.error('Failed to load new test', err)
  62. this.loadingErrorMessage = 'Failed to load new test. ' + err.message
  63. }
  64. finally {
  65. this.loadingMessage = null
  66. this.saveProgress()
  67. }
  68. },
  69. // Finish an experiment, sending full data to the server
  70. // Don't forget to surcharge this function when using this mixin to add more data
  71. finishExperiment() {
  72. const obj = {
  73. experimentName: this.experimentName,
  74. sceneName: this.sceneName
  75. }
  76. this.sendMessage({ msgId: experimentMsgId.VALIDATED, msg: obj })
  77. this.setExperimentDone({ experimentName: this.experimentName, sceneName: this.sceneName, done: true })
  78. this.$router.push(`/experiments/${this.experimentName}`)
  79. }
  80. }
  81. }
  82. </script>