diff --git a/app/(main)/ClientComponents/ServerListClient.tsx b/app/(main)/ClientComponents/ServerListClient.tsx
index 81f8e8e..0d3186b 100644
--- a/app/(main)/ClientComponents/ServerListClient.tsx
+++ b/app/(main)/ClientComponents/ServerListClient.tsx
@@ -11,12 +11,11 @@ export default function ServerListClient() {
});
if (!data) return null;
const sortedResult = data.result.sort((a, b) => a.id - b.id);
- const timestamp = Date.now() / 1000;
return (
{sortedResult.map((serverInfo) => (
-
+
))}
);
diff --git a/app/(main)/header.tsx b/app/(main)/header.tsx
index 65702ba..d61da36 100644
--- a/app/(main)/header.tsx
+++ b/app/(main)/header.tsx
@@ -38,7 +38,7 @@ function Header() {
// https://github.com/streamich/react-use/blob/master/src/useInterval.ts
const useInterval = (callback: Function, delay?: number | null) => {
- const savedCallback = useRef(() => { });
+ const savedCallback = useRef(() => {});
useEffect(() => {
savedCallback.current = callback;
@@ -61,7 +61,9 @@ function Overview() {
}, []);
const timeOption = DateTime.TIME_SIMPLE;
timeOption.hour12 = true;
- const [timeString, setTimeString] = useState(DateTime.now().setLocale("en-US").toLocaleString(timeOption));
+ const [timeString, setTimeString] = useState(
+ DateTime.now().setLocale("en-US").toLocaleString(timeOption),
+ );
useInterval(() => {
setTimeString(DateTime.now().setLocale("en-US").toLocaleString(timeOption));
@@ -73,9 +75,7 @@ function Overview() {
where the time is
{mouted && (
-
- {timeString}
-
+
{timeString}
)}
diff --git a/app/(main)/page.tsx b/app/(main)/page.tsx
index e7dcb53..24a1a48 100644
--- a/app/(main)/page.tsx
+++ b/app/(main)/page.tsx
@@ -1,6 +1,7 @@
import ServerList from "@/components/ServerList";
import ServerOverview from "@/components/ServerOverview";
-import { GetNezhaData } from "@/lib/prefetch";
+import { GetNezhaData } from "@/lib/serverFetch";
+
import { SWRConfig } from "swr";
export default function Home() {
diff --git a/app/api/server/route.ts b/app/api/server/route.ts
index 08789e0..f99bc10 100644
--- a/app/api/server/route.ts
+++ b/app/api/server/route.ts
@@ -1,57 +1,10 @@
-import { NezhaAPI, ServerApi } from "@/app/types/nezha-api";
-import { MakeOptional } from "@/app/types/utils";
+import { GetNezhaData } from "@/lib/serverFetch";
import { NextResponse } from "next/server";
export async function GET(_: Request) {
- if (!process.env.NezhaBaseUrl) {
- return NextResponse.json(
- { error: "NezhaBaseUrl is not set" },
- { status: 400 },
- );
- }
-
- // Remove trailing slash
- var nezhaBaseUrl = process.env.NezhaBaseUrl;
-
- if (process.env.NezhaBaseUrl[process.env.NezhaBaseUrl.length - 1] === "/") {
- nezhaBaseUrl = process.env.NezhaBaseUrl.slice(0, -1);
- }
-
try {
- const response = await fetch(nezhaBaseUrl + "/api/v1/server/details", {
- headers: {
- Authorization: process.env.NezhaAuth as string,
- },
- next: {
- revalidate: 0,
- },
- });
- const nezhaData = (await response.json()).result as NezhaAPI[];
- const data: ServerApi = {
- live_servers: 0,
- offline_servers: 0,
- total_bandwidth: 0,
- result: [],
- };
- const timestamp = Date.now() / 1000;
- data.result = nezhaData.map(
- (element: MakeOptional) => {
- if (timestamp - element.last_active > 300) {
- data.offline_servers += 1;
- } else {
- data.live_servers += 1;
- }
- data.total_bandwidth += element.status.NetOutTransfer;
-
- delete element.ipv4;
- delete element.ipv6;
- delete element.valid_ip;
-
- return element;
- },
- );
-
- return NextResponse.json(data, { status: 200 });
+ const response = await GetNezhaData();
+ return NextResponse.json(response, { status: 200 });
} catch (error) {
return NextResponse.json({ error: error }, { status: 200 });
}
diff --git a/app/types/nezha-api.ts b/app/types/nezha-api.ts
index dd1f356..59679c5 100644
--- a/app/types/nezha-api.ts
+++ b/app/types/nezha-api.ts
@@ -12,6 +12,7 @@ export interface NezhaAPI {
name: string;
tag: string;
last_active: number;
+ online_status: boolean;
ipv4: string;
ipv6: string;
valid_ip: string;
diff --git a/bun.lockb b/bun.lockb
index d1e5845..3474d36 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/components/ServerCard.tsx b/components/ServerCard.tsx
index 3a93215..4e9d784 100644
--- a/components/ServerCard.tsx
+++ b/components/ServerCard.tsx
@@ -10,18 +10,14 @@ import { formatNezhaInfo } from "@/lib/utils";
import ServerCardPopover from "./ServerCardPopover";
export default function ServerCard({
- timestamp,
serverInfo,
}: {
- timestamp: number;
serverInfo: NezhaAPISafe;
}) {
- const { name, online, cpu, up, down, mem, stg, ...props } = formatNezhaInfo(
- timestamp,
- serverInfo,
- );
+ const { name, online, cpu, up, down, mem, stg, ...props } =
+ formatNezhaInfo(serverInfo);
- return online === "online" ? (
+ return online ? (
,
@@ -20,12 +20,12 @@ const PopoverContent = React.forwardRef<
sideOffset={sideOffset}
className={cn(
"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
- className
+ className,
)}
{...props}
/>
-))
-PopoverContent.displayName = PopoverPrimitive.Content.displayName
+));
+PopoverContent.displayName = PopoverPrimitive.Content.displayName;
-export { Popover, PopoverTrigger, PopoverContent }
+export { Popover, PopoverTrigger, PopoverContent };
diff --git a/lib/prefetch.tsx b/lib/prefetch.tsx
deleted file mode 100644
index 911edbb..0000000
--- a/lib/prefetch.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { NezhaAPI, ServerApi } from "@/app/types/nezha-api";
-import { MakeOptional } from "@/app/types/utils";
-import { error } from "console";
-
-export async function GetNezhaData() {
- if (!process.env.NezhaBaseUrl) {
- error("NezhaBaseUrl is not set");
- return;
- }
- // Remove trailing slash
- var nezhaBaseUrl = process.env.NezhaBaseUrl;
-
- if (process.env.NezhaBaseUrl[process.env.NezhaBaseUrl.length - 1] === "/") {
- nezhaBaseUrl = process.env.NezhaBaseUrl.slice(0, -1);
- }
- try {
- const response = await fetch(nezhaBaseUrl + "/api/v1/server/details", {
- headers: {
- Authorization: process.env.NezhaAuth as string,
- },
- next: {
- revalidate: 1,
- },
- });
- const nezhaData = (await response.json()).result as NezhaAPI[];
- const data: ServerApi = {
- live_servers: 0,
- offline_servers: 0,
- total_bandwidth: 0,
- result: [],
- };
- const timestamp = Date.now() / 1000;
- data.result = nezhaData.map(
- (element: MakeOptional) => {
- if (timestamp - element.last_active > 300) {
- data.offline_servers += 1;
- } else {
- data.live_servers += 1;
- }
- data.total_bandwidth += element.status.NetOutTransfer;
-
- delete element.ipv4;
- delete element.ipv6;
- delete element.valid_ip;
-
- return element;
- },
- );
-
- return data;
- } catch (error) {
- return error;
- }
-}
\ No newline at end of file
diff --git a/lib/serverFetch.tsx b/lib/serverFetch.tsx
new file mode 100644
index 0000000..6058678
--- /dev/null
+++ b/lib/serverFetch.tsx
@@ -0,0 +1,58 @@
+"use server";
+
+import { NezhaAPI, ServerApi } from "@/app/types/nezha-api";
+import { MakeOptional } from "@/app/types/utils";
+import { error } from "console";
+
+export async function GetNezhaData() {
+ if (!process.env.NezhaBaseUrl) {
+ error("NezhaBaseUrl is not set");
+ return;
+ }
+ // Remove trailing slash
+ var nezhaBaseUrl = process.env.NezhaBaseUrl;
+
+ if (process.env.NezhaBaseUrl[process.env.NezhaBaseUrl.length - 1] === "/") {
+ nezhaBaseUrl = process.env.NezhaBaseUrl.slice(0, -1);
+ }
+ try {
+ const response = await fetch(nezhaBaseUrl + "/api/v1/server/details", {
+ headers: {
+ Authorization: process.env.NezhaAuth as string,
+ },
+ next: {
+ revalidate: 1,
+ },
+ });
+ const nezhaData = (await response.json()).result as NezhaAPI[];
+ const data: ServerApi = {
+ live_servers: 0,
+ offline_servers: 0,
+ total_bandwidth: 0,
+ result: [],
+ };
+ const timestamp = Date.now() / 1000;
+ data.result = nezhaData.map(
+ (element: MakeOptional) => {
+ if (timestamp - element.last_active > 300) {
+ data.offline_servers += 1;
+ element.online_status = false;
+ } else {
+ data.live_servers += 1;
+ element.online_status = true;
+ }
+ data.total_bandwidth += element.status.NetOutTransfer;
+
+ delete element.ipv4;
+ delete element.ipv6;
+ delete element.valid_ip;
+
+ return element;
+ },
+ );
+
+ return data;
+ } catch (error) {
+ return error;
+ }
+}
diff --git a/lib/utils.ts b/lib/utils.ts
index e3a7514..2512031 100644
--- a/lib/utils.ts
+++ b/lib/utils.ts
@@ -6,16 +6,16 @@ export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
-export function formatNezhaInfo(timestamp: number, serverInfo: NezhaAPISafe) {
- return {
- ...serverInfo,
- cpu: serverInfo.status.CPU,
- up: serverInfo.status.NetOutSpeed / 1024 / 1024,
- down: serverInfo.status.NetInSpeed / 1024 / 1024,
- online: timestamp - serverInfo.last_active > 300 ? "offline" : "online",
- mem: (serverInfo.status.MemUsed / serverInfo.host.MemTotal) * 100,
- stg: (serverInfo.status.DiskUsed / serverInfo.host.DiskTotal) * 100,
- }
+export function formatNezhaInfo(serverInfo: NezhaAPISafe) {
+ return {
+ ...serverInfo,
+ cpu: serverInfo.status.CPU,
+ up: serverInfo.status.NetOutSpeed / 1024 / 1024,
+ down: serverInfo.status.NetInSpeed / 1024 / 1024,
+ online: serverInfo.online_status,
+ mem: (serverInfo.status.MemUsed / serverInfo.host.MemTotal) * 100,
+ stg: (serverInfo.status.DiskUsed / serverInfo.host.DiskTotal) * 100,
+ };
}
export function formatBytes(bytes: number, decimals: number = 2) {