Skip to content

Commit a6659fd

Browse files
committed
[feat] #181 키워드 설정 기능 추가
1 parent d128a6e commit a6659fd

File tree

3 files changed

+105
-59
lines changed

3 files changed

+105
-59
lines changed

Projects/Domain/Sources/PokitCategorySetting/PokitCategorySetting.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public struct PokitCategorySetting: Equatable {
2424
public var categoryImage: BaseCategoryImage?
2525
/// 카테고리 공개 여부(기본값: 공개)
2626
public var openType: BaseOpenType
27-
/// 카테고리 키워드(기본값: default - 미선택)
27+
/// 유저가 선택한 카테고리 키워드(기본값: default - 미선택)
2828
public var keywordType: BaseInterestType
2929

3030
public init(

Projects/Feature/FeatureCategorySetting/Sources/PokitCategorySettingFeature.swift

Lines changed: 94 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Projects/Feature/FeatureCategorySetting/Sources/PokitCategorySettingView.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SwiftUI
99
import ComposableArchitecture
1010
import Domain
1111
import DSKit
12+
import Util
1213
import NukeUI
1314

1415
@ViewAction(for: PokitCategorySettingFeature.self)
@@ -17,7 +18,6 @@ public struct PokitCategorySettingView: View {
1718
@Perception.Bindable
1819
public var store: StoreOf<PokitCategorySettingFeature>
1920
@FocusState private var isFocused: Bool
20-
@State private var isOn = false
2121

2222
/// - Initializer
2323
public init(store: StoreOf<PokitCategorySettingFeature>) {
@@ -51,6 +51,12 @@ public extension PokitCategorySettingView {
5151
delegateSend: { store.send(.scope(.profile($0))) }
5252
)
5353
}
54+
.sheet(isPresented: $store.isKeywordSheetPresented) {
55+
PokitKeywordBottomSheet(
56+
selectedKeywordType: store.selectedKeywordType,
57+
action: { send(.키워드_선택_버튼_눌렀을때($0)) }
58+
)
59+
}
5460
.task { await send(.뷰가_나타났을때).finish() }
5561
}
5662
}
@@ -170,17 +176,17 @@ private extension PokitCategorySettingView {
170176
Group {
171177
if store.isPublicType {
172178
VStack(alignment: .leading, spacing: 4) {
173-
Button(action: {}) {
179+
Button(action: { send(.키워드_바텀시트_활성화(true)) }) {
174180
Text("포킷 키워드")
175181
.pokitFont(.b1(.b))
176182
.foregroundStyle(.pokit(.text(.primary)))
177183
Spacer()
178184
Image(.icon(.arrowRight))
179185
}
180186
.buttonStyle(.plain)
181-
Text("추천을 위해 포킷 키워드를 선택해 주세요.")
187+
Text(store.keywordSelectType.label)
182188
.pokitFont(.detail1)
183-
.foregroundStyle(.pokit(.text(.tertiary)))
189+
.foregroundStyle(store.keywordSelectType.fontColor)
184190
}
185191
.padding(.vertical, 12)
186192
.padding(.leading, 8)

0 commit comments

Comments
 (0)