diff --git a/bun.lockb b/bun.lockb
index de5dba4..627e74d 100755
Binary files a/bun.lockb and b/bun.lockb differ
diff --git a/package.json b/package.json
index 41cb330..09548d1 100644
--- a/package.json
+++ b/package.json
@@ -19,6 +19,7 @@
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-label": "^2.1.0",
+ "@radix-ui/react-popover": "^1.1.3",
"@radix-ui/react-progress": "^1.1.0",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
diff --git a/src/components/ServerCard.tsx b/src/components/ServerCard.tsx
index 617d5d0..2c3c46e 100644
--- a/src/components/ServerCard.tsx
+++ b/src/components/ServerCard.tsx
@@ -110,7 +110,7 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf
{down >= 1024
? `${(down / 1024).toFixed(2)}G/s`
- : up >= 1
+ : down >= 1
? `${down.toFixed(2)}M/s`
: `${(down * 1024).toFixed(2)}K/s`}
diff --git a/src/components/ServerOverview.tsx b/src/components/ServerOverview.tsx
index 27b82fb..ac7dc75 100644
--- a/src/components/ServerOverview.tsx
+++ b/src/components/ServerOverview.tsx
@@ -104,11 +104,7 @@ export default function ServerOverview({
-
+
diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx
new file mode 100644
index 0000000..960fb07
--- /dev/null
+++ b/src/components/ui/popover.tsx
@@ -0,0 +1,28 @@
+import { cn } from "@/lib/utils"
+import * as PopoverPrimitive from "@radix-ui/react-popover"
+import * as React from "react"
+
+const Popover = PopoverPrimitive.Root
+
+const PopoverTrigger = PopoverPrimitive.Trigger
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef
,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+PopoverContent.displayName = PopoverPrimitive.Content.displayName
+
+export { Popover, PopoverTrigger, PopoverContent }
diff --git a/src/context/filter-context.ts b/src/context/filter-context.ts
deleted file mode 100644
index aaedf94..0000000
--- a/src/context/filter-context.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { createContext } from "react"
-
-export interface FilterContextType {
- filter: boolean
- setFilter: (filter: boolean) => void
-}
-
-export const FilterContext = createContext(undefined)
diff --git a/src/context/network-filter-context.tsx b/src/context/network-filter-context.tsx
deleted file mode 100644
index 78c5cc2..0000000
--- a/src/context/network-filter-context.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-"use client"
-
-import { ReactNode, useState } from "react"
-
-import { FilterContext } from "./filter-context"
-
-export function FilterProvider({ children }: { children: ReactNode }) {
- const [filter, setFilter] = useState(false)
-
- return {children}
-}
diff --git a/src/hooks/use-filter.tsx b/src/hooks/use-filter.tsx
deleted file mode 100644
index 1c87e6e..0000000
--- a/src/hooks/use-filter.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { FilterContext, FilterContextType } from "@/context/filter-context"
-import { useContext } from "react"
-
-const useFilter = (): FilterContextType => {
- const context = useContext(FilterContext)
- if (context === undefined) {
- throw new Error("useFilter must be used within a FilterProvider")
- }
- return context
-}
-
-export default useFilter
diff --git a/src/main.tsx b/src/main.tsx
index 0008866..ab8b1b1 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -7,7 +7,6 @@ import { Toaster } from "sonner"
import App from "./App"
import { ThemeProvider } from "./components/ThemeProvider"
import { MotionProvider } from "./components/motion/motion-provider"
-import { FilterProvider } from "./context/network-filter-context"
import { StatusProvider } from "./context/status-provider"
import { TooltipProvider } from "./context/tooltip-provider"
import { WebSocketProvider } from "./context/websocket-provider"
@@ -23,23 +22,21 @@ ReactDOM.createRoot(document.getElementById("root")!).render(
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/src/pages/Server.tsx b/src/pages/Server.tsx
index 27fedd0..3fe41ff 100644
--- a/src/pages/Server.tsx
+++ b/src/pages/Server.tsx
@@ -5,14 +5,15 @@ import ServerCardInline from "@/components/ServerCardInline"
import ServerOverview from "@/components/ServerOverview"
import { ServiceTracker } from "@/components/ServiceTracker"
import { Loader } from "@/components/loading/Loader"
-import useFilter from "@/hooks/use-filter"
+import { Label } from "@/components/ui/label"
+import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"
import { useStatus } from "@/hooks/use-status"
import { useWebSocketContext } from "@/hooks/use-websocket-context"
import { fetchServerGroup } from "@/lib/nezha-api"
import { cn, formatNezhaInfo } from "@/lib/utils"
import { NezhaWebsocketResponse } from "@/types/nezha-api"
import { ServerGroup } from "@/types/nezha-api"
-import { ChartBarSquareIcon, MapIcon, ViewColumnsIcon } from "@heroicons/react/20/solid"
+import { ChartBarSquareIcon, CogIcon, MapIcon, ViewColumnsIcon } from "@heroicons/react/20/solid"
import { useQuery } from "@tanstack/react-query"
import { useEffect, useState } from "react"
import { useTranslation } from "react-i18next"
@@ -26,10 +27,10 @@ export default function Servers() {
})
const { lastMessage, connected } = useWebSocketContext()
const { status } = useStatus()
- const { filter } = useFilter()
const [showServices, setShowServices] = useState("0")
const [showMap, setShowMap] = useState("0")
const [inline, setInline] = useState("0")
+ const [settingsOpen, setSettingsOpen] = useState(false)
const [currentGroup, setCurrentGroup] = useState("All")
useEffect(() => {
@@ -136,26 +137,6 @@ export default function Servers() {
[status].includes(formatNezhaInfo(nezhaWsData.now, server).online ? "online" : "offline"),
)
- if (filter) {
- filteredServers.sort((a, b) => {
- if (!formatNezhaInfo(nezhaWsData.now, a).online && formatNezhaInfo(nezhaWsData.now, b).online)
- return 1
- if (formatNezhaInfo(nezhaWsData.now, a).online && !formatNezhaInfo(nezhaWsData.now, b).online)
- return -1
- if (
- !formatNezhaInfo(nezhaWsData.now, a).online &&
- !formatNezhaInfo(nezhaWsData.now, b).online
- )
- return 0
- return (
- formatNezhaInfo(nezhaWsData.now, b).state.net_in_speed +
- formatNezhaInfo(nezhaWsData.now, b).state.net_out_speed -
- (formatNezhaInfo(nezhaWsData.now, a).state.net_in_speed +
- formatNezhaInfo(nezhaWsData.now, a).state.net_out_speed)
- )
- })
- }
-
return (
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{showMap === "1" && (
)}