mirror of
https://github.com/woodchen-ink/nezha-dash-v1.git
synced 2025-07-18 17:41:56 +08:00
104 lines
3.3 KiB
TypeScript
104 lines
3.3 KiB
TypeScript
import { NezhaServer } from "@/types/nezha-api";
|
|
import { type ClassValue, clsx } from "clsx";
|
|
import { twMerge } from "tailwind-merge";
|
|
|
|
export function cn(...inputs: ClassValue[]) {
|
|
return twMerge(clsx(inputs));
|
|
}
|
|
|
|
export function formatNezhaInfo(now: number, serverInfo: NezhaServer) {
|
|
const lastActiveTime = parseISOTimestamp(serverInfo.last_active);
|
|
return {
|
|
...serverInfo,
|
|
cpu: serverInfo.state.cpu || 0,
|
|
process: serverInfo.state.process_count || 0,
|
|
up: serverInfo.state.net_out_speed / 1024 / 1024 || 0,
|
|
down: serverInfo.state.net_in_speed / 1024 / 1024 || 0,
|
|
online: now - lastActiveTime <= 30000,
|
|
uptime: serverInfo.state.uptime || 0,
|
|
version: serverInfo.host.version || null,
|
|
tcp: serverInfo.state.tcp_conn_count || 0,
|
|
udp: serverInfo.state.udp_conn_count || 0,
|
|
mem: (serverInfo.state.mem_used / serverInfo.host.mem_total) * 100 || 0,
|
|
swap: (serverInfo.state.swap_used / serverInfo.host.swap_total) * 100 || 0,
|
|
disk: (serverInfo.state.disk_used / serverInfo.host.disk_total) * 100 || 0,
|
|
stg: (serverInfo.state.disk_used / serverInfo.host.disk_total) * 100 || 0,
|
|
country_code: serverInfo.country_code,
|
|
};
|
|
}
|
|
|
|
export function getDaysBetweenDates(date1: string, date2: string): number {
|
|
const oneDay = 24 * 60 * 60 * 1000; // 一天的毫秒数
|
|
const firstDate = new Date(date1);
|
|
const secondDate = new Date(date2);
|
|
|
|
// 计算两个日期之间的天数差异
|
|
return Math.round(
|
|
Math.abs((firstDate.getTime() - secondDate.getTime()) / oneDay),
|
|
);
|
|
}
|
|
|
|
export const fetcher = (url: string) =>
|
|
fetch(url)
|
|
.then((res) => {
|
|
if (!res.ok) {
|
|
throw new Error(res.statusText);
|
|
}
|
|
return res.json();
|
|
})
|
|
.then((data) => data.data)
|
|
.catch((err) => {
|
|
console.error(err);
|
|
throw err;
|
|
});
|
|
|
|
export const nezhaFetcher = async (url: string) => {
|
|
const res = await fetch(url);
|
|
|
|
if (!res.ok) {
|
|
const error = new Error("An error occurred while fetching the data.");
|
|
// @ts-expect-error - res.json() returns a Promise<any>
|
|
error.info = await res.json();
|
|
// @ts-expect-error - res.status is a number
|
|
error.status = res.status;
|
|
throw error;
|
|
}
|
|
|
|
return res.json();
|
|
};
|
|
|
|
export function parseISOTimestamp(isoString: string): number {
|
|
return new Date(isoString).getTime();
|
|
}
|
|
|
|
export function formatRelativeTime(timestamp: number): string {
|
|
const now = Date.now();
|
|
const diff = now - timestamp;
|
|
const hours = Math.floor(diff / (1000 * 60 * 60));
|
|
const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
|
|
const seconds = Math.floor((diff % (1000 * 60)) / 1000);
|
|
|
|
if (hours > 24) {
|
|
const days = Math.floor(hours / 24);
|
|
return `${days}d`;
|
|
} else if (hours > 0) {
|
|
return `${hours}h`;
|
|
} else if (minutes > 0) {
|
|
return `${minutes}m`;
|
|
} else if (seconds >= 0) {
|
|
return `${seconds}s`;
|
|
}
|
|
return "0s";
|
|
}
|
|
|
|
export function formatTime(timestamp: number): string {
|
|
const date = new Date(timestamp);
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth() + 1;
|
|
const day = date.getDate();
|
|
const hours = date.getHours().toString().padStart(2, "0");
|
|
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
const seconds = date.getSeconds().toString().padStart(2, "0");
|
|
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
}
|