Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
8f322a05
authored
Jun 25, 2026
by
Xianquan
Committed by
GitHub
Jun 25, 2026
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: agent v2 plan select expand/fold animation (#7181)
* fix: agent v2 plan select expand/fold animation * pro submodule
parent
4bdf7471
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
31 additions
and
25 deletions
+31
-25
pro
+1
-1
projects/app/src/components/core/chat/components/AIResponseBox/RenderAgentPlanAskInteractive.tsx
+9
-4
projects/app/src/components/core/chat/components/Interactive/InteractiveChoiceCollapse.tsx
+21
-20
No files found.
pro
@
b4fea0a5
Subproject commit
9a950b77868f43a056f996ee78ab0099f1de12a
2
Subproject commit
b4fea0a55abc616d4a3f3cdb2bb0a6e9adf81a5
2
projects/app/src/components/core/chat/components/AIResponseBox/RenderAgentPlanAskInteractive.tsx
View file @
8f322a05
...
@@ -38,7 +38,8 @@ const RenderAgentPlanAskInteractive = React.memo(function RenderAgentPlanAskInte
...
@@ -38,7 +38,8 @@ const RenderAgentPlanAskInteractive = React.memo(function RenderAgentPlanAskInte
selectedAnswerPlacement
,
selectedAnswerPlacement
,
shouldShowOptions
,
shouldShowOptions
,
scheduleCollapse
,
scheduleCollapse
,
toggleOptionsExpanded
toggleOptionsExpanded
,
handleOptionsCollapseExited
}
=
useInteractiveChoiceCollapse
(
effectiveAnswer
);
}
=
useInteractiveChoiceCollapse
(
effectiveAnswer
);
const
showOtherInput
=
!!
answeredOther
||
isOtherSelected
;
const
showOtherInput
=
!!
answeredOther
||
isOtherSelected
;
const
radioValue
=
const
radioValue
=
...
@@ -93,13 +94,17 @@ const RenderAgentPlanAskInteractive = React.memo(function RenderAgentPlanAskInte
...
@@ -93,13 +94,17 @@ const RenderAgentPlanAskInteractive = React.memo(function RenderAgentPlanAskInte
)
}
)
}
<
Collapse
<
Collapse
in=
{
shouldShowOptions
}
in=
{
shouldShowOptions
}
animateOpacity
onTransitionEnd=
{
()
=>
{
if
(
!
shouldShowOptions
)
{
handleOptionsCollapseExited
();
}
}
}
transitionEnd=
{
{
transitionEnd=
{
{
enter
:
{
overflow
:
'visible'
},
enter
:
{
overflow
:
'visible'
},
exit
:
{
overflow
:
'
hidden
'
}
exit
:
{
overflow
:
'
visible
'
}
}
}
}
}
>
>
<
Flex
w=
{
'360px'
}
maxW=
{
'100%'
}
flexDirection=
{
'column'
}
gap=
{
3
}
>
<
Flex
w=
{
'360px'
}
maxW=
{
'100%'
}
flexDirection=
{
'column'
}
gap=
{
3
}
p=
{
'3px'
}
mx=
{
'-3px'
}
>
<
LeftRadio
<
string
>
<
LeftRadio
<
string
>
px=
{
4
}
px=
{
4
}
py=
{
4
}
py=
{
4
}
...
...
projects/app/src/components/core/chat/components/Interactive/InteractiveChoiceCollapse.tsx
View file @
8f322a05
...
@@ -9,28 +9,25 @@ type SelectedAnswerPlacement = 'above' | 'below';
...
@@ -9,28 +9,25 @@ type SelectedAnswerPlacement = 'above' | 'below';
* 选中后先保留选项 1 秒用于反馈,再折叠为答案摘要;刷新后如果已有答案则默认折叠。
* 选中后先保留选项 1 秒用于反馈,再折叠为答案摘要;刷新后如果已有答案则默认折叠。
*/
*/
export
const
useInteractiveChoiceCollapse
=
(
selectedAnswer
?:
string
)
=>
{
export
const
useInteractiveChoiceCollapse
=
(
selectedAnswer
?:
string
)
=>
{
const
[
isOptionsExpanded
,
setIsOptionsExpanded
]
=
React
.
useState
(
!
selectedAnswer
);
const
[
selectedAnswerPlacement
,
setSelectedAnswerPlacement
]
=
React
.
useState
<
SelectedAnswerPlacement
>
(
selectedAnswer
?
'above'
:
'below'
);
const
collapseTimerRef
=
React
.
useRef
<
ReturnType
<
typeof
setTimeout
>>
();
const
collapseTimerRef
=
React
.
useRef
<
ReturnType
<
typeof
setTimeout
>>
();
const
placementTimerRef
=
React
.
useRef
<
ReturnType
<
typeof
setTimeout
>>
();
const
[
internalExpanded
,
setInternalExpanded
]
=
React
.
useState
(()
=>
!
selectedAnswer
);
const
[
internalPlacement
,
setInternalPlacement
]
=
React
.
useState
<
SelectedAnswerPlacement
>
(()
=>
selectedAnswer
?
'above'
:
'below'
);
// 无答案时直接派生默认展示,避免在 effect 里同步 setState 触发额外渲染。
const
isOptionsExpanded
=
selectedAnswer
?
internalExpanded
:
true
;
const
selectedAnswerPlacement
=
selectedAnswer
?
internalPlacement
:
'below'
;
const
clearCollapseTimers
=
React
.
useCallback
(()
=>
{
const
clearCollapseTimers
=
React
.
useCallback
(()
=>
{
if
(
collapseTimerRef
.
current
)
{
if
(
collapseTimerRef
.
current
)
{
clearTimeout
(
collapseTimerRef
.
current
);
clearTimeout
(
collapseTimerRef
.
current
);
collapseTimerRef
.
current
=
undefined
;
collapseTimerRef
.
current
=
undefined
;
}
}
if
(
placementTimerRef
.
current
)
{
clearTimeout
(
placementTimerRef
.
current
);
placementTimerRef
.
current
=
undefined
;
}
},
[]);
},
[]);
React
.
useEffect
(()
=>
{
React
.
useEffect
(()
=>
{
if
(
!
selectedAnswer
)
{
if
(
!
selectedAnswer
)
{
clearCollapseTimers
();
clearCollapseTimers
();
setIsOptionsExpanded
(
true
);
setSelectedAnswerPlacement
(
'below'
);
}
}
},
[
clearCollapseTimers
,
selectedAnswer
]);
},
[
clearCollapseTimers
,
selectedAnswer
]);
...
@@ -42,30 +39,34 @@ export const useInteractiveChoiceCollapse = (selectedAnswer?: string) => {
...
@@ -42,30 +39,34 @@ export const useInteractiveChoiceCollapse = (selectedAnswer?: string) => {
const
scheduleCollapse
=
React
.
useCallback
(()
=>
{
const
scheduleCollapse
=
React
.
useCallback
(()
=>
{
clearCollapseTimers
();
clearCollapseTimers
();
set
SelectedAnswer
Placement
(
'below'
);
set
Internal
Placement
(
'below'
);
setI
sOptions
Expanded
(
true
);
setI
nternal
Expanded
(
true
);
collapseTimerRef
.
current
=
setTimeout
(()
=>
{
collapseTimerRef
.
current
=
setTimeout
(()
=>
{
setI
sOptions
Expanded
(
false
);
setI
nternal
Expanded
(
false
);
collapseTimerRef
.
current
=
undefined
;
collapseTimerRef
.
current
=
undefined
;
placementTimerRef
.
current
=
setTimeout
(()
=>
{
setSelectedAnswerPlacement
(
'above'
);
placementTimerRef
.
current
=
undefined
;
},
240
);
},
1000
);
},
1000
);
},
[
clearCollapseTimers
]);
},
[
clearCollapseTimers
]);
const
toggleOptionsExpanded
=
React
.
useCallback
(()
=>
{
const
toggleOptionsExpanded
=
React
.
useCallback
(()
=>
{
clearCollapseTimers
();
clearCollapseTimers
();
set
SelectedAnswer
Placement
(
'above'
);
set
Internal
Placement
(
'above'
);
setI
sOptions
Expanded
((
state
)
=>
!
state
);
setI
nternal
Expanded
((
state
)
=>
!
state
);
},
[
clearCollapseTimers
]);
},
[
clearCollapseTimers
]);
/** 选项区域收起动画结束后,将答案摘要移到选项上方,避免与硬编码动画时长不同步。 */
const
handleOptionsCollapseExited
=
React
.
useCallback
(()
=>
{
if
(
selectedAnswer
)
{
setInternalPlacement
(
'above'
);
}
},
[
selectedAnswer
]);
return
{
return
{
isOptionsExpanded
,
isOptionsExpanded
,
selectedAnswerPlacement
,
selectedAnswerPlacement
,
shouldShowOptions
:
!
selectedAnswer
||
isOptionsExpanded
,
shouldShowOptions
:
!
selectedAnswer
||
isOptionsExpanded
,
scheduleCollapse
,
scheduleCollapse
,
toggleOptionsExpanded
toggleOptionsExpanded
,
handleOptionsCollapseExited
};
};
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment