fix(ui): prevent infinite re-render loop on agent configure page
MarkdownEditor's plugins useMemo depended on imageUploadHandler, which was a new arrow function on every parent render. This caused MDXEditor to reinitialize plugins on each render, firing onChange, which updated the overlay state in AgentConfigForm, triggering a parent re-render — creating an infinite "Maximum update depth exceeded" loop. Fix: use a stable ref for imageUploadHandler so plugins are only created once (keyed on whether a handler exists, not its identity). Also use a module-level empty object for env config fallback to avoid unnecessary EnvVarEditor re-renders. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -85,6 +85,9 @@ const emptyOverlay: Overlay = {
|
||||
runtime: {},
|
||||
};
|
||||
|
||||
/** Stable empty object used as fallback for missing env config to avoid new-object-per-render. */
|
||||
const EMPTY_ENV: Record<string, EnvBinding> = {};
|
||||
|
||||
function isOverlayDirty(o: Overlay): boolean {
|
||||
return (
|
||||
Object.keys(o.identity).length > 0 ||
|
||||
@@ -617,8 +620,8 @@ export function AgentConfigForm(props: AgentConfigFormProps) {
|
||||
<EnvVarEditor
|
||||
value={
|
||||
isCreate
|
||||
? ((val!.envBindings ?? {}) as Record<string, EnvBinding>)
|
||||
: ((eff("adapterConfig", "env", config.env ?? {}) as Record<string, EnvBinding>)
|
||||
? ((val!.envBindings ?? EMPTY_ENV) as Record<string, EnvBinding>)
|
||||
: ((eff("adapterConfig", "env", (config.env ?? EMPTY_ENV) as Record<string, EnvBinding>))
|
||||
)
|
||||
}
|
||||
secrets={availableSecrets}
|
||||
|
||||
Reference in New Issue
Block a user