@@ -21,6 +21,8 @@ public struct PokitCategorySettingFeature {
2121 var pasteboard
2222 @Dependency ( CategoryClient . self)
2323 var categoryClient
24+ @Dependency ( UserClient . self)
25+ var userClient
2426 /// - State
2527 @ObservableState
2628 public struct State : Equatable {
@@ -38,14 +40,21 @@ public struct PokitCategorySettingFeature {
3840 get { domain. imageList }
3941 }
4042
43+ var selectedKeywordType : BaseInterestType {
44+ get { domain. keywordType }
45+ set { domain. keywordType = newValue }
46+ }
47+
4148 var isPublicType : Bool {
4249 get { domain. openType == . 공개 ? true : false }
4350 set { domain. openType = newValue ? . 공개 : . 비공개 }
4451 }
4552
4653 let type : SettingType
4754 let shareType : ShareType
55+ var keywordSelectType : KeywordSelectType = . normal
4856 var isProfileSheetPresented : Bool = false
57+ var isKeywordSheetPresented : Bool = false
4958 var pokitNameTextInpuState : PokitInputStyle . State = . default
5059 @Shared ( . inMemory( " SelectCategory " ) ) var categoryId : Int ?
5160 /// - 포킷 수정 API / 추가 API
@@ -89,6 +98,8 @@ public struct PokitCategorySettingFeature {
8998 case 저장_버튼_눌렀을때
9099 case 뷰가_나타났을때
91100 case 포킷명지우기_버튼_눌렀을때
101+ case 키워드_바텀시트_활성화( Bool )
102+ case 키워드_선택_버튼_눌렀을때( BaseInterestType )
92103 }
93104
94105 public enum InnerAction : Equatable {
@@ -152,6 +163,12 @@ private extension PokitCategorySettingFeature {
152163 /// - View Effect
153164 func handleViewAction( _ action: Action . View , state: inout State ) -> Effect < Action > {
154165 switch action {
166+ case . binding( \. isPublicType) :
167+ if !state. isPublicType {
168+ state. selectedKeywordType = . default
169+ state. keywordSelectType = . normal
170+ }
171+ return . none
155172 case . binding:
156173 return . none
157174
@@ -163,66 +180,77 @@ private extension PokitCategorySettingFeature {
163180 return . none
164181
165182 case . 저장_버튼_눌렀을때:
166- return . run { [ domain = state. domain,
167- type = state. type] send in
168- switch type {
169- case . 추가:
170- guard let image = domain. categoryImage else { return }
171- let request = CategoryEditRequest (
172- categoryName: domain. categoryName,
173- categoryImageId: image. id,
174- openType: domain. openType. title,
175- keywordType: domain. keywordType. title
176- )
177- let response = try await categoryClient. 카테고리_생성 ( request)
178- let responseToCategoryDomain = BaseCategoryItem (
179- id: response. categoryId,
180- userId: 0 ,
181- categoryName: response. categoryName,
182- categoryImage: BaseCategoryImage (
183- imageId: response. categoryImage. imageId,
184- imageURL: response. categoryImage. imageUrl
185- ) ,
186- contentCount: 0 ,
187- createdAt: " " ,
188- //TODO: v2 property 수정
189- openType: domain. openType,
190- keywordType: domain. keywordType,
191- userCount: 0
192- )
193- await send ( . inner( . 카테고리_인메모리_저장( responseToCategoryDomain) ) )
194- await send ( . delegate( . settingSuccess) )
195-
196- case . 수정:
197- guard let categoryId = domain. categoryId else { return }
198- guard let image = domain. categoryImage else { return }
199- let request = CategoryEditRequest (
200- categoryName: domain. categoryName,
201- categoryImageId: image. id,
202- openType: domain. openType. title,
203- keywordType: domain. keywordType. title
204- )
205- let _ = try await categoryClient. 카테고리_수정 ( categoryId, request)
206- await send ( . delegate( . settingSuccess) )
207-
208- case . 공유추가:
209- guard let categoryId = domain. categoryId else { return }
210- guard let image = domain. categoryImage else { return }
211- try await categoryClient. 공유받은_카테고리_저장 (
212- CopiedCategoryRequest (
213- originCategoryId: categoryId,
183+ /// 전체공개 설정을 했는데 키워드 설정을 안했을 때
184+ if state. domain. openType == . 공개
185+ && state. domain. keywordType == . default {
186+ state. keywordSelectType = . warnning
187+ return . none
188+ } else {
189+ return . run { [ domain = state. domain,
190+ type = state. type] send in
191+ switch type {
192+ case . 추가:
193+ guard let image = domain. categoryImage else { return }
194+ let request = CategoryEditRequest (
195+ categoryName: domain. categoryName,
196+ categoryImageId: image. id,
197+ openType: domain. openType. title,
198+ keywordType: domain. keywordType. title
199+ )
200+ let response = try await categoryClient. 카테고리_생성 ( request)
201+ let responseToCategoryDomain = BaseCategoryItem (
202+ id: response. categoryId,
203+ userId: 0 ,
204+ categoryName: response. categoryName,
205+ categoryImage: BaseCategoryImage (
206+ imageId: response. categoryImage. imageId,
207+ imageURL: response. categoryImage. imageUrl
208+ ) ,
209+ contentCount: 0 ,
210+ createdAt: " " ,
211+ //TODO: v2 property 수정
212+ openType: domain. openType,
213+ keywordType: domain. keywordType,
214+ userCount: 0
215+ )
216+ await send ( . inner( . 카테고리_인메모리_저장( responseToCategoryDomain) ) )
217+ await send ( . delegate( . settingSuccess) )
218+
219+ case . 수정:
220+ guard let categoryId = domain. categoryId else { return }
221+ guard let image = domain. categoryImage else { return }
222+ let request = CategoryEditRequest (
214223 categoryName: domain. categoryName,
215- categoryImageId: image. id
224+ categoryImageId: image. id,
225+ openType: domain. openType. title,
226+ keywordType: domain. keywordType. title
216227 )
217- )
218- await send ( . delegate( . settingSuccess) )
228+ let _ = try await categoryClient. 카테고리_수정 ( categoryId, request)
229+ await send ( . delegate( . settingSuccess) )
230+
231+ case . 공유추가:
232+ guard let categoryId = domain. categoryId else { return }
233+ guard let image = domain. categoryImage else { return }
234+ try await categoryClient. 공유받은_카테고리_저장 (
235+ CopiedCategoryRequest (
236+ originCategoryId: categoryId,
237+ categoryName: domain. categoryName,
238+ categoryImageId: image. id
239+ )
240+ )
241+ await send ( . delegate( . settingSuccess) )
242+ }
243+ } catch: { error, send in
244+ guard let errorResponse = error as? ErrorResponse else { return }
245+ await send ( . inner( . 포킷_오류_핸들링( BaseError ( response: errorResponse) ) ) )
219246 }
220- } catch: { error, send in
221- guard let errorResponse = error as? ErrorResponse else { return }
222- await send ( . inner( . 포킷_오류_핸들링( BaseError ( response: errorResponse) ) ) )
223247 }
224248
225249 case . 뷰가_나타났을때:
250+ let selectType = state. selectedKeywordType
251+ if selectType != . default {
252+ state. keywordSelectType = . select( keywordName: selectType. title)
253+ }
226254 /// 단순 조회API들의 나열이라 merge사용
227255 return . merge(
228256 . send( . async( . 프로필_목록_조회_API) ) ,
@@ -231,6 +259,18 @@ private extension PokitCategorySettingFeature {
231259 case . 포킷명지우기_버튼_눌렀을때:
232260 state. domain. categoryName = " "
233261 return . none
262+
263+ case let . 키워드_바텀시트_활성화( isActive) :
264+ state. isKeywordSheetPresented = isActive
265+ return . none
266+
267+ //TODO: 액션 마이그레이션 시 반영
268+ case let . 키워드_선택_버튼_눌렀을때( type) :
269+ state. domain. keywordType = type
270+ state. keywordSelectType = . select( keywordName: type. title)
271+ return . run { send in
272+ await send ( . view( . 키워드_바텀시트_활성화( false ) ) )
273+ }
234274 }
235275 }
236276
0 commit comments