feat: decouple create target from tab selection

This commit is contained in:
yyh
2026-01-19 14:09:37 +08:00
parent 611ff05bde
commit 5947e04226
6 changed files with 15 additions and 4 deletions

View File

@ -87,6 +87,7 @@ const FileTree: React.FC<FileTreeProps> = ({ className, searchTerm = '' }) => {
}
const selectedId = nodes[0]?.id ?? null
storeApi.getState().setSelectedTreeNodeId(selectedId)
storeApi.getState().setCreateTargetNodeId(selectedId)
}, [activeTabId, storeApi])
const handleBlankAreaContextMenu = useCallback((e: React.MouseEvent) => {

View File

@ -49,12 +49,13 @@ export function useTreeNodeHandlers({
const handleClick = useCallback((e: React.MouseEvent) => {
e.stopPropagation()
storeApi.getState().setCreateTargetNodeId(node.data.id)
node.select()
if (isFolder)
throttledToggle()
else
handleFileClick()
}, [isFolder, node, throttledToggle, handleFileClick])
}, [handleFileClick, isFolder, node, storeApi, throttledToggle])
const handleDoubleClick = useCallback((e: React.MouseEvent) => {
e.stopPropagation()
@ -73,6 +74,7 @@ export function useTreeNodeHandlers({
e.preventDefault()
e.stopPropagation()
storeApi.getState().setCreateTargetNodeId(node.data.id)
storeApi.getState().setContextMenu({
top: e.clientY,
left: e.clientX,

View File

@ -66,14 +66,14 @@ const SidebarSearchAdd: FC<SidebarSearchAddProps> = ({ onSearchChange }) => {
const { data: treeData } = useSkillAssetTreeData()
const activeTabId = useStore(s => s.activeTabId)
const selectedTreeNodeId = useStore(s => s.selectedTreeNodeId)
const createTargetNodeId = useStore(s => s.createTargetNodeId)
const treeChildren = treeData?.children
const targetFolderId = useMemo(() => {
if (!treeChildren)
return 'root'
return getTargetFolderIdFromSelection(activeTabId ?? selectedTreeNodeId, treeChildren)
}, [activeTabId, selectedTreeNodeId, treeChildren])
return getTargetFolderIdFromSelection(createTargetNodeId ?? activeTabId, treeChildren)
}, [activeTabId, createTargetNodeId, treeChildren])
const menuOffset = useMemo(() => ({ mainAxis: 4 }), [])
const {

View File

@ -17,6 +17,7 @@ export const createFileTreeSlice: StateCreator<
> = (set, get) => ({
expandedFolderIds: new Set<string>(),
selectedTreeNodeId: null,
createTargetNodeId: null,
pendingCreateNode: null,
setExpandedFolderIds: (ids: Set<string>) => {
@ -61,6 +62,10 @@ export const createFileTreeSlice: StateCreator<
set({ selectedTreeNodeId: nodeId })
},
setCreateTargetNodeId: (nodeId) => {
set({ createTargetNodeId: nodeId })
},
startCreateNode: (nodeType, parentId) => {
set({
pendingCreateNode: {

View File

@ -28,6 +28,7 @@ export const createSkillEditorSlice: StateCreator<SkillEditorSliceShape> = (...a
previewTabId: null,
expandedFolderIds: new Set<string>(),
selectedTreeNodeId: null,
createTargetNodeId: null,
pendingCreateNode: null,
dirtyContents: new Map<string, string>(),
fileMetadata: new Map<string, Record<string, unknown>>(),

View File

@ -30,6 +30,8 @@ export type FileTreeSliceShape = {
getOpensObject: () => OpensObject
selectedTreeNodeId: string | null
setSelectedTreeNodeId: (nodeId: string | null) => void
createTargetNodeId: string | null
setCreateTargetNodeId: (nodeId: string | null) => void
pendingCreateNode: PendingCreateNode | null
startCreateNode: (nodeType: PendingCreateNode['nodeType'], parentId: PendingCreateNode['parentId']) => void
clearCreateNode: () => void