Advertisement
Guest User

button-card-fix.js

a guest
Mar 5th, 2025
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.18 KB | None | 0 0
  1. (() => {
  2. const COOLDOWN_PERIOD = 5000; // Prevents multiple triggers within 5s
  3. const BANNER_CLICK_COOLDOWN = 100; // Prevents spam clicking
  4.  
  5. let hasTriggeredFix = false;
  6. let lastTriggerTime = 0;
  7. let lastBannerClickTime = 0;
  8. let bannerMonitorActive = false;
  9.  
  10. function getHass() {
  11. return document.querySelector("home-assistant")?.hass || null;
  12. }
  13.  
  14. function fetchLovelaceConfig() {
  15. if (hasTriggeredFix) {
  16. return;
  17. }
  18.  
  19. hasTriggeredFix = true;
  20.  
  21. const hass = getHass();
  22. if (!hass?.connection) {
  23. return;
  24. }
  25.  
  26. hass.connection.sendMessagePromise({ type: "lovelace/config" })
  27. .then(saveLovelaceConfig)
  28. .catch(err => console.error("❌ Failed to fetch Lovelace config:", err));
  29. }
  30.  
  31. function saveLovelaceConfig(lovelaceConfig) {
  32. const hass = getHass();
  33. if (!hass?.connection) {
  34. return;
  35. }
  36.  
  37. hass.connection.sendMessagePromise({
  38. type: "lovelace/config/save",
  39. config: { views: lovelaceConfig.views },
  40. url_path: null
  41. }).then(() => {
  42. console.log("✅ Successfully saved Lovelace config!");
  43. monitorForBanner(); // Start monitoring for refresh banner
  44. }).catch(err => console.error("❌ Failed to save Lovelace config!", err));
  45. }
  46.  
  47. function findButtonInShadowRoots(text) {
  48. const queue = [{ root: document }];
  49.  
  50. while (queue.length) {
  51. const { root } = queue.shift();
  52. const button = [...root.querySelectorAll("button")].find(
  53. btn => btn.textContent.trim().toUpperCase() === text
  54. );
  55.  
  56. if (button) {
  57. return button;
  58. }
  59.  
  60. queue.push(...[...root.querySelectorAll("*")]
  61. .filter(el => el.shadowRoot)
  62. .map(el => ({ root: el.shadowRoot })));
  63. }
  64.  
  65. return null;
  66. }
  67.  
  68. function monitorForBanner() {
  69. if (bannerMonitorActive) {
  70. return;
  71. }
  72.  
  73. console.log("🔎 Monitoring for Lovelace Refresh banner...");
  74. bannerMonitorActive = true;
  75.  
  76. function checkBanner() {
  77. const now = Date.now();
  78. const refreshButton = findButtonInShadowRoots("REFRESH");
  79.  
  80. if (refreshButton && now - lastBannerClickTime > BANNER_CLICK_COOLDOWN) {
  81. console.log("✅ Found Lovelace Refresh button! Clicking...");
  82. refreshButton.click();
  83. lastBannerClickTime = now;
  84. }
  85.  
  86. requestAnimationFrame(checkBanner); // Keep monitoring even after clicking
  87. }
  88.  
  89. requestAnimationFrame(checkBanner);
  90. }
  91.  
  92. function monitorConsoleForError() {
  93. const TARGET_ERROR = "Cannot read properties of undefined (reading 'style')";
  94.  
  95. function triggerFix() {
  96. const now = Date.now();
  97.  
  98. if (now - lastTriggerTime < COOLDOWN_PERIOD) {
  99. return;
  100. }
  101.  
  102. lastTriggerTime = now;
  103.  
  104. if (!hasTriggeredFix) {
  105. console.warn("⚠️ Lovelace error detected! Running fix...");
  106. fetchLovelaceConfig();
  107. }
  108. }
  109.  
  110. const originalConsoleError = console.error;
  111. console.error = function (...args) {
  112. originalConsoleError.apply(console, args);
  113.  
  114. if (args.some(arg => arg?.toString().includes(TARGET_ERROR))) {
  115. triggerFix();
  116. }
  117. };
  118.  
  119. window.onerror = function (message, source, lineno, colno, error) {
  120. if (message.includes(TARGET_ERROR)) {
  121. triggerFix();
  122. }
  123. };
  124. }
  125.  
  126. function isHomeAssistantApp() {
  127. return navigator.userAgent.includes("HomeAssistant");
  128. }
  129.  
  130. if (!window.__lovelaceConfigFetched) {
  131. window.__lovelaceConfigFetched = true;
  132. monitorConsoleForError();
  133.  
  134. if (isHomeAssistantApp()) {
  135. console.warn("📱 Running inside Home Assistant app - fetching Lovelace config...");
  136. fetchLovelaceConfig();
  137. }
  138. }
  139. })();
  140.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement