修复转化漏斗:前后端数据格式对齐,正确解析 events/rates 结构
This commit is contained in:
@@ -21,13 +21,15 @@ type FunnelStep = { label: string; count: number; pct_of_prev?: number };
|
||||
export function AnalyticsPageClient() {
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [funnel, setFunnel] = useState<FunnelStep[]>([]);
|
||||
const [rates, setRates] = useState<Record<string, number> | null>(null);
|
||||
const [days, setDays] = useState(30);
|
||||
|
||||
const load = async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
const data = await opsApi.funnel(days);
|
||||
setFunnel((data as unknown as { steps?: FunnelStep[] }).steps ?? []);
|
||||
setFunnel(data.steps);
|
||||
setRates(data.rates ?? null);
|
||||
} catch { /* */ }
|
||||
setLoading(false);
|
||||
};
|
||||
|
||||
@@ -7,7 +7,7 @@ import { Button } from "@/components/ui/button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { opsApi } from "@/lib/ops-api";
|
||||
import Link from "next/link";
|
||||
import type { SystemStatusPayload, MembershipsPayload, FunnelPayload, MembershipEntry } from "@/types/ops";
|
||||
import type { SystemStatusPayload, MembershipsPayload, MembershipEntry } from "@/types/ops";
|
||||
import {
|
||||
PieChart, Pie, Cell, ResponsiveContainer, Tooltip,
|
||||
BarChart, Bar, XAxis, YAxis, CartesianGrid,
|
||||
@@ -36,7 +36,7 @@ export function OverviewPageClient() {
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [status, setStatus] = useState<SystemStatusPayload | null>(null);
|
||||
const [memberships, setMemberships] = useState<MembershipEntry[]>([]);
|
||||
const [funnel, setFunnel] = useState<FunnelPayload | null>(null);
|
||||
const [funnel, setFunnel] = useState<{ steps: { label: string; count: number; pct_of_prev?: number }[] } | null>(null);
|
||||
|
||||
const load = async () => {
|
||||
setLoading(true);
|
||||
@@ -44,7 +44,7 @@ export function OverviewPageClient() {
|
||||
const [s, m, f] = await Promise.all([
|
||||
opsApi.systemStatus() as Promise<SystemStatusPayload>,
|
||||
opsApi.memberships() as Promise<MembershipsPayload>,
|
||||
opsApi.funnel(30) as Promise<FunnelPayload>,
|
||||
opsApi.funnel(30),
|
||||
]);
|
||||
setStatus(s);
|
||||
setMemberships((m as MembershipsPayload).memberships ?? []);
|
||||
|
||||
Reference in New Issue
Block a user