launchpad.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. })
  50. return new Promise((resolve, reject) => {
  51. setTimeout(() => reject(new Error('timed out')), timeout)
  52. socket.on('connectionAccepted', function () {
  53. resolve()
  54. })
  55. socket.on('connectionRejected', function (err) {
  56. reject(new Error(err && err.message))
  57. })
  58. socket.on('connect_failed', function (err) {
  59. reject(new Error(err && err.message))
  60. })
  61. }).finally(() => {
  62. socket.disconnect()
  63. })
  64. }
  65. )
  66. setUpStatusIndicator(
  67. document.querySelector('[data-ol-launchpad-check="ide"]'),
  68. () => {
  69. return fetch(getMeta('ol-ideJsPath')).then(res => {
  70. if (!res.ok) {
  71. throw new Error(`Http status: ${res.status}`)
  72. }
  73. })
  74. }
  75. )
  76. }
  77. if (getMeta('ol-adminUserExists')) {
  78. setUpStatusIndicators()
  79. }