launchpad.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* global io */
  2. import '../../../../../frontend/js/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. setUpStatusIndicator(
  72. document.querySelector('[data-ol-launchpad-check="ide"]'),
  73. () => {
  74. return fetch(getMeta('ol-ideJsPath')).then(res => {
  75. if (!res.ok) {
  76. throw new Error(`Http status: ${res.status}`)
  77. }
  78. })
  79. }
  80. )
  81. }
  82. if (getMeta('ol-adminUserExists')) {
  83. setUpStatusIndicators()
  84. }