Files
homeassistant-desktop/web/index.html
2021-11-17 11:14:08 +01:00

137 lines
4.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<title>Home Assistant</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,user-scalable=no" />
<link href="assets/style.css" rel="stylesheet" />
<link href="assets/checkmark.css" rel="stylesheet" />
<script>
const { ipcRenderer } = require("electron");
const bonjour = require('bonjour')()
function showInstance(url) {
document.getElementById('availableInstancesContainer').style.display = "block"
const button = document.createElement("button")
button.onclick = () => addInstance(url)
button.classList.add("pure-material-button-contained")
button.textContent = url
document.getElementById('availableInstances').append(button)
}
document.addEventListener("DOMContentLoaded", function (event) {
setTimeout(() => document.getElementById('url').focus(), 300);
});
ipcRenderer.send("get-instances");
ipcRenderer.on("get-instances", (event, result) => {
let instances = result
bonjour.find({ type: 'home-assistant' }, instance => {
if (instances.indexOf(instance.txt.internal_url) === -1) showInstance(instance.txt.internal_url)
if (instances.indexOf(instance.txt.external_url) === -1) showInstance(instance.txt.external_url)
})
})
function addInstance(url) {
ipcRenderer.send("ha-instance", url);
}
ipcRenderer.send("ha-instance");
let showCheckmark = false;
ipcRenderer.on("ha-instance", function (event, url) {
if (showCheckmark) {
document
.getElementById("check-wrapper")
.addEventListener(
"animationend",
() => (window.location.href = url)
);
} else window.location.href = url;
});
function isValidUrl(string) {
try {
new URL(string);
} catch (_) {
return false;
}
return true;
}
function checkUrl() {
const url = document.getElementById("url").value;
if (!isValidUrl(url)) {
return;
}
fetch(url + "/auth/providers")
.then(response => response.text())
.then(data => {
if (!data.includes('homeassistant')) return;
document.getElementById("url").value = url;
document.getElementById("url").disabled = true;
document.getElementById("check-wrapper").style.display = "block";
document.getElementById("url-wrapper").style.display = "none";
showCheckmark = true;
ipcRenderer.send("ha-instance", url);
}).catch((err) => { });
}
function showPlaceholder(status = true) {
if (status) document.getElementById("url").placeholder = 'e.g. http://hassio.local:8123';
else document.getElementById("url").placeholder = '';
}
</script>
</head>
<body>
<div class="container">
<div class="content">
<div class="center header">
<img src="assets/favicon.png" height="52" /> Home Assistant
</div>
<div id="availableInstancesContainer" style="display:none;">
<div class="center">
<p>Available Instances: </p>
</div>
<div class="center">
<div id="availableInstances">
</div>
</div>
</div>
<div class="center" style="margin-top: 30px;">
</div>
<div class="center">
<div id="check-wrapper" class="success-checkmark">
<div class="check-icon">
<span class="icon-line line-tip"></span>
<span class="icon-line line-long"></span>
<div class="icon-circle"></div>
<div class="icon-fix"></div>
</div>
</div>
<div id="url-wrapper" class="group">
<input type="url" required="required" id="url" onblur="showPlaceholder(false)" onfocus="showPlaceholder()"
onkeyup="checkUrl()" />
<span class="highlight"></span>
<span class="bar"></span>
<label>Home Assistant URL</label>
</div>
</div>
<div class="center">
<p>
<small class="grey">Your URL is checked and you will be forwarded to Home Assistant automatically.</small>
</p>
</div>
</div>
</div>
</body>
</html>