links.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. const toggleVisible = ele => ele.style.display = ele.style.display === 'none' ? 'block' : 'none'
  2. const toggleClass = (ele, class1, class2) => ele.className = ele.className === class1 ? class2 : class1
  3. const guildIdField = document.getElementById('guildId')
  4. const userIdField = document.getElementById('userId')
  5. const generateButton = document.getElementById('generateButton')
  6. const generateInfo = document.getElementById('generateInfo')
  7. const userIdFeedback = document.getElementById('userIdFeedback')
  8. async function loadExperiment(){
  9. var urlParams = new URLSearchParams(window.location.search);
  10. if(urlParams.get('id')){
  11. current_guild_id = urlParams.get('id')
  12. for (let option of guildIdField.options){
  13. if (option.value == current_guild_id){
  14. option.defaultSelected = true
  15. }
  16. }
  17. }
  18. }
  19. // check enter key issue
  20. async function searchUserId(){
  21. // reinit feedback div and form
  22. // userIdFeedback.innerText = ''
  23. userIdField.className = 'form-control'
  24. generateButton.disabled = true
  25. // get form value
  26. let guildId = guildIdField.value
  27. let userId = userIdField.value
  28. if (!userId.length){
  29. guildIdChanged()
  30. return
  31. }
  32. const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value
  33. let data = {'guildId': guildId, 'userId': userId}
  34. let url = `${BASE}` === '' ? 'check' : `${BASE}/check`
  35. fetch(url, {
  36. method: 'POST',
  37. body: JSON.stringify(data),
  38. headers: {
  39. 'Content-type': 'application/json; charset=utf-8',
  40. 'X-CSRFToken': csrfToken
  41. }
  42. })
  43. .then((resp) =>
  44. resp.json()
  45. )
  46. .then(res => {
  47. // update status field and enable link generation if valid
  48. userIdFeedback.innerText = res.message
  49. if (res.status){
  50. userIdField.className = 'form-control is-valid'
  51. userIdFeedback.className = 'valid-feedback'
  52. generateButton.disabled = false
  53. }else{
  54. userIdField.className = 'form-control is-invalid'
  55. userIdFeedback.className = 'invalid-feedback'
  56. generateButton.disabled = true
  57. }
  58. })
  59. }
  60. async function guildIdChanged(){
  61. // reinit field if guild value changed
  62. userIdField.className = 'form-control'
  63. userIdFeedback.className = 'valid-feedback'
  64. userIdFeedback.innerText = ''
  65. userIdField.value = ''
  66. generateButton.disabled = true
  67. }
  68. async function generateLink(){
  69. // reinit field if guild value changed
  70. let guildId = guildIdField.value
  71. let userId = userIdField.value
  72. const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value
  73. let data = {'guildId': guildId, 'userId': userId}
  74. let url = `${BASE}` === '' ? 'generate' : `${BASE}/generate`
  75. fetch(url, {
  76. method: 'POST',
  77. body: JSON.stringify(data),
  78. headers: {
  79. 'Content-type': 'application/json; charset=utf-8',
  80. 'X-CSRFToken': csrfToken
  81. }
  82. })
  83. .then((resp) =>
  84. resp.json()
  85. )
  86. .then(res => {
  87. // update status field and enable link generation if valid
  88. console.log(res)
  89. user_config = res.config
  90. user_link = res.link
  91. if (res.status){
  92. // Add link to local storage
  93. var localStorage = window.localStorage
  94. // link composed of {'experimentId', 'link'}
  95. expes_link = {}
  96. // retrieve expe links if exists
  97. if (localStorage.getItem('p3d-user-links')){
  98. expes_link = JSON.parse(localStorage.getItem('p3d-user-links'))
  99. }
  100. if (!expes_link[user_config.experimentName]){
  101. // create for this experiment
  102. expes_link[user_config.experimentName] = {}
  103. }
  104. if (!expes_link[user_config.experimentName][user_config.experimentId]){
  105. // create for this experiment and experiment id
  106. expes_link[user_config.experimentName][user_config.experimentId] = {}
  107. }
  108. if (!expes_link[user_config.experimentName][user_config.experimentId][user_config.userId]){
  109. // create for this experiment, experiment id and user id
  110. expes_link[user_config.experimentName][user_config.experimentId][user_config.userId] = {'config': user_config, 'link': user_link}
  111. }
  112. localStorage.setItem('p3d-user-links', JSON.stringify(expes_link))
  113. generateInfo.className = 'alert alert-dismissible alert-success'
  114. generateInfo.style.display = 'block'
  115. generateInfo.innerHTML = '<button id="generateInfoClose" type="button" class="close" data-dismiss="alert">&times;</button> \
  116. Well done! You successfully generate <a href="' + user_link + '" class="alert-link">your experiment link</a>. \
  117. <strong>This link is unique and associated with your browser</strong>..'
  118. }else{
  119. generateInfo.className = 'alert alert-dismissible alert-danger'
  120. generateInfo.style.display = 'block'
  121. generateInfo.innerHTML = '<button id="generateInfoClose" type="button" class="close" data-dismiss="alert">&times;</button> \
  122. <strong>An error occured!</strong> ' + res.message + '.'
  123. }
  124. let generateInfoClose = document.getElementById('generateInfoClose')
  125. // link function
  126. generateInfoClose.addEventListener('click', (e) => {
  127. toggleVisible(generateInfo)
  128. })
  129. // reset form
  130. loadLinks()
  131. guildIdChanged()
  132. })
  133. }
  134. // check by default
  135. searchUserId()
  136. document.addEventListener('DOMContentLoaded', loadExperiment)
  137. userIdField.addEventListener('keyup', searchUserId)
  138. guildIdField.addEventListener('change', guildIdChanged)
  139. generateButton.addEventListener('click', generateLink)
  140. // implement `key` events
  141. // document.addEventListener('keydown', checkKey)