From 9551d4680041f8daee7ff29a1b3ae96c9b084936 Mon Sep 17 00:00:00 2001 From: hamster1963 <1410514192@qq.com> Date: Sun, 15 Dec 2024 21:26:31 +0800 Subject: [PATCH] feat: init settings --- bun.lockb | Bin 185332 -> 189199 bytes package.json | 1 + src/components/ServerCard.tsx | 2 +- src/components/ServerOverview.tsx | 6 +- src/components/ui/popover.tsx | 28 ++++ src/context/filter-context.ts | 8 -- src/context/network-filter-context.tsx | 11 -- src/hooks/use-filter.tsx | 12 -- src/main.tsx | 33 +++-- src/pages/Server.tsx | 175 +++++++++++++++---------- 10 files changed, 154 insertions(+), 122 deletions(-) create mode 100644 src/components/ui/popover.tsx delete mode 100644 src/context/filter-context.ts delete mode 100644 src/context/network-filter-context.tsx delete mode 100644 src/hooks/use-filter.tsx diff --git a/bun.lockb b/bun.lockb index de5dba476cc81bf72b495b8c1c1983beeaed2a41..627e74d3f5fb5e2df38de54c6f20049021859d32 100755 GIT binary patch delta 33068 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 ig!P&wgs|9R!DoBOYG#q5^J*n delta 31572 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 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" && ( )}