Skip to content

Commit c8a0d5d

Browse files
authored
Merge pull request #195 from YAPP-Github/fix/#193-link-recommend
fix: 2.0.0 QA [2]
2 parents 33c70b7 + 058bcb8 commit c8a0d5d

File tree

8 files changed

+121
-24
lines changed

8 files changed

+121
-24
lines changed

β€ŽProjects/App/Sources/MainTab/MainTabPath.swiftβ€Ž

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ public extension MainTabFeature {
9393
/// - 포킷 `μΆ”κ°€` λ²„νŠΌ λˆŒλ €μ„ λ•Œ
9494
case .delegate(.ν¬ν‚·μΆ”κ°€ν•˜κΈ°),
9595
.path(.element(_, action: .λ§ν¬μΆ”κ°€λ°μˆ˜μ •(.delegate(.ν¬ν‚·μΆ”κ°€ν•˜κΈ°)))),
96-
.pokit(.delegate(.포킷좔가_λ²„νŠΌ_λˆŒλ €μ„λ•Œ)):
96+
.pokit(.delegate(.포킷좔가_λ²„νŠΌ_λˆŒλ €μ„λ•Œ)),
97+
.recommend(.delegate(.포킷_μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ)):
9798
state.path.append(.ν¬ν‚·μΆ”κ°€λ°μˆ˜μ •(PokitCategorySettingFeature.State(type: .μΆ”κ°€)))
9899
return .none
99100

@@ -130,7 +131,6 @@ public extension MainTabFeature {
130131
/// - 링크상세 λ°”ν…€μ‹œνŠΈμ—μ„œ λ§ν¬μˆ˜μ •μœΌλ‘œ 이동
131132
case let .contentDetail(.presented(.delegate(.editButtonTapped(id)))),
132133
let .pokit(.delegate(.λ§ν¬μˆ˜μ •ν•˜κΈ°(id))),
133-
let .recommend(.delegate(.μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(id))),
134134
let .path(.element(_, action: .μΉ΄ν…Œκ³ λ¦¬μƒμ„Έ(.delegate(.λ§ν¬μˆ˜μ •(id))))),
135135
let .path(.element(_, action: .링크λͺ©λ‘(.delegate(.λ§ν¬μˆ˜μ •(id))))),
136136
let .path(.element(_, action: .검색(.delegate(.λ§ν¬μˆ˜μ •(id))))),
@@ -193,6 +193,8 @@ public extension MainTabFeature {
193193
default:
194194
return .send(.inner(.λ§ν¬νŒμ—…_ν™œμ„±ν™”(.success(title: Constants.링크_μ €μž₯_μ™„λ£Œ_문ꡬ))), animation: .pokitSpring)
195195
}
196+
case .recommend(.delegate(.μ €μž₯ν•˜κΈ°_μ™„λ£Œ)):
197+
return .send(.inner(.λ§ν¬νŒμ—…_ν™œμ„±ν™”(.success(title: Constants.링크_μ €μž₯_μ™„λ£Œ_문ꡬ))), animation: .pokitSpring)
196198
/// - 각 ν™”λ©΄μ—μ„œ 링크 볡사 κ°μ§€ν–ˆμ„ λ•Œ (링크 μΆ”κ°€ 및 μˆ˜μ • ν™”λ©΄ μ œμ™Έ)
197199
case let .path(.element(_, action: .μ•Œλ¦Όν•¨(.delegate(.linkCopyDetected(url))))),
198200
let .path(.element(_, action: .검색(.delegate(.linkCopyDetected(url))))),

β€ŽProjects/DSKit/Sources/Foundation/PokitButtonStyle.swiftβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ extension PokitButtonStyle.State {
4949
red: 67 / 255,
5050
green: 67 / 255,
5151
blue: 67 / 255
52-
).opacity(0.4)
52+
).opacity(0.7)
5353
}
5454
}
5555

β€ŽProjects/DSKit/Sources/Foundation/PokitImage.swiftβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public enum PokitImage {
5050
case .trash:
5151
return DSKitAsset.iconTrash.swiftUIImage
5252
case .plusR:
53-
return DSKitAsset.iconPlus.swiftUIImage
53+
return DSKitAsset.iconPlusR.swiftUIImage
5454
case .remind:
5555
return DSKitAsset.iconRemind.swiftUIImage
5656
case .reminder:

β€Ž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/FeatureCategorySetting/Sources/PokitCategorySettingView.swiftβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ public extension PokitCategorySettingView {
6161
action: { send(.ν‚€μ›Œλ“œ_선택_λ²„νŠΌ_λˆŒλ €μ„λ•Œ($0)) }
6262
)
6363
}
64+
.ignoresSafeArea(.container, edges: .bottom)
6465
.task { await send(.λ·°κ°€_λ‚˜νƒ€λ‚¬μ„λ•Œ).finish() }
6566
}
6667
}

β€ŽProjects/Feature/FeatureRecommend/Sources/Recommend/RecommendFeature.swiftβ€Ž

Lines changed: 87 additions & 11 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,15 +108,18 @@ 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_반영
122+
case 포킷_μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ
109123
}
110124
}
111125

@@ -158,7 +172,9 @@ private extension RecommendFeature {
158172
case .pagination:
159173
return shared(.async(.μΆ”μ²œ_쑰회_νŽ˜μ΄μ§•_API), state: &state)
160174
case let .μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(content):
161-
return .send(.delegate(.μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(content.id)))
175+
state.addContent = content
176+
state.showSelectSheet = true
177+
return shared(.async(.μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회_API), state: &state)
162178
case let .κ³΅μœ ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(content):
163179
state.shareContent = content
164180
return .none
@@ -170,6 +186,7 @@ private extension RecommendFeature {
170186
return .none
171187
case let .전체보기_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(proxy):
172188
guard state.selectedInterest != nil else { return .none }
189+
state.domain.contentList.data = nil
173190

174191
state.selectedInterest = nil
175192
let leading = 20 / UIScreen.main.bounds.width
@@ -178,19 +195,13 @@ private extension RecommendFeature {
178195
y: UnitPoint.leading.y
179196
)
180197
proxy.scrollTo("전체보기", anchor: anchor)
181-
state.domain.contentList.data = nil
182198
return shared(.async(.μΆ”μ²œ_쑰회_API), state: &state)
183199
case let .관심사_λ²„νŠΌ_λˆŒλ €μ„λ•Œ(interest, proxy):
184200
guard state.selectedInterest != interest else { return .none }
201+
state.domain.contentList.data = nil
185202

186203
state.selectedInterest = interest
187-
let leading = 20 / UIScreen.main.bounds.width
188-
let anchor = UnitPoint(
189-
x: leading,
190-
y: UnitPoint.leading.y
191-
)
192-
proxy.scrollTo(interest.description, anchor: anchor)
193-
state.domain.contentList.data = nil
204+
proxy.scrollTo(interest.description, anchor: .leading)
194205
return shared(.async(.μΆ”μ²œ_쑰회_API), state: &state)
195206
case .링크_곡유_μ™„λ£Œλ˜μ—ˆμ„λ•Œ:
196207
state.shareContent = nil
@@ -216,6 +227,13 @@ private extension RecommendFeature {
216227
case .κ²½κ³ μ‹œνŠΈ_dismiss:
217228
state.reportContent = nil
218229
return .none
230+
case .포킷선택_ν•­λͺ©_λˆŒλ €μ„λ•Œ(pokit: let pokit):
231+
state.selectedPokit = pokit
232+
state.showSelectSheet = false
233+
return shared(.async(.컨텐츠_μΆ”κ°€_API), state: &state)
234+
case .포킷_μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ:
235+
state.showSelectSheet = false
236+
return .send(.delegate(.포킷_μΆ”κ°€ν•˜κΈ°_λ²„νŠΌ_λˆŒλ €μ„λ•Œ))
219237
}
220238
}
221239

@@ -247,6 +265,30 @@ private extension RecommendFeature {
247265
case let .컨텐츠_μ‹ κ³ _API_반영(contentId):
248266
state.domain.contentList.data?.removeAll(where: { $0.id == contentId })
249267
return .send(.delegate(.컨텐츠_μ‹ κ³ _API_반영))
268+
case .μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회_API_반영(categoryList: let categoryList):
269+
/// - `μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회`의 filter μ˜΅μ…˜μ„ `false`둜 ν•΄λ‘μ—ˆκΈ° λ•Œλ¬Έμ— `λ―ΈλΆ„λ₯˜` μΉ΄ν…Œκ³ λ¦¬ λ˜ν•œ ν•­λͺ©μ—μ„œ μ‘°νšŒκ°€ κ°€λŠ₯함
270+
271+
/// [1]. `λ―ΈλΆ„λ₯˜`에 ν•΄λ‹Ήν•˜λŠ” 인덱슀 λ²ˆν˜Έμ™€ ν•­λͺ©μ„ 체크, μ—†λ‹€λ©΄ λͺ©λ‘κ°±μ‹ μ΄ λΆˆκ°€ν•¨
272+
guard
273+
let unclassifiedItemIdx = categoryList.data?.firstIndex(where: {
274+
$0.categoryName == "λ―ΈλΆ„λ₯˜"
275+
})
276+
else { return .none }
277+
guard
278+
let unclassifiedItem = categoryList.data?.first(where: {
279+
$0.categoryName == "λ―ΈλΆ„λ₯˜"
280+
})
281+
else { return .none }
282+
283+
/// [2]. μƒˆλ‘œμš΄ listλ³€μˆ˜λ₯Ό λ§Œλ“€μ–΄μ£Όκ³  μΉ΄ν…Œκ³ λ¦¬ ν•­λͺ© μˆœμ„œλ₯Ό 재배치 (μ΅œμ‹ μˆœ μ •λ ¬ μ‹œ λ―ΈλΆ„λ₯˜λŠ” 항상 맨 λ§ˆμ§€λ§‰)
284+
var list = categoryList
285+
list.data?.remove(at: unclassifiedItemIdx)
286+
list.data?.insert(unclassifiedItem, at: 0)
287+
288+
/// [3]. 도메인 ν•­λͺ© λ¦¬μŠ€νŠΈμ— list ν• λ‹Ή
289+
state.domain.categoryListInQuiry = list
290+
state.selectedPokit = unclassifiedItem
291+
return .none
250292
}
251293
}
252294

@@ -291,6 +333,33 @@ private extension RecommendFeature {
291333
animation: .pokitSpring
292334
)
293335
}
336+
case .μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회_API:
337+
let request = BasePageableRequest(
338+
page: state.domain.pageable.page,
339+
size: 30,
340+
sort: state.domain.pageable.sort
341+
)
342+
return categoryListFetch(request: request)
343+
case .컨텐츠_μΆ”κ°€_API:
344+
guard
345+
let categoryId = state.selectedPokit?.id,
346+
let category = state.domain.categoryListInQuiry.data?.first(where: {
347+
$0.id == categoryId
348+
}),
349+
let content = state.addContent
350+
else { return .none }
351+
let request = ContentBaseRequest(
352+
data: content.data,
353+
title: content.title,
354+
categoryId: categoryId,
355+
memo: content.memo ?? "",
356+
alertYn: "NO",
357+
thumbNail: content.thumbNail
358+
)
359+
return .run { send in
360+
let content = try await contentClient.컨텐츠_μΆ”κ°€(request)
361+
await send(.delegate(.μ €μž₯ν•˜κΈ°_μ™„λ£Œ))
362+
}
294363
}
295364
}
296365

@@ -353,4 +422,11 @@ private extension RecommendFeature {
353422
await send(.inner(.μΆ”μ²œ_쑰회_API_반영(contentItems)), animation: .pokitDissolve)
354423
}
355424
}
425+
426+
func categoryListFetch(request: BasePageableRequest) -> Effect<Action> {
427+
return .run { send in
428+
let categoryList = try await categoryClient.μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회(request, false, true).toDomain()
429+
await send(.inner(.μΉ΄ν…Œκ³ λ¦¬_λͺ©λ‘_쑰회_API_반영(categoryList: categoryList)), animation: .pokitDissolve)
430+
}
431+
}
356432
}

β€ŽProjects/Feature/FeatureRecommend/Sources/Recommend/RecommendView.swiftβ€Ž

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ public struct RecommendView: View {
2626
public extension RecommendView {
2727
var body: some View {
2828
WithPerceptionTracking {
29-
VStack(spacing: 10) {
29+
VStack(spacing: 0) {
3030
interestList
31+
.background(.pokit(.bg(.base)))
3132

3233
list
3334
}
35+
.background(.pokit(.bg(.primary)))
3436
.ignoresSafeArea(edges: .bottom)
3537
.sheet(item: $store.shareContent) { content in
3638
if let shareURL = URL(string: content.data) {
@@ -58,6 +60,20 @@ public extension RecommendView {
5860
cancelAction: { send(.κ²½κ³ μ‹œνŠΈ_dismiss) }
5961
)
6062
}
63+
.sheet(isPresented: $store.showSelectSheet) {
64+
PokitSelectSheet(
65+
list: store.pokitList,
66+
selectedItem: .constant(nil),
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+
}
6177
}
6278
}
6379
}
@@ -180,6 +196,7 @@ private extension RecommendView {
180196
}
181197
.padding(.horizontal, 20)
182198
.padding(.bottom, 150)
199+
.padding(.top, 12)
183200
}
184201
}
185202

β€ŽProjects/Feature/FeatureSetting/Sources/Search/PokitSearchView.swiftβ€Ž

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,6 @@ private extension PokitSearchView {
265265

266266
var resultList: some View {
267267
VStack(alignment: .leading, spacing: 20) {
268-
PokitIconLTextLink(
269-
store.isResultAscending ? "였래된순" : "μ΅œμ‹ μˆœ",
270-
icon: .icon(.align),
271-
action: { send(.μ •λ ¬_λ²„νŠΌ_λˆŒλ €μ„λ•Œ) }
272-
)
273-
.contentTransition(.numericText())
274-
.padding(.horizontal, 20)
275-
276268
if !store.isLoading {
277269
ScrollView {
278270
LazyVStack(spacing: 0) {

0 commit comments

Comments
Β (0)