ui: toast per-type durations, Details modal for long errors, concise acme.sh failure summary
This commit is contained in:
@@ -107,19 +107,53 @@ export const _toasts = [];
|
||||
const _toastIds = { next: 1 };
|
||||
|
||||
/**
|
||||
* Show a toast notification. Auto-dismisses after `duration` ms.
|
||||
* Default auto-dismiss durations per toast type (ms). 0 = never
|
||||
* auto-dismiss. Errors stay on screen until dismissed so long
|
||||
* failure messages remain readable.
|
||||
*/
|
||||
const _TOAST_DEFAULT_DURATIONS = {
|
||||
info: 4000,
|
||||
success: 4000,
|
||||
warning: 8000,
|
||||
error: 0,
|
||||
};
|
||||
|
||||
/**
|
||||
* Auto-dismiss timer that pauses while the toast is hovered.
|
||||
* Re-checks in 1s while hovered instead of dismissing.
|
||||
*/
|
||||
function _scheduleToastDismiss(id, delay) {
|
||||
setTimeout(() => {
|
||||
const t = _toasts.find(t => t.id === id);
|
||||
if (!t) return;
|
||||
if (t.hovered) _scheduleToastDismiss(id, 1000);
|
||||
else dismissToast(id);
|
||||
}, delay);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a toast notification.
|
||||
*
|
||||
* When `duration` is omitted, per-type defaults apply: 'info' and
|
||||
* 'success' auto-dismiss after 4000 ms, 'warning' after 8000 ms, and
|
||||
* 'error' toasts never auto-dismiss. An explicit `duration` overrides
|
||||
* the default. The auto-dismiss timer pauses while the toast is
|
||||
* hovered.
|
||||
*
|
||||
* @param {string} message – Toast text
|
||||
* @param {string} [type] – 'info' | 'success' | 'error' | 'warning'
|
||||
* @param {number} [duration] – Auto-dismiss timeout in ms (0 = indefinite)
|
||||
* @returns {number} id
|
||||
*/
|
||||
export function toast(message, type = 'info', duration = 4000) {
|
||||
export function toast(message, type = 'info', duration) {
|
||||
const id = _toastIds.next++;
|
||||
_toasts.push({ id, message, type, createdAt: Date.now(), duration });
|
||||
const dur = duration === undefined
|
||||
? (_TOAST_DEFAULT_DURATIONS[type] ?? 4000)
|
||||
: duration;
|
||||
_toasts.push({ id, message, type, createdAt: Date.now(), duration: dur, hovered: false });
|
||||
requestUpdate();
|
||||
|
||||
if (duration > 0) setTimeout(() => dismissToast(id), duration);
|
||||
if (dur > 0) _scheduleToastDismiss(id, dur);
|
||||
return id;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user