Browse Source

feat(03-01): update store and canvas references

- Rename loadNanoBananaDefaults to loadGenerateImageDefaults (keep alias)
- Rename saveNanoBananaDefaults to saveGenerateImageDefaults (keep alias)
- Update createDefaultNodeData to set default selectedModel for Gemini
- Update WorkflowCanvas nodeTypes to use GenerateImageNode

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 6 months ago
parent
commit
cec11f206c
  1. 4
      src/components/WorkflowCanvas.tsx
  2. 29
      src/store/workflowStore.ts

4
src/components/WorkflowCanvas.tsx

@ -21,7 +21,7 @@ import {
ImageInputNode, ImageInputNode,
AnnotationNode, AnnotationNode,
PromptNode, PromptNode,
NanoBananaNode, GenerateImageNode,
LLMGenerateNode, LLMGenerateNode,
SplitGridNode, SplitGridNode,
OutputNode, OutputNode,
@ -41,7 +41,7 @@ const nodeTypes: NodeTypes = {
imageInput: ImageInputNode, imageInput: ImageInputNode,
annotation: AnnotationNode, annotation: AnnotationNode,
prompt: PromptNode, prompt: PromptNode,
nanoBanana: NanoBananaNode, nanoBanana: GenerateImageNode,
llmGenerate: LLMGenerateNode, llmGenerate: LLMGenerateNode,
splitGrid: SplitGridNode, splitGrid: SplitGridNode,
output: OutputNode, output: OutputNode,

29
src/store/workflowStore.ts

@ -27,6 +27,7 @@ import {
GroupColor, GroupColor,
ProviderType, ProviderType,
ProviderSettings, ProviderSettings,
SelectedModel,
} from "@/types"; } from "@/types";
import { useToast } from "@/components/Toast"; import { useToast } from "@/components/Toast";
import { calculateGenerationCost } from "@/utils/costCalculator"; import { calculateGenerationCost } from "@/utils/costCalculator";
@ -181,6 +182,12 @@ const createDefaultNodeData = (type: NodeType): WorkflowNodeData => {
} as PromptNodeData; } as PromptNodeData;
case "nanoBanana": { case "nanoBanana": {
const defaults = loadNanoBananaDefaults(); const defaults = loadNanoBananaDefaults();
const modelDisplayName = defaults.model === "nano-banana" ? "Nano Banana" : "Nano Banana Pro";
const defaultSelectedModel: SelectedModel = {
provider: "gemini",
modelId: defaults.model,
displayName: modelDisplayName,
};
return { return {
inputImages: [], inputImages: [],
inputPrompt: null, inputPrompt: null,
@ -188,6 +195,7 @@ const createDefaultNodeData = (type: NodeType): WorkflowNodeData => {
aspectRatio: defaults.aspectRatio, aspectRatio: defaults.aspectRatio,
resolution: defaults.resolution, resolution: defaults.resolution,
model: defaults.model, model: defaults.model,
selectedModel: defaultSelectedModel,
useGoogleSearch: defaults.useGoogleSearch, useGoogleSearch: defaults.useGoogleSearch,
status: "idle", status: "idle",
error: null, error: null,
@ -283,21 +291,21 @@ const saveWorkflowCostData = (data: WorkflowCostData): void => {
localStorage.setItem(COST_DATA_STORAGE_KEY, JSON.stringify(allCosts)); localStorage.setItem(COST_DATA_STORAGE_KEY, JSON.stringify(allCosts));
}; };
// localStorage helpers for NanoBanana sticky settings // localStorage helpers for GenerateImage sticky settings
const NANO_BANANA_DEFAULTS_KEY = "node-banana-nanoBanana-defaults"; const GENERATE_IMAGE_DEFAULTS_KEY = "node-banana-nanoBanana-defaults";
interface NanoBananaDefaults { interface GenerateImageDefaults {
aspectRatio: string; aspectRatio: string;
resolution: string; resolution: string;
model: string; model: string;
useGoogleSearch: boolean; useGoogleSearch: boolean;
} }
const loadNanoBananaDefaults = (): NanoBananaDefaults => { const loadGenerateImageDefaults = (): GenerateImageDefaults => {
if (typeof window === "undefined") { if (typeof window === "undefined") {
return { aspectRatio: "1:1", resolution: "1K", model: "nano-banana-pro", useGoogleSearch: false }; return { aspectRatio: "1:1", resolution: "1K", model: "nano-banana-pro", useGoogleSearch: false };
} }
const stored = localStorage.getItem(NANO_BANANA_DEFAULTS_KEY); const stored = localStorage.getItem(GENERATE_IMAGE_DEFAULTS_KEY);
if (stored) { if (stored) {
try { try {
return JSON.parse(stored); return JSON.parse(stored);
@ -308,13 +316,18 @@ const loadNanoBananaDefaults = (): NanoBananaDefaults => {
return { aspectRatio: "1:1", resolution: "1K", model: "nano-banana-pro", useGoogleSearch: false }; return { aspectRatio: "1:1", resolution: "1K", model: "nano-banana-pro", useGoogleSearch: false };
}; };
export const saveNanoBananaDefaults = (settings: Partial<NanoBananaDefaults>) => { export const saveGenerateImageDefaults = (settings: Partial<GenerateImageDefaults>) => {
if (typeof window === "undefined") return; if (typeof window === "undefined") return;
const current = loadNanoBananaDefaults(); const current = loadGenerateImageDefaults();
const updated = { ...current, ...settings }; const updated = { ...current, ...settings };
localStorage.setItem(NANO_BANANA_DEFAULTS_KEY, JSON.stringify(updated)); localStorage.setItem(GENERATE_IMAGE_DEFAULTS_KEY, JSON.stringify(updated));
}; };
// Backward-compatible aliases
type NanoBananaDefaults = GenerateImageDefaults;
const loadNanoBananaDefaults = loadGenerateImageDefaults;
export const saveNanoBananaDefaults = saveGenerateImageDefaults;
// localStorage helpers for provider settings // localStorage helpers for provider settings
const PROVIDER_SETTINGS_KEY = "node-banana-provider-settings"; const PROVIDER_SETTINGS_KEY = "node-banana-provider-settings";

Loading…
Cancel
Save