overleaf/services/web/modules/launchpad/frontend/js/pages/launchpad.js
Jakob Ackermann f06f1e2b96 Merge pull request #5171 from overleaf/jpa-web-launchpad-de-ng
[web] de-ng launchpad page

GitOrigin-RevId: 0a8939ac8716bd099d9e8c2be0a281f24274e48d
2021-09-24 08:03:43 +00:00

88 lines
2.4 KiB
JavaScript

/* global io */
import '../../../../../frontend/js/marketing'
import {
inflightHelper,
toggleDisplay,
} from '../../../../../frontend/js/features/form-helpers/hydrate-form'
import getMeta from '../../../../../frontend/js/utils/meta'
function setUpStatusIndicator(el, fn) {
inflightHelper(el)
const displaySuccess = el.querySelectorAll('[data-ol-result="success"]')
const displayError = el.querySelectorAll('[data-ol-result="error"]')
// The checks are very lightweight and do not appear to do anything
// from looking at the UI. Add an artificial delay of 1s to show that
// we are actually doing something. :)
const artificialProgressDelay = 1000
function run() {
setTimeout(() => {
fn()
.then(() => {
toggleDisplay(displayError, displaySuccess)
})
.catch(error => {
el.querySelector('[data-ol-error]').textContent = error.message
toggleDisplay(displaySuccess, displayError)
})
.finally(() => {
el.dispatchEvent(new Event('idle'))
})
}, artificialProgressDelay)
}
el.querySelectorAll('button').forEach(retryBtn => {
retryBtn.addEventListener('click', function (e) {
e.preventDefault()
el.dispatchEvent(new Event('pending'))
run()
})
})
run()
}
function setUpStatusIndicators() {
setUpStatusIndicator(
document.querySelector('[data-ol-launchpad-check="websocket"]'),
() => {
const timeout = 10 * 1000
const socket = io.connect(null, {
reconnect: false,
'connect timeout': timeout,
'force new connection': true,
})
return new Promise((resolve, reject) => {
setTimeout(() => reject(new Error('timed out')), timeout)
socket.on('connectionAccepted', function () {
resolve()
})
socket.on('connectionRejected', function (err) {
reject(new Error(err && err.message))
})
socket.on('connect_failed', function (err) {
reject(new Error(err && err.message))
})
}).finally(() => {
socket.disconnect()
})
}
)
setUpStatusIndicator(
document.querySelector('[data-ol-launchpad-check="ide"]'),
() => {
return fetch(getMeta('ol-ideJsPath')).then(res => {
if (!res.ok) {
throw new Error(`Http status: ${res.status}`)
}
})
}
)
}
if (getMeta('ol-adminUserExists')) {
setUpStatusIndicators()
}