startup.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const api = window.dshDesktop
  2. async function main() {
  3. const { id, messages } = await api.locale()
  4. document.documentElement.lang = id
  5. document.querySelector('#page-title').textContent = messages.startupLoading
  6. document.querySelector('#restart').textContent = messages.restartApplication
  7. document.querySelector('#disable-plugins').textContent = messages.disableThirdPartyPlugins
  8. document.querySelector('#reset-configuration').textContent = messages.resetConfiguration
  9. document.querySelector('#reset-advice').textContent = messages.startupConfigurationAdvice
  10. document.querySelector('#reinstall-advice').textContent = messages.startupReinstallAdvice
  11. function render(state) {
  12. const failed = state.phase === 'error'
  13. document.querySelector('main').setAttribute('aria-busy', String(!failed))
  14. document.querySelector('#spinner').hidden = failed
  15. document.querySelector('#title').textContent = failed ? messages.startupFailed : messages.startupLoading
  16. document.querySelector('#description').textContent = failed ? messages.startupErrorDescription : messages.startupLoadingDescription
  17. document.querySelector('#error').hidden = !failed
  18. document.querySelector('#error').textContent = failed ? state.message : ''
  19. document.querySelector('#actions').hidden = !failed
  20. for (const button of document.querySelectorAll('#actions button')) button.disabled = !failed
  21. for (const selector of ['#disable-plugins', '#reset-configuration', '#reset-advice']) {
  22. document.querySelector(selector).hidden = !failed || !state.profileRecovery
  23. }
  24. document.querySelector('#reinstall-advice').hidden = !failed
  25. }
  26. let changed = false
  27. const unsubscribe = api.backend.subscribe(state => { changed = true; render(state) })
  28. window.addEventListener('pagehide', unsubscribe, { once: true })
  29. const initial = await api.backend.status()
  30. if (!changed) render(initial)
  31. async function recover(operation) {
  32. render({ phase: 'starting' })
  33. try { await operation() }
  34. catch (error) {
  35. const current = await api.backend.status().catch(() => undefined)
  36. render(current?.phase === 'error' ? current : { phase: 'error', message: error instanceof Error ? error.message : String(error) })
  37. }
  38. }
  39. document.querySelector('#disable-plugins').addEventListener('click', () => { void recover(() => api.disablePlugins()) })
  40. document.querySelector('#reset-configuration').addEventListener('click', () => { void recover(() => api.resetConfiguration()) })
  41. document.querySelector('#restart').addEventListener('click', () => { void recover(() => api.restart()) })
  42. }
  43. void main()