Revert "Refactor OTA update handling and improve error reporting."

This reverts commit 7c128a27eb.
This commit is contained in:
2026-03-17 22:17:32 +01:00
parent 07cf97fffb
commit ce981232f0

View File

@@ -1,50 +1,60 @@
class ToastService { class ToastService {
private container: HTMLElement; private container: HTMLElement;
private stylesInjected = false; private stylesInjected = false;
constructor() { constructor() {
this.container = document.getElementById('toast-container') as HTMLElement; this.container = this.ensureContainer();
this.injectStyles(); this.injectStyles();
}
info(message: string, timeoutMs: number = 5000) {
const el = this.createToast(message, 'info');
this.container.appendChild(el);
// Auto-dismiss after timeout
const timer = window.setTimeout(() => this.dismiss(el), timeoutMs);
// Dismiss on click immediately
el.addEventListener('click', () => {
window.clearTimeout(timer);
this.dismiss(el);
});
}
error(message: string) {
console.error(message);
const el = this.createToast(message, 'error');
this.container.appendChild(el);
// Only dismiss on click
el.addEventListener('click', () => this.dismiss(el));
}
private dismiss(el: HTMLElement) {
if (!el.parentElement) return;
el.parentElement.removeChild(el);
}
private createToast(message: string, type: 'info' | 'error'): HTMLElement {
const div = document.createElement('div');
div.className = `toast ${type}`;
div.textContent = message;
div.setAttribute('role', 'status');
div.setAttribute('aria-live', 'polite');
return div;
}
private ensureContainer(): HTMLElement {
let container = document.getElementById('toast-container');
if (!container) {
container = document.createElement('div');
container.id = 'toast-container';
document.body.appendChild(container);
} }
return container;
}
info(message: string, timeoutMs: number = 5000) { private injectStyles() {
const el = this.createToast(message, 'info'); if (this.stylesInjected) return;
this.container.appendChild(el); const style = document.createElement('style');
// Auto-dismiss after timeout style.textContent = `
const timer = window.setTimeout(() => this.dismiss(el), timeoutMs);
// Dismiss on click immediately
el.addEventListener('click', () => {
window.clearTimeout(timer);
this.dismiss(el);
});
}
error(message: string) {
console.error(message);
const el = this.createToast(message, 'error');
this.container.appendChild(el);
// Only dismiss on click
el.addEventListener('click', () => this.dismiss(el));
}
private dismiss(el: HTMLElement) {
if (!el.parentElement) return;
el.parentElement.removeChild(el);
}
private createToast(message: string, type: 'info' | 'error'): HTMLElement {
const div = document.createElement('div');
div.className = `toast ${type}`;
div.textContent = message;
div.setAttribute('role', 'status');
div.setAttribute('aria-live', 'polite');
return div;
}
private injectStyles() {
if (this.stylesInjected) return;
const style = document.createElement('style');
style.textContent = `
#toast-container { #toast-container {
position: fixed; position: fixed;
top: 12px; top: 12px;
@@ -76,9 +86,9 @@ class ToastService {
border-left: 4px solid #dc3545; border-left: 4px solid #dc3545;
} }
`; `;
document.head.appendChild(style); document.head.appendChild(style);
this.stylesInjected = true; this.stylesInjected = true;
} }
} }
export const toast = new ToastService(); export const toast = new ToastService();