|
|
@ -122,7 +122,8 @@ type NanoBananaNodeType = Node<NanoBananaNodeData, "nanoBanana">; |
|
|
export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNodeType>) { |
|
|
export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNodeType>) { |
|
|
const nodeData = data; |
|
|
const nodeData = data; |
|
|
const { t } = useI18n(); |
|
|
const { t } = useI18n(); |
|
|
const adaptiveOutputImage = useAdaptiveImageSrc(data.outputImage, id); |
|
|
const displayImage = data.previewImg || data.outputImage; |
|
|
|
|
|
const adaptiveOutputImage = useAdaptiveImageSrc(displayImage, id); |
|
|
const updateNodeData = useWorkflowStore((state) => state.updateNodeData); |
|
|
const updateNodeData = useWorkflowStore((state) => state.updateNodeData); |
|
|
const popiserverImageModels = useModelStore((state) => state.byKind.image); |
|
|
const popiserverImageModels = useModelStore((state) => state.byKind.image); |
|
|
const generationsPath = useWorkflowStore((state) => state.generationsPath); |
|
|
const generationsPath = useWorkflowStore((state) => state.generationsPath); |
|
|
@ -401,7 +402,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNo |
|
|
|
|
|
|
|
|
const { setNodes } = useReactFlow(); |
|
|
const { setNodes } = useReactFlow(); |
|
|
const handleClearImage = useCallback(() => { |
|
|
const handleClearImage = useCallback(() => { |
|
|
updateNodeData(id, { outputImage: null, status: "idle", error: null }); |
|
|
updateNodeData(id, { outputImage: null, previewImg: undefined, status: "idle", error: null }); |
|
|
}, [id, updateNodeData]); |
|
|
}, [id, updateNodeData]); |
|
|
|
|
|
|
|
|
const regenerateNode = useWorkflowStore((state) => state.regenerateNode); |
|
|
const regenerateNode = useWorkflowStore((state) => state.regenerateNode); |
|
|
@ -464,6 +465,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNo |
|
|
if (image) { |
|
|
if (image) { |
|
|
updateNodeData(id, { |
|
|
updateNodeData(id, { |
|
|
outputImage: image, |
|
|
outputImage: image, |
|
|
|
|
|
previewImg: imageItem.previewImg, |
|
|
selectedHistoryIndex: newIndex, |
|
|
selectedHistoryIndex: newIndex, |
|
|
status: "idle", |
|
|
status: "idle", |
|
|
error: null, |
|
|
error: null, |
|
|
@ -486,6 +488,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNo |
|
|
if (image) { |
|
|
if (image) { |
|
|
updateNodeData(id, { |
|
|
updateNodeData(id, { |
|
|
outputImage: image, |
|
|
outputImage: image, |
|
|
|
|
|
previewImg: imageItem.previewImg, |
|
|
selectedHistoryIndex: newIndex, |
|
|
selectedHistoryIndex: newIndex, |
|
|
status: "idle", |
|
|
status: "idle", |
|
|
error: null, |
|
|
error: null, |
|
|
@ -942,7 +945,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNo |
|
|
data-tutorial="generate-output-area" |
|
|
data-tutorial="generate-output-area" |
|
|
> |
|
|
> |
|
|
{/* Preview area */} |
|
|
{/* Preview area */} |
|
|
{nodeData.outputImage ? ( |
|
|
{displayImage ? ( |
|
|
<> |
|
|
<> |
|
|
<img |
|
|
<img |
|
|
src={adaptiveOutputImage ?? undefined} |
|
|
src={adaptiveOutputImage ?? undefined} |
|
|
@ -1117,7 +1120,7 @@ export function GenerateImageNode({ id, data, selected }: NodeProps<NanoBananaNo |
|
|
{isPreviewOpen && nodeData.outputImage && ( |
|
|
{isPreviewOpen && nodeData.outputImage && ( |
|
|
<MediaPreviewModal |
|
|
<MediaPreviewModal |
|
|
type="image" |
|
|
type="image" |
|
|
src={adaptiveOutputImage ?? nodeData.outputImage} |
|
|
src={adaptiveOutputImage ?? displayImage ?? nodeData.outputImage} |
|
|
downloadSrc={nodeData.outputImage} |
|
|
downloadSrc={nodeData.outputImage} |
|
|
alt="Generated preview" |
|
|
alt="Generated preview" |
|
|
onClose={() => setIsPreviewOpen(false)} |
|
|
onClose={() => setIsPreviewOpen(false)} |
|
|
|