mirror of
https://github.com/JetSprow/J-Board-Lite.git
synced 2026-05-01 01:14:10 +05:30
feat: make network insights optional
This commit is contained in:
@@ -30,7 +30,7 @@ export const metadata: Metadata = {
|
||||
|
||||
export default async function StorePage() {
|
||||
const session = await getActiveSession();
|
||||
const { plans, availabilityMap, pendingOrder, latencyRecommendations } = await getStorePageData(session?.user.id);
|
||||
const { plans, availabilityMap, pendingOrder, networkInsightsEnabled, latencyRecommendations } = await getStorePageData(session?.user.id);
|
||||
const proxyPlans = getProxyPlans(plans);
|
||||
const streamingPlans = getStreamingPlans(plans);
|
||||
const proxyCards = sortPlansForDisplay(proxyPlans.map((plan) => toProxyPlanCard(plan, availabilityMap.get(plan.id))));
|
||||
@@ -77,7 +77,7 @@ export default async function StorePage() {
|
||||
|
||||
<PendingOrderBanner order={pendingOrder} />
|
||||
|
||||
{proxyCards.length > 0 && (
|
||||
{networkInsightsEnabled && proxyCards.length > 0 && (
|
||||
<StoreLatencyRecommendations initialItems={latencyRecommendations} />
|
||||
)}
|
||||
|
||||
@@ -89,7 +89,7 @@ export default async function StorePage() {
|
||||
gridClassName="lg:grid-cols-2 xl:grid-cols-3"
|
||||
after={(
|
||||
<>
|
||||
{proxyNodeIds.length > 0 && (
|
||||
{networkInsightsEnabled && proxyNodeIds.length > 0 && (
|
||||
<>
|
||||
<LatencyLoader nodeIds={proxyNodeIds} />
|
||||
<TraceLoader nodeIds={proxyNodeIds} />
|
||||
@@ -99,7 +99,11 @@ export default async function StorePage() {
|
||||
)}
|
||||
>
|
||||
{proxyCards.map((plan) => (
|
||||
<ProxyPlanCard key={plan.id} plan={plan} />
|
||||
<ProxyPlanCard
|
||||
key={plan.id}
|
||||
plan={plan}
|
||||
networkInsightsEnabled={networkInsightsEnabled}
|
||||
/>
|
||||
))}
|
||||
</StorePlanSection>
|
||||
)}
|
||||
|
||||
@@ -34,9 +34,10 @@ interface Props {
|
||||
open: boolean;
|
||||
onOpenChange: (open: boolean) => void;
|
||||
plan: ProxyPlan;
|
||||
networkInsightsEnabled: boolean;
|
||||
}
|
||||
|
||||
export function ProxyDetailDialog({ open, onOpenChange, plan }: Props) {
|
||||
export function ProxyDetailDialog({ open, onOpenChange, plan, networkInsightsEnabled }: Props) {
|
||||
const fixedTrafficGb = plan.fixedTrafficGb ?? plan.minTrafficGb;
|
||||
const [trafficGb, setTrafficGb] = useState(
|
||||
plan.pricingMode === "FIXED_PACKAGE" ? fixedTrafficGb : plan.minTrafficGb,
|
||||
@@ -121,7 +122,7 @@ export function ProxyDetailDialog({ open, onOpenChange, plan }: Props) {
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div className="grid items-start gap-6 lg:grid-cols-[1fr_20rem]">
|
||||
<div className={`grid items-start gap-6 ${networkInsightsEnabled ? "lg:grid-cols-[1fr_20rem]" : ""}`}>
|
||||
{/* Left: purchase config — always visible without scrolling */}
|
||||
<div className="space-y-3">
|
||||
<ProxyInboundSelect
|
||||
@@ -188,32 +189,37 @@ export function ProxyDetailDialog({ open, onOpenChange, plan }: Props) {
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Right: signal data — supplementary, scrolls independently on desktop */}
|
||||
<div className="min-w-0 lg:max-h-[60vh] lg:overflow-y-auto lg:-mr-3 lg:pr-3">
|
||||
<ProxySignalPanel
|
||||
latencyItems={latencyItems}
|
||||
traceItems={traceItems}
|
||||
onTraceSelect={setSelectedTrace}
|
||||
onLatencyClick={() => setLatencyDialogOpen(true)}
|
||||
/>
|
||||
</div>
|
||||
{networkInsightsEnabled && (
|
||||
<div className="min-w-0 lg:max-h-[60vh] lg:overflow-y-auto lg:-mr-3 lg:pr-3">
|
||||
<ProxySignalPanel
|
||||
latencyItems={latencyItems}
|
||||
traceItems={traceItems}
|
||||
onTraceSelect={setSelectedTrace}
|
||||
onLatencyClick={() => setLatencyDialogOpen(true)}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
|
||||
<ProxyTraceDetailDialog
|
||||
trace={selectedTrace}
|
||||
onOpenChange={(open) => {
|
||||
if (!open) setSelectedTrace(null);
|
||||
}}
|
||||
/>
|
||||
{networkInsightsEnabled && (
|
||||
<ProxyTraceDetailDialog
|
||||
trace={selectedTrace}
|
||||
onOpenChange={(open) => {
|
||||
if (!open) setSelectedTrace(null);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
|
||||
<LatencyDetailDialog
|
||||
nodeId={plan.nodeId}
|
||||
open={latencyDialogOpen}
|
||||
onOpenChange={setLatencyDialogOpen}
|
||||
/>
|
||||
{networkInsightsEnabled && (
|
||||
<LatencyDetailDialog
|
||||
nodeId={plan.nodeId}
|
||||
open={latencyDialogOpen}
|
||||
onOpenChange={setLatencyDialogOpen}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ import type { ProxyPlan } from "./proxy-plan-types";
|
||||
|
||||
interface Props {
|
||||
plan: ProxyPlan;
|
||||
networkInsightsEnabled: boolean;
|
||||
}
|
||||
|
||||
export function ProxyPlanCard({ plan }: Props) {
|
||||
export function ProxyPlanCard({ plan, networkInsightsEnabled }: Props) {
|
||||
const [dialogOpen, setDialogOpen] = useState(false);
|
||||
const hasInboundOptions = plan.inboundOptions.length > 0;
|
||||
const isFixedPackage = plan.pricingMode === "FIXED_PACKAGE";
|
||||
@@ -80,7 +81,12 @@ export function ProxyPlanCard({ plan }: Props) {
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<ProxyDetailDialog open={dialogOpen} onOpenChange={setDialogOpen} plan={plan} />
|
||||
<ProxyDetailDialog
|
||||
open={dialogOpen}
|
||||
onOpenChange={setDialogOpen}
|
||||
plan={plan}
|
||||
networkInsightsEnabled={networkInsightsEnabled}
|
||||
/>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2,9 +2,11 @@ import { prisma } from "@/lib/prisma";
|
||||
import { normalizeTraceText } from "@/lib/trace-normalize";
|
||||
import { getPlanAvailability, type PlanAvailability } from "@/services/plan-availability";
|
||||
import { getLatencyRecommendations } from "@/services/latency-recommendations";
|
||||
import { getAppConfig } from "@/services/app-config";
|
||||
|
||||
export async function getStorePageData(userId?: string) {
|
||||
const [plans, pendingOrder, latencyRecommendations] = await Promise.all([
|
||||
const [config, plans, pendingOrder] = await Promise.all([
|
||||
getAppConfig(),
|
||||
prisma.subscriptionPlan.findMany({
|
||||
where: { isActive: true },
|
||||
include: {
|
||||
@@ -25,8 +27,10 @@ export async function getStorePageData(userId?: string) {
|
||||
orderBy: { createdAt: "desc" },
|
||||
})
|
||||
: null,
|
||||
getLatencyRecommendations(),
|
||||
]);
|
||||
const latencyRecommendations = config.networkInsightsEnabled
|
||||
? await getLatencyRecommendations()
|
||||
: [];
|
||||
|
||||
const availabilityMap = new Map<string, PlanAvailability>();
|
||||
await Promise.all(
|
||||
@@ -39,6 +43,7 @@ export async function getStorePageData(userId?: string) {
|
||||
return {
|
||||
plans,
|
||||
availabilityMap,
|
||||
networkInsightsEnabled: config.networkInsightsEnabled,
|
||||
latencyRecommendations,
|
||||
pendingOrder: pendingOrder
|
||||
? {
|
||||
|
||||
Reference in New Issue
Block a user