Skip to content

Commit d5b12ce

Browse files
authored
Merge branch 'develop' into feat/#187-recommend-api
2 parents e7cfe50 + adfce8c commit d5b12ce

File tree

22 files changed

+460
-86
lines changed

22 files changed

+460
-86
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// BaseProfileImageResponse.swift
3+
// CoreKit
4+
//
5+
// Created by ๊น€๋ฏผํ˜ธ on 2/25/25.
6+
//
7+
8+
import Util
9+
10+
public struct BaseProfileImageResponse: Decodable {
11+
public let id: Int
12+
public let url: String
13+
}
14+
15+
extension BaseProfileImageResponse {
16+
static let mock: Self = Self(id: 999, url: Constants.mockImageUrl)
17+
}

โ€ŽProjects/CoreKit/Sources/Data/DTO/Base/BaseUserResponse.swiftโ€Ž

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ public struct BaseUserResponse: Decodable {
1111
public let id: Int
1212
public let email: String
1313
public let nickname: String
14+
public let profileImage: BaseProfileImageResponse?
1415
}
1516

1617
extension BaseUserResponse {
1718
public static var mock: Self = Self(
1819
id: 961222,
1920
20-
nickname: "๋ฝ€์‚1"
21+
nickname: "๋ฝ€์‚1",
22+
profileImage: BaseProfileImageResponse(id: 53211, url: "")
2123
)
2224
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//
2+
// ProfileEditRequest.swift
3+
// CoreKit
4+
//
5+
// Created by ๊น€๋ฏผํ˜ธ on 2/25/25.
6+
//
7+
8+
import Foundation
9+
/// ํ”„๋กœํ•„ ์ˆ˜์ • API Request
10+
public struct ProfileEditRequest: Encodable {
11+
public let profileImageId: Int?
12+
public let nickname: String
13+
14+
public init(profileImageId: Int?, nickname: String) {
15+
self.profileImageId = profileImageId
16+
self.nickname = nickname
17+
}
18+
}
19+
20+
extension ProfileEditRequest {
21+
public func encode(to encoder: Encoder) throws {
22+
var container = encoder.container(keyedBy: CodingKeys.self)
23+
24+
try container.encodeIfPresent(profileImageId, forKey: .profileImageId)
25+
try container.encode(nickname, forKey: .nickname)
26+
27+
if profileImageId == nil {
28+
try container.encodeNil(forKey: .profileImageId)
29+
}
30+
}
31+
32+
private enum CodingKeys: String, CodingKey {
33+
case profileImageId
34+
case nickname
35+
}
36+
}

โ€ŽProjects/CoreKit/Sources/Data/Network/User/UserClient+LiveKey.swiftโ€Ž

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ extension UserClient: DependencyKey {
1515
let provider = MoyaProvider<UserEndpoint>.build()
1616

1717
return Self(
18+
ํ”„๋กœํ•„_์ˆ˜์ •: { model in
19+
try await provider.request(.ํ”„๋กœํ•„_์ˆ˜์ •(model: model))
20+
},
1821
๋‹‰๋„ค์ž„_์ˆ˜์ •: { model in
1922
try await provider.request(.๋‹‰๋„ค์ž„_์ˆ˜์ •(model: model))
2023
},
@@ -33,6 +36,9 @@ extension UserClient: DependencyKey {
3336
fcm_ํ† ํฐ_์ €์žฅ: { model in
3437
try await provider.request(.fcm_ํ† ํฐ_์ €์žฅ(model: model))
3538
},
39+
ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ: {
40+
try await provider.request(.ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ)
41+
},
3642
์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ: {
3743
try await provider.request(.์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ)
3844
},

โ€ŽProjects/CoreKit/Sources/Data/Network/User/UserClient+TestKey.swiftโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import Dependencies
1212
extension UserClient: TestDependencyKey {
1313
public static let previewValue: Self = {
1414
Self(
15+
ํ”„๋กœํ•„_์ˆ˜์ •: { _ in .mock },
1516
๋‹‰๋„ค์ž„_์ˆ˜์ •: { _ in .mock },
1617
ํšŒ์›๋“ฑ๋ก: { _ in .mock },
1718
๋‹‰๋„ค์ž„_์ค‘๋ณต_์ฒดํฌ: { _ in .mock },
1819
๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ: { InterestResponse.mock },
1920
๋‹‰๋„ค์ž„_์กฐํšŒ: { .mock },
2021
fcm_ํ† ํฐ_์ €์žฅ: { _ in .mock },
22+
ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ: { [.mock] },
2123
์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ: { InterestResponse.mock },
2224
๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •: { _ in }
2325
)

โ€ŽProjects/CoreKit/Sources/Data/Network/User/UserClient.swiftโ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ import DependenciesMacros
99

1010
@DependencyClient
1111
public struct UserClient {
12+
public var ํ”„๋กœํ•„_์ˆ˜์ •: @Sendable (_ model: ProfileEditRequest) async throws -> BaseUserResponse
1213
public var ๋‹‰๋„ค์ž„_์ˆ˜์ •: @Sendable (_ model: NicknameEditRequest) async throws -> BaseUserResponse
1314
public var ํšŒ์›๋“ฑ๋ก: @Sendable (_ model: SignupRequest) async throws -> BaseUserResponse
1415
public var ๋‹‰๋„ค์ž„_์ค‘๋ณต_์ฒดํฌ: @Sendable (_ nickname: String) async throws -> NicknameCheckResponse
1516
public var ๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ: @Sendable () async throws -> [InterestResponse]
1617
public var ๋‹‰๋„ค์ž„_์กฐํšŒ: @Sendable () async throws -> BaseUserResponse
1718
public var fcm_ํ† ํฐ_์ €์žฅ: @Sendable (_ model: FCMRequest) async throws -> FCMResponse
19+
public var ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ: @Sendable () async throws -> [BaseProfileImageResponse]
1820
public var ์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ: @Sendable () async throws -> [InterestResponse]
1921
public var ๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •: @Sendable (_ model: InterestRequest) async throws -> Void
2022
}

โ€ŽProjects/CoreKit/Sources/Data/Network/User/UserEndpoint.swiftโ€Ž

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ import Util
1111
import Moya
1212
/// ์ปจํ…์ธ  ์ „์šฉ Endpont
1313
public enum UserEndpoint {
14+
case ํ”„๋กœํ•„_์ˆ˜์ •(model: ProfileEditRequest)
1415
case ๋‹‰๋„ค์ž„_์ˆ˜์ •(model: NicknameEditRequest)
1516
case ํšŒ์›๋“ฑ๋ก(model: SignupRequest)
1617
case ๋‹‰๋„ค์ž„_์ค‘๋ณต_์ฒดํฌ(nickname: String)
1718
case ๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ
1819
case ๋‹‰๋„ค์ž„_์กฐํšŒ
1920
case fcm_ํ† ํฐ_์ €์žฅ(model: FCMRequest)
21+
case ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ
2022
case ์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ
2123
case ๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •(model: InterestRequest)
2224
}
@@ -28,6 +30,8 @@ extension UserEndpoint: TargetType {
2830

2931
public var path: String {
3032
switch self {
33+
case .ํ”„๋กœํ•„_์ˆ˜์ •:
34+
return ""
3135
case .๋‹‰๋„ค์ž„_์ˆ˜์ •, .๋‹‰๋„ค์ž„_์กฐํšŒ:
3236
return "/nickname"
3337
case .ํšŒ์›๋“ฑ๋ก:
@@ -38,6 +42,8 @@ extension UserEndpoint: TargetType {
3842
return "/interests"
3943
case .fcm_ํ† ํฐ_์ €์žฅ:
4044
return "/fcm"
45+
case .ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ:
46+
return "/profileImage"
4147
case .์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ, .๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •:
4248
return "/myinterests"
4349
}
@@ -46,7 +52,8 @@ extension UserEndpoint: TargetType {
4652
public var method: Moya.Method {
4753
switch self {
4854
case .๋‹‰๋„ค์ž„_์ˆ˜์ •,
49-
.๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •:
55+
.๊ด€์‹ฌ์‚ฌ_์ˆ˜์ •,
56+
.ํ”„๋กœํ•„_์ˆ˜์ •:
5057
return .put
5158

5259
case .ํšŒ์›๋“ฑ๋ก,
@@ -56,13 +63,16 @@ extension UserEndpoint: TargetType {
5663
case .๋‹‰๋„ค์ž„_์ค‘๋ณต_์ฒดํฌ,
5764
.๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ,
5865
.๋‹‰๋„ค์ž„_์กฐํšŒ,
66+
.ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ,
5967
.์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ:
6068
return .get
6169
}
6270
}
6371

6472
public var task: Moya.Task {
6573
switch self {
74+
case let .ํ”„๋กœํ•„_์ˆ˜์ •(model):
75+
return .requestJSONEncodable(model)
6676
case let .๋‹‰๋„ค์ž„_์ˆ˜์ •(model):
6777
return .requestJSONEncodable(model)
6878
case let .ํšŒ์›๋“ฑ๋ก(model):
@@ -74,6 +84,7 @@ extension UserEndpoint: TargetType {
7484
case .๋‹‰๋„ค์ž„_์ค‘๋ณต_์ฒดํฌ,
7585
.๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ,
7686
.๋‹‰๋„ค์ž„_์กฐํšŒ,
87+
.ํ”„๋กœํ•„_์ด๋ฏธ์ง€_๋ชฉ๋ก_์กฐํšŒ,
7788
.์œ ์ €_๊ด€์‹ฌ์‚ฌ_๋ชฉ๋ก_์กฐํšŒ:
7889
return .requestPlain
7990
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "image_profile.svg",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"idiom" : "universal",
10+
"scale" : "2x"
11+
},
12+
{
13+
"idiom" : "universal",
14+
"scale" : "3x"
15+
}
16+
],
17+
"info" : {
18+
"author" : "xcode",
19+
"version" : 1
20+
}
21+
}
Lines changed: 12 additions & 0 deletions
Loading

Projects/Feature/FeatureCategorySetting/Sources/Sheet/ProfileBottomSheet.swift renamed to Projects/DSKit/Sources/Components/PokitProfileBottomSheet.swift

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,30 @@
11
//
2-
// ProfileBottomSheet.swift
3-
// Feature
2+
// PokitProfileBottomSheet.swift
3+
// DSKit
4+
//
5+
// Created by ๊น€๋ฏผํ˜ธ on 2/24/25.
46
//
5-
// Created by ๊น€๋ฏผํ˜ธ on 7/25/24.
67

78
import SwiftUI
89

9-
import Domain
10-
import CoreKit
11-
import DSKit
10+
import Util
1211
import NukeUI
1312

14-
public struct ProfileBottomSheet: View {
13+
public struct PokitProfileBottomSheet<ImageType: CategoryImage & Identifiable & Equatable>: View {
1514
@State private var height: CGFloat = 0
16-
@State private var images: [BaseCategoryImage]
17-
let selectedImage: BaseCategoryImage?
15+
@State private var images: [ImageType]
16+
let selectedImage: ImageType?
1817
private let colmumns = [
1918
GridItem(.fixed(72), spacing: 20),
2019
GridItem(.fixed(72), spacing: 20),
2120
GridItem(.fixed(72), spacing: 0)
2221
]
23-
private let delegateSend: ((ProfileBottomSheet.Delegate) -> Void)?
22+
private let delegateSend: ((PokitProfileBottomSheet.Delegate) -> Void)?
2423

2524
public init(
26-
selectedImage: BaseCategoryImage?,
27-
images: [BaseCategoryImage],
28-
delegateSend: ((ProfileBottomSheet.Delegate) -> Void)?
25+
selectedImage: ImageType?,
26+
images: [ImageType],
27+
delegateSend: ((PokitProfileBottomSheet.Delegate) -> Void)?
2928
) {
3029
self.selectedImage = selectedImage
3130
self.images = images
@@ -34,7 +33,7 @@ public struct ProfileBottomSheet: View {
3433

3534
}
3635
//MARK: - View
37-
public extension ProfileBottomSheet {
36+
public extension PokitProfileBottomSheet {
3837
@MainActor
3938
var body: some View {
4039
ScrollView {
@@ -89,18 +88,35 @@ public extension ProfileBottomSheet {
8988
}
9089
}
9190
//MARK: - Delegate
92-
public extension ProfileBottomSheet {
91+
public extension PokitProfileBottomSheet {
9392
enum Delegate: Equatable {
94-
case ์ด๋ฏธ์ง€_์„ ํƒํ–ˆ์„๋•Œ(BaseCategoryImage)
93+
case ์ด๋ฏธ์ง€_์„ ํƒํ–ˆ์„๋•Œ(ImageType)
9594
}
9695
}
9796
//MARK: - Preview
97+
#if DEBUG
98+
struct BaseCategoryImageMock: Equatable, Identifiable, CategoryImage {
99+
public var id: Int
100+
public var imageURL: String
101+
}
102+
extension BaseCategoryImageMock {
103+
static var mock: [Self] {
104+
return [
105+
BaseCategoryImageMock(
106+
id: 231,
107+
imageURL: "https://pokit-storage.s3.ap-northeast-2.amazonaws.com/logo/pokit.png"
108+
)
109+
]
110+
}
111+
}
98112
#Preview {
99-
ProfileBottomSheet(
100-
selectedImage: BaseCategoryImage(imageId: 312, imageURL: "https://pokit-storage.s3.ap-northeast-2.amazonaws.com/logo/pokit.png"),
101-
images: CategoryImageResponse.mock.map { $0.toDomain() },
113+
PokitProfileBottomSheet(
114+
selectedImage: BaseCategoryImageMock(
115+
id: 312,
116+
imageURL: "https://pokit-storage.s3.ap-northeast-2.amazonaws.com/logo/pokit.png"),
117+
images: BaseCategoryImageMock.mock,
102118
delegateSend: nil
103119
)
104120
}
105-
121+
#endif
106122

0 commit comments

Comments
ย (0)