feat: make network insights optional

This commit is contained in:
JetSprow
2026-04-30 15:45:25 +10:00
parent 0289246db7
commit d2ff80abc3
14 changed files with 131 additions and 31 deletions

View File

@@ -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>
)}

View File

@@ -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}
/>
)}
</>
);
}

View File

@@ -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}
/>
</>
);
}

View File

@@ -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
? {