@@ -20,6 +20,29 @@ class DesignViewModel: ObservableObject {
2020 @Published var loadingStep : Int = 0
2121 @Published var loadingStatus : String = " "
2222
23+ private var inventoryService : InventoryService ?
24+ private var aiService : AIService ?
25+ private var imagePersistence : ImagePersistence ?
26+ private var historyService : HistoryService ?
27+ private var localizationManager : LocalizationManager ?
28+
29+ init ( ) { }
30+
31+ func setup(
32+ inventoryService: InventoryService ,
33+ aiService: AIService ,
34+ imagePersistence: ImagePersistence ,
35+ historyService: HistoryService ,
36+ localizationManager: LocalizationManager
37+ ) {
38+ guard self . inventoryService == nil else { return }
39+ self . inventoryService = inventoryService
40+ self . aiService = aiService
41+ self . imagePersistence = imagePersistence
42+ self . historyService = historyService
43+ self . localizationManager = localizationManager
44+ }
45+
2346 enum CultureFilter : String , CaseIterable , Identifiable {
2447 case all = " All "
2548 case japanese = " Japanese "
@@ -57,11 +80,11 @@ class DesignViewModel: ObservableObject {
5780 }
5881
5982 func generateDesign( ) {
60- guard !isLoading else { return }
83+ guard !isLoading, let aiService = aiService , let inventoryService = inventoryService , let localizationManager = localizationManager , let historyService = historyService , let imagePersistence = imagePersistence else { return }
6184
6285 isLoading = true
6386 loadingStep = 0
64- loadingStatus = Tx . t ( " design.loading.analyze " ) // "Analyzing Request..."
87+ loadingStatus = localizationManager . t ( " design.loading.analyze " ) // "Analyzing Request..."
6588 errorMessage = nil
6689
6790 Task {
@@ -70,27 +93,27 @@ class DesignViewModel: ObservableObject {
7093 try await Task . sleep ( nanoseconds: 800_000_000 )
7194 await MainActor . run {
7295 self . loadingStep = 1
73- self . loadingStatus = Tx . t ( " design.loading.technique " )
96+ self . loadingStatus = localizationManager . t ( " design.loading.technique " )
7497 } // "Selecting Technique..."
7598
7699 try await Task . sleep ( nanoseconds: 800_000_000 )
77100 await MainActor . run {
78101 self . loadingStep = 2
79- self . loadingStatus = Tx . t ( " design.loading.match " )
102+ self . loadingStatus = localizationManager . t ( " design.loading.match " )
80103 } // "Matching Inventory..."
81104
82105 try await Task . sleep ( nanoseconds: 800_000_000 )
83106 await MainActor . run {
84107 self . loadingStep = 3
85- self . loadingStatus = Tx . t ( " design.loading.generate " )
108+ self . loadingStatus = localizationManager . t ( " design.loading.generate " )
86109 } // "Generating Design..."
87110
88- let inventory = InventoryService . shared . flowers
111+ let inventory = inventoryService . flowers
89112 var result : DesignResult
90113
91114 if let image = selectedImage {
92115 // Visual Muse Mode
93- result = try await AIService . shared . generateDesignFromImage (
116+ result = try await aiService . generateDesignFromImage (
94117 image: image, request: request, inventory: inventory)
95118 } else {
96119 // Standard Mode
@@ -99,19 +122,19 @@ class DesignViewModel: ObservableObject {
99122 if isProfessionalMode {
100123 currentRequest. designMode = " professional "
101124 }
102- result = try await AIService . shared . generateFlowerPlan (
125+ result = try await aiService . generateFlowerPlan (
103126 request: currentRequest, inventory: inventory)
104127 }
105128
106129 // Image Generation Step
107130 if let prompt = result. imagePrompt, !prompt. isEmpty {
108131 await MainActor . run {
109- self . loadingStatus = Tx . t ( " design.loading.dreaming " ) // "Dreaming up visual..."
132+ self . loadingStatus = localizationManager . t ( " design.loading.dreaming " ) // "Dreaming up visual..."
110133 }
111134
112135 do {
113136 // 1. Generate Image URL (or Base64)
114- let imageUrlString = try await AIService . shared . generateImage (
137+ let imageUrlString = try await aiService . generateImage (
115138 prompt: prompt,
116139 requestId: result. syncId ?? result. requestId
117140 )
@@ -121,23 +144,23 @@ class DesignViewModel: ObservableObject {
121144
122145 // 3. Save to Persistence
123146 if let validImage = image {
124- if let filename = ImagePersistence . shared . saveImage ( validImage, name: result. id) {
147+ if let filename = imagePersistence . saveImage ( validImage, name: result. id) {
125148 result. imageUrl = filename
126149 } else {
127150 AppLogger . image. error ( " Failed to save image to disk " )
128- result. imageError = Tx . t ( " error.saveImage " )
151+ result. imageError = localizationManager . t ( " error.saveImage " )
129152 }
130153 } else {
131154 AppLogger . image. error ( " Failed to decode image from string: \( imageUrlString. prefix ( 100 ) ) ... " )
132- result. imageError = Tx . t ( " error.invalidImageData " )
155+ result. imageError = localizationManager . t ( " error.invalidImageData " )
133156 }
134157 } catch {
135158 AppLogger . ai. error ( " Image generation failed: \( error) " )
136159 result. imageError = error. localizedDescription
137160 }
138161 } else if let selectedImg = selectedImage {
139162 // Visual Muse: Save input image as the design image
140- if let filename = ImagePersistence . shared . saveImage ( selectedImg, name: result. id) {
163+ if let filename = imagePersistence . saveImage ( selectedImg, name: result. id) {
141164 result. imageUrl = filename
142165 }
143166 }
@@ -148,7 +171,7 @@ class DesignViewModel: ObservableObject {
148171 self . showResult = true
149172 self . isLoading = false
150173 // Save to History
151- HistoryService . shared . saveDesign ( finalizedResult)
174+ historyService . saveDesign ( finalizedResult)
152175 }
153176
154177 } catch {
0 commit comments