diff --git a/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Components/ComponentPanel.tsx b/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Components/ComponentPanel.tsx index c4fa25f93..2e3955fd0 100644 --- a/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Components/ComponentPanel.tsx +++ b/apps/ai-game-creator-shell/src/view/ui-editor/components/Inspector/Components/ComponentPanel.tsx @@ -1,5 +1,5 @@ import { ChevronDown, ChevronRight, Plus, Trash2 } from 'lucide-react'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { ThemedModal } from '../../../../../components/modal/ThemedModal'; import type { Component } from '../../../../../features/ui-editor/types/Component'; @@ -19,9 +19,15 @@ export function ComponentPanel(props: ComponentPanelProps) { const [expanded, setExpanded] = useState(Boolean(component)); const [error, setError] = useState(null); const [replaceConfirmationOpen, setReplaceConfirmationOpen] = useState(false); + const [removeConfirmationOpen, setRemoveConfirmationOpen] = useState(false); + const previousComponentRef = useRef(component); useEffect(() => { - setExpanded(Boolean(component)); + const previous = previousComponentRef.current; + previousComponentRef.current = component; + if (Boolean(component) !== Boolean(previous)) { + setExpanded(Boolean(component)); + } }, [component]); function setComponent(next: Component | null) { @@ -48,8 +54,15 @@ export function ComponentPanel(props: ComponentPanelProps) { function applyReplacement() { const result = setComponent(createComponent()); - if (result?.ok) setExpanded(true); - setReplaceConfirmationOpen(false); + if (result?.ok) { + setExpanded(true); + setReplaceConfirmationOpen(false); + } + } + + function removeComponent() { + const result = setComponent(null); + if (result?.ok) setRemoveConfirmationOpen(false); } return ( @@ -107,7 +120,7 @@ export function ComponentPanel(props: ComponentPanelProps) { type="button" className="grid size-7 place-items-center rounded-lg border border-red-200 bg-red-50 text-red-700 disabled:cursor-not-allowed disabled:opacity-35" disabled={readOnly} - onClick={() => setComponent(null)} + onClick={() => setRemoveConfirmationOpen(true)} aria-label="移除组件" title="移除组件" > @@ -153,6 +166,33 @@ export function ComponentPanel(props: ComponentPanelProps) { + setRemoveConfirmationOpen(false)} + panelClassName="w-full max-w-sm rounded-2xl p-5" + > +

确认移除组件?

+

+ 当前组件配置将被移除。 +

+
+ + +
+
); }