launchpad.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* global io */
  2. import '@/marketing'
  3. import {
  4. inflightHelper,
  5. toggleDisplay,
  6. } from '../../../../../frontend/js/features/form-helpers/hydrate-form'
  7. import getMeta from '../../../../../frontend/js/utils/meta'
  8. function setUpStatusIndicator(el, fn) {
  9. inflightHelper(el)
  10. const displaySuccess = el.querySelectorAll('[data-ol-result="success"]')
  11. const displayError = el.querySelectorAll('[data-ol-result="error"]')
  12. // The checks are very lightweight and do not appear to do anything
  13. // from looking at the UI. Add an artificial delay of 1s to show that
  14. // we are actually doing something. :)
  15. const artificialProgressDelay = 1000
  16. function run() {
  17. setTimeout(() => {
  18. fn()
  19. .then(() => {
  20. toggleDisplay(displayError, displaySuccess)
  21. })
  22. .catch(error => {
  23. el.querySelector('[data-ol-error]').textContent = error.message
  24. toggleDisplay(displaySuccess, displayError)
  25. })
  26. .finally(() => {
  27. el.dispatchEvent(new Event('idle'))
  28. })
  29. }, artificialProgressDelay)
  30. }
  31. el.querySelectorAll('button').forEach(retryBtn => {
  32. retryBtn.addEventListener('click', function (e) {
  33. e.preventDefault()
  34. el.dispatchEvent(new Event('pending'))
  35. run()
  36. })
  37. })
  38. run()
  39. }
  40. function setUpStatusIndicators() {
  41. setUpStatusIndicator(
  42. document.querySelector('[data-ol-launchpad-check="websocket"]'),
  43. () => {
  44. const timeout = 10 * 1000
  45. const socket = io.connect(null, {
  46. reconnect: false,
  47. 'connect timeout': timeout,
  48. 'force new connection': true,
  49. query: new URLSearchParams({
  50. projectId: '404404404404404404404404',
  51. }).toString(),
  52. })
  53. return new Promise((resolve, reject) => {
  54. setTimeout(() => reject(new Error('timed out')), timeout)
  55. socket.on('connectionRejected', function (err) {
  56. if (err.code === 'ProjectNotFound') {
  57. // We received the response from joinProject, so the websocket is up.
  58. resolve()
  59. } else {
  60. reject(new Error(err && err.message))
  61. }
  62. })
  63. socket.on('connect_failed', function (err) {
  64. reject(new Error(err && err.message))
  65. })
  66. }).finally(() => {
  67. socket.disconnect()
  68. })
  69. }
  70. )
  71. }
  72. if (getMeta('ol-adminUserExists')) {
  73. setUpStatusIndicators()
  74. }