/** Общие мелочи для админ-разделов: бейджи статусов, формат времени, сокращение. */
/** Разрешённые варианты кита: primary, secondary, accent, success, warning, danger, error, info. */
export const statusVariant = {
// delivery
delivered: "success",
pending: "info",
failed: "danger",
skipped: "warning",
// event
queued: "info",
processing: "info",
done: "success",
};
export function badgeFor(status) {
return { label: status, variant: statusVariant[status] || "secondary" };
}
export function fmtTime(iso) {
if (!iso) return "—";
return new Date(iso).toLocaleString("ru-RU", {
day: "2-digit", month: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit",
});
}
export function truncate(text, n = 80) {
if (!text) return "";
return text.length > n ? `${text.slice(0, n - 1)}…` : text;
}
/** JSON в одну строку для ячейки таблицы. */
export function shortJson(value, n = 60) {
if (!value || (typeof value === "object" && !Object.keys(value).length)) return "—";
const text = JSON.stringify(value);
return truncate(text, n);
}
/** Разбор строки с запятыми/пробелами в массив непустых токенов. */
export function parseList(text) {
return (text || "")
.split(/[,\n]+/)
.map((s) => s.trim())
.filter(Boolean);
}