@@ -19,6 +19,8 @@ public struct RecommendFeature {
1919 private var contentClient
2020 @Dependency ( UserClient . self)
2121 private var userClient
22+ @Dependency ( CategoryClient . self)
23+ private var categoryClient
2224 @Dependency ( \. openURL)
2325 private var openURL
2426 /// - State
@@ -43,13 +45,19 @@ public struct RecommendFeature {
4345 array. append ( contentsOf: domain. myInterests)
4446 return array
4547 }
48+ var pokitList : [ BaseCategoryItem ] ? {
49+ get { domain. categoryListInQuiry. data }
50+ }
4651 var isLoading : Bool = true
4752 var selectedInterest : BaseInterest ?
4853 var shareContent : BaseContentItem ?
4954 var interests : [ BaseInterest ] { domain. interests }
5055 var showKeywordSheet : Bool = false
5156 var selectedInterestList = Set < BaseInterest > ( )
5257 var reportContent : BaseContentItem ?
58+ var showSelectSheet : Bool = false
59+ var selectedPokit : BaseCategoryItem ?
60+ var addContent : BaseContentItem ?
5361 }
5462
5563 /// - Action
@@ -81,14 +89,17 @@ public struct RecommendFeature {
8189 case μλ¦Ό_λ²νΌ_λλ μλ
8290 case μΆμ²_컨ν
μΈ _λλ μλ( String )
8391 case κ²½κ³ μνΈ_dismiss
92+ case ν¬ν·μ ν_νλͺ©_λλ μλ( pokit: BaseCategoryItem )
93+ case ν¬ν·_μΆκ°νκΈ°_λ²νΌ_λλ μλ
8494 }
8595
86- public enum InnerAction : Equatable {
96+ public enum InnerAction {
8797 case μΆμ²_μ‘°ν_API_λ°μ( BaseContentListInquiry )
8898 case μΆμ²_μ‘°ν_νμ΄μ§_API_λ°μ( BaseContentListInquiry )
8999 case μ μ _κ΄μ¬μ¬_μ‘°ν_API_λ°μ( [ BaseInterest ] )
90100 case κ΄μ¬μ¬_μ‘°ν_API_λ°μ( [ BaseInterest ] )
91101 case 컨ν
μΈ _μ κ³ _API_λ°μ( Int )
102+ case μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API_λ°μ( categoryList: BaseCategoryListInquiry )
92103 }
93104
94105 public enum AsyncAction : Equatable {
@@ -97,15 +108,18 @@ public struct RecommendFeature {
97108 case μ μ _κ΄μ¬μ¬_μ‘°ν_API
98109 case κ΄μ¬μ¬_μ‘°ν_API
99110 case 컨ν
μΈ _μ κ³ _API( Int )
111+ case μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API
112+ case 컨ν
μΈ _μΆκ°_API
100113 }
101114
102115 public enum ScopeAction : Equatable { case doNothing }
103116
104117 public enum DelegateAction : Equatable {
105- case μΆκ°νκΈ°_λ²νΌ_λλ μλ ( Int )
118+ case μ μ₯νκΈ°_μλ£
106119 case κ²μ_λ²νΌ_λλ μλ
107120 case μλ¦Ό_λ²νΌ_λλ μλ
108121 case 컨ν
μΈ _μ κ³ _API_λ°μ
122+ case ν¬ν·_μΆκ°νκΈ°_λ²νΌ_λλ μλ
109123 }
110124 }
111125
@@ -158,7 +172,9 @@ private extension RecommendFeature {
158172 case . pagination:
159173 return shared ( . async( . μΆμ²_μ‘°ν_νμ΄μ§_API) , state: & state)
160174 case let . μΆκ°νκΈ°_λ²νΌ_λλ μλ( content) :
161- return . send( . delegate( . μΆκ°νκΈ°_λ²νΌ_λλ μλ( content. id) ) )
175+ state. addContent = content
176+ state. showSelectSheet = true
177+ return shared ( . async( . μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API) , state: & state)
162178 case let . 곡μ νκΈ°_λ²νΌ_λλ μλ( content) :
163179 state. shareContent = content
164180 return . none
@@ -170,6 +186,7 @@ private extension RecommendFeature {
170186 return . none
171187 case let . μ 체보기_λ²νΌ_λλ μλ( proxy) :
172188 guard state. selectedInterest != nil else { return . none }
189+ state. domain. contentList. data = nil
173190
174191 state. selectedInterest = nil
175192 let leading = 20 / UIScreen. main. bounds. width
@@ -178,19 +195,13 @@ private extension RecommendFeature {
178195 y: UnitPoint . leading. y
179196 )
180197 proxy. scrollTo ( " μ 체보기 " , anchor: anchor)
181- state. domain. contentList. data = nil
182198 return shared ( . async( . μΆμ²_μ‘°ν_API) , state: & state)
183199 case let . κ΄μ¬μ¬_λ²νΌ_λλ μλ( interest, proxy) :
184200 guard state. selectedInterest != interest else { return . none }
201+ state. domain. contentList. data = nil
185202
186203 state. selectedInterest = interest
187- let leading = 20 / UIScreen. main. bounds. width
188- let anchor = UnitPoint (
189- x: leading,
190- y: UnitPoint . leading. y
191- )
192- proxy. scrollTo ( interest. description, anchor: anchor)
193- state. domain. contentList. data = nil
204+ proxy. scrollTo ( interest. description, anchor: . leading)
194205 return shared ( . async( . μΆμ²_μ‘°ν_API) , state: & state)
195206 case . λ§ν¬_곡μ _μλ£λμμλ:
196207 state. shareContent = nil
@@ -216,6 +227,13 @@ private extension RecommendFeature {
216227 case . κ²½κ³ μνΈ_dismiss:
217228 state. reportContent = nil
218229 return . none
230+ case . ν¬ν·μ ν_νλͺ©_λλ μλ( pokit: let pokit) :
231+ state. selectedPokit = pokit
232+ state. showSelectSheet = false
233+ return shared ( . async( . 컨ν
μΈ _μΆκ°_API) , state: & state)
234+ case . ν¬ν·_μΆκ°νκΈ°_λ²νΌ_λλ μλ:
235+ state. showSelectSheet = false
236+ return . send( . delegate( . ν¬ν·_μΆκ°νκΈ°_λ²νΌ_λλ μλ) )
219237 }
220238 }
221239
@@ -247,6 +265,30 @@ private extension RecommendFeature {
247265 case let . 컨ν
μΈ _μ κ³ _API_λ°μ( contentId) :
248266 state. domain. contentList. data? . removeAll ( where: { $0. id == contentId } )
249267 return . send( . delegate( . 컨ν
μΈ _μ κ³ _API_λ°μ) )
268+ case . μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API_λ°μ( categoryList: let categoryList) :
269+ /// - `μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν`μ filter μ΅μ
μ `false`λ‘ ν΄λμκΈ° λλ¬Έμ `λ―ΈλΆλ₯` μΉ΄ν
κ³ λ¦¬ λν νλͺ©μμ μ‘°νκ° κ°λ₯ν¨
270+
271+ /// [1]. `λ―ΈλΆλ₯`μ ν΄λΉνλ μΈλ±μ€ λ²νΈμ νλͺ©μ 체ν¬, μλ€λ©΄ λͺ©λ‘κ°±μ μ΄ λΆκ°ν¨
272+ guard
273+ let unclassifiedItemIdx = categoryList. data? . firstIndex ( where: {
274+ $0. categoryName == " λ―ΈλΆλ₯ "
275+ } )
276+ else { return . none }
277+ guard
278+ let unclassifiedItem = categoryList. data? . first ( where: {
279+ $0. categoryName == " λ―ΈλΆλ₯ "
280+ } )
281+ else { return . none }
282+
283+ /// [2]. μλ‘μ΄ listλ³μλ₯Ό λ§λ€μ΄μ£Όκ³ μΉ΄ν
κ³ λ¦¬ νλͺ© μμλ₯Ό μ¬λ°°μΉ (μ΅μ μ μ λ ¬ μ λ―ΈλΆλ₯λ νμ 맨 λ§μ§λ§)
284+ var list = categoryList
285+ list. data? . remove ( at: unclassifiedItemIdx)
286+ list. data? . insert ( unclassifiedItem, at: 0 )
287+
288+ /// [3]. λλ©μΈ νλͺ© 리μ€νΈμ list ν λΉ
289+ state. domain. categoryListInQuiry = list
290+ state. selectedPokit = unclassifiedItem
291+ return . none
250292 }
251293 }
252294
@@ -291,6 +333,33 @@ private extension RecommendFeature {
291333 animation: . pokitSpring
292334 )
293335 }
336+ case . μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API:
337+ let request = BasePageableRequest (
338+ page: state. domain. pageable. page,
339+ size: 30 ,
340+ sort: state. domain. pageable. sort
341+ )
342+ return categoryListFetch ( request: request)
343+ case . 컨ν
μΈ _μΆκ°_API:
344+ guard
345+ let categoryId = state. selectedPokit? . id,
346+ let category = state. domain. categoryListInQuiry. data? . first ( where: {
347+ $0. id == categoryId
348+ } ) ,
349+ let content = state. addContent
350+ else { return . none }
351+ let request = ContentBaseRequest (
352+ data: content. data,
353+ title: content. title,
354+ categoryId: categoryId,
355+ memo: content. memo ?? " " ,
356+ alertYn: " NO " ,
357+ thumbNail: content. thumbNail
358+ )
359+ return . run { send in
360+ let content = try await contentClient. 컨ν
μΈ _μΆκ° ( request)
361+ await send ( . delegate( . μ μ₯νκΈ°_μλ£) )
362+ }
294363 }
295364 }
296365
@@ -353,4 +422,11 @@ private extension RecommendFeature {
353422 await send ( . inner( . μΆμ²_μ‘°ν_API_λ°μ( contentItems) ) , animation: . pokitDissolve)
354423 }
355424 }
425+
426+ func categoryListFetch( request: BasePageableRequest ) -> Effect < Action > {
427+ return . run { send in
428+ let categoryList = try await categoryClient. μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν ( request, false , true ) . toDomain ( )
429+ await send ( . inner( . μΉ΄ν
κ³ λ¦¬_λͺ©λ‘_μ‘°ν_API_λ°μ( categoryList: categoryList) ) , animation: . pokitDissolve)
430+ }
431+ }
356432}
0 commit comments