@@ -33,9 +33,62 @@ export default function FavoritesPanel() {
3333 const { selectedFavoriteId, selectedFavoriteType, setSelectedFavorite } = useUIStore ( )
3434
3535 const [ editingNodeKey , setEditingNodeKey ] = useState < string | null > ( null )
36+ const treeRef = React . useRef < any > ( null )
37+ const lastSelectedFavoriteIdRef = React . useRef < string | null > ( null )
3638
3739 const stats = getStats ( )
3840
41+ // 展开父级文件夹并滚动到选中的节点
42+ useEffect ( ( ) => {
43+ // 只有当选中的节点真正改变时才执行滚动
44+ if ( selectedFavoriteId && selectedFavoriteType === 'item' && selectedFavoriteId !== lastSelectedFavoriteIdRef . current ) {
45+ lastSelectedFavoriteIdRef . current = selectedFavoriteId
46+
47+ // 找到该收藏项所在的文件夹链
48+ const item = items . find ( ( i ) => i . id === selectedFavoriteId )
49+ if ( item && item . folderId ) {
50+ const foldersToExpand : string [ ] = [ ]
51+ let currentFolderId : string | undefined = item . folderId
52+
53+ // 收集所有需要展开的父级文件夹
54+ while ( currentFolderId ) {
55+ foldersToExpand . push ( currentFolderId )
56+ const folder = folders . find ( ( f ) => f . id === currentFolderId )
57+ currentFolderId = folder ?. parentId
58+ }
59+
60+ // 展开所有父级文件夹
61+ const { updateFolder } = useFavoritesStore . getState ( )
62+ foldersToExpand . forEach ( ( folderId ) => {
63+ const folder = folders . find ( ( f ) => f . id === folderId )
64+ if ( folder && ! folder . expanded ) {
65+ updateFolder ( folderId , { expanded : true } )
66+ }
67+ } )
68+ }
69+
70+ // 滚动到选中的节点
71+ setTimeout ( ( ) => {
72+ const nodeKey = `item-${ selectedFavoriteId } `
73+
74+ // 优先使用Tree的scrollTo API(如果可用)
75+ if ( treeRef . current && treeRef . current . scrollTo ) {
76+ treeRef . current . scrollTo ( { key : nodeKey , align : 'auto' } )
77+ } else {
78+ // 备用方案:使用DOM查询(适用于非虚拟化Tree)
79+ let selectedNode =
80+ document . querySelector ( `.favorites-tree [data-node-key="${ nodeKey } "]` ) ||
81+ document . querySelector ( `.favorites-tree [data-key="${ nodeKey } "]` ) ||
82+ document . querySelector ( `.favorites-tree .ant-tree-treenode-selected` )
83+
84+ if ( selectedNode ) {
85+ selectedNode . scrollIntoView ( { behavior : 'smooth' , block : 'nearest' } )
86+ }
87+ }
88+ } , 300 ) // 增加延迟确保文件夹展开完成
89+ }
90+ } , [ selectedFavoriteId , selectedFavoriteType , items , folders ] )
91+
3992 // 处理搜索
4093 const handleSearch = ( value : string ) => {
4194 setSearchQuery ( value )
@@ -578,6 +631,7 @@ export default function FavoritesPanel() {
578631 />
579632 ) : (
580633 < Tree
634+ ref = { treeRef }
581635 className = "favorites-tree"
582636 showIcon = { false }
583637 blockNode
0 commit comments