forked from BWilky/viewtimeout
-
Notifications
You must be signed in to change notification settings - Fork 0
/
timeout.js
123 lines (94 loc) · 3.18 KB
/
timeout.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
class ViewTimeout {
constructor() {
this.ha = document.querySelector("home-assistant");
this.main = this.ha.shadowRoot.querySelector("home-assistant-main").shadowRoot;
this.llAttempts = 0;
this.viewTimeout;
this.urlInterval;
this.timeoutTime;
this.homeView;
this.defaultPanelUrl;
this.run();
}
run(lovelace = this.main.querySelector("ha-panel-lovelace")) {
if (this.queryString("disable_timeout") || !lovelace) return;
this.getConfig(lovelace);
}
getConfig(lovelace) {
this.llAttempts++;
try {
const llConfig = lovelace.lovelace.config;
const config = llConfig.view_timeout || {};
this.processConfig(lovelace, config);
} catch (e) {
if (this.llAttempts < 200) {
setTimeout(() => this.getConfig(lovelace), 50);
} else {
console.log("Lovelace config not found, continuing with default configuration.");
console.log(e);
this.processConfig(lovelace, {});
}
}
}
processConfig(lovelace, config) {
if(!config.timeout) return;
this.homeView = config.default || "home";
this.defaultPanelUrl = this.ha.hass.panelUrl;
this.timeoutTime = config.duration || 30000;
this.dashboard
setTimeout(() => this.urlCheckerStart(), 50);
}
// Convert to array.
array(x) {
return Array.isArray(x) ? x : [x];
}
queryString(keywords) {
return this.array(keywords).some((x) => window.location.search.includes(x));
}
clickEvent() {
clearTimeout(this.ViewTimeout.viewTimeout);
this.ViewTimeout.viewTimeout = setTimeout(() => this.ViewTimeout.timeoutReturn(), this.ViewTimeout.timeoutTime);
}
setViewTimeout() {
window.addEventListener("click", this.clickEvent );
this.viewTimeout = setTimeout(() => this.timeoutReturn(), this.timeoutTime);
}
cancelEverything() {
window.removeEventListener("click", this.clickEvent );
clearTimeout(this.viewTimeout);
//null the timeout
this.viewTimeout = false;
}
timeoutReturn() {
this.cancelEverything();
//Remove focus from the former active tab to clear the style
try {
var activeTab = this.main.querySelector('ha-drawer > partial-panel-resolver > ha-panel-lovelace').shadowRoot.querySelector('hui-root').shadowRoot.activeElement;
if (activeTab != null) activeTab.blur();
} catch (e) {
console.log("Failed to blur active tab: " + e);
}
//switch tabs
window.history.pushState("", "", '/'+this.defaultPanelUrl+'/'+this.homeView);
window.cardTools.fireEvent("location-changed", {}, document.querySelector("home-assistant"));
}
urlCheckerStart() {
this.urlInterval = setInterval(() => this.urlChecker(), 1000);
}
urlGetView() {
const currentView = window.location.href.split("/").pop().split('?')[0];
return currentView;
}
urlChecker() {
if(this.homeView != this.urlGetView() && !this.viewTimeout) {
this.setViewTimeout();
}
if(this.homeView == this.urlGetView() && this.viewTimeout) {
this.cancelEverything();
}
}
}
// Initial Run
Promise.resolve(customElements.whenDefined("hui-view")).then(() => {
window.ViewTimeout = new ViewTimeout();
});