'use client'; import { useState, useCallback, useEffect } from 'react'; import Link from 'next/link'; import { useReferralTree } from '../hooks/use-users'; import { usersApi } from '../api/users.api'; import { formatNumber } from '@/lib/utils/format'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import type { ReferralNode } from '@/types/user'; import { cn } from '@/lib/utils'; interface ReferralTreeProps { accountSequence: string; } export function ReferralTree({ accountSequence }: ReferralTreeProps) { const [treeRootUser, setTreeRootUser] = useState(accountSequence); const [expandedNodes, setExpandedNodes] = useState>({}); const { data: referralTree, isLoading } = useReferralTree(treeRootUser, 'both', 1); // 当 referralTree 数据加载完成后,自动展开当前用户的直推下级 useEffect(() => { if (referralTree?.currentUser && referralTree.directReferrals?.length > 0) { setExpandedNodes((prev) => ({ ...prev, [referralTree.currentUser.accountSequence]: referralTree.directReferrals, })); } }, [referralTree]); // 切换推荐关系树的根节点 const handleTreeNodeClick = useCallback((node: ReferralNode) => { setTreeRootUser(node.accountSequence); }, []); // 展开/收起节点的下级 const handleToggleNode = useCallback(async (nodeSeq: string, hasChildren: boolean) => { if (!hasChildren) return; // 如果已展开,则收起 if (expandedNodes[nodeSeq] !== undefined) { setExpandedNodes((prev) => { const newState = { ...prev }; delete newState[nodeSeq]; return newState; }); return; } // 展开:先标记为 null(加载中),然后获取数据 setExpandedNodes((prev) => ({ ...prev, [nodeSeq]: null })); try { const treeData = await usersApi.getReferralTree(nodeSeq, 'down', 1); setExpandedNodes((prev) => ({ ...prev, [nodeSeq]: treeData.directReferrals })); } catch (error) { console.error('获取下级失败:', error); setExpandedNodes((prev) => { const newState = { ...prev }; delete newState[nodeSeq]; return newState; }); } }, [expandedNodes]); if (isLoading) { return ( 引荐关系
{[...Array(3)].map((_, i) => ( ))}
); } if (!referralTree) { return ( 引荐关系

暂无引荐关系数据

); } return ( 引荐关系树 {treeRootUser !== accountSequence && ( )} {/* 树形结构容器 - 仿照1.0 admin-web的样式 */}
{/* 向上的引荐人链 */}
引荐人链 (向上) {(referralTree.ancestors?.length ?? 0) > 0 ? ( <>
{(referralTree.ancestors || []).map((ancestor, index) => (
handleTreeNodeClick(ancestor)} /> {index < (referralTree.ancestors?.length ?? 0) - 1 && (
)}
))}
) : ( <> {/* 总部节点 */}
总部
)}
{/* 当前用户节点 - 递归组件 */}
); } /** * 树节点卡片 - 单个节点的展示 */ interface TreeNodeCardProps { node: ReferralNode; isCurrentUser?: boolean; isHighlight?: boolean; onClick?: () => void; } function TreeNodeCard({ node, isCurrentUser, isHighlight, onClick }: TreeNodeCardProps) { return ( ); } /** * 递归渲染引荐节点 - 支持展开/收起子节点 */ interface ReferralNodeItemProps { node: ReferralNode; isCurrentUser?: boolean; isHighlight?: boolean; expandedNodes: Record; onToggle: (nodeSeq: string, hasChildren: boolean) => void; onClick: (node: ReferralNode) => void; } function ReferralNodeItem({ node, isCurrentUser = false, isHighlight = false, expandedNodes, onToggle, onClick, }: ReferralNodeItemProps) { const hasChildren = node.directReferralCount > 0; const isExpanded = expandedNodes[node.accountSequence] !== undefined; const isLoading = expandedNodes[node.accountSequence] === null; const children = expandedNodes[node.accountSequence] || []; return (
{/* 节点内容 */}
onClick(node)} /> {/* 展开/收起按钮 */} {hasChildren && ( )}
{/* 递归渲染子节点 */} {isExpanded && children.length > 0 && (
{children.map((child) => ( ))}
)}
); }