import { ImageIcon, ImagePlus } from 'lucide-react'; import { type CSSProperties, type Dispatch, type ReactNode, type RefObject, type SetStateAction, } from 'react'; import { AutoGrowTextArea } from '../common/AutoGrowTextArea'; import { PlatformFloatingMenu, PlatformFloatingMenuItem, } from '../common/PlatformFloatingMenu'; import { PlatformStatusMessage } from '../common/PlatformStatusMessage'; import type { GenerateDialogState, SpecGenerationType, UploadTarget, } from './ImageCanvasEditorTypes'; import { ImageCanvasGenerationImageOptionsView } from './ImageCanvasGenerationImageOptionsView'; import { calculateEditorIconSpritesheetPrice, } from './ImageCanvasGenerationModel'; import { ImageCanvasReferenceSlot } from './ImageCanvasReferenceSlot'; import { useImageCanvasFloatingOptionDismiss } from './useImageCanvasFloatingOptionDismiss'; type ImageCanvasIconSpritesheetComposerViewProps = { dialog: GenerateDialogState; style: CSSProperties; iconSpecButtonRef: RefObject; isIconSpecMenuOpen: boolean; setGenerateDialog: Dispatch>; setIsIconSpecMenuOpen: Dispatch>; setIsPickingIconSpecFromCanvas: Dispatch>; renderEditorPortal: (node: ReactNode) => ReactNode; buildPortalMenuStyle: ( anchor: HTMLElement | null, placement: 'above' | 'below', ) => CSSProperties; onOpenSpecDialog: (specType: SpecGenerationType) => void; onRequestUpload: (target: UploadTarget) => void; onUpdateIconDescriptionText: (value: string) => void; onRememberImageModel: (model: string) => void; onSubmit: (dialog: GenerateDialogState) => void; }; export function ImageCanvasIconSpritesheetComposerView({ dialog, style, iconSpecButtonRef, isIconSpecMenuOpen, setGenerateDialog, setIsIconSpecMenuOpen, setIsPickingIconSpecFromCanvas, renderEditorPortal, buildPortalMenuStyle, onOpenSpecDialog, onRequestUpload, onUpdateIconDescriptionText, onRememberImageModel, onSubmit, }: ImageCanvasIconSpritesheetComposerViewProps) { const descriptionText = dialog.prompt || (dialog.iconDescriptions ?? []).join('\n'); useImageCanvasFloatingOptionDismiss({ isOpen: isIconSpecMenuOpen, boundaryRefs: [iconSpecButtonRef], onDismiss: () => setIsIconSpecMenuOpen(false), }); const pickIconSpecFromCanvas = () => { setIsPickingIconSpecFromCanvas(true); setIsIconSpecMenuOpen(false); }; const openIconSpecDialog = () => { setIsIconSpecMenuOpen(false); onOpenSpecDialog('icon'); }; const requestIconSpecUpload = () => { setIsIconSpecMenuOpen(false); onRequestUpload('icon-spec'); }; const references = dialog.generationReferences ?? []; return (
event.stopPropagation()} onSubmit={(event) => { event.preventDefault(); if (dialog.status !== 'generating') { onSubmit({ ...dialog, prompt: descriptionText }); } }} >
{dialog.status === 'failed' ? ( {dialog.errorMessage} ) : null}
); }