141 lines
7.1 KiB
HTML
141 lines
7.1 KiB
HTML
<script>
|
|
(function () {
|
|
var deviceKey = "pulse-signage-player-device-id";
|
|
var clientNameKey = "pulse-signage-player-client-name";
|
|
function getClientNameStorageKey(_screenSlug) {
|
|
return clientNameKey;
|
|
}
|
|
var screenKey = "pulse-signage-player-screen-slug";
|
|
var qr = document.getElementById("onboarding-qr");
|
|
var status = document.getElementById("onboarding-status");
|
|
var localForm = document.getElementById("onboarding-local-form");
|
|
var localMessage = document.getElementById("onboarding-message");
|
|
var localScreenSelect = document.getElementById("onboarding-screen-select");
|
|
function parseResponseError(response) {
|
|
return response.text().then(function (text) {
|
|
var fallbackMessage = text && text.trim() ? text.trim() : "Unable to save onboarding.";
|
|
try {
|
|
var payload = JSON.parse(text);
|
|
return payload && payload.error ? payload.error : fallbackMessage;
|
|
} catch (_error) {
|
|
return fallbackMessage;
|
|
}
|
|
});
|
|
}
|
|
function getDeviceId() {
|
|
var stored = "";
|
|
try { stored = window.localStorage.getItem(deviceKey) || ""; } catch (_error) { stored = ""; }
|
|
if (stored) { return stored; }
|
|
var next = (window.crypto && window.crypto.randomUUID ? window.crypto.randomUUID() : "device-" + Date.now() + "-" + Math.random().toString(16).slice(2));
|
|
try { window.localStorage.setItem(deviceKey, next); } catch (_error2) {}
|
|
return next;
|
|
}
|
|
function setStatus(message) { if (status) { status.textContent = message; } }
|
|
function setLocalMessage(message) { if (localMessage) { localMessage.textContent = message || ""; } }
|
|
function setSelectOptions(select, screens, selectedSlug) {
|
|
if (!select) { return; }
|
|
while (select.firstChild) { select.removeChild(select.firstChild); }
|
|
var placeholder = document.createElement("option");
|
|
placeholder.value = "";
|
|
placeholder.textContent = "Select a screen";
|
|
select.appendChild(placeholder);
|
|
(Array.isArray(screens) ? screens : []).forEach(function (screen) {
|
|
var option = document.createElement("option");
|
|
option.value = String(screen && screen.slug ? screen.slug : "");
|
|
option.textContent = String(screen && (screen.name || screen.slug) ? (screen.name || screen.slug) : "Screen");
|
|
if (selectedSlug && String(option.value) === String(selectedSlug)) {
|
|
option.selected = true;
|
|
}
|
|
select.appendChild(option);
|
|
});
|
|
}
|
|
function loadScreens(selectedSlug) {
|
|
return fetch("/api/onboarding/screens", { cache: "no-store" })
|
|
.then(function (response) { return response.ok ? response.json() : null; })
|
|
.then(function (payload) {
|
|
var screens = payload && Array.isArray(payload.screens) ? payload.screens : [];
|
|
setSelectOptions(localScreenSelect, screens, selectedSlug);
|
|
return screens;
|
|
})
|
|
.catch(function () { setSelectOptions(localScreenSelect, [], selectedSlug); return []; });
|
|
}
|
|
function loadQr(deviceId) {
|
|
if (qr) { qr.src = "/api/onboarding/qr?deviceId=" + encodeURIComponent(deviceId); }
|
|
}
|
|
function submitOnboarding(deviceId, clientName, screenSlug) {
|
|
return fetch("/api/onboarding", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
body: JSON.stringify({ deviceId: deviceId, clientName: clientName, screenSlug: screenSlug })
|
|
})
|
|
.then(function (response) {
|
|
if (response.ok) {
|
|
return response.json();
|
|
}
|
|
return parseResponseError(response).then(function (messageText) {
|
|
throw new Error(messageText);
|
|
});
|
|
})
|
|
.then(function (payload) {
|
|
if (!payload || !payload.screenSlug) { throw new Error("Unable to save onboarding."); }
|
|
if (payload.clientName) { try { window.localStorage.setItem(clientNameKey, payload.clientName); } catch (_error) {} }
|
|
if (payload.clientName && payload.screenSlug) { try { window.localStorage.setItem(getClientNameStorageKey(payload.screenSlug), payload.clientName); } catch (_error2) {} }
|
|
try { window.localStorage.setItem(screenKey, payload.screenSlug); } catch (_error) {}
|
|
setLocalMessage("Onboarding complete.");
|
|
if (localForm) {
|
|
Array.prototype.slice.call(localForm.querySelectorAll("input, select, button")).forEach(function (control) {
|
|
control.disabled = true;
|
|
});
|
|
}
|
|
});
|
|
}
|
|
function redirectIfOnboarded(deviceId) {
|
|
return fetch("/api/onboarding/status?deviceId=" + encodeURIComponent(deviceId), { cache: "no-store" })
|
|
.then(function (response) { return response.ok ? response.json() : null; })
|
|
.then(function (payload) {
|
|
if (payload && payload.onboarded && payload.screenSlug) {
|
|
if (payload.clientName) { try { window.localStorage.setItem(clientNameKey, payload.clientName); } catch (_error) {} }
|
|
if (payload.clientName && payload.screenSlug) { try { window.localStorage.setItem(getClientNameStorageKey(payload.screenSlug), payload.clientName); } catch (_error2) {} }
|
|
try { window.localStorage.setItem(screenKey, payload.screenSlug); } catch (_error) {}
|
|
window.location.replace("/screen/" + encodeURIComponent(payload.screenSlug));
|
|
return true;
|
|
}
|
|
return false;
|
|
})
|
|
.catch(function () { return false; });
|
|
}
|
|
var deviceId = getDeviceId();
|
|
if (localForm) {
|
|
localForm.addEventListener("submit", function (event) {
|
|
event.preventDefault();
|
|
var formData = new FormData(localForm);
|
|
var clientName = String(formData.get("clientName") || "").trim();
|
|
var screenSlug = String(formData.get("screenSlug") || "").trim();
|
|
if (!clientName) { setLocalMessage("Client name is required."); return; }
|
|
if (!screenSlug) { setLocalMessage("Screen is required."); return; }
|
|
setLocalMessage("Saving client...");
|
|
submitOnboarding(deviceId, clientName, screenSlug).catch(function (error) {
|
|
setLocalMessage(error && error.message ? error.message : "Unable to save onboarding.");
|
|
});
|
|
});
|
|
}
|
|
loadScreens().then(function () {
|
|
try {
|
|
var storedScreenSlug = window.localStorage.getItem(screenKey) || "";
|
|
var storedClientName = window.localStorage.getItem(clientNameKey) || "";
|
|
if (!storedClientName && storedScreenSlug) { storedClientName = window.localStorage.getItem(getClientNameStorageKey(storedScreenSlug)) || ""; }
|
|
if (storedClientName && localForm) {
|
|
var clientNameInput = localForm.querySelector("input[name=\"clientName\"]");
|
|
if (clientNameInput && !clientNameInput.value) { clientNameInput.value = storedClientName; }
|
|
}
|
|
if (storedScreenSlug && localScreenSelect) { localScreenSelect.value = storedScreenSlug; }
|
|
} catch (_error) {}
|
|
});
|
|
redirectIfOnboarded(deviceId).then(function (redirected) {
|
|
if (redirected) { return; }
|
|
loadQr(deviceId);
|
|
setStatus("Waiting for onboarding to finish.");
|
|
window.setInterval(function () { redirectIfOnboarded(deviceId); }, 2000);
|
|
});
|
|
}());
|
|
</script> |