55// Created by 김민호 on 12/24/24.
66
77import ComposableArchitecture
8+ import CoreKit
89import Domain
910import Util
1011
1112@Reducer
1213public struct PokitLinkEditFeature {
1314 /// - Dependency
1415 @Dependency ( \. dismiss) var dismiss
16+ @Dependency ( CategoryClient . self) var categoryClient
17+ @Dependency ( ContentClient . self) var contentClient
1518 /// - State
1619 @ObservableState
1720 public struct State : Equatable {
21+ /// 링크 아이템 Doamin
1822 var item : BaseContentListInquiry
23+ /// 카테고리 아이템 Domain
24+ var category : BaseCategoryListInquiry ?
25+ /// 링크 목록
1926 var list = IdentifiedArrayOf < BaseContentItem > ( )
27+ /// 선택한 링크 목록
2028 var selectedItems = IdentifiedArrayOf < BaseContentItem > ( )
29+ /// 포킷 이동 눌렀을 때 sheet
2130 var isPresented : Bool = false
2231
2332 public init ( linkList: BaseContentListInquiry ) {
@@ -40,12 +49,17 @@ public struct PokitLinkEditFeature {
4049 public enum View : BindableAction , Equatable {
4150 case binding( BindingAction < State > )
4251 case dismiss
52+ case onAppear
4353
54+ case 카테고리_추가_버튼_눌렀을때
4455 case 체크박스_선택했을때( BaseContentItem )
4556 case 카테고리_선택했을때( BaseCategoryItem )
4657 }
4758
48- public enum InnerAction : Equatable { case 없음 }
59+ public enum InnerAction : Equatable {
60+ case 카테고리_목록_조회_API_반영( BaseCategoryListInquiry )
61+ case 미분류_카테고리_이동_API_반영
62+ }
4963
5064 public enum AsyncAction : Equatable { case 없음 }
5165
@@ -101,6 +115,12 @@ private extension PokitLinkEditFeature {
101115 case . dismiss:
102116 return . run { _ in await dismiss ( ) }
103117
118+ case . onAppear:
119+ return fetchCateogryList ( )
120+
121+ case . 카테고리_추가_버튼_눌렀을때:
122+ return . none
123+
104124 case let . 체크박스_선택했을때( item) :
105125 /// 이미 체크되어 있다면 해제
106126 if state. selectedItems. contains ( item) {
@@ -111,15 +131,27 @@ private extension PokitLinkEditFeature {
111131 return . none
112132
113133 case let . 카테고리_선택했을때( pokit) :
114- //TODO: 포킷이동 네트워크 구현
115- state. isPresented = false
116- return . none
134+ return moveContentList ( categoryId: pokit. id, state: & state)
117135 }
118136 }
119137
120138 /// - Inner Effect
121139 func handleInnerAction( _ action: Action . InnerAction , state: inout State ) -> Effect < Action > {
122- return . none
140+ switch action {
141+ case let . 카테고리_목록_조회_API_반영( response) :
142+ state. category = response
143+ return . none
144+
145+ case . 미분류_카테고리_이동_API_반영:
146+ /// 1. 시트 내리기
147+ state. isPresented = false
148+ /// 2. 선택했던 체크리스트 삭제
149+ state. selectedItems
150+ . map { $0. id }
151+ . forEach { state. list. remove ( id: $0) }
152+ state. selectedItems. removeAll ( )
153+ return . none
154+ }
123155 }
124156
125157 /// - Async Effect
@@ -154,4 +186,23 @@ private extension PokitLinkEditFeature {
154186 func handleDelegateAction( _ action: Action . DelegateAction , state: inout State ) -> Effect < Action > {
155187 return . none
156188 }
189+
190+ /// 카테고리 목록 조회 API
191+ func fetchCateogryList( ) -> Effect < Action > {
192+ return . run { send in
193+ let request : BasePageableRequest = BasePageableRequest ( page: 0 , size: 100 , sort: [ " createdAt " , " desc " ] )
194+ let response = try await categoryClient. 카테고리_목록_조회 ( model: request, filterUncategorized: false ) . toDomain ( )
195+ await send ( . inner( . 카테고리_목록_조회_API_반영( response) ) )
196+ }
197+ }
198+
199+ /// 미분류 링크 카테고리 이동 API
200+ func moveContentList( categoryId: Int , state: inout State ) -> Effect < Action > {
201+ return . run { [ contentIds = state. selectedItems] send in
202+ let contentIds = contentIds. map { $0. id }
203+ let request = ContentMoveRequest ( contentIds: contentIds, categoryId: categoryId)
204+ try await contentClient. 미분류_링크_포킷_이동 ( request)
205+ await send ( . inner( . 미분류_카테고리_이동_API_반영) )
206+ }
207+ }
157208}
0 commit comments