'use client' import { memo, useCallback } from 'react' import type { User, UserTreeNode } from '../types' import { cardStyles, cn } from '@/lib/ui-styles' interface UserTreeProps { nodes: UserTreeNode[] collapsedNodeIds: Set searchTerm: string onToggleUserNode: (id: string) => void renderStatusBadges: (user: User) => JSX.Element renderActionButtons: (user: User) => JSX.Element } function UserTreeComponent({ nodes, collapsedNodeIds, searchTerm, onToggleUserNode, renderStatusBadges, renderActionButtons, }: UserTreeProps) { const renderNodes = useCallback( (tree: UserTreeNode[], depth = 0): JSX.Element[] => tree.map((node) => { const { user } = node const hasChildren = node.children.length > 0 const collapsed = searchTerm.trim() ? false : collapsedNodeIds.has(user.id) return (
{hasChildren ? ( ) : ( )}
{user.username} {renderStatusBadges(user)}
素材:{user._count.materials}
{renderActionButtons(user)}
{hasChildren && !collapsed &&
{renderNodes(node.children, depth + 1)}
}
) }), [collapsedNodeIds, onToggleUserNode, renderActionButtons, renderStatusBadges, searchTerm], ) if (!nodes.length) { return
暂无用户
} return
{renderNodes(nodes)}
} export const UserTree = memo(UserTreeComponent) export default UserTree