77import ComposableArchitecture
88import CoreKit
99import Domain
10+ import DSKit
11+ import FeatureCategorySetting
1012import Util
1113
1214@Reducer
@@ -18,6 +20,7 @@ public struct PokitLinkEditFeature {
1820 /// - State
1921 @ObservableState
2022 public struct State : Equatable {
23+ @Presents var addPokit : PokitCategorySettingFeature . State ?
2124 /// 링크 아이템 Doamin
2225 var item : BaseContentListInquiry
2326 /// 카테고리 아이템 Domain
@@ -27,7 +30,9 @@ public struct PokitLinkEditFeature {
2730 /// 선택한 링크 목록
2831 var selectedItems = IdentifiedArrayOf < BaseContentItem > ( )
2932 /// 포킷 이동 눌렀을 때 sheet
30- var isPresented : Bool = false
33+ var categorySelectSheetPresetend : Bool = false
34+ var linkDeleteSheetPresented : Bool = false
35+ var linkPopup : PokitLinkPopup . PopupType ?
3136
3237 public init ( linkList: BaseContentListInquiry ) {
3338 self . item = linkList
@@ -49,22 +54,31 @@ public struct PokitLinkEditFeature {
4954 public enum View : BindableAction , Equatable {
5055 case binding( BindingAction < State > )
5156 case dismiss
52- case onAppear
5357
54- case 카테고리_추가_버튼_눌렀을때
58+ case 뷰가_나타났을때
59+ case 포킷_추가하기_버튼_눌렀을때
60+ case 링크팝업_버튼_눌렀을때
61+ case 경고시트_해제
62+ case 삭제확인_버튼_눌렀을때
5563 case 체크박스_선택했을때( BaseContentItem )
5664 case 카테고리_선택했을때( BaseCategoryItem )
5765 }
5866
59- public enum InnerAction : Equatable {
67+ public enum InnerAction {
68+ case error( Error )
69+ case 카테고리_이동_시트_활성화( Bool )
70+ case 카테고리_삭제_시트_활성화( Bool )
71+ case 경고팝업_활성화( PokitLinkPopup . PopupType )
6072 case 카테고리_목록_조회_API_반영( BaseCategoryListInquiry )
61- case 미분류_카테고리_이동_API_반영
73+ case 미분류_API_반영 ( LinkEditType )
6274 }
6375
6476 public enum AsyncAction : Equatable { case 없음 }
6577
66- public enum ScopeAction : Equatable {
78+ @CasePathable
79+ public enum ScopeAction {
6780 case floatButtonAction( PokitLinkEditFloatView . Delegate )
81+ case addPokit( PresentationAction < PokitCategorySettingFeature . Action > )
6882 }
6983
7084 public enum DelegateAction : Equatable { case 없음 }
@@ -102,6 +116,9 @@ public struct PokitLinkEditFeature {
102116 public var body : some ReducerOf < Self > {
103117 BindingReducer ( action: \. view)
104118 Reduce ( self . core)
119+ . ifLet ( \. $addPokit, action: \. scope. addPokit) {
120+ PokitCategorySettingFeature ( )
121+ }
105122 }
106123}
107124//MARK: - FeatureAction Effect
@@ -115,12 +132,21 @@ private extension PokitLinkEditFeature {
115132 case . dismiss:
116133 return . run { _ in await dismiss ( ) }
117134
118- case . onAppear :
135+ case . 뷰가_나타났을때 :
119136 return fetchCateogryList ( )
120137
121- case . 카테고리_추가_버튼_눌렀을때:
138+ case . 포킷_추가하기_버튼_눌렀을때:
139+ state. categorySelectSheetPresetend = false
140+ state. linkDeleteSheetPresented = false
141+ state. addPokit = PokitCategorySettingFeature . State ( type: . 추가)
122142 return . none
123143
144+ case . 경고시트_해제:
145+ return . send( . inner( . 카테고리_삭제_시트_활성화( false ) ) )
146+
147+ case . 삭제확인_버튼_눌렀을때:
148+ return linkDelete ( state: & state)
149+
124150 case let . 체크박스_선택했을때( item) :
125151 /// 이미 체크되어 있다면 해제
126152 if state. selectedItems. contains ( item) {
@@ -131,20 +157,60 @@ private extension PokitLinkEditFeature {
131157 return . none
132158
133159 case let . 카테고리_선택했을때( pokit) :
134- return moveContentList ( categoryId: pokit. id, state: & state)
160+ /// 🚨 Error Case [1]: 체크한 것이 없는데 카테고리를 선택했을 때
161+ if state. selectedItems. isEmpty {
162+ return . merge(
163+ . send( . inner( . 카테고리_이동_시트_활성화( false ) ) ) ,
164+ . send( . inner( . 경고팝업_활성화( . error( title: " 링크를 선택해주세요. " ) ) ) )
165+ )
166+ } else {
167+ return moveContentList ( categoryId: pokit. id, state: & state)
168+ }
169+
170+ case . 링크팝업_버튼_눌렀을때:
171+ state. linkPopup = nil
172+ return . none
135173 }
136174 }
137175
138176 /// - Inner Effect
139177 func handleInnerAction( _ action: Action . InnerAction , state: inout State ) -> Effect < Action > {
140178 switch action {
179+ case let . error( error) :
180+ guard let errorResponse = error as? ErrorResponse else { return . none }
181+ state. categorySelectSheetPresetend = false
182+ state. linkDeleteSheetPresented = false
183+ return . merge(
184+ . send( . inner( . 카테고리_이동_시트_활성화( false ) ) ) ,
185+ . send( . inner( . 카테고리_삭제_시트_활성화( false ) ) ) ,
186+ . send( . inner( . 경고팝업_활성화( . error( title: errorResponse. message) ) ) ,
187+ animation: . pokitSpring
188+ )
189+ )
190+
191+ case let . 경고팝업_활성화( type) :
192+ state. linkPopup = type
193+ return . none
194+
195+ case let . 카테고리_이동_시트_활성화( isPresented) :
196+ state. categorySelectSheetPresetend = isPresented
197+ return . none
198+
199+ case let . 카테고리_삭제_시트_활성화( isPresented) :
200+ state. linkDeleteSheetPresented = isPresented
201+ return . none
202+
141203 case let . 카테고리_목록_조회_API_반영( response) :
142204 state. category = response
143205 return . none
144206
145- case . 미분류_카테고리_이동_API_반영 :
207+ case let . 미분류_API_반영 ( type ) :
146208 /// 1. 시트 내리기
147- state. isPresented = false
209+ if type == . 링크이동 {
210+ state. categorySelectSheetPresetend = false
211+ } else {
212+ state. linkDeleteSheetPresented = false
213+ }
148214 /// 2. 선택했던 체크리스트 삭제
149215 state. selectedItems
150216 . map { $0. id }
@@ -165,7 +231,11 @@ private extension PokitLinkEditFeature {
165231 case let . floatButtonAction( delegate) :
166232 switch delegate {
167233 case . 링크삭제_버튼_눌렀을때:
168- return . none
234+ if state. selectedItems. isEmpty {
235+ return . send( . inner( . 경고팝업_활성화( . error( title: " 링크를 선택해주세요. " ) ) ) )
236+ } else {
237+ return . send( . inner( . 카테고리_삭제_시트_활성화( true ) ) )
238+ }
169239
170240 case . 전체선택_버튼_눌렀을때:
171241 state. selectedItems = state. list
@@ -176,9 +246,18 @@ private extension PokitLinkEditFeature {
176246 return . none
177247
178248 case . 포킷이동_버튼_눌렀을때:
179- state. isPresented = true
180- return . none
249+ return . send( . inner( . 카테고리_이동_시트_활성화( true ) ) )
181250 }
251+
252+ case . addPokit( . presented( . delegate( . settingSuccess) ) ) :
253+ state. addPokit = nil
254+ return . merge(
255+ fetchCateogryList ( ) ,
256+ . send( . inner( . 카테고리_이동_시트_활성화( true ) ) )
257+ )
258+
259+ case . addPokit:
260+ return . none
182261 }
183262 }
184263
@@ -202,7 +281,25 @@ private extension PokitLinkEditFeature {
202281 let contentIds = contentIds. map { $0. id }
203282 let request = ContentMoveRequest ( contentIds: contentIds, categoryId: categoryId)
204283 try await contentClient. 미분류_링크_포킷_이동 ( request)
205- await send ( . inner( . 미분류_카테고리_이동_API_반영) )
284+ await send ( . inner( . 미분류_API_반영( . 링크이동) ) )
285+ } catch: { error, send in
286+ await send ( . inner( . error( error) ) )
287+ }
288+ }
289+
290+ func linkDelete( state: inout State ) -> Effect < Action > {
291+ return . run { [ contentIds = state. selectedItems. ids] send in
292+ let request = ContentDeleteRequest ( contentId: Array ( contentIds) )
293+ try await contentClient. 미분류_링크_삭제 ( request)
294+ await send ( . inner( . 미분류_API_반영( . 링크삭제) ) )
295+ } catch: { error, send in
296+ await send ( . inner( . error( error) ) )
206297 }
207298 }
208299}
300+ public extension PokitLinkEditFeature {
301+ enum LinkEditType : Equatable {
302+ case 링크이동
303+ case 링크삭제
304+ }
305+ }
0 commit comments