import { ImageIcon, X } from 'lucide-react'; import { type CSSProperties, type Dispatch, type ReactNode, type RefObject, type SetStateAction, } from 'react'; import { PlatformFloatingMenu, PlatformFloatingMenuItem, } from '../common/PlatformFloatingMenu'; import { PlatformStatusMessage } from '../common/PlatformStatusMessage'; import { PlatformTextField } from '../common/PlatformTextField'; import { EditorIconButton } from './ImageCanvasEditorPrimitives'; import type { CharacterReferenceImage, GenerateDialogState, } from './ImageCanvasEditorTypes'; import { ImageCanvasGenerationImageOptionsView } from './ImageCanvasGenerationImageOptionsView'; import { ImageCanvasReferenceSlot } from './ImageCanvasReferenceSlot'; import { EDITOR_GENERATION_MUD_POINT_CONFIG, } from './ImageCanvasGenerationModel'; import { useImageCanvasFloatingOptionDismiss } from './useImageCanvasFloatingOptionDismiss'; type ImageCanvasBasicGenerationComposerViewProps = { dialog: GenerateDialogState; style: CSSProperties; setGenerateDialog: Dispatch>; generationReferenceButtonRef?: RefObject; isGenerationReferenceMenuOpen?: boolean; setIsGenerationReferenceMenuOpen?: Dispatch>; setIsPickingGenerationReferenceFromCanvas?: Dispatch>; renderEditorPortal?: (node: ReactNode) => ReactNode; buildPortalMenuStyle?: ( anchor: HTMLElement | null, placement: 'above' | 'below', ) => CSSProperties; onRequestUpload: (target: 'generation-reference') => void; onToggleReferenceMenu?: () => void; onRememberImageModel?: (model: string) => void; onSubmit: (dialog: GenerateDialogState) => void; onClose: () => void; }; function resetFailedDialogStatus(dialog: GenerateDialogState) { return { ...dialog, status: dialog.status === 'failed' ? 'idle' : dialog.status, errorMessage: dialog.status === 'failed' ? undefined : dialog.errorMessage, }; } function ReferenceChip({ reference, index, onRemove, }: { reference: CharacterReferenceImage; index: number; onRemove: () => void; }) { const label = reference.label || `参考图${index + 1}`; return (