60 lines
1.6 KiB
TypeScript
60 lines
1.6 KiB
TypeScript
import type { UserRole } from "@/lib/api";
|
|
|
|
export function getInitials(name: string) {
|
|
return name
|
|
.split(" ")
|
|
.map((part) => part[0]?.toUpperCase())
|
|
.filter(Boolean)
|
|
.slice(0, 2)
|
|
.join("");
|
|
}
|
|
|
|
export function formatRelativeDate(value: string | null) {
|
|
if (!value) return "Never";
|
|
const date = new Date(value);
|
|
if (Number.isNaN(date.getTime())) return "Never";
|
|
|
|
const diffSeconds = Math.max(
|
|
0,
|
|
Math.floor((Date.now() - date.getTime()) / 1000),
|
|
);
|
|
if (diffSeconds < 60) return `${diffSeconds}s ago`;
|
|
if (diffSeconds < 3600) return `${Math.floor(diffSeconds / 60)}m ago`;
|
|
if (diffSeconds < 86400) return `${Math.floor(diffSeconds / 3600)}h ago`;
|
|
if (diffSeconds < 604800) return `${Math.floor(diffSeconds / 86400)}d ago`;
|
|
return date.toLocaleString();
|
|
}
|
|
|
|
export function getServerAccessSummary(input: {
|
|
role: UserRole;
|
|
allServersAccess: boolean;
|
|
names: string[];
|
|
}) {
|
|
if (input.role === "SUPER_ADMIN" || input.allServersAccess) {
|
|
return {
|
|
label: "All servers",
|
|
color: "#10b981",
|
|
tone: "rgba(16,185,129,0.1)",
|
|
border: "rgba(16,185,129,0.25)",
|
|
};
|
|
}
|
|
if (input.names.length === 0) {
|
|
return {
|
|
label: "No servers assigned",
|
|
color: "#f59e0b",
|
|
tone: "rgba(245,158,11,0.1)",
|
|
border: "rgba(245,158,11,0.25)",
|
|
};
|
|
}
|
|
return {
|
|
label: input.names.join(", "),
|
|
color: "#3b82f6",
|
|
tone: "rgba(59,130,246,0.08)",
|
|
border: "rgba(59,130,246,0.2)",
|
|
};
|
|
}
|
|
|
|
export function copyText(value: string) {
|
|
return navigator.clipboard.writeText(value).catch(() => undefined);
|
|
}
|