ReconnectModal.razor.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Set up event handlers
  2. const reconnectModal = document.getElementById("components-reconnect-modal");
  3. reconnectModal.addEventListener("components-reconnect-state-changed", handleReconnectStateChanged);
  4. const retryButton = document.getElementById("components-reconnect-button");
  5. retryButton.addEventListener("click", retry);
  6. const resumeButton = document.getElementById("components-resume-button");
  7. resumeButton.addEventListener("click", resume);
  8. function handleReconnectStateChanged(event) {
  9. if (event.detail.state === "show") {
  10. reconnectModal.showModal();
  11. } else if (event.detail.state === "hide") {
  12. reconnectModal.close();
  13. } else if (event.detail.state === "failed") {
  14. document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
  15. } else if (event.detail.state === "rejected") {
  16. location.reload();
  17. }
  18. }
  19. async function retry() {
  20. document.removeEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
  21. try {
  22. // Reconnect will asynchronously return:
  23. // - true to mean success
  24. // - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)
  25. // - exception to mean we didn't reach the server (this can be sync or async)
  26. const successful = await Blazor.reconnect();
  27. if (!successful) {
  28. // We have been able to reach the server, but the circuit is no longer available.
  29. // We'll reload the page so the user can continue using the app as quickly as possible.
  30. const resumeSuccessful = await Blazor.resumeCircuit();
  31. if (!resumeSuccessful) {
  32. location.reload();
  33. } else {
  34. reconnectModal.close();
  35. }
  36. }
  37. } catch (err) {
  38. // We got an exception, server is currently unavailable
  39. document.addEventListener("visibilitychange", retryWhenDocumentBecomesVisible);
  40. }
  41. }
  42. async function resume() {
  43. try {
  44. const successful = await Blazor.resumeCircuit();
  45. if (!successful) {
  46. location.reload();
  47. }
  48. } catch {
  49. location.reload();
  50. }
  51. }
  52. async function retryWhenDocumentBecomesVisible() {
  53. if (document.visibilityState === "visible") {
  54. await retry();
  55. }
  56. }