@@ -57,6 +57,7 @@ final class TodoEditorViewModel: Store {
5757 var tagText : String = " "
5858 var focusOnEditor : Bool = false
5959 var tabViewTag : Tag = . editor
60+ var categories : [ TodoCategory ] = [ ]
6061 var category : TodoCategory = . system( . etc)
6162 var isValidToSave : Bool {
6263 !title. trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty
@@ -68,6 +69,7 @@ final class TodoEditorViewModel: Store {
6869 }
6970
7071 enum Action {
72+ case onAppear
7173 case addTag( String )
7274 case removeTag( String )
7375 case setContent( String )
@@ -80,15 +82,18 @@ final class TodoEditorViewModel: Store {
8082 case setTabViewTag( Tag )
8183 case setTagText( String )
8284 case setTitle( String )
85+ case setCategories( [ TodoCategory ] )
8386 case setReferenceItems( [ Int : TodoReferenceItem ] )
8487 }
8588
8689 enum SideEffect {
90+ case fetchCategories
8791 case resolveMarkdown( String )
8892 }
8993
9094 private( set) var state = State ( )
9195 private let calendar = Calendar . current
96+ private let fetchPreferencesUseCase : FetchTodoCategoryPreferencesUseCase
9297 private let fetchReferenceItemsUseCase : FetchReferenceItemsUseCase
9398 private let id : String
9499 private let isCompleted : Bool
@@ -117,8 +122,10 @@ final class TodoEditorViewModel: Store {
117122 // 새로운 Todo 생성용 생성자
118123 init (
119124 category: TodoCategory ,
125+ fetchPreferencesUseCase: FetchTodoCategoryPreferencesUseCase ,
120126 fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
121127 ) {
128+ self . fetchPreferencesUseCase = fetchPreferencesUseCase
122129 self . fetchReferenceItemsUseCase = fetchReferenceItemsUseCase
123130 self . id = UUID ( ) . uuidString
124131 self . isCompleted = false
@@ -127,13 +134,16 @@ final class TodoEditorViewModel: Store {
127134 self . createdAt = nil
128135 self . originalDraft = nil
129136 state. category = category
137+ state. categories = [ category]
130138 }
131139
132140 // 기존 Todo 편집용 생성자
133141 init (
134142 todo: Todo ,
143+ fetchPreferencesUseCase: FetchTodoCategoryPreferencesUseCase ,
135144 fetchReferenceItemsUseCase: FetchReferenceItemsUseCase
136145 ) {
146+ self . fetchPreferencesUseCase = fetchPreferencesUseCase
137147 self . fetchReferenceItemsUseCase = fetchReferenceItemsUseCase
138148 self . id = todo. id
139149 self . isCompleted = todo. isCompleted
@@ -156,6 +166,8 @@ final class TodoEditorViewModel: Store {
156166 var effects : [ SideEffect ] = [ ]
157167
158168 switch action {
169+ case . onAppear:
170+ effects = [ . fetchCategories]
159171 case . addTag( let tag) :
160172 if !tag. isEmpty {
161173 state. tags. append ( tag)
@@ -193,6 +205,8 @@ final class TodoEditorViewModel: Store {
193205 if tag == . preview {
194206 effects = [ . resolveMarkdown( state. content) ]
195207 }
208+ case . setCategories( let categories) :
209+ state. categories = categories
196210 case . setReferenceItems( let items) :
197211 state. referenceItems = items
198212 }
@@ -203,6 +217,13 @@ final class TodoEditorViewModel: Store {
203217
204218 func run( _ effect: SideEffect ) {
205219 switch effect {
220+ case . fetchCategories:
221+ Task {
222+ do {
223+ let preferences = try await fetchPreferencesUseCase. execute ( )
224+ send ( . setCategories( preferences. map ( \. category) ) )
225+ } catch { }
226+ }
206227 case . resolveMarkdown( let content) :
207228 Task {
208229 let numbers = content. todoReferenceNumbers
0 commit comments