From ace9c2ee8c4026ea8f394bb18bb31f67b5b455ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=BB=93=E9=BC=A0?=
<71394853+hamster1963@users.noreply.github.com>
Date: Thu, 5 Dec 2024 11:23:57 +0800
Subject: [PATCH 1/6] docs: Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index d7364e8..e436d17 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
> V0 | V1 版本 issue 请在当前仓库发起
> [!TIP]
-> 有关 V1 版本 pr 可移步 https://github.com/hamster1963/nezha-dash-react
+> 有关 V1 版本 pr 可移步 https://github.com/hamster1963/nezha-dash-v1
### 部署
From ec1c72e4cb73a9272a41985cd8ac1d5c8f824722 Mon Sep 17 00:00:00 2001
From: hamster1963 <1410514192@qq.com>
Date: Thu, 5 Dec 2024 14:29:31 +0800
Subject: [PATCH 2/6] fix(overview): refreshInterval
---
app/(main)/ClientComponents/ServerOverviewClient.tsx | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/(main)/ClientComponents/ServerOverviewClient.tsx b/app/(main)/ClientComponents/ServerOverviewClient.tsx
index 7df36ae..235fecf 100644
--- a/app/(main)/ClientComponents/ServerOverviewClient.tsx
+++ b/app/(main)/ClientComponents/ServerOverviewClient.tsx
@@ -24,6 +24,9 @@ export default function ServerOverviewClient() {
const { data, error, isLoading } = useSWR(
"/api/server",
nezhaFetcher,
+ {
+ refreshInterval: Number(getEnv("NEXT_PUBLIC_NezhaFetchInterval")) || 2000,
+ },
);
const disableCartoon = getEnv("NEXT_PUBLIC_DisableCartoon") === "true";
From 07f02f5da86300c2f7d6d393c73f03c5e9bf8ffc Mon Sep 17 00:00:00 2001
From: hamster1963 <1410514192@qq.com>
Date: Thu, 5 Dec 2024 14:31:02 +0800
Subject: [PATCH 3/6] chore: deps
---
bun.lockb | Bin 613720 -> 613720 bytes
package.json | 10 +++++-----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/bun.lockb b/bun.lockb
index 912fe8175efc5740dad367cacdb7867150dad79f..cdc237041e2cb2363a41dff00cc8e78954698e06 100755
GIT binary patch
delta 2716
zcmaJ@dpMNo8~&y-%;!)!b(sn?j+KlNgNQ~H{l;NjIuNymGUSjP3biU>Rn}ydmvsth
zGl-&{hFXkLG+SB*+lY}>l*l@?rNh2t%GK8I`{TRc_qm_B-}`yLYp&<%s?qJL(Pfc|
z?%Ln^n>TLu9?{0}&vJtQ5P5FWf87%B598|DoVCnx&C4z^tF}&yFo-sS91}q#Lac#E
zf|xajQFA;4q8^NsA!HMsD$O*@IfeEZP4Z6O@%rQ&V
zx{j)5H^?elN7UW5X|RxbmdC#Sd$@y4)x~Y~w(J!Jl&Z{3h8A{7OEa6bU6?z3Z`x*<5#b5|{$TGji&bUE69{oSI9y&0Q+0daXNgFGvkBO10U#H4ce0&Y1Q`%;_sw7X}KUb=G5WHQ>v2GWO>LPIaaX|KFiLJGI;
z^eGf(=N0E@U7R?pM$l}$;*j9!{(MEcDI>sd_Yt!r){9DBf=68J0a|REMnmn!qP|^q
z2AA{S8A!T6Vw3p#z`7JB8jTT8-N4l=4
z|9E+Lh`+DNDxx&$>9+kx^U0mp?6-hi5mqfOJKcN8!C#dbncl?P`3g;>O&9m8DQDb{
zDPVSIYrMJSb!e(UuOOGy9x%H1g_cEtiIp?`pO7|{@PMmzdZ|CX!XO9+kwT6k2(lRm
zUvrPtn!DcnlTwHR`HHmAl*E(6MuN;BR&+wx9%X6#gKRG$_P&ZUb%&TRnWuILf28h*z@F4~u!gYP?UL6<&bM2)oP|
z=1hCB#p=@LQ7&)MH?f)ahf)?syNc}bmtPBsc0TSq6kRMbZVcXUAUMCM>d4=q*zcD3
z@_|m2vb9m^ZMqpJbe>^X91;iRKR!}t1(OyZYztcII>cL^6zf6k60~6!&%Z|QnE}PK>ioIBsxGYD0;z4oEcXo%1f;@yF+AAqO
zN-384N;M;^3U0Iw^lBGuGvW?+ncN=QFhtWaer;ve;*)fqZFxzDVtK(mZ1LQk!v7KC
zKHs5G94P+T+Tqw4jsG>*^!;9e*r)wH3luErqdy{a+sT
zigECqDMO%2#so=E|C}HhBqUw`Gs6I*Guo2LLoz0OPRIfUFac8of@kt1lZ#}`_?$Nl
zYGDEwA1HIr17pnX59p($1)w?)PXKT!&;4~J8bng3
zk|X?Mf&%=R5g`E~{=VVireq44V(7CsVh@=L*3(fYZZ-uRXP`uYcS4mx9UYYc{d81q
zW~C0Solp&s?}SPN3Ij#Ks+pA8t&20N0Qy`|ZE(g3wFF09Q9KB6LJ6SW84A3d$*Xrl
z7lW~H336VTi~>dAte&ZzFZ*lt(Uc-|JCu@L+`BR^B#r=QK*kj`*LSAH3X
zeyCr@pk>2(F<6TnXmf>?N;Dllt#kp#4b}U!)d16USYH7H)%qAa=Y|?#sN7aJ^ar_r
E0ll9#S^xk5
delta 2569
zcmZWr2|QG5A3kRmGe<((S0yO_Rs*=y#
z;??}Vdn3VCOEFI18tV+Fzm*TC)d14=9focluPx?X?!5Weqgxn27KcQA}Jndf>&oU_}vqOrRM450YCa4F7
zLZp~_l#$k0_I|Iqh%!M^yP!T83X@{OP)7ROn^0z(l*arS3~iaufb^0t#}Ratz`6qa
zRA@}Tg_STxpvBq7kG7WZUHOxLdEKMKBfC87WVKW9_6H7c
zbR3(bf0McPkX#I_|!WhqG*uDw)ORJ#G=p
z@VP^&uV7bdS`IN|WA~09%@epef6EgYq#{1$RLQ{kgi;Ux6J
zX9k=tO}94KDvWkrS6^mUsaPAMxX&R1arA#R)1w}Ho8jsba@+ew*K<&}%GztKrE1l$
zhQvY8Bf##oUpAmo+^oDgXQQ=k@UC*N1rG9w+}@g
z8%sQ^QE*$uzSjN$_k?2fOMXS+>!X6Co7g5D`wQn>{i2$kKCOE@xQVs+R5&%#Vd<4&
z`jSeniLgRGzliQbTC%kI?PopF?^BpS7+p{M!Y@x$xXjZ~G*i%*LWKREtUarpEYlfNFctY;Df18+C-ss1|yy_&tmWh-ll
zZpS{Bdj1m+Ll6vMAVmm*=y>$w>xBz0@!VCkT=z^F-HQA~HaooC&GDK#`)TgE@t)z%
zJL9g0z17NQ$iAc$BQpG{>%*pS&S*iB$fJWck^5qGk(lZLnBAzoN4ZsD+m7xyqtC5Q
zda?t1HZS-3tw~Gc$8bBMro8I6=v(J=|6p7u
z2KCR{!$GmAEw}mhOcEYh$_Jlh6#V0#xj=*Z-*a9D!W?frugqF+VKR5EL5`36jOf*S
zlG6IiRj_tHwoc^gXCmMQFVCo>op_rJTERz&y$S#Oku3_?x
zOjSw(D4hDO-F5p)JH1{9E%H_4FG`AZZ|0``Fcq|Ymv}*D-N+=~jn?tio@9E=`Szkd
z_fvXtc~NdxjThqIM6^Y8nX!+*Z?!Va4(Zj0gpK)oNy!@$Y+@K{ekCq@(~9+|97;0H
zZjf0SRAjW3Uvp%(F+`M{n>D|297QMI4N=I{h(qqU++gzV1eCvbohH6DKGtwumpJ-!
zRqFV`HTiY@I0vnfYPI*NDZ9iA>dFusvv
znEJ4^Voj!#lNWxM!abc_VVjEO$V}h%%$vGj8%u0+<~P3n4yHdQKZjzD)*Lx|BV8GD=mo&Mc=*!luKu=DKG_oojJopG#$Ra_s!(%o
zcqHbAHV*Lu?1HtqBXr91S%(l2hfdOCzC-+yp_$F8%8DDvJ6*f!yv%U28EbJoxU|-~
zDPoIo;Vs>`R-4lU@}!evQ;xmDu@gP_1`G4ArV}2oHWfIh!Q`9Zb{|&N-W>a!cF8X(
z+JN#BFR&yq>kR^9F{*9bhg$-TWA7t219lfbwADog)|qzKTwLx<6a7<&Ul-MA+sA#u
z-B`J9MS{vRtU%=%uInXunU$Fa(R-iPQuzN)Uii
zqR<-T3Q@&QDx!@6yDtz(0KJtHRO%z)+KbFr?Frr=9vU37Co(iLc!0bd4!fDH_U1eP%nGEie73qgyd9A_c2piCmpXCPF-
zVxlFwU?$n24BiY9v_UBcSpeAXh{LQcaEXJcN=i9U#YFU_IT_%>L@cB^IgrRg45c{*
zFw;+v1s_?6j`V_z#G1+X9O`)iuw$d=kPPO34ivx>cf>%NlaZWP9&G3Qe`j_*yByqvN7|`5j
diff --git a/package.json b/package.json
index b471cd6..4950f09 100644
--- a/package.json
+++ b/package.json
@@ -26,7 +26,7 @@
"@types/d3-geo": "^3.1.0",
"@types/luxon": "^3.4.2",
"@typescript-eslint/eslint-plugin": "^8.17.0",
- "caniuse-lite": "^1.0.30001685",
+ "caniuse-lite": "^1.0.30001686",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"country-flag-icons": "^1.5.13",
@@ -47,7 +47,7 @@
"react-dom": "19.0.0-rc-02c0e824-20241028",
"react-intersection-observer": "^9.13.1",
"react-wrap-balancer": "^1.1.1",
- "recharts": "^2.14.0",
+ "recharts": "^2.14.1",
"sharp": "^0.33.5",
"swr": "^2.2.6-beta.4",
"tailwind-merge": "^2.5.5",
@@ -56,7 +56,7 @@
},
"devDependencies": {
"@next/bundle-analyzer": "^15.0.3",
- "@tailwindcss/postcss": "^4.0.0-beta.4",
+ "@tailwindcss/postcss": "^4.0.0-beta.5",
"@types/node": "^22.10.1",
"@types/react": "npm:types-react@19.0.0-rc.1",
"@types/react-dom": "npm:types-react-dom@19.0.0-rc.1",
@@ -65,9 +65,9 @@
"eslint-plugin-turbo": "^2.3.3",
"eslint-plugin-unused-imports": "^4.1.4",
"postcss": "^8.4.49",
- "prettier": "^3.4.1",
+ "prettier": "^3.4.2",
"prettier-plugin-tailwindcss": "^0.6.9",
- "tailwindcss": "^4.0.0-beta.4",
+ "tailwindcss": "^4.0.0-beta.5",
"typescript": "^5.7.2",
"vercel": "39.1.1"
},
From f8bfbde9b58beb09299c2f0ad4a2f15df20b326a Mon Sep 17 00:00:00 2001
From: hamster1963 <1410514192@qq.com>
Date: Thu, 5 Dec 2024 14:45:58 +0800
Subject: [PATCH 4/6] perf: refactor global map as client side render
---
app/(main)/ClientComponents/Global.tsx | 25 ++++++++++++++++---
.../ClientComponents/ServerOverviewClient.tsx | 4 +--
app/(main)/page.tsx | 13 +++++-----
3 files changed, 29 insertions(+), 13 deletions(-)
diff --git a/app/(main)/ClientComponents/Global.tsx b/app/(main)/ClientComponents/Global.tsx
index 5fe711f..cb58e6b 100644
--- a/app/(main)/ClientComponents/Global.tsx
+++ b/app/(main)/ClientComponents/Global.tsx
@@ -1,11 +1,30 @@
-import { GetNezhaData } from "@/lib/serverFetch";
+"use client";
+
+import { ServerApi } from "@/app/types/nezha-api";
+import { nezhaFetcher } from "@/lib/utils";
+import useSWR from "swr";
import { geoJsonString } from "../../../lib/geo-json-string";
import GlobalInfo from "./GlobalInfo";
+import GlobalLoading from "./GlobalLoading";
import { InteractiveMap } from "./InteractiveMap";
-export default async function ServerGlobal() {
- const nezhaServerList = await GetNezhaData();
+export default function ServerGlobal() {
+ const { data: nezhaServerList, error } = useSWR(
+ "/api/server",
+ nezhaFetcher,
+ );
+
+ if (error)
+ return (
+
+ );
+
+ if (!nezhaServerList) {
+ return ;
+ }
const countryList: string[] = [];
const serverCounts: { [key: string]: number } = {};
diff --git a/app/(main)/ClientComponents/ServerOverviewClient.tsx b/app/(main)/ClientComponents/ServerOverviewClient.tsx
index 235fecf..9a49d37 100644
--- a/app/(main)/ClientComponents/ServerOverviewClient.tsx
+++ b/app/(main)/ClientComponents/ServerOverviewClient.tsx
@@ -202,9 +202,7 @@ export default function ServerOverviewClient() {
- {formatBytes(
- data?.total_in_speed,
- )}/s
+ {formatBytes(data?.total_in_speed)}/s
>
diff --git a/app/(main)/page.tsx b/app/(main)/page.tsx
index 680118f..871fe51 100644
--- a/app/(main)/page.tsx
+++ b/app/(main)/page.tsx
@@ -1,10 +1,13 @@
import ServerList from "@/components/ServerList";
import ServerOverview from "@/components/ServerOverview";
-import { Suspense } from "react";
+import dynamic from "next/dynamic";
-import ServerGlobal from "./ClientComponents/Global";
import GlobalLoading from "./ClientComponents/GlobalLoading";
+const ServerGlobal = dynamic(() => import("./ClientComponents/Global"), {
+ loading: () => ,
+});
+
export default async function Home({
searchParams,
}: {
@@ -15,11 +18,7 @@ export default async function Home({
{!global && }
- {global && (
- }>
-
-
- )}
+ {global && }
);
}
From 0b93cf7af82387278c3f0defa92e50e310fcba07 Mon Sep 17 00:00:00 2001
From: hamster1963 <1410514192@qq.com>
Date: Thu, 5 Dec 2024 15:07:20 +0800
Subject: [PATCH 5/6] feat: show map in main page
---
app/(main)/ClientComponents/GlobalInfo.tsx | 2 -
app/(main)/ClientComponents/GlobalLoading.tsx | 2 -
.../ClientComponents/ServerListClient.tsx | 20 +++++++--
.../ClientComponents/ServerOverviewClient.tsx | 42 ++++---------------
app/(main)/page.tsx | 17 +-------
5 files changed, 27 insertions(+), 56 deletions(-)
diff --git a/app/(main)/ClientComponents/GlobalInfo.tsx b/app/(main)/ClientComponents/GlobalInfo.tsx
index ff777c6..f407480 100644
--- a/app/(main)/ClientComponents/GlobalInfo.tsx
+++ b/app/(main)/ClientComponents/GlobalInfo.tsx
@@ -1,6 +1,5 @@
"use client";
-import GlobalBackButton from "@/components/GlobalBackButton";
import { useTranslations } from "next-intl";
type GlobalInfoProps = {
@@ -11,7 +10,6 @@ export default function GlobalInfo({ countries }: GlobalInfoProps) {
const t = useTranslations("Global");
return (
-
{t("Distributions")} {countries.length} {t("Regions")}
diff --git a/app/(main)/ClientComponents/GlobalLoading.tsx b/app/(main)/ClientComponents/GlobalLoading.tsx
index a87fb4a..c6141c6 100644
--- a/app/(main)/ClientComponents/GlobalLoading.tsx
+++ b/app/(main)/ClientComponents/GlobalLoading.tsx
@@ -1,6 +1,5 @@
"use client";
-import GlobalBackButton from "@/components/GlobalBackButton";
import { Loader } from "@/components/loading/Loader";
import { useTranslations } from "next-intl";
@@ -8,7 +7,6 @@ export default function GlobalLoading() {
const t = useTranslations("Global");
return (
-
{t("Loading")}
diff --git a/app/(main)/ClientComponents/ServerListClient.tsx b/app/(main)/ClientComponents/ServerListClient.tsx
index 1d68c95..8d10961 100644
--- a/app/(main)/ClientComponents/ServerListClient.tsx
+++ b/app/(main)/ClientComponents/ServerListClient.tsx
@@ -10,19 +10,25 @@ import { useStatus } from "@/lib/status-context";
import { cn, nezhaFetcher } from "@/lib/utils";
import { MapIcon, ViewColumnsIcon } from "@heroicons/react/20/solid";
import { useTranslations } from "next-intl";
-import { useRouter } from "next/navigation";
+import dynamic from "next/dynamic";
import { useEffect, useRef, useState } from "react";
import useSWR from "swr";
+import GlobalLoading from "./GlobalLoading";
+
+const ServerGlobal = dynamic(() => import("./Global"), {
+ loading: () =>
,
+});
+
export default function ServerListClient() {
const { status } = useStatus();
const { filter } = useFilter();
const t = useTranslations("ServerListClient");
const containerRef = useRef
(null);
const defaultTag = "defaultTag";
- const router = useRouter();
const [tag, setTag] = useState(defaultTag);
+ const [showMap, setShowMap] = useState(false);
const [inline, setInline] = useState("0");
useEffect(() => {
@@ -131,9 +137,14 @@ export default function ServerListClient() {
@@ -161,6 +172,7 @@ export default function ServerListClient() {
/>
)}
+ {showMap && }
{inline === "1" && (
@@ -50,14 +45,10 @@ export default function ServerOverviewClient() {
{
- if (!global) {
- setFilter(false);
- setStatus("all");
- }
+ setFilter(false);
+ setStatus("all");
}}
- className={cn("cursor-pointer hover:border-blue-500 transition-all", {
- "pointer-events-none": global,
- })}
+ className={cn("cursor-pointer hover:border-blue-500 transition-all")}
>
@@ -83,19 +74,14 @@ export default function ServerOverviewClient() {
{
- if (!global) {
- setFilter(false);
- setStatus("online");
- }
+ setFilter(false);
+ setStatus("online");
}}
className={cn(
"cursor-pointer hover:ring-green-500 ring-1 ring-transparent transition-all",
{
"ring-green-500 ring-2 border-transparent": status === "online",
},
- {
- "pointer-events-none": global,
- },
)}
>
@@ -123,19 +109,14 @@ export default function ServerOverviewClient() {
{
- if (!global) {
- setFilter(false);
- setStatus("offline");
- }
+ setFilter(false);
+ setStatus("offline");
}}
className={cn(
"cursor-pointer hover:ring-red-500 ring-1 ring-transparent transition-all",
{
"ring-red-500 ring-2 border-transparent": status === "offline",
},
- {
- "pointer-events-none": global,
- },
)}
>
@@ -163,19 +144,14 @@ export default function ServerOverviewClient() {
{
- if (!global) {
- setStatus("all");
- setFilter(true);
- }
+ setStatus("all");
+ setFilter(true);
}}
className={cn(
"cursor-pointer hover:ring-purple-500 ring-1 ring-transparent transition-all",
{
"ring-purple-500 ring-2 border-transparent": filter === true,
},
- {
- "pointer-events-none": global,
- },
)}
>
diff --git a/app/(main)/page.tsx b/app/(main)/page.tsx
index 871fe51..f7cafe8 100644
--- a/app/(main)/page.tsx
+++ b/app/(main)/page.tsx
@@ -1,24 +1,11 @@
import ServerList from "@/components/ServerList";
import ServerOverview from "@/components/ServerOverview";
-import dynamic from "next/dynamic";
-import GlobalLoading from "./ClientComponents/GlobalLoading";
-
-const ServerGlobal = dynamic(() => import("./ClientComponents/Global"), {
- loading: () => ,
-});
-
-export default async function Home({
- searchParams,
-}: {
- searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
-}) {
- const global = (await searchParams).global;
+export default async function Home() {
return (
- {!global && }
- {global && }
+
);
}
From 017a82859109398bbbb8ad6cd4398b4b00df951b Mon Sep 17 00:00:00 2001
From: hamster1963 <1410514192@qq.com>
Date: Thu, 5 Dec 2024 15:08:14 +0800
Subject: [PATCH 6/6] v1.7.0
---
package.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/package.json b/package.json
index 4950f09..8be1269 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "nezha-dash",
- "version": "1.6.11",
+ "version": "1.7.0",
"private": true,
"scripts": {
"dev": "next dev -p 3040",