index.vue 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. scrollToChoiceButtons() {
  28. const ele = document.querySelector('#choice')
  29. if (ele) ele.scrollIntoView({ behavior: 'smooth' })
  30. },
  31. async getTest(leftQuality, rightQuality) {
  32. const left = this.qualities[leftQuality]
  33. const right = this.qualities[rightQuality]
  34. const res = await Promise.all([this.getImage(left), this.getImage(right)])
  35. const [leftImage, rightImage] = res.map(x => {
  36. x.link = `${this.getHostURI}${x.link}`
  37. return x
  38. })
  39. return { leftImage, rightImage }
  40. },
  41. getRandomTest() {
  42. return this.getTest(rand(0, this.qualities.length - 1), rand(0, this.qualities.length - 1))
  43. },
  44. // An action was triggered, load extracts and save progression
  45. async areTheSameActionRandom(areTheSame) {
  46. this.loadingMessage = 'Loading new test...'
  47. this.loadingErrorMessage = null
  48. try {
  49. this.testCount++
  50. const obj = {
  51. leftImage: this.leftImage,
  52. rightImage: this.rightImage,
  53. areTheSame,
  54. experimentName: this.experimentName,
  55. sceneName: this.sceneName
  56. }
  57. this.sendMessage({ msgId: experimentMsgId.DATA, msg: obj })
  58. const { leftImage, rightImage } = await this.getRandomTest()
  59. this.leftImage = leftImage
  60. this.rightImage = rightImage
  61. // Experiment end
  62. if (this.testCount > this.maxTestCount) return this.finishExperiment()
  63. }
  64. catch (err) {
  65. console.error('Failed to load new test', err)
  66. this.loadingErrorMessage = 'Failed to load new test. ' + err.message
  67. }
  68. finally {
  69. this.loadingMessage = null
  70. this.saveProgress()
  71. }
  72. },
  73. // Finish an experiment, sending full data to the server
  74. // Don't forget to surcharge this function when using this mixin to add more data
  75. finishExperiment() {
  76. const obj = {
  77. experimentName: this.experimentName,
  78. sceneName: this.sceneName
  79. }
  80. this.sendMessage({ msgId: experimentMsgId.VALIDATED, msg: obj })
  81. this.setExperimentDone({ experimentName: this.experimentName, sceneName: this.sceneName, done: true })
  82. this.$router.push(`/experiments/${this.experimentName}`)
  83. }
  84. }
  85. }
  86. </script>