Spaces:
Running on Zero
Running on Zero
| import { create } from 'zustand'; | |
| import type { GenerationSettings, ModelInfo, PreviewMessage, SettingsSnapshot } from '../types'; | |
| interface AppState { | |
| settings: GenerationSettings; | |
| availableModels: ModelInfo[]; | |
| availableControlNets: string[]; | |
| status: 'idle' | 'generating' | 'error'; | |
| currentImage: string | null; // Latest generated image | |
| gallery: string[]; // History of generated images | |
| preview: PreviewMessage | null; | |
| serverStatus: boolean; // Is server reachable? | |
| // Settings history (for UI snapshots) | |
| settingsHistory: SettingsSnapshot[]; | |
| setSettingsHistory: (arr: SettingsSnapshot[]) => void; | |
| appendSettingsSnapshot: (snap: SettingsSnapshot) => void; | |
| setSettings: (settings: Partial<GenerationSettings>) => void; | |
| setModels: (models: ModelInfo[]) => void; | |
| setControlNets: (models: string[]) => void; | |
| setStatus: (status: 'idle' | 'generating' | 'error') => void; | |
| setCurrentImage: (image: string | null) => void; | |
| addToGallery: (image: string) => void; | |
| addManyToGallery: (images: string[]) => void; | |
| setPreview: (preview: PreviewMessage | null) => void; | |
| setServerStatus: (status: boolean) => void; | |
| } | |
| export const useStore = create<AppState>((set) => ({ | |
| settings: { | |
| prompt: "", | |
| negative_prompt: "", | |
| width: 512, | |
| height: 512, | |
| num_images: 1, | |
| batch_size: 1, | |
| steps: 20, | |
| cfg_scale: 7.0, | |
| seed: -1, | |
| scheduler: "ays", | |
| sampler: "dpmpp_sde_cfgpp", | |
| model_path: "", // Default empty, user must select | |
| refiner_model_path: "", | |
| refiner_switch_step: 15, | |
| img2img_mode: false, | |
| img2img_denoise: 0.75, | |
| img2img_image: undefined, | |
| controlnet_enabled: false, | |
| controlnet_strength: 1.0, | |
| controlnet_type: "canny", | |
| hiresfix: false, | |
| adetailer: false, | |
| enhance_prompt: false, | |
| stable_fast: false, | |
| reuse_seed: false, | |
| keep_models_loaded: true, | |
| enable_preview: true, | |
| // Default to the improved/balanced preview fidelity | |
| preview_fidelity: 'balanced', | |
| // By default do NOT persist prompts to server history (opt-in) | |
| persist_prompt_history: false, | |
| enable_multiscale: false, | |
| multiscale_preset: "disabled", | |
| multiscale_factor: 0.5, | |
| multiscale_fullres_start: 10, | |
| multiscale_fullres_end: 8, | |
| multiscale_intermittent_fullres: true, | |
| deepcache_enabled: false, | |
| deepcache_interval: 3, | |
| deepcache_depth: 2, | |
| cfg_free_enabled: false, | |
| cfg_free_start_percent: 70.0, | |
| tome_enabled: false, | |
| tome_ratio: 0.5, | |
| torch_compile: false, | |
| vae_autotune: false, | |
| fp8_inference: false, | |
| weight_quantization: null, | |
| }, | |
| availableModels: [], | |
| availableControlNets: [], | |
| status: 'idle', | |
| currentImage: null, | |
| gallery: [], | |
| preview: null, | |
| serverStatus: false, | |
| // Settings history | |
| settingsHistory: [], | |
| setSettingsHistory: (arr: SettingsSnapshot[]) => set({ settingsHistory: arr }), | |
| appendSettingsSnapshot: (snap: SettingsSnapshot) => set((s) => ({ settingsHistory: [snap, ...s.settingsHistory] })), | |
| setSettings: (newSettings) => set((state) => ({ settings: { ...state.settings, ...newSettings } })), | |
| setModels: (models) => set({ availableModels: models }), | |
| setControlNets: (models) => set({ availableControlNets: models }), | |
| setStatus: (status) => set({ status }), | |
| setCurrentImage: (image) => set({ currentImage: image }), | |
| addToGallery: (image) => set((state) => ({ gallery: [image, ...state.gallery] })), | |
| addManyToGallery: (images) => | |
| set((state) => ({ | |
| gallery: images.length > 0 ? [...images, ...state.gallery] : state.gallery, | |
| })), | |
| setPreview: (preview) => set({ preview }), | |
| setServerStatus: (status) => set({ serverStatus: status }), | |
| })); | |