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" && ( )}