Browse Source
- Create src/store/utils/localStorage.ts with all localStorage utilities - Move storage keys, cost data helpers, provider settings helpers - Move generateImageDefaults helpers with backward-compatible aliases - Re-export generateWorkflowId, saveGenerateImageDefaults, saveNanoBananaDefaults from workflowStorehandoff-20260429-1057
2 changed files with 159 additions and 130 deletions
@ -0,0 +1,142 @@ |
|||
import { WorkflowSaveConfig, WorkflowCostData, ProviderSettings } from "@/types"; |
|||
|
|||
// Storage keys
|
|||
export const STORAGE_KEY = "node-banana-workflow-configs"; |
|||
export const COST_DATA_STORAGE_KEY = "node-banana-workflow-costs"; |
|||
export const GENERATE_IMAGE_DEFAULTS_KEY = "node-banana-nanoBanana-defaults"; |
|||
export const PROVIDER_SETTINGS_KEY = "node-banana-provider-settings"; |
|||
|
|||
// GenerateImage defaults interface
|
|||
export interface GenerateImageDefaults { |
|||
aspectRatio: string; |
|||
resolution: string; |
|||
model: string; |
|||
useGoogleSearch: boolean; |
|||
} |
|||
|
|||
const DEFAULT_GENERATE_IMAGE_SETTINGS: GenerateImageDefaults = { |
|||
aspectRatio: "1:1", |
|||
resolution: "1K", |
|||
model: "nano-banana-pro", |
|||
useGoogleSearch: false, |
|||
}; |
|||
|
|||
// Default provider settings
|
|||
export const defaultProviderSettings: ProviderSettings = { |
|||
providers: { |
|||
gemini: { id: "gemini", name: "Google Gemini", enabled: true, apiKey: null, apiKeyEnvVar: "GEMINI_API_KEY" }, |
|||
openai: { id: "openai", name: "OpenAI", enabled: true, apiKey: null, apiKeyEnvVar: "OPENAI_API_KEY" }, |
|||
replicate: { id: "replicate", name: "Replicate", enabled: false, apiKey: null, apiKeyEnvVar: "REPLICATE_API_KEY" }, |
|||
fal: { id: "fal", name: "fal.ai", enabled: false, apiKey: null, apiKeyEnvVar: "FAL_API_KEY" }, |
|||
} |
|||
}; |
|||
|
|||
// Workflow configs helpers
|
|||
export const loadSaveConfigs = (): Record<string, WorkflowSaveConfig> => { |
|||
if (typeof window === "undefined") return {}; |
|||
const stored = localStorage.getItem(STORAGE_KEY); |
|||
return stored ? JSON.parse(stored) : {}; |
|||
}; |
|||
|
|||
export const saveSaveConfig = (config: WorkflowSaveConfig): void => { |
|||
if (typeof window === "undefined") return; |
|||
const configs = loadSaveConfigs(); |
|||
configs[config.workflowId] = config; |
|||
localStorage.setItem(STORAGE_KEY, JSON.stringify(configs)); |
|||
}; |
|||
|
|||
// Cost data helpers
|
|||
export const loadWorkflowCostData = (workflowId: string): WorkflowCostData | null => { |
|||
if (typeof window === "undefined") return null; |
|||
const stored = localStorage.getItem(COST_DATA_STORAGE_KEY); |
|||
if (!stored) return null; |
|||
try { |
|||
const allCosts: Record<string, WorkflowCostData> = JSON.parse(stored); |
|||
return allCosts[workflowId] || null; |
|||
} catch { |
|||
return null; |
|||
} |
|||
}; |
|||
|
|||
export const saveWorkflowCostData = (data: WorkflowCostData): void => { |
|||
if (typeof window === "undefined") return; |
|||
const stored = localStorage.getItem(COST_DATA_STORAGE_KEY); |
|||
let allCosts: Record<string, WorkflowCostData> = {}; |
|||
if (stored) { |
|||
try { |
|||
allCosts = JSON.parse(stored); |
|||
} catch { |
|||
allCosts = {}; |
|||
} |
|||
} |
|||
allCosts[data.workflowId] = data; |
|||
localStorage.setItem(COST_DATA_STORAGE_KEY, JSON.stringify(allCosts)); |
|||
}; |
|||
|
|||
// GenerateImage defaults helpers
|
|||
export const loadGenerateImageDefaults = (): GenerateImageDefaults => { |
|||
if (typeof window === "undefined") { |
|||
return DEFAULT_GENERATE_IMAGE_SETTINGS; |
|||
} |
|||
const stored = localStorage.getItem(GENERATE_IMAGE_DEFAULTS_KEY); |
|||
if (stored) { |
|||
try { |
|||
return JSON.parse(stored); |
|||
} catch { |
|||
return DEFAULT_GENERATE_IMAGE_SETTINGS; |
|||
} |
|||
} |
|||
return DEFAULT_GENERATE_IMAGE_SETTINGS; |
|||
}; |
|||
|
|||
export const saveGenerateImageDefaults = (settings: Partial<GenerateImageDefaults>): void => { |
|||
if (typeof window === "undefined") return; |
|||
const current = loadGenerateImageDefaults(); |
|||
const updated = { ...current, ...settings }; |
|||
localStorage.setItem(GENERATE_IMAGE_DEFAULTS_KEY, JSON.stringify(updated)); |
|||
}; |
|||
|
|||
// Provider settings helpers
|
|||
export const getProviderSettings = (): ProviderSettings => { |
|||
if (typeof window === "undefined") return defaultProviderSettings; |
|||
const stored = localStorage.getItem(PROVIDER_SETTINGS_KEY); |
|||
if (stored) { |
|||
try { |
|||
const parsed = JSON.parse(stored) as ProviderSettings; |
|||
// Merge with defaults to handle new providers added after user saved settings
|
|||
return { |
|||
providers: { |
|||
...defaultProviderSettings.providers, |
|||
...parsed.providers, |
|||
} |
|||
}; |
|||
} catch { |
|||
return defaultProviderSettings; |
|||
} |
|||
} |
|||
return defaultProviderSettings; |
|||
}; |
|||
|
|||
export const saveProviderSettings = (settings: ProviderSettings): void => { |
|||
if (typeof window === "undefined") return; |
|||
localStorage.setItem(PROVIDER_SETTINGS_KEY, JSON.stringify(settings)); |
|||
}; |
|||
|
|||
// Workflow ID generator
|
|||
export const generateWorkflowId = (): string => |
|||
`wf_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; |
|||
|
|||
/** |
|||
* @deprecated Backward-compatible alias. Use `GenerateImageDefaults` instead. |
|||
*/ |
|||
export type NanoBananaDefaults = GenerateImageDefaults; |
|||
|
|||
/** |
|||
* @deprecated Backward-compatible alias. Use `loadGenerateImageDefaults` instead. |
|||
*/ |
|||
export const loadNanoBananaDefaults = loadGenerateImageDefaults; |
|||
|
|||
/** |
|||
* @deprecated Backward-compatible alias. Use `saveGenerateImageDefaults` instead. |
|||
*/ |
|||
export const saveNanoBananaDefaults = saveGenerateImageDefaults; |
|||
Loading…
Reference in new issue