mirror of
https://github.com/hamster1963/nezha-dash.git
synced 2025-04-24 21:10:45 +08:00
120 lines
5.0 KiB
TypeScript
120 lines
5.0 KiB
TypeScript
"use client"
|
|
|
|
import { IPInfo } from "@/app/api/server-ip/route"
|
|
import { Loader } from "@/components/loading/Loader"
|
|
import { Card, CardContent } from "@/components/ui/card"
|
|
import { nezhaFetcher } from "@/lib/utils"
|
|
import { useTranslations } from "next-intl"
|
|
import useSWRImmutable from "swr/immutable"
|
|
|
|
export default function ServerIPInfo({ server_id }: { server_id: number }) {
|
|
const t = useTranslations("IPInfo")
|
|
|
|
const { data } = useSWRImmutable<IPInfo>(`/api/server-ip?server_id=${server_id}`, nezhaFetcher)
|
|
|
|
if (!data) {
|
|
return (
|
|
<div className="mb-11">
|
|
<Loader visible />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<>
|
|
<section className="flex flex-wrap gap-2 mb-4">
|
|
{data.asn.autonomous_system_organization && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{"ASN"}</p>
|
|
<div className="text-xs">{data.asn.autonomous_system_organization}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.asn.autonomous_system_number && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("asn_number")}</p>
|
|
<div className="text-xs">AS{data.asn.autonomous_system_number}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.registered_country?.names.en && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("registered_country")}</p>
|
|
<div className="text-xs">{data.city.registered_country?.names.en}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.country?.iso_code && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{"ISO"}</p>
|
|
<div className="text-xs">{data.city.country?.iso_code}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.city?.names.en && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("city")}</p>
|
|
<div className="text-xs">{data.city.city?.names.en}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.location?.longitude && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("longitude")}</p>
|
|
<div className="text-xs">{data.city.location?.longitude}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.location?.latitude && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("latitude")}</p>
|
|
<div className="text-xs">{data.city.location?.latitude}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.location?.time_zone && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("time_zone")}</p>
|
|
<div className="text-xs">{data.city.location?.time_zone}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
{data.city.postal && (
|
|
<Card className="rounded-[10px] bg-transparent border-none shadow-none">
|
|
<CardContent className="px-1.5 py-1">
|
|
<section className="flex flex-col items-start gap-0.5">
|
|
<p className="text-xs text-muted-foreground">{t("postal_code")}</p>
|
|
<div className="text-xs">{data.city.postal?.code}</div>
|
|
</section>
|
|
</CardContent>
|
|
</Card>
|
|
)}
|
|
</section>
|
|
</>
|
|
)
|
|
}
|