Home Reference Source

cables_dev/cables_ui/src/ui/components/idlemode.js

  1. import { ModalBackground, Logger } from "cables-shared-client";
  2. import uiConfig from "../uiconfig.js";
  3. import { gui } from "../gui.js";
  4. import { userSettings } from "./usersettings.js";
  5. let idling = false;
  6. let idleTimeout = null;
  7. let idleModeStart = 0;
  8. let idleFocus = false;
  9. let idleModal = null;
  10. let activeModeStart = performance.now();
  11. const logger = new Logger("idlemode");
  12. function startIdleMode()
  13. {
  14. if (gui.canvasManager.mode == gui.canvasManager.CANVASMODE_POPOUT || gui.canvasManager.mode == gui.canvasManager.CANVASMODE_MAXIMIZED) return;
  15. if (gui.patchView.hasFocus() && idleFocus) return;
  16. if (!window.gui || !gui.finishedLoading()) return;
  17. if (idling) return;
  18. if (!userSettings.get("idlemode")) return;
  19. if (gui.socket && gui.socket.inMultiplayerSession) return;
  20. const wasActiveSeconds = (performance.now() - activeModeStart) / 1000;
  21. if (window.gui && !(gui.currentModal && gui.currentModal.persistInIdleMode && gui.currentModal.persistInIdleMode()))
  22. {
  23. gui.restriction.setMessage("idlemode", "cables is paused! Click to resume");
  24. idleModal = new ModalBackground();
  25. idleModal.show();
  26. }
  27. gui.corePatch().pause();
  28. gui.emitEvent("uiIdleStart", wasActiveSeconds);
  29. idling = true;
  30. clearTimeout(idleTimeout);
  31. idleModeStart = Date.now();
  32. }
  33. function idleInteractivity()
  34. {
  35. idleFocus = true;
  36. if (idling) stopIdleMode();
  37. if (!document.hidden)
  38. {
  39. clearTimeout(idleTimeout);
  40. idleTimeout = setTimeout(startIdleMode, uiConfig.idleModeTimeout * 1000);
  41. }
  42. }
  43. function stopIdleMode()
  44. {
  45. if (!window.gui || !gui.finishedLoading()) return;
  46. if (!idling) return;
  47. const idleSeconds = Math.round((Date.now() - idleModeStart) / 1000);
  48. logger.log("idled for ", idleSeconds + " seconds");
  49. gui.corePatch().resume();
  50. // if (idleModal) idleModal.close();
  51. if (idleModal)
  52. {
  53. idleModal.hide();
  54. gui.restriction.setMessage("idlemode", null);
  55. }
  56. // gui.closeModal();
  57. idling = false;
  58. clearTimeout(idleTimeout);
  59. gui.emitEvent("uiIdleEnd", idleSeconds);
  60. activeModeStart = performance.now();
  61. }
  62. function visibilityChanged(e)
  63. {
  64. idleTimeout = clearTimeout(idleTimeout);
  65. if (document.hidden) idleTimeout = setTimeout(startIdleMode, 1000);
  66. else stopIdleMode();
  67. }
  68. export default function startIdleListeners()
  69. {
  70. if (gui.isRemoteClient) return;
  71. window.addEventListener("focus", (event) =>
  72. {
  73. idleFocus = true;
  74. clearTimeout(idleTimeout);
  75. stopIdleMode();
  76. });
  77. window.addEventListener("blur", (event) =>
  78. {
  79. idleFocus = false;
  80. clearTimeout(idleTimeout);
  81. idleTimeout = setTimeout(startIdleMode, uiConfig.idleModeTimeout * 1000);
  82. });
  83. document.addEventListener("keydown", idleInteractivity, false);
  84. document.addEventListener("pointermove", idleInteractivity);
  85. document.addEventListener("visibilitychange", visibilityChanged);
  86. gui.on("userActivity", idleInteractivity);
  87. idleTimeout = setTimeout(startIdleMode, uiConfig.idleModeTimeout * 1000);
  88. }