Skip to content

Commit d02b584

Browse files
committed
[fix] #193 추가하기 버튼 로직 수정
1 parent 3abefb4 commit d02b584

File tree

4 files changed

+107
-4
lines changed

4 files changed

+107
-4
lines changed

Projects/App/Sources/MainTab/MainTabPath.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ public extension MainTabFeature {
130130
/// - 링크상세 바텀시트에서 링크수정으로 이동
131131
case let .contentDetail(.presented(.delegate(.editButtonTapped(id)))),
132132
let .pokit(.delegate(.링크수정하기(id))),
133-
let .recommend(.delegate(.추가하기_버튼_눌렀을때(id))),
134133
let .path(.element(_, action: .카테고리상세(.delegate(.링크수정(id))))),
135134
let .path(.element(_, action: .링크목록(.delegate(.링크수정(id))))),
136135
let .path(.element(_, action: .검색(.delegate(.링크수정(id))))),
@@ -193,6 +192,8 @@ public extension MainTabFeature {
193192
default:
194193
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구))), animation: .pokitSpring)
195194
}
195+
case .recommend(.delegate(.저장하기_완료)):
196+
return .send(.inner(.링크팝업_활성화(.success(title: Constants.링크_저장_완료_문구))), animation: .pokitSpring)
196197
/// - 각 화면에서 링크 복사 감지했을 때 (링크 추가 및 수정 화면 제외)
197198
case let .path(.element(_, action: .알림함(.delegate(.linkCopyDetected(url))))),
198199
let .path(.element(_, action: .검색(.delegate(.linkCopyDetected(url))))),

Projects/Domain/Sources/Recommend/Recommend.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public struct Recommend: Equatable {
1414
public var pageable: BasePageable
1515
public var myInterests: [BaseInterest]
1616
public var interests: [BaseInterest]
17+
/// 카테고리(포킷) 리스트
18+
public var categoryListInQuiry: BaseCategoryListInquiry
1719

1820
public init() {
1921
self.contentList = .init(
@@ -28,5 +30,12 @@ public struct Recommend: Equatable {
2830
)
2931
self.myInterests = []
3032
self.interests = []
33+
self.categoryListInQuiry = BaseCategoryListInquiry(
34+
data: [],
35+
page: 0,
36+
size: 0,
37+
sort: [],
38+
hasNext: false
39+
)
3140
}
3241
}

Projects/Feature/FeatureRecommend/Sources/Recommend/RecommendFeature.swift

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

Projects/Feature/FeatureRecommend/Sources/Recommend/RecommendView.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,20 @@ public extension RecommendView {
6060
cancelAction: { send(.경고시트_dismiss) }
6161
)
6262
}
63+
.sheet(isPresented: $store.showSelectSheet) {
64+
PokitSelectSheet(
65+
list: store.pokitList,
66+
selectedItem: $store.selectedPokit,
67+
itemSelected: { item in
68+
send(.포킷선택_항목_눌렀을때(pokit: item))
69+
},
70+
pokitAddAction: { send(.포킷_추가하기_버튼_눌렀을때) }
71+
)
72+
.presentationDragIndicator(.visible)
73+
.pokitPresentationCornerRadius()
74+
.presentationDetents([.height(564)])
75+
.pokitPresentationBackground()
76+
}
6377
}
6478
}
6579
}

0 commit comments

Comments
 (0)