Skip to content

Commit 842a4a9

Browse files
authored
Merge pull request #189 from YAPP-Github/feat/#183-pokit-detail
feat: [2.0.0] ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์— ๋”ฐ๋ฅธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •(์นดํ…Œ๊ณ ๋ฆฌ ์ƒ์„ธ)
2 parents 9aca4aa + dc6a8d5 commit 842a4a9

File tree

7 files changed

+269
-73
lines changed

7 files changed

+269
-73
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ public extension MainTabFeature {
171171
state.path.append(.๋งํฌ์ถ”๊ฐ€๋ฐ์ˆ˜์ •(ContentSettingFeature.State(urlText: state.link)))
172172
state.link = nil
173173
return .none
174+
175+
case let .path(.element(_, action: .์นดํ…Œ๊ณ ๋ฆฌ์ƒ์„ธ(.delegate(.๋งํฌ์ถ”๊ฐ€(categoryId))))):
176+
state.categoryId = categoryId
177+
state.path.append(.๋งํฌ์ถ”๊ฐ€๋ฐ์ˆ˜์ •(ContentSettingFeature.State()))
178+
return .none
174179

175180
/// - ๋งํฌ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •์—์„œ ์ €์žฅํ•˜๊ธฐ ๋ˆŒ๋ €์„ ๋•Œ
176181
case let .path(.element(stackElementId, action: .๋งํฌ์ถ”๊ฐ€๋ฐ์ˆ˜์ •(.delegate(.์ €์žฅํ•˜๊ธฐ_์™„๋ฃŒ(contentId))))):

โ€ŽProjects/DSKit/Sources/Components/PokitBottomSheet.swiftโ€Ž

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
import SwiftUI
99

1010
public struct PokitBottomSheet: View {
11+
@State
12+
private var height: CGFloat
1113
private let items: [Item]
12-
private let height: CGFloat
1314
private let delegateSend: ((PokitBottomSheet.Delegate) -> Void)?
1415

1516
public init(
1617
items: [Item],
17-
height: CGFloat,
18+
height: CGFloat = 0,
1819
delegateSend: ((PokitBottomSheet.Delegate) -> Void)?
1920
) {
2021
self.items = items
@@ -30,6 +31,16 @@ public struct PokitBottomSheet: View {
3031
.presentationDetents([.height(height)])
3132
.pokitPresentationCornerRadius()
3233
.pokitPresentationBackground()
34+
.readHeight()
35+
.onPreferenceChange(HeightPreferenceKey.self) { height in
36+
if let height {
37+
print("height:", height)
38+
self.height = height
39+
}
40+
}
41+
.ignoresSafeArea(.all)
42+
.padding(.top, 12)
43+
.padding(.bottom, -20)
3344
}
3445

3546
@ViewBuilder
@@ -120,3 +131,18 @@ public extension PokitBottomSheet {
120131
}
121132
}
122133

134+
@available(iOS 18.0, *)
135+
#Preview {
136+
@Previewable
137+
@State var isPresented: Bool = true
138+
139+
ZStack {
140+
Color.green.ignoresSafeArea()
141+
}
142+
.sheet(isPresented: $isPresented) {
143+
PokitBottomSheet(
144+
items: [.share, .edit, .delete],
145+
delegateSend: { _ in }
146+
)
147+
}
148+
}

โ€ŽProjects/DSKit/Sources/Components/PokitCaution.swiftโ€Ž

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@ import SwiftUI
1010
public enum CautionType {
1111
case ์นดํ…Œ๊ณ ๋ฆฌ์—†์Œ
1212
case ๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ
13+
case ํฌํ‚ท์ƒ์„ธ_๋งํฌ์—†์Œ
1314
case ๋งํฌ์—†์Œ
1415
case ์ฆ๊ฒจ์ฐพ๊ธฐ_๋งํฌ์—†์Œ
1516
case ๋งํฌ๋ถ€์กฑ
1617
case ์•Œ๋ฆผ์—†์Œ
1718

1819
var image: PokitImage.Character {
1920
switch self {
20-
case .์นดํ…Œ๊ณ ๋ฆฌ์—†์Œ, .๋งํฌ์—†์Œ, .์ฆ๊ฒจ์ฐพ๊ธฐ_๋งํฌ์—†์Œ, .๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ:
21-
return .empty
2221
case .๋งํฌ๋ถ€์กฑ:
2322
return .sad
23+
2424
case .์•Œ๋ฆผ์—†์Œ:
2525
return .pooki
26+
27+
default: return .empty
2628
}
2729
}
2830

@@ -32,7 +34,7 @@ public enum CautionType {
3234
return "์ €์žฅ๋œ ํฌํ‚ท์ด ์—†์–ด์š”!"
3335
case .๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ:
3436
return "๋ฏธ๋ถ„๋ฅ˜ ๋งํฌ๊ฐ€ ์—†์–ด์š”!"
35-
case .๋งํฌ์—†์Œ:
37+
case .๋งํฌ์—†์Œ, .ํฌํ‚ท์ƒ์„ธ_๋งํฌ์—†์Œ:
3638
return "์ €์žฅ๋œ ๋งํฌ๊ฐ€ ์—†์–ด์š”!"
3739
case .์ฆ๊ฒจ์ฐพ๊ธฐ_๋งํฌ์—†์Œ:
3840
return "์ฆ๊ฒจ์ฐพ๊ธฐ ๋งํฌ๊ฐ€ ์—†์–ด์š”!"
@@ -49,6 +51,8 @@ public enum CautionType {
4951
return "ํฌํ‚ท์„ ์ƒ์„ฑํ•ด ๋งํฌ๋ฅผ ์ €์žฅํ•ด๋ณด์„ธ์š”"
5052
case .๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ:
5153
return "๋งํฌ๋ฅผ ํฌํ‚ท์— ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฅ˜ํ•˜์…จ์–ด์š”"
54+
case .ํฌํ‚ท์ƒ์„ธ_๋งํฌ์—†์Œ:
55+
return "ํฌํ‚ท์— ๋งํฌ๋ฅผ ์ €์žฅํ•ด๋ณด์„ธ์š”"
5256
case .๋งํฌ์—†์Œ:
5357
return "๋‹ค์–‘ํ•œ ๋งํฌ๋ฅผ ํ•œ ๊ณณ์— ์ €์žฅํ•ด๋ณด์„ธ์š”"
5458
case .์ฆ๊ฒจ์ฐพ๊ธฐ_๋งํฌ์—†์Œ:
@@ -64,7 +68,7 @@ public enum CautionType {
6468
switch self {
6569
case .์นดํ…Œ๊ณ ๋ฆฌ์—†์Œ:
6670
return "ํฌํ‚ท ์ถ”๊ฐ€ํ•˜๊ธฐ"
67-
case .๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ:
71+
case .๋ฏธ๋ถ„๋ฅ˜_๋งํฌ์—†์Œ, .ํฌํ‚ท์ƒ์„ธ_๋งํฌ์—†์Œ:
6872
return "๋งํฌ ์ถ”๊ฐ€ํ•˜๊ธฐ"
6973
default: return nil
7074
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//
2+
// PokitFloatButtonModifier.swift
3+
// DSKit
4+
//
5+
// Created by ๊น€๋ฏผํ˜ธ on 1/16/25.
6+
//
7+
import SwiftUI
8+
9+
private struct PokitFloatButtonModifier: ViewModifier {
10+
let action: () -> Void
11+
12+
func body(content: Content) -> some View {
13+
content
14+
.overlay(alignment: .bottomTrailing) {
15+
Button(action: action) {
16+
Image(.icon(.plus))
17+
.resizable()
18+
.frame(width: 36, height: 36)
19+
.padding(12)
20+
.foregroundStyle(.pokit(.icon(.inverseWh)))
21+
.background {
22+
RoundedRectangle(cornerRadius: 9999, style: .continuous)
23+
.fill(.pokit(.bg(.brand)))
24+
}
25+
.frame(width: 60, height: 60)
26+
}
27+
.padding(.trailing, 20)
28+
.padding(.bottom, 39)
29+
}
30+
}
31+
}
32+
33+
public extension View {
34+
func pokitFloatButton(action: @escaping () -> Void) -> some View {
35+
return self.modifier(PokitFloatButtonModifier(action: action))
36+
}
37+
}
38+
39+
#Preview {
40+
ZStack {
41+
Color.black.ignoresSafeArea()
42+
.pokitFloatButton(action: {})
43+
}
44+
}

โ€ŽProjects/Feature/FeatureCategoryDetail/Sources/CategoryDetailFeature.swiftโ€Ž

Lines changed: 49 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public struct CategoryDetailFeature {
4040
var isFavoriteFiltered: Bool {
4141
get { domain.condition.isFavoriteFlitered }
4242
}
43+
var isFavoriteCategory: Bool {
44+
get { domain.category.isFavorite }
45+
}
4346

4447
var sortType: SortType = .์ตœ์‹ ์ˆœ
4548
var categories: IdentifiedArrayOf<BaseCategoryItem>? {
@@ -57,7 +60,6 @@ public struct CategoryDetailFeature {
5760
var isCategorySheetPresented: Bool = false
5861
var isCategorySelectSheetPresented: Bool = false
5962
var isPokitDeleteSheetPresented: Bool = false
60-
var isFilterSheetPresented: Bool = false
6163
/// pagenation
6264
var hasNext: Bool {
6365
domain.contentList.hasNext
@@ -83,11 +85,16 @@ public struct CategoryDetailFeature {
8385
case binding(BindingAction<State>)
8486
case dismiss
8587
case pagenation
88+
89+
/// ์ฆ๊ฒจ์ฐพ๊ธฐ or ์•ˆ์ฝ์Œ ๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ
90+
case ๋ถ„๋ฅ˜_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ(SortCollectType)
91+
case ์ •๋ ฌ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
92+
case ๊ณต์œ _๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
8693
case ์นดํ…Œ๊ณ ๋ฆฌ_์ผ€๋ฐฅ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
8794
case ์นดํ…Œ๊ณ ๋ฆฌ_์„ ํƒ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
8895
case ์นดํ…Œ๊ณ ๋ฆฌ_์„ ํƒํ–ˆ์„๋•Œ(BaseCategoryItem)
89-
case ํ•„ํ„ฐ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
9096
case ๋ทฐ๊ฐ€_๋‚˜ํƒ€๋‚ฌ์„๋•Œ
97+
case ๋งํฌ_์ถ”๊ฐ€_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ
9198
}
9299

93100
public enum InnerAction: Equatable {
@@ -111,14 +118,14 @@ public struct CategoryDetailFeature {
111118
public enum ScopeAction {
112119
case categoryBottomSheet(PokitBottomSheet.Delegate)
113120
case categoryDeleteBottomSheet(PokitDeleteBottomSheet.Delegate)
114-
case filterBottomSheet(CategoryFilterSheet.Delegate)
115121
case contents(IdentifiedActionOf<ContentCardFeature>)
116122
}
117123

118124
public enum DelegateAction: Equatable {
119125
case contentItemTapped(BaseContentItem)
120126
case linkCopyDetected(URL?)
121127
case ๋งํฌ์ˆ˜์ •(contentId: Int)
128+
case ๋งํฌ์ถ”๊ฐ€(categoryId: Int)
122129
case ํฌํ‚ท์‚ญ์ œ
123130
case ํฌํ‚ท์ˆ˜์ •(BaseCategoryItem)
124131
case ํฌํ‚ท๊ณต์œ 
@@ -174,6 +181,45 @@ private extension CategoryDetailFeature {
174181
case .binding:
175182
return .none
176183

184+
case .์ •๋ ฌ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ:
185+
state.sortType = state.sortType == .์ตœ์‹ ์ˆœ
186+
? .์˜ค๋ž˜๋œ์ˆœ
187+
: .์ตœ์‹ ์ˆœ
188+
189+
state.domain.pageable.sort = [
190+
state.sortType == .์ตœ์‹ ์ˆœ ? "createdAt,desc" : "createdAt,asc"
191+
]
192+
193+
return .concatenate(
194+
.send(.inner(.pagenation_์ดˆ๊ธฐํ™”), animation: .pokitDissolve),
195+
.send(.async(.์นดํ…Œ๊ณ ๋ฆฌ_๋‚ด_์ปจํ…์ธ _๋ชฉ๋ก_์กฐํšŒ_API))
196+
)
197+
198+
case let .๋ถ„๋ฅ˜_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ(type):
199+
if type == .์ฆ๊ฒจ์ฐพ๊ธฐ {
200+
state.domain.condition.isFavoriteFlitered.toggle()
201+
} else {
202+
state.domain.condition.isUnreadFlitered.toggle()
203+
}
204+
return .concatenate(
205+
.send(.inner(.pagenation_์ดˆ๊ธฐํ™”), animation: .pokitDissolve),
206+
.send(.async(.์นดํ…Œ๊ณ ๋ฆฌ_๋‚ด_์ปจํ…์ธ _๋ชฉ๋ก_์กฐํšŒ_API))
207+
)
208+
209+
case .๊ณต์œ _๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ:
210+
kakaoShareClient.์นดํ…Œ๊ณ ๋ฆฌ_์นด์นด์˜คํ†ก_๊ณต์œ (
211+
CategoryKaKaoShareModel(
212+
categoryName: state.domain.category.categoryName,
213+
categoryId: state.domain.category.id,
214+
imageURL: state.domain.category.categoryImage.imageURL
215+
)
216+
)
217+
return .none
218+
219+
case .๋งํฌ_์ถ”๊ฐ€_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ:
220+
let id = state.category.id
221+
return .send(.delegate(.๋งํฌ์ถ”๊ฐ€(categoryId: id)))
222+
177223
case .์นดํ…Œ๊ณ ๋ฆฌ_์ผ€๋ฐฅ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ:
178224
return .run { send in await send(.inner(.์นดํ…Œ๊ณ ๋ฆฌ_์‹œํŠธ_ํ™œ์„ฑํ™”(true))) }
179225

@@ -188,10 +234,6 @@ private extension CategoryDetailFeature {
188234
await send(.inner(.์นดํ…Œ๊ณ ๋ฆฌ_์„ ํƒ_์‹œํŠธ_ํ™œ์„ฑํ™”(false)))
189235
}
190236

191-
case .ํ•„ํ„ฐ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ:
192-
state.isFilterSheetPresented.toggle()
193-
return .none
194-
195237
case .dismiss:
196238
return .run { _ in await dismiss() }
197239

@@ -347,16 +389,6 @@ private extension CategoryDetailFeature {
347389
/// - ์นดํ…Œ๊ณ ๋ฆฌ์— ๋Œ€ํ•œ `๊ณต์œ ` / `์ˆ˜์ •` / `์‚ญ์ œ` Delegate
348390
case .categoryBottomSheet(let delegateAction):
349391
switch delegateAction {
350-
case .shareCellButtonTapped:
351-
kakaoShareClient.์นดํ…Œ๊ณ ๋ฆฌ_์นด์นด์˜คํ†ก_๊ณต์œ (
352-
CategoryKaKaoShareModel(
353-
categoryName: state.domain.category.categoryName,
354-
categoryId: state.domain.category.id,
355-
imageURL: state.domain.category.categoryImage.imageURL
356-
)
357-
)
358-
state.isCategorySheetPresented = false
359-
return .none
360392
case .editCellButtonTapped:
361393
return .run { [category = state.category] send in
362394
await send(.inner(.์นดํ…Œ๊ณ ๋ฆฌ_์‹œํŠธ_ํ™œ์„ฑํ™”(false)))
@@ -384,25 +416,6 @@ private extension CategoryDetailFeature {
384416
try await categoryClient.์นดํ…Œ๊ณ ๋ฆฌ_์‚ญ์ œ(categoryId)
385417
}
386418
}
387-
/// - ํ•„ํ„ฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ
388-
case .filterBottomSheet(let delegateAction):
389-
switch delegateAction {
390-
case .dismiss:
391-
state.isFilterSheetPresented.toggle()
392-
return .none
393-
case let .ํ™•์ธ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ(type, bookMarkSelected, unReadSelected):
394-
state.isFilterSheetPresented.toggle()
395-
state.domain.pageable.sort = [
396-
type == .์ตœ์‹ ์ˆœ ? "createdAt,desc" : "createdAt,asc"
397-
]
398-
state.sortType = type
399-
state.domain.condition.isFavoriteFlitered = bookMarkSelected
400-
state.domain.condition.isUnreadFlitered = unReadSelected
401-
return .concatenate(
402-
.send(.inner(.pagenation_์ดˆ๊ธฐํ™”), animation: .pokitDissolve),
403-
.send(.async(.์นดํ…Œ๊ณ ๋ฆฌ_๋‚ด_์ปจํ…์ธ _๋ชฉ๋ก_์กฐํšŒ_API))
404-
)
405-
}
406419

407420
case let .contents(.element(id: _, action: .delegate(.์ปจํ…์ธ _ํ•ญ๋ชฉ_์ผ€๋ฐฅ_๋ฒ„ํŠผ_๋ˆŒ๋ €์„๋•Œ(content)))):
408421
return .send(.delegate(.contentItemTapped(content)))

0 commit comments

Comments
ย (0)