feat: planDataMod support

This commit is contained in:
hamster1963 2024-12-17 11:01:03 +08:00
parent ccaff37022
commit 48414a9543
3 changed files with 215 additions and 39 deletions

View File

@ -66,16 +66,56 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf
> >
{name} {name}
</p> </p>
{parsedData && {parsedData?.billingDataMod &&
(daysLeft >= 0 ? ( (daysLeft >= 0 ? (
<>
<p className={cn("text-[10px] text-muted-foreground")}> <p className={cn("text-[10px] text-muted-foreground")}>
: {isNeverExpire ? "永久" : daysLeft + "天"} : {isNeverExpire ? "永久" : daysLeft + "天"}
</p> </p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : ( ) : (
<p className={cn("text-[10px] text-green-600")}></p>
)}
</>
) : (
<>
<p className={cn("text-[10px] text-muted-foreground text-red-600")}> <p className={cn("text-[10px] text-muted-foreground text-red-600")}>
: {daysLeft * -1} : {daysLeft * -1}
</p> </p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground ")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600 ")}></p>
)}
</>
))} ))}
{parsedData?.planDataMod && (
<section className="flex gap-1 items-center flex-wrap mt-0.5">
{parsedData.planDataMod.bandwidth !== "" && (
<p
className={cn(
"text-[9px] bg-purple-600 dark:bg-purple-800 text-purple-200 dark:text-purple-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.bandwidth}
</p>
)}
{parsedData.planDataMod.trafficVol !== "" && (
<p
className={cn(
"text-[9px] bg-green-600 text-green-200 dark:bg-green-800 dark:text-green-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.trafficVol}
</p>
)}
</section>
)}
</div> </div>
</section> </section>
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
@ -152,10 +192,60 @@ export default function ServerCard({ now, serverInfo }: { now: number; serverInf
> >
{showFlag ? <ServerFlag country_code={country_code} /> : null} {showFlag ? <ServerFlag country_code={country_code} /> : null}
</div> </div>
<div className="relative"> <div className="relative flex flex-col">
<p className={cn("break-all font-bold tracking-tight", showFlag ? "text-xs" : "text-sm")}> <p className={cn("break-all font-bold tracking-tight", showFlag ? "text-xs" : "text-sm")}>
{name} {name}
</p> </p>
{parsedData?.billingDataMod &&
(daysLeft >= 0 ? (
<>
<p className={cn("text-[10px] text-muted-foreground")}>
: {isNeverExpire ? "永久" : daysLeft + "天"}
</p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600")}></p>
)}
</>
) : (
<>
<p className={cn("text-[10px] text-muted-foreground text-red-600")}>
: {daysLeft * -1}
</p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground ")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600 ")}></p>
)}
</>
))}
{parsedData?.planDataMod && (
<section className="flex gap-1 items-center flex-wrap mt-0.5">
{parsedData.planDataMod.bandwidth !== "" && (
<p
className={cn(
"text-[9px] bg-purple-600 dark:bg-purple-800 text-purple-200 dark:text-purple-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.bandwidth}
</p>
)}
{parsedData.planDataMod.trafficVol !== "" && (
<p
className={cn(
"text-[9px] bg-green-600 text-green-200 dark:bg-green-800 dark:text-green-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.trafficVol}
</p>
)}
</section>
)}
</div> </div>
</section> </section>
</Card> </Card>

View File

@ -80,20 +80,56 @@ export default function ServerCardInline({
> >
{name} {name}
</p> </p>
{parsedData && {parsedData?.billingDataMod &&
(daysLeft >= 0 ? ( (daysLeft >= 0 ? (
<p <>
className={cn("text-[10px] text-muted-foreground", { <p className={cn("text-[10px] text-muted-foreground")}>
"text-orange-600": daysLeft <= 7 && !isNeverExpire,
})}
>
: {isNeverExpire ? "永久" : daysLeft + "天"} : {isNeverExpire ? "永久" : daysLeft + "天"}
</p> </p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : ( ) : (
<p className={cn("text-[10px] text-green-600")}></p>
)}
</>
) : (
<>
<p className={cn("text-[10px] text-muted-foreground text-red-600")}> <p className={cn("text-[10px] text-muted-foreground text-red-600")}>
: {daysLeft * -1} : {daysLeft * -1}
</p> </p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground ")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600 ")}></p>
)}
</>
))} ))}
{parsedData?.planDataMod && (
<section className="flex gap-1 items-center flex-wrap mt-0.5">
{parsedData.planDataMod.bandwidth !== "" && (
<p
className={cn(
"text-[9px] bg-purple-600 dark:bg-purple-800 text-purple-200 dark:text-purple-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.bandwidth}
</p>
)}
{parsedData.planDataMod.trafficVol !== "" && (
<p
className={cn(
"text-[9px] bg-green-600 text-green-200 dark:bg-green-800 dark:text-green-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.trafficVol}
</p>
)}
</section>
)}
</div> </div>
</section> </section>
<Separator orientation="vertical" className="h-8 mx-0 ml-2" /> <Separator orientation="vertical" className="h-8 mx-0 ml-2" />
@ -190,7 +226,7 @@ export default function ServerCardInline({
> >
{showFlag ? <ServerFlag country_code={country_code} /> : null} {showFlag ? <ServerFlag country_code={country_code} /> : null}
</div> </div>
<div className="relative"> <div className="relative flex flex-col">
<p <p
className={cn( className={cn(
"break-all font-bold w-28 tracking-tight", "break-all font-bold w-28 tracking-tight",
@ -199,6 +235,56 @@ export default function ServerCardInline({
> >
{name} {name}
</p> </p>
{parsedData?.billingDataMod &&
(daysLeft >= 0 ? (
<>
<p className={cn("text-[10px] text-muted-foreground")}>
: {isNeverExpire ? "永久" : daysLeft + "天"}
</p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600")}></p>
)}
</>
) : (
<>
<p className={cn("text-[10px] text-muted-foreground text-red-600")}>
: {daysLeft * -1}
</p>
{parsedData.billingDataMod.amount !== "0" ? (
<p className={cn("text-[10px] text-muted-foreground ")}>
: {parsedData.billingDataMod.amount}/{parsedData.billingDataMod.cycle}
</p>
) : (
<p className={cn("text-[10px] text-green-600 ")}></p>
)}
</>
))}
{parsedData?.planDataMod && (
<section className="flex gap-1 items-center flex-wrap mt-0.5">
{parsedData.planDataMod.bandwidth !== "" && (
<p
className={cn(
"text-[9px] bg-purple-600 dark:bg-purple-800 text-purple-200 dark:text-purple-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.bandwidth}
</p>
)}
{parsedData.planDataMod.trafficVol !== "" && (
<p
className={cn(
"text-[9px] bg-green-600 text-green-200 dark:bg-green-800 dark:text-green-300 w-fit rounded-[5px] px-[3px] py-[1.5px]",
)}
>
{parsedData.planDataMod.trafficVol}
</p>
)}
</section>
)}
</div> </div>
</section> </section>
</Card> </Card>

View File

@ -127,19 +127,19 @@ interface BillingData {
amount: string amount: string
} }
// interface PlanData { interface PlanData {
// bandwidth: string; bandwidth: string
// trafficVol: string; trafficVol: string
// trafficType: string; trafficType: string
// IPv4: string; IPv4: string
// IPv6: string; IPv6: string
// networkRoute: string; networkRoute: string
// extra: string; extra: string
// } }
interface PublicNoteData { interface PublicNoteData {
billingDataMod: BillingData billingDataMod: BillingData
// planDataMod: PlanData; planDataMod: PlanData
} }
export function parsePublicNote(publicNote: string): PublicNoteData | null { export function parsePublicNote(publicNote: string): PublicNoteData | null {
@ -156,15 +156,15 @@ export function parsePublicNote(publicNote: string): PublicNoteData | null {
cycle: data.billingDataMod.cycle || "", cycle: data.billingDataMod.cycle || "",
amount: data.billingDataMod.amount || "", amount: data.billingDataMod.amount || "",
}, },
// planDataMod: { planDataMod: {
// bandwidth: data.planDataMod.bandwidth || "", bandwidth: data.planDataMod.bandwidth || "",
// trafficVol: data.planDataMod.trafficVol || "", trafficVol: data.planDataMod.trafficVol || "",
// trafficType: data.planDataMod.trafficType || "", trafficType: data.planDataMod.trafficType || "",
// IPv4: data.planDataMod.IPv4 || "", IPv4: data.planDataMod.IPv4 || "",
// IPv6: data.planDataMod.IPv6 || "", IPv6: data.planDataMod.IPv6 || "",
// networkRoute: data.planDataMod.networkRoute || "", networkRoute: data.planDataMod.networkRoute || "",
// extra: data.planDataMod.extra || "", extra: data.planDataMod.extra || "",
// }, },
} }
} catch (error) { } catch (error) {
console.error("Error parsing public note:", error) console.error("Error parsing public note:", error)