"use client"; import Link from "next/link"; import { useCallback, useEffect, useState } from "react"; import { adminApi, errMessage, type FundProduct } from "@/lib/admin-api"; import { isAdvisor } from "@/lib/roles"; import type { UserPayload } from "@/types/api"; import { Badge, Button, Card, EmptyState, ErrorState, LoadingBlock, Pagination, SearchInput, Select, TableWrap, Td, Th, statusTone, } from "@/components/admin/ui"; const RISK_OPTIONS = [ { value: "", label: "全部风险等级" }, { value: "低风险", label: "低风险" }, { value: "中低风险", label: "中低风险" }, { value: "中风险", label: "中风险" }, { value: "中高风险", label: "中高风险" }, { value: "高风险", label: "高风险" }, ]; export function FundsSection({ user }: { user: UserPayload }) { const advisor = isAdvisor(user); const [items, setItems] = useState([]); const [total, setTotal] = useState(0); const [totalPages, setTotalPages] = useState(0); const [page, setPage] = useState(1); const [keyword, setKeyword] = useState(""); const [riskLevel, setRiskLevel] = useState(""); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const load = useCallback(async () => { setLoading(true); setError(""); try { const result = advisor ? await adminApi.funds({ keyword: keyword || undefined, risk_level: riskLevel || undefined, page, page_size: 10 }) : await adminApi.products({ keyword: keyword || undefined, page, page_size: 10 }); setItems(result.items ?? []); setTotal(result.total ?? 0); setTotalPages(result.total_pages ?? 0); } catch (e) { setError(errMessage(e, "基金数据加载失败")); } finally { setLoading(false); } }, [advisor, keyword, riskLevel, page]); useEffect(() => { void load(); }, [load]); return ( 在官网查看 } >
{ setKeyword(event.target.value); setPage(1); }} /> {advisor && ( )}
{loading ? ( ) : error ? ( void load()} /> ) : items.length === 0 ? ( ) : ( <> 基金代码 基金名称 类型 风险等级 最新净值 净值日期 基金经理 状态 操作 {items.map((fund) => ( {fund.product_code} {fund.product_name} {fund.product_type} {fund.risk_level} {fund.nav?.toFixed(4) ?? "--"} {fund.nav_date ?? "--"} {fund.fund_manager ?? "--"} {fund.status} 详情 ))} )}
); }