-
Notifications
You must be signed in to change notification settings - Fork 35
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
2462dfc
commit 6e67602
Showing
6 changed files
with
198 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
import React from "react"; | ||
import { CycleTransferStats } from "@/types/nezha-api"; | ||
import { CycleTransferStatsClient } from "./CycleTransferStatsClient"; | ||
|
||
interface CycleTransferStatsProps { | ||
cycleStats: CycleTransferStats; | ||
className?: string; | ||
} | ||
|
||
export const CycleTransferStatsCard: React.FC<CycleTransferStatsProps> = ({ | ||
cycleStats, | ||
className, | ||
}) => { | ||
return ( | ||
<> | ||
{Object.entries(cycleStats).map(([cycleId, cycleData]) => { | ||
const serverStats = Object.entries(cycleData.server_name).map( | ||
([serverId, serverName]) => ({ | ||
serverId, | ||
serverName, | ||
transfer: cycleData.transfer[serverId] || 0, | ||
nextUpdate: cycleData.next_update[serverId], | ||
}), | ||
); | ||
|
||
return ( | ||
<CycleTransferStatsClient | ||
key={cycleId} | ||
name={cycleData.name} | ||
from={cycleData.from} | ||
to={cycleData.to} | ||
max={cycleData.max} | ||
serverStats={serverStats} | ||
className={className} | ||
/> | ||
); | ||
})} | ||
</> | ||
); | ||
}; | ||
|
||
export default CycleTransferStatsCard; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
import React from "react"; | ||
import { cn } from "@/lib/utils"; | ||
import { formatBytes } from "@/lib/format"; | ||
|
||
interface CycleTransferStatsClientProps { | ||
name: string; | ||
from: string; | ||
to: string; | ||
max: number; | ||
serverStats: Array<{ | ||
serverId: string; | ||
serverName: string; | ||
transfer: number; | ||
nextUpdate: string; | ||
}>; | ||
className?: string; | ||
} | ||
|
||
export const CycleTransferStatsClient: React.FC< | ||
CycleTransferStatsClientProps | ||
> = ({ name, from, to, max, serverStats, className }) => { | ||
return ( | ||
<div | ||
className={cn( | ||
"w-full space-y-2 bg-white px-4 py-3 dark:bg-black rounded-lg border bg-card text-card-foreground shadow-lg shadow-neutral-200/40 dark:shadow-none", | ||
className, | ||
)} | ||
> | ||
<div className="space-y-1"> | ||
{/* <div className="flex justify-between items-center"> | ||
<span className=" font-semibold text-sm">{name}</span> | ||
<span className="text-stone-600 dark:text-stone-400 text-xs"> | ||
{new Date(from).toLocaleDateString()} -{" "} | ||
{new Date(to).toLocaleDateString()} | ||
</span> | ||
</div> */} | ||
<div className="space-y-2"> | ||
{serverStats.map(({ serverId, serverName, transfer, nextUpdate }) => { | ||
const progress = (transfer / max) * 100; | ||
|
||
return ( | ||
<div key={serverId} className="space-y-2"> | ||
<div className="flex justify-between items-center"> | ||
<span className="text-sm font-semibold">{serverName}</span> | ||
<span className="text-sm text-stone-600 dark:text-stone-400 font-semibold"> | ||
{formatBytes(transfer)} / {formatBytes(max)} | ||
</span> | ||
</div> | ||
<div className="w-full bg-neutral-200 dark:bg-neutral-800 rounded-full h-2.5"> | ||
<div | ||
className="bg-blue-600 h-2.5 rounded-full" | ||
style={{ width: `${Math.min(progress, 100)}%` }} | ||
/> | ||
</div> | ||
|
||
<section className="flex justify-between items-center"> | ||
<div className="text-xs text-stone-500 dark:text-stone-400"> | ||
Next update: {new Date(nextUpdate).toLocaleString()} | ||
</div> | ||
<section className="flex items-center gap-2"> | ||
<span className="text-stone-600 dark:text-stone-400 text-xs"> | ||
{new Date(from).toLocaleDateString()} -{" "} | ||
{new Date(to).toLocaleDateString()} | ||
</span> | ||
<div className=" bg-blue-600 text-white px-1 py-0.5 rounded text-[10px]"> | ||
{name} | ||
</div> | ||
</section> | ||
</section> | ||
</div> | ||
); | ||
})} | ||
</div> | ||
</div> | ||
</div> | ||
); | ||
}; | ||
|
||
export default CycleTransferStatsClient; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
export function formatBytes(bytes: number, decimals = 2): string { | ||
if (bytes === 0) return "0 B"; | ||
|
||
const k = 1024; | ||
const dm = decimals < 0 ? 0 : decimals; | ||
const sizes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; | ||
|
||
const i = Math.floor(Math.log(bytes) / Math.log(k)); | ||
|
||
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters