@@ -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,12 +108,14 @@ 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_반영
@@ -158,7 +171,9 @@ private extension RecommendFeature {
158171 case . pagination:
159172 return shared ( . async( . 추천_조회_페이징_API) , state: & state)
160173 case let . 추가하기_버튼_눌렀을때( content) :
161- return . send( . delegate( . 추가하기_버튼_눌렀을때( content. id) ) )
174+ state. addContent = content
175+ state. showSelectSheet = true
176+ return shared ( . async( . 카테고리_목록_조회_API) , state: & state)
162177 case let . 공유하기_버튼_눌렀을때( content) :
163178 state. shareContent = content
164179 return . none
@@ -216,6 +231,12 @@ private extension RecommendFeature {
216231 case . 경고시트_dismiss:
217232 state. reportContent = nil
218233 return . none
234+ case . 포킷선택_항목_눌렀을때( pokit: let pokit) :
235+ state. selectedPokit = pokit
236+ return . none
237+ case . 포킷_추가하기_버튼_눌렀을때:
238+ state. showSelectSheet = false
239+ return shared ( . async( . 컨텐츠_추가_API) , state: & state)
219240 }
220241 }
221242
@@ -247,6 +268,30 @@ private extension RecommendFeature {
247268 case let . 컨텐츠_신고_API_반영( contentId) :
248269 state. domain. contentList. data? . removeAll ( where: { $0. id == contentId } )
249270 return . send( . delegate( . 컨텐츠_신고_API_반영) )
271+ case . 카테고리_목록_조회_API_반영( categoryList: let categoryList) :
272+ /// - `카테고리_목록_조회`의 filter 옵션을 `false`로 해두었기 때문에 `미분류` 카테고리 또한 항목에서 조회가 가능함
273+
274+ /// [1]. `미분류`에 해당하는 인덱스 번호와 항목을 체크, 없다면 목록갱신이 불가함
275+ guard
276+ let unclassifiedItemIdx = categoryList. data? . firstIndex ( where: {
277+ $0. categoryName == " 미분류 "
278+ } )
279+ else { return . none }
280+ guard
281+ let unclassifiedItem = categoryList. data? . first ( where: {
282+ $0. categoryName == " 미분류 "
283+ } )
284+ else { return . none }
285+
286+ /// [2]. 새로운 list변수를 만들어주고 카테고리 항목 순서를 재배치 (최신순 정렬 시 미분류는 항상 맨 마지막)
287+ var list = categoryList
288+ list. data? . remove ( at: unclassifiedItemIdx)
289+ list. data? . insert ( unclassifiedItem, at: 0 )
290+
291+ /// [3]. 도메인 항목 리스트에 list 할당
292+ state. domain. categoryListInQuiry = list
293+ state. selectedPokit = unclassifiedItem
294+ return . none
250295 }
251296 }
252297
@@ -291,6 +336,33 @@ private extension RecommendFeature {
291336 animation: . pokitSpring
292337 )
293338 }
339+ case . 카테고리_목록_조회_API:
340+ let request = BasePageableRequest (
341+ page: state. domain. pageable. page,
342+ size: 30 ,
343+ sort: state. domain. pageable. sort
344+ )
345+ return categoryListFetch ( request: request)
346+ case . 컨텐츠_추가_API:
347+ guard
348+ let categoryId = state. selectedPokit? . id,
349+ let category = state. domain. categoryListInQuiry. data? . first ( where: {
350+ $0. id == categoryId
351+ } ) ,
352+ let content = state. addContent
353+ else { return . none }
354+ let request = ContentBaseRequest (
355+ data: content. data,
356+ title: content. title,
357+ categoryId: categoryId,
358+ memo: content. memo ?? " " ,
359+ alertYn: " NO " ,
360+ thumbNail: content. thumbNail
361+ )
362+ return . run { send in
363+ let content = try await contentClient. 컨텐츠_추가 ( request)
364+ await send ( . delegate( . 저장하기_완료) )
365+ }
294366 }
295367 }
296368
@@ -353,4 +425,11 @@ private extension RecommendFeature {
353425 await send ( . inner( . 추천_조회_API_반영( contentItems) ) , animation: . pokitDissolve)
354426 }
355427 }
428+
429+ func categoryListFetch( request: BasePageableRequest ) -> Effect < Action > {
430+ return . run { send in
431+ let categoryList = try await categoryClient. 카테고리_목록_조회 ( request, false , true ) . toDomain ( )
432+ await send ( . inner( . 카테고리_목록_조회_API_반영( categoryList: categoryList) ) , animation: . pokitDissolve)
433+ }
434+ }
356435}
0 commit comments