From 38ca74763068c24cc72110e57e5df4dcd4cadec2 Mon Sep 17 00:00:00 2001 From: kangddong Date: Mon, 5 Jan 2026 21:04:38 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[Feat]=20Home=20=ED=94=BC=EC=B2=98=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DI/Package.swift | 17 ++- Hambug.xcodeproj/project.pbxproj | 14 +- Home/Package.swift | 63 +++++++- .../Sources/DI}/HomeDIContainer.swift | 30 ++-- Home/Sources/Data/API/HomeAPI.swift | 44 ++++++ .../Data/DTO/RecommendedBurgerResponse.swift | 29 ++++ .../Data/DTO/TrendingPostResponse.swift | 47 ++++++ .../Repositories/HomeViewRepositoryImpl.swift | 134 ++++++++++++------ .../Domain/Entities/RecommendedBurger.swift | 25 ++++ .../Domain/Entities/TrendingPost.swift | 56 ++++++++ .../Repositories/HomeViewRepository.swift | 6 +- .../FetchRecommendedBurgersUseCase.swift | 12 ++ .../FetchRecommendedBurgersUseCaseImpl.swift | 20 +++ .../UseCases/FetchTrendingPostsUseCase.swift | 24 ++++ .../Domain/UseCases/HomeViewUseCase.swift | 13 -- .../Domain/UseCases/HomeViewUseCaseImpl.swift | 20 --- Home/Sources/Presentation/HomeView.swift | 67 +++++---- Home/Sources/Presentation/HomeViewModel.swift | 49 +++++-- Home/Sources/Presentation/PostView.swift | 73 ++++++---- Home/Sources/Presentation/SuggestView.swift | 130 +++++++++++++---- 20 files changed, 673 insertions(+), 200 deletions(-) rename {DI/Sources/HomeDI => Home/Sources/DI}/HomeDIContainer.swift (52%) create mode 100644 Home/Sources/Data/API/HomeAPI.swift create mode 100644 Home/Sources/Data/DTO/RecommendedBurgerResponse.swift create mode 100644 Home/Sources/Data/DTO/TrendingPostResponse.swift create mode 100644 Home/Sources/Domain/Entities/RecommendedBurger.swift create mode 100644 Home/Sources/Domain/Entities/TrendingPost.swift create mode 100644 Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift create mode 100644 Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift create mode 100644 Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift delete mode 100644 Home/Sources/Domain/UseCases/HomeViewUseCase.swift delete mode 100644 Home/Sources/Domain/UseCases/HomeViewUseCaseImpl.swift diff --git a/DI/Package.swift b/DI/Package.swift index 5b4de3d..192bf1a 100644 --- a/DI/Package.swift +++ b/DI/Package.swift @@ -11,7 +11,6 @@ enum Config: String, CaseIterable { case intro = "Intro" case login = "Login" case myPage = "MyPage" - case home = "Home" case community = "Community" var name: String { @@ -29,6 +28,14 @@ let package = Package( .library( name: Config.interface.name, targets: Config.allCases.map(\.name) + ), + .library( + name: Config.interface.rawValue, + targets: [Config.interface.name] + ), + .library( + name: Config.app.name, + targets: [Config.app.name] ) ], dependencies: [ @@ -37,7 +44,6 @@ let package = Package( .package(name: "Intro", path: "../Intro"), .package(name: "Login", path: "../Login"), .package(name: "MyPage", path: "../MyPage"), - .package(name: "Home", path: "../Home"), .package(name: "Community", path: "../Community"), ], targets: [ @@ -75,13 +81,6 @@ let package = Package( .product(name: "MyPage", package: "MyPage"), ] ), - .target( - name: Config.home.name, - dependencies: [ - .target(config: .app), - .product(name: "Home", package: "Home"), - ] - ), .target( name: Config.community.name, dependencies: [ diff --git a/Hambug.xcodeproj/project.pbxproj b/Hambug.xcodeproj/project.pbxproj index 9ecd3c1..269440d 100644 --- a/Hambug.xcodeproj/project.pbxproj +++ b/Hambug.xcodeproj/project.pbxproj @@ -14,13 +14,13 @@ B5412A862EF277A200CC4938 /* NetworkCommon in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A852EF277A200CC4938 /* NetworkCommon */; }; B5412A882EF277A200CC4938 /* NetworkImpl in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A872EF277A200CC4938 /* NetworkImpl */; }; B5412A8A2EF277A200CC4938 /* NetworkInterface in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A892EF277A200CC4938 /* NetworkInterface */; }; - B5412BFF2EF311AE00CC4938 /* DIKit in Frameworks */ = {isa = PBXBuildFile; productRef = B5412BFE2EF311AE00CC4938 /* DIKit */; }; B54134082EF535FC00CC4938 /* MyPage in Frameworks */ = {isa = PBXBuildFile; productRef = B54134072EF535FC00CC4938 /* MyPage */; }; B54134FD2EF5B09D00CC4938 /* Community in Frameworks */ = {isa = PBXBuildFile; productRef = B54134FC2EF5B09D00CC4938 /* Community */; }; B54134FF2EF5B0A400CC4938 /* Home in Frameworks */ = {isa = PBXBuildFile; productRef = B54134FE2EF5B0A400CC4938 /* Home */; }; B54135802EF5B4CC00CC4938 /* KakaoLogin in Frameworks */ = {isa = PBXBuildFile; productRef = B541357F2EF5B4CC00CC4938 /* KakaoLogin */; }; B57DE3412E92CB6100575CDA /* Onboarding in Frameworks */ = {isa = PBXBuildFile; productRef = B57DE3402E92CB6100575CDA /* Onboarding */; }; B57DE3432E92CB6100575CDA /* Splash in Frameworks */ = {isa = PBXBuildFile; productRef = B57DE3422E92CB6100575CDA /* Splash */; }; + B5EDA8F82F0B9C0C002F72B9 /* DIKit in Frameworks */ = {isa = PBXBuildFile; productRef = B5EDA8F72F0B9C0C002F72B9 /* DIKit */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -101,9 +101,9 @@ B52286032E884E5B00678ECC /* DesignSystem in Frameworks */, B54134082EF535FC00CC4938 /* MyPage in Frameworks */, B5412A862EF277A200CC4938 /* NetworkCommon in Frameworks */, + B5EDA8F82F0B9C0C002F72B9 /* DIKit in Frameworks */, B54134FF2EF5B0A400CC4938 /* Home in Frameworks */, B57DE3412E92CB6100575CDA /* Onboarding in Frameworks */, - B5412BFF2EF311AE00CC4938 /* DIKit in Frameworks */, B52285C92E88469C00678ECC /* Managers in Frameworks */, B54128772EF1CD3100CC4938 /* Login in Frameworks */, B54135802EF5B4CC00CC4938 /* KakaoLogin in Frameworks */, @@ -198,11 +198,11 @@ B5412A852EF277A200CC4938 /* NetworkCommon */, B5412A872EF277A200CC4938 /* NetworkImpl */, B5412A892EF277A200CC4938 /* NetworkInterface */, - B5412BFE2EF311AE00CC4938 /* DIKit */, B54134072EF535FC00CC4938 /* MyPage */, B54134FC2EF5B09D00CC4938 /* Community */, B54134FE2EF5B0A400CC4938 /* Home */, B541357F2EF5B4CC00CC4938 /* KakaoLogin */, + B5EDA8F72F0B9C0C002F72B9 /* DIKit */, ); productName = Hambug; productReference = 915BC5D22E3CB9B50062B78E /* Hambug.app */; @@ -719,10 +719,6 @@ isa = XCSwiftPackageProductDependency; productName = NetworkInterface; }; - B5412BFE2EF311AE00CC4938 /* DIKit */ = { - isa = XCSwiftPackageProductDependency; - productName = DIKit; - }; B54134072EF535FC00CC4938 /* MyPage */ = { isa = XCSwiftPackageProductDependency; productName = MyPage; @@ -747,6 +743,10 @@ isa = XCSwiftPackageProductDependency; productName = Splash; }; + B5EDA8F72F0B9C0C002F72B9 /* DIKit */ = { + isa = XCSwiftPackageProductDependency; + productName = DIKit; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 915BC5CA2E3CB9B50062B78E /* Project object */; diff --git a/Home/Package.swift b/Home/Package.swift index 59d9489..54c983f 100644 --- a/Home/Package.swift +++ b/Home/Package.swift @@ -6,6 +6,7 @@ import PackageDescription enum Config: String, CaseIterable { static let name: String = "Home" + case di = "DI" case data = "Data" case domain = "Domain" case presentation = "Presentation" @@ -30,35 +31,83 @@ let package = Package( ], dependencies: [ .package(name: "Common", path: "../Common"), + .package(name: "DIKit", path: "../DI"), + .package(name: "Infrastructure", path: "../Infrastructure"), ], targets: [ - // Domain: 독립적 (외부 의존성 없음) .target( - name: Config.domain.name, - path: Config.domain.path + config: .di, + dependencies: [ + .target(config: .domain), + .target(config: .data), + .target(config: .presentation), + .product(name: "DI", package: "DIKit"), + .product(name: "AppDI", package: "DIKit"), + .product(name: "Managers", package: "Common"), + .product(name: "DataSources", package: "Common"), + ], + ), + // Domain: NetworkCommon에 의존 + .target( + config: .domain, + dependencies: [ + .product(name: "NetworkCommon", package: "Infrastructure"), + ], ), // Data: Domain에 의존 .target( - name: Config.data.name, + config: .data, dependencies: [ .target(config: .domain), + .product(name: "NetworkCommon", package: "Infrastructure"), + .product(name: "NetworkInterface", package: "Infrastructure"), ], - path: Config.data.path ), // Presentation: Domain, DesignSystem에 의존 .target( - name: Config.presentation.name, + config: .presentation, dependencies: [ .target(config: .domain), .product(name: "DesignSystem", package: "Common"), ], - path: Config.presentation.path ), ] ) +extension Target { + static func target( + config: Config, + dependencies: [Dependency] = [], + exclude: [String] = [], + sources: [String]? = nil, + resources: [Resource]? = nil, + publicHeadersPath: String? = nil, + packageAccess: Bool = false, + cSettings: [CSetting]? = nil, + cxxSettings: [CXXSetting]? = nil, + swiftSettings: [SwiftSetting]? = nil, + linkerSettings: [LinkerSetting]? = nil, + plugins: [PluginUsage]? = nil, + ) -> Target { + return .target( + name: config.name, + dependencies: dependencies, + path: config.path, + exclude: exclude, + sources: sources, + resources: resources, + publicHeadersPath: publicHeadersPath, + packageAccess: packageAccess, + cSettings: cSettings, + cxxSettings: cxxSettings, + swiftSettings: swiftSettings, + linkerSettings: linkerSettings, + plugins: plugins) + } +} + extension Target.Dependency { static func target(config: Config) -> Self { return .target(name: config.name) diff --git a/DI/Sources/HomeDI/HomeDIContainer.swift b/Home/Sources/DI/HomeDIContainer.swift similarity index 52% rename from DI/Sources/HomeDI/HomeDIContainer.swift rename to Home/Sources/DI/HomeDIContainer.swift index da44d03..0141df5 100644 --- a/DI/Sources/HomeDI/HomeDIContainer.swift +++ b/Home/Sources/DI/HomeDIContainer.swift @@ -10,28 +10,38 @@ import DIKit import AppDI import Managers import DataSources +import NetworkInterface import HomeDomain import HomeData import HomePresentation +import SwiftUI + // MARK: - Home Assembly struct HomeAssembly: Assembly { func assemble(container: GenericDIContainer) { // Note: TokenStorage, UserDefaultsManager, AppStateManager come from parent - // Repository registration - container.register(HomeViewRepository.self) { _ in - DummyHomeViewRepositoryImpl() + // Repository - AppDIContainer의 NetworkService 직접 의존 + container.register(HomeViewRepository.self) { resolver in + HomeViewRepositoryImpl(networkService: resolver.resolve(NetworkServiceInterface.self)) + } + + // Use Cases - Repository 의존 + container.register(FetchRecommendedBurgersUseCase.self) { resolver in + FetchRecommendedBurgersUseCaseImpl(repository: resolver.resolve(HomeViewRepository.self)) } - // UseCase registration - container.register(HomeViewUseCase.self) { resolver in - HomeViewUseCaseImpl(repository: resolver.resolve(HomeViewRepository.self)) + container.register(FetchTrendingPostsUseCaseInterface.self) { resolver in + FetchTrendingPostsUseCase(repository: resolver.resolve(HomeViewRepository.self)) } - // ViewModel registration + // ViewModel - Use Cases 의존 container.register(HomeViewModel.self) { resolver in - HomeViewModel(useCase: resolver.resolve(HomeViewUseCase.self)) + HomeViewModel( + fetchRecommendedBurgersUseCase: resolver.resolve(FetchRecommendedBurgersUseCase.self), + fetchTrendingPostsUseCase: resolver.resolve(FetchTrendingPostsUseCaseInterface.self) + ) } } } @@ -57,3 +67,7 @@ public final class HomeDIContainer { return container.resolve(type) } } + +#Preview { + HomeView(viewModel: HomeDIContainer.init().homeViewModel) +} diff --git a/Home/Sources/Data/API/HomeAPI.swift b/Home/Sources/Data/API/HomeAPI.swift new file mode 100644 index 0000000..2385657 --- /dev/null +++ b/Home/Sources/Data/API/HomeAPI.swift @@ -0,0 +1,44 @@ +// +// HomeAPI.swift +// HomeData +// +// Created by Claude on 1/5/26. +// + +import Foundation +import NetworkInterface +import NetworkImpl + +public enum HomeEndpoint: Endpoint { + case recommendedBurgers + case trendingPosts + + public var baseURL: String { + return NetworkServiceImpl.baseURL + } + + public var path: String { + switch self { + case .recommendedBurgers: + return "/api/v1/burgers/recommended" + case .trendingPosts: + return "/api/v1/boards/trending" + } + } + + public var method: HTTPMethod { + return .GET + } + + public var headers: [String: String] { + return [:] + } + + public var queryParameters: [String: Any] { + return [:] + } + + public var body: Data? { + return nil + } +} diff --git a/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift b/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift new file mode 100644 index 0000000..dcbdaf7 --- /dev/null +++ b/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift @@ -0,0 +1,29 @@ +// +// RecommendedBurgerResponse.swift +// HomeData +// +// Created by Claude on 1/5/26. +// + +import Foundation +import HomeDomain + +public struct RecommendedBurgerResponse: Decodable, Sendable { + public let id: Int + public let menuImage: String + public let franchise: String + public let menuName: String + public let menuDescription: String +} + +extension RecommendedBurgerResponse { + public func toDomain() -> RecommendedBurger { + return RecommendedBurger( + id: id, + menuImage: menuImage, + franchise: franchise, + menuName: menuName, + menuDescription: menuDescription + ) + } +} diff --git a/Home/Sources/Data/DTO/TrendingPostResponse.swift b/Home/Sources/Data/DTO/TrendingPostResponse.swift new file mode 100644 index 0000000..b0bda7c --- /dev/null +++ b/Home/Sources/Data/DTO/TrendingPostResponse.swift @@ -0,0 +1,47 @@ +// +// TrendingPostResponse.swift +// HomeData +// +// Created by Claude on 1/5/26. +// + +import Foundation +import HomeDomain + +public struct TrendingPostResponse: Decodable, Sendable { + public let id: Int + public let title: String + public let content: String + public let category: String + public let imageUrls: [String] + public let authorNickname: String + public let authorId: Int + public let createdAt: String // ISO8601 문자열 + public let updatedAt: String // ISO8601 문자열 + public let viewCount: Int + public let likeCount: Int + public let commentCount: Int + public let isLiked: Bool +} + +extension TrendingPostResponse { + public func toDomain() -> TrendingPost { + let formatter = ISO8601DateFormatter() + + return TrendingPost( + id: id, + title: title, + content: content, + category: category, + imageUrls: imageUrls, + authorNickname: authorNickname, + authorId: authorId, + createdAt: formatter.date(from: createdAt) ?? Date(), + updatedAt: formatter.date(from: updatedAt) ?? Date(), + viewCount: viewCount, + likeCount: likeCount, + commentCount: commentCount, + isLiked: isLiked + ) + } +} diff --git a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift index a9b0039..7905bed 100644 --- a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift +++ b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift @@ -1,56 +1,98 @@ // -// HomeViewRepository.swift -// Hambug +// HomeViewRepositoryImpl.swift +// HomeData // // Created by 차상진 on 9/27/25. // import Foundation +import Combine +import NetworkCommon +import NetworkInterface +import NetworkImpl import HomeDomain -public final class DummyHomeViewRepositoryImpl: HomeViewRepository { - - public init() {} - - public func fetchPopularPosts() -> [PostModel] { - return [ - PostCodableItem( - id: 1, - title: "글 제목입니다.1", - content: "글 내용입니다.1", - createdAt: Date(), - updatedAt: Date() - ), - PostCodableItem( - id: 2, - title: "글 제목입니다.2", - content: "글 내용입니다.2", - createdAt: Date(), - updatedAt: Date() - ), - PostCodableItem( - id: 3, - title: "글 제목입니다.3", - content: "글 내용입니다.3", - createdAt: Date(), - updatedAt: Date() - ), - PostCodableItem( - id: 4, - title: "글 제목입니다.4", - content: "글 내용입니다.4", - createdAt: Date(), - updatedAt: Date() - ), - PostCodableItem( - id: 5, - title: "글 제목입니다.5", - content: "글 내용입니다.5", - createdAt: Date(), - updatedAt: Date() - ) - ].map { - PostModel(postCodableItem: $0) - } +public final class HomeViewRepositoryImpl: HomeViewRepository { + private let networkService: NetworkServiceInterface + + public init(networkService: NetworkServiceInterface) { + self.networkService = networkService + } + + public func fetchRecommendedBurgers() async throws -> [RecommendedBurger] { + return try await networkService.request( + HomeEndpoint.recommendedBurgers, + responseType: SuccessResponse<[RecommendedBurgerResponse]>.self + ) + .map(\.data) // SuccessResponse 래퍼 언래핑 + .map { responses in + responses.map { $0.toDomain() } + } + .async() + } + + public func fetchTrendingPosts() async throws -> [TrendingPost] { + return try await networkService.request( + HomeEndpoint.trendingPosts, + responseType: SuccessResponse<[TrendingPostResponse]>.self + ) + .map(\.data) // SuccessResponse 래퍼 언래핑 + .map { responses in + responses.map { $0.toDomain() } } + .async() + } +} + +// 테스트용 Dummy Repository (필요 시 사용) +public final class DummyHomeViewRepositoryImpl: HomeViewRepository { + + public init() {} + + public func fetchRecommendedBurgers() async throws -> [RecommendedBurger] { + let dummyBurgers = [ + RecommendedBurger( + id: 1, + menuImage: "https://via.placeholder.com/150", + franchise: "맥도날드", + menuName: "빅맥", + menuDescription: "두 장의 순쇠고기 패티가 들어간 클래식 버거" + ), + RecommendedBurger( + id: 2, + menuImage: "https://via.placeholder.com/150", + franchise: "버거킹", + menuName: "와퍼", + menuDescription: "불꽃에 직화 구운 패티의 풍미" + ) + ] + + return try await Just(dummyBurgers) + .setFailureType(to: NetworkError.self) + .async() + } + + public func fetchTrendingPosts() async throws -> [TrendingPost] { + let dummyPosts = [ + TrendingPost( + id: 1, + title: "인기 게시글 1", + content: "내용입니다.", + category: "FREE_TALK", + imageUrls: [], + authorNickname: "테스트유저", + authorId: 1, + createdAt: Date(), + updatedAt: Date(), + viewCount: 100, + likeCount: 10, + commentCount: 5, + isLiked: false + ) + ] + + return try await Just(dummyPosts) + .setFailureType(to: NetworkError.self) + .async() + } } diff --git a/Home/Sources/Domain/Entities/RecommendedBurger.swift b/Home/Sources/Domain/Entities/RecommendedBurger.swift new file mode 100644 index 0000000..5dc5298 --- /dev/null +++ b/Home/Sources/Domain/Entities/RecommendedBurger.swift @@ -0,0 +1,25 @@ +// +// RecommendedBurger.swift +// HomeDomain +// +// Created by Claude on 1/5/26. +// + +import Foundation + +public struct RecommendedBurger: Identifiable, Equatable, Sendable { + public let id: Int + public let menuImage: String + public let franchise: String + public let menuName: String + public let menuDescription: String + + public init(id: Int, menuImage: String, franchise: String, + menuName: String, menuDescription: String) { + self.id = id + self.menuImage = menuImage + self.franchise = franchise + self.menuName = menuName + self.menuDescription = menuDescription + } +} diff --git a/Home/Sources/Domain/Entities/TrendingPost.swift b/Home/Sources/Domain/Entities/TrendingPost.swift new file mode 100644 index 0000000..84f3366 --- /dev/null +++ b/Home/Sources/Domain/Entities/TrendingPost.swift @@ -0,0 +1,56 @@ +// +// TrendingPost.swift +// HomeDomain +// +// Created by Claude on 1/5/26. +// + +import Foundation + +public struct TrendingPost: Identifiable, Equatable, Sendable { + public let id: Int + public let title: String + public let content: String + public let category: String + public let imageUrls: [String] + public let authorNickname: String + public let authorId: Int + public let createdAt: Date + public let updatedAt: Date + public let viewCount: Int + public let likeCount: Int + public let commentCount: Int + public let isLiked: Bool + + // UI 표시용 계산 프로퍼티 + public var formattedDate: String { + let formatter = DateFormatter() + formatter.dateFormat = "MM.dd" + return formatter.string(from: createdAt) + } + + public var formattedTime: String { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + return formatter.string(from: createdAt) + } + + public init(id: Int, title: String, content: String, category: String, + imageUrls: [String], authorNickname: String, authorId: Int, + createdAt: Date, updatedAt: Date, viewCount: Int, + likeCount: Int, commentCount: Int, isLiked: Bool) { + self.id = id + self.title = title + self.content = content + self.category = category + self.imageUrls = imageUrls + self.authorNickname = authorNickname + self.authorId = authorId + self.createdAt = createdAt + self.updatedAt = updatedAt + self.viewCount = viewCount + self.likeCount = likeCount + self.commentCount = commentCount + self.isLiked = isLiked + } +} diff --git a/Home/Sources/Domain/Repositories/HomeViewRepository.swift b/Home/Sources/Domain/Repositories/HomeViewRepository.swift index 7b3d3d6..366c30f 100644 --- a/Home/Sources/Domain/Repositories/HomeViewRepository.swift +++ b/Home/Sources/Domain/Repositories/HomeViewRepository.swift @@ -1,11 +1,13 @@ // // HomeViewRepository.swift -// Hambug +// HomeDomain // // Created by 강동영 on 12/5/25. // +import Foundation public protocol HomeViewRepository { - func fetchPopularPosts() -> [PostModel] + func fetchRecommendedBurgers() async throws -> [RecommendedBurger] + func fetchTrendingPosts() async throws -> [TrendingPost] } diff --git a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift new file mode 100644 index 0000000..f4ba773 --- /dev/null +++ b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift @@ -0,0 +1,12 @@ +// +// FetchRecommendedBurgersUseCase.swift +// HomeDomain +// +// Created by Claude on 1/5/26. +// + +import Foundation + +public protocol FetchRecommendedBurgersUseCase { + func execute() async throws -> [RecommendedBurger] +} diff --git a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift new file mode 100644 index 0000000..a41755d --- /dev/null +++ b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift @@ -0,0 +1,20 @@ +// +// FetchRecommendedBurgersUseCase.swift +// HomeDomain +// +// Created by Claude on 1/5/26. +// + +import Foundation + +public final class FetchRecommendedBurgersUseCaseImpl: FetchRecommendedBurgersUseCase { + private let repository: HomeViewRepository + + public init(repository: HomeViewRepository) { + self.repository = repository + } + + public func execute() async throws -> [RecommendedBurger] { + return try await repository.fetchRecommendedBurgers() + } +} diff --git a/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift b/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift new file mode 100644 index 0000000..62253e1 --- /dev/null +++ b/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift @@ -0,0 +1,24 @@ +// +// FetchTrendingPostsUseCase.swift +// HomeDomain +// +// Created by Claude on 1/5/26. +// + +import Foundation + +public protocol FetchTrendingPostsUseCaseInterface { + func execute() async throws -> [TrendingPost] +} + +public final class FetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface { + private let repository: HomeViewRepository + + public init(repository: HomeViewRepository) { + self.repository = repository + } + + public func execute() async throws -> [TrendingPost] { + return try await repository.fetchTrendingPosts() + } +} diff --git a/Home/Sources/Domain/UseCases/HomeViewUseCase.swift b/Home/Sources/Domain/UseCases/HomeViewUseCase.swift deleted file mode 100644 index 9d88761..0000000 --- a/Home/Sources/Domain/UseCases/HomeViewUseCase.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// HomeViewUseCase.swift -// Hambug -// -// Created by 차상진 on 9/27/25. -// - -import Foundation - -public protocol HomeViewUseCase { - func fetchPopularPosts() -> [PostModel] -} - diff --git a/Home/Sources/Domain/UseCases/HomeViewUseCaseImpl.swift b/Home/Sources/Domain/UseCases/HomeViewUseCaseImpl.swift deleted file mode 100644 index 1d95dcb..0000000 --- a/Home/Sources/Domain/UseCases/HomeViewUseCaseImpl.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// HomeViewUseCaseImpl.swift -// Hambug -// -// Created by 강동영 on 12/5/25. -// - - -public final class HomeViewUseCaseImpl: HomeViewUseCase { - - let repository: HomeViewRepository - - public init(repository: HomeViewRepository) { - self.repository = repository - } - - public func fetchPopularPosts() -> [PostModel] { - self.repository.fetchPopularPosts() - } -} diff --git a/Home/Sources/Presentation/HomeView.swift b/Home/Sources/Presentation/HomeView.swift index 80ef683..81368da 100644 --- a/Home/Sources/Presentation/HomeView.swift +++ b/Home/Sources/Presentation/HomeView.swift @@ -11,10 +11,10 @@ import DesignSystem public struct HomeView: View { - @StateObject private var viewModel: HomeViewModel + @State private var viewModel: HomeViewModel public init(viewModel: HomeViewModel) { - self._viewModel = StateObject(wrappedValue: viewModel) + self._viewModel = State(initialValue: viewModel) } public var body: some View { @@ -26,10 +26,15 @@ public struct HomeView: View { HeaderBar() ScrollView { - SuggestView() - - PopularPostsView(postItems: viewModel.postModels) - .padding() + SuggestView(burgers: viewModel.recommendedBurgers) + .padding(.leading, 18) + + Spacer() + .frame(height: 30) + + PopularPostsView(postItems: viewModel.trendingPosts) + .padding(.horizontal, 18) + } .safeAreaPadding(.bottom, 100) } @@ -42,31 +47,41 @@ public struct HomeView: View { struct PopularPostsView: View { - - var postItems: [PostModel] // @State - - init(postItems: [PostModel]) { + + var postItems: [TrendingPost] + + init(postItems: [TrendingPost]) { self.postItems = postItems } - - + + var body: some View { - VStack(spacing: 10) { - HStack { - Text("인기글") - .foregroundColor(.textG800) - Spacer() - } - - ForEach(postItems) { post in - PostView(postModel: post) + VStack(spacing: 12) { + CategoryHeaderText("인기글") + + VStack(spacing: 0) { + ForEach(postItems) { post in + PostView(post: post) + } } + .background(.white) + .cornerRadius(16) + .shadow(radius: 6) } - .padding() - .background(.white) - .cornerRadius(16) - .shadow(radius: 6) - } } +struct CategoryHeaderText: View { + private let title: String + + init(_ title: String) { + self.title = title + } + var body: some View { + HStack { + Text(title) + .pretendard(.title(.t2)) + Spacer() + } + } +} diff --git a/Home/Sources/Presentation/HomeViewModel.swift b/Home/Sources/Presentation/HomeViewModel.swift index 277841f..eaeb0e0 100644 --- a/Home/Sources/Presentation/HomeViewModel.swift +++ b/Home/Sources/Presentation/HomeViewModel.swift @@ -1,6 +1,6 @@ // // HomeViewModel.swift -// Hambug +// HomePresentation // // Created by 차상진 on 9/27/25. // @@ -8,18 +8,49 @@ import Foundation import HomeDomain -public final class HomeViewModel: ObservableObject { +@Observable +public final class HomeViewModel { + private let fetchRecommendedBurgersUseCase: FetchRecommendedBurgersUseCase + private let fetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface - let useCase: HomeViewUseCase - @Published public var postModels: [PostModel] = [] + public var recommendedBurgers: [RecommendedBurger] = [] + public var trendingPosts: [TrendingPost] = [] + public var isLoading: Bool = false + public var errorMessage: String? - public init(useCase: HomeViewUseCase) { - self.useCase = useCase - fetchPopularPosts() + public init( + fetchRecommendedBurgersUseCase: FetchRecommendedBurgersUseCase, + fetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface + ) { + self.fetchRecommendedBurgersUseCase = fetchRecommendedBurgersUseCase + self.fetchTrendingPostsUseCase = fetchTrendingPostsUseCase + + Task { + await loadHomeData() + } } + @MainActor + public func loadHomeData() async { + isLoading = true + errorMessage = nil + defer { isLoading = false } + + do { + // 병렬 API 호출 + async let burgers = try fetchRecommendedBurgersUseCase.execute() + async let posts = try fetchTrendingPostsUseCase.execute() + + self.recommendedBurgers = try await burgers + self.trendingPosts = try await posts + } catch { + self.errorMessage = error.localizedDescription + print("❌ Home API 에러: \(error)") + } + } - public func fetchPopularPosts() { - self.postModels = self.useCase.fetchPopularPosts() + @MainActor + public func refresh() async { + await loadHomeData() } } diff --git a/Home/Sources/Presentation/PostView.swift b/Home/Sources/Presentation/PostView.swift index c6f1fc7..94a591b 100644 --- a/Home/Sources/Presentation/PostView.swift +++ b/Home/Sources/Presentation/PostView.swift @@ -11,46 +11,61 @@ import HomeDomain public struct PostView: View { - var postModel: PostModel + var post: TrendingPost - public init(postModel: PostModel) { - self.postModel = postModel + public init(post: TrendingPost) { + self.post = post } public var body: some View { VStack(alignment: .center) { HStack { VStack(alignment: .leading, spacing: 6) { - Text(postModel.title) + Text(post.title) .pretendard(.title(.t2)) .foregroundColor(.textG800) - + HStack { - Text("게시판") + Text(post.category) .pretendard(.caption(.emphasis)) .foregroundColor(.primaryHambugRed) - + Text("·") .foregroundColor(.bgG200) - + HStack(spacing: 5) { - Text(postModel.date) + Text(post.formattedDate) .pretendard(.caption(.emphasis)) .foregroundColor(.iconG600) - - Text(postModel.time) + + Text(post.formattedTime) .pretendard(.caption(.emphasis)) .foregroundColor(.iconG600) } } } - + Spacer() - - Rectangle() + + // 첫 번째 이미지가 있으면 표시 + if let firstImageUrl = post.imageUrls.first, + let url = URL(string: firstImageUrl) { + AsyncImage(url: url) { image in + image + .resizable() + .aspectRatio(contentMode: .fill) + } placeholder: { + Rectangle() + .foregroundColor(.gray) + } .frame(width: 56, height: 56) .cornerRadius(8) - .foregroundColor(.gray) + } else { + Rectangle() + .frame(width: 56, height: 56) + .cornerRadius(8) + .foregroundColor(.gray) + } } } .padding() @@ -64,21 +79,21 @@ public struct PostView: View { struct FeedPostView: View { var body: some View { VStack(spacing: 20) { - + Rectangle() .frame(height: 200) - + VStack(alignment: .leading, spacing: 14) { Text("제목이 들어가는 자리입니다.") .fontWeight(.bold) .font(.system(size: 20)) .frame(maxWidth: .infinity, alignment: .leading) - + Text("내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다.") .frame(maxWidth: .infinity, alignment: .leading) } .frame(maxWidth: .infinity) - + } .padding() .background(.white) @@ -91,14 +106,24 @@ struct FeedPostView: View { Color.gray VStack { PostView( - postModel: PostModel( - postCodableItem: PostCodableItem( - id: 1, title: "글 제목입니다.", content: "글 내용입니다.", createdAt: Date(), updatedAt: Date() - ) + post: TrendingPost( + id: 1, + title: "글 제목입니다.", + content: "글 내용입니다.", + category: "FREE_TALK", + imageUrls: [], + authorNickname: "테스트", + authorId: 1, + createdAt: Date(), + updatedAt: Date(), + viewCount: 100, + likeCount: 10, + commentCount: 5, + isLiked: false ) ) .padding() - + FeedPostView() .padding() } diff --git a/Home/Sources/Presentation/SuggestView.swift b/Home/Sources/Presentation/SuggestView.swift index 7e4ddb0..5092a02 100644 --- a/Home/Sources/Presentation/SuggestView.swift +++ b/Home/Sources/Presentation/SuggestView.swift @@ -6,49 +6,117 @@ // import SwiftUI +import DesignSystem +import HomeDomain public struct SuggestView: View { - public init() {} - - public var body: some View { - VStack { - ScrollView(.horizontal) { - HStack(spacing: 20) { - SingleSuggestView() - SingleSuggestView() - SingleSuggestView() - } - - .padding(.vertical, 30) - .scrollTargetLayout() + let burgers: [RecommendedBurger] + + public init(burgers: [RecommendedBurger]) { + self.burgers = burgers + } + + public var body: some View { + VStack(spacing: 12) { + CategoryHeaderText("오늘의 추천 버거") + + if burgers.isEmpty { + // 빈 상태 + HStack(spacing: 20) { + SingleSuggestView(burger: nil) + SingleSuggestView(burger: nil) + SingleSuggestView(burger: nil) + } + } else { + ScrollView(.horizontal) { + HStack(spacing: 20) { + ForEach(burgers) { burger in + SingleSuggestView(burger: burger) } - .scrollTargetBehavior(.viewAligned) - .safeAreaPadding(.horizontal, SuggestSizeValue.shared.safeAreaPadding) - .scrollIndicators(.hidden) - + } + .scrollTargetLayout() } - + .scrollTargetBehavior(.viewAligned) + .scrollIndicators(.hidden) + } } + } } struct SingleSuggestView: View { - var body: some View { - Rectangle() - .frame(width: SuggestSizeValue.shared.singleSuggestViewWidth, height: 200) - .foregroundColor(.gray) - .cornerRadius(13) - - VStack { - + let burger: RecommendedBurger? + + var body: some View { + VStack(spacing: 4) { + if let burger = burger { + AsyncImage(url: URL(string: burger.menuImage)) { image in + image + .resizable() + .aspectRatio(contentMode: .fill) + } placeholder: { + EmptyView() + } + .frame(width: 170, height: 170) + .clipped() + .padding(.top, 20) + + VStack(spacing: 0) { + Text(burger.franchise) + .pretendard(.title(.t2)) + .padding(7) + .foregroundStyle(Color.bgWhite) + .background(Color.primaryHambugRed) + .clipShape(RoundedRectangle(cornerRadius: 4)) + + Text(burger.menuName) + .pretendard(.title(.t2)) + .frame(maxWidth: .infinity) + + Text(burger.menuDescription) + .pretendard(.body(.small)) + .lineLimit(1) + .frame(maxWidth: .infinity) + } + .padding(.horizontal, 20) + } else { + // Placeholder +// Image(systemName: "birthday.cake") +// .resizable() +// .padding(.top, 20) +// .frame(width: 170, height: 170) + EmptyView() + + VStack(spacing: 0) { + Text("franchiseChip") + .pretendard(.title(.t2)) + .padding(7) + .foregroundStyle(Color.bgWhite) + .background(Color.primaryHambugRed) + .clipShape(RoundedRectangle(cornerRadius: 4)) + Text("Menu Name") + .pretendard(.title(.t2)) + .frame(maxWidth: .infinity) + Text("Menu Descriptionaadasdasdasdasdaasdasd") + .pretendard(.body(.small)) + .lineLimit(1) + .frame(maxWidth: .infinity) } + .padding(.horizontal, 20) + } } + .frame(width: 290 * 0.85, height: 290) + .background( + RoundedRectangle(cornerRadius: 15) + .foregroundColor(Color.bgWhite) + ) + } } class SuggestSizeValue { - + static let shared = SuggestSizeValue() - + var singleSuggestViewWidth: Double { UIScreen.main.bounds.size.width * 0.7 } @@ -59,5 +127,9 @@ class SuggestSizeValue { #Preview { - SuggestView() + ZStack { + Color.bgG75 + SuggestView(burgers: []) + } + } From d03b21b708d16a278b1ea33eecd0736d543d44f9 Mon Sep 17 00:00:00 2001 From: kangddong Date: Thu, 8 Jan 2026 02:33:42 +0900 Subject: [PATCH 02/12] =?UTF-8?q?fix:=20=EB=AF=B8=EB=B9=84=20=EB=90=9C=20T?= =?UTF-8?q?oekn=20Error=20=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80,=20AuthI?= =?UTF-8?q?nterceptor=20session=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Keychain/KeychainTokenStorage.swift | 4 +- .../Sources/NetworkImpl/AuthInterceptor.swift | 40 ++++++++++++------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Common/Sources/DataSources/Keychain/KeychainTokenStorage.swift b/Common/Sources/DataSources/Keychain/KeychainTokenStorage.swift index 5a7045a..2e4b0da 100644 --- a/Common/Sources/DataSources/Keychain/KeychainTokenStorage.swift +++ b/Common/Sources/DataSources/Keychain/KeychainTokenStorage.swift @@ -91,7 +91,7 @@ private extension KeychainTokenStorage { kSecReturnData as String: true, kSecMatchLimit as String: kSecMatchLimitOne ] - print("service: \(service), key: \(key) in storage") + var item: CFTypeRef? let status = SecItemCopyMatching(query as CFDictionary, &item) @@ -131,6 +131,8 @@ private extension KeychainTokenStorage { switch status { case errSecSuccess: return + case errSecDuplicateItem: + throw KeychainError.duplicateItem case errSecItemNotFound: throw KeychainError.itemNotFound default: diff --git a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift index ce2a214..45cadf6 100644 --- a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift +++ b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift @@ -16,12 +16,15 @@ import Alamofire // MARK: - Auth Interceptor public final class AuthInterceptor: RequestInterceptor { private let authorizationKey = "Authorization" - private let refreshTokenKey = "RefreshToken" - + private let refreshTokenKey = "Authorization" + private let maxRetryCount = 1 + private let tokenManager: TokenStorage - + private let session: Session + public init(tokenManager: TokenStorage) { self.tokenManager = tokenManager + self.session = Session() } private actor RefreshCoordinator { @@ -55,14 +58,15 @@ public final class AuthInterceptor: RequestInterceptor { var urlRequest = urlRequest let (access, refresh) = tokenManager.load() + print(#function) + + print("🔑 access: \(access ?? "")") + print("🔑 refresh: \(refresh ?? "")") + if let accessToken = access { urlRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: authorizationKey) } - if let refreshToken = refresh { - urlRequest.setValue(refreshToken, forHTTPHeaderField: refreshTokenKey) - } - completion(.success(urlRequest)) } @@ -72,19 +76,27 @@ public final class AuthInterceptor: RequestInterceptor { dueTo error: any Error, completion: @escaping @Sendable (RetryResult) -> Void ) { + print(#function) guard let response = request.task?.response as? HTTPURLResponse, - response.statusCode == 401 else { + response.statusCode == 403 else { completion(.doNotRetryWithError(error)) return } - - + + guard request.retryCount < maxRetryCount else { + print("⚠️ Max retry count reached. Logging out.") + completion(.doNotRetry) + handleLogout() + return + } + Task { @MainActor in let success = await coordinator.refresh { [weak self] in guard let self = self else { return false } return await self.refreshTokens() } - + + print("retry is success?: \(success)") if success { completion(.retry) } else { @@ -92,7 +104,7 @@ public final class AuthInterceptor: RequestInterceptor { handleLogout() } } - + } private func refreshTokens() async -> Bool { @@ -102,14 +114,14 @@ public final class AuthInterceptor: RequestInterceptor { } var header = [String : String]() - header[authorizationKey] = "Bearer \(refreshToken)" + header[refreshTokenKey] = "Bearer \(refreshToken)" guard let request = try? TokenRefreshEndpoint(headers: header).createURLRequest() else { return false } do { - let tokenResponse = try await AF.request(request) + let tokenResponse = try await session.request(request) .validate() .serializingDecodable(SuccessResponse.self) .value From 4111e701dba0cf540d56830b1da210bcf52918df Mon Sep 17 00:00:00 2001 From: kangddong Date: Thu, 8 Jan 2026 02:34:14 +0900 Subject: [PATCH 03/12] =?UTF-8?q?add(font):=20=EB=A1=9C=EA=B3=A0=20?= =?UTF-8?q?=ED=8F=B0=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Sources/DesignSystem/FontManager.swift | 9 ++++++-- .../Sources/DesignSystem/FontProvider.swift | 10 +++++++++ Common/Sources/DesignSystem/HeaderBar.swift | 14 +++++++++--- .../Resources/Font/GeekbleMalang2.otf | Bin 0 -> 2092580 bytes .../{ => Font}/Pretendard-Medium.otf | Bin .../{ => Font}/Pretendard-Regular.otf | Bin .../{ => Font}/Pretendard-SemiBold.otf | Bin Common/Sources/DesignSystem/TextStyle.swift | 6 ++--- Hambug/Info.plist | 6 ----- .../icon/notification.imageset/Contents.json | 21 ++++++++++++++++++ .../icon/notification.imageset/IconBell.png | Bin 0 -> 748 bytes 11 files changed, 52 insertions(+), 14 deletions(-) create mode 100644 Common/Sources/DesignSystem/Resources/Font/GeekbleMalang2.otf rename Common/Sources/DesignSystem/Resources/{ => Font}/Pretendard-Medium.otf (100%) rename Common/Sources/DesignSystem/Resources/{ => Font}/Pretendard-Regular.otf (100%) rename Common/Sources/DesignSystem/Resources/{ => Font}/Pretendard-SemiBold.otf (100%) create mode 100644 Hambug/Resources/Assets.xcassets/icon/notification.imageset/Contents.json create mode 100644 Hambug/Resources/Assets.xcassets/icon/notification.imageset/IconBell.png diff --git a/Common/Sources/DesignSystem/FontManager.swift b/Common/Sources/DesignSystem/FontManager.swift index 90a7bcc..cff439b 100644 --- a/Common/Sources/DesignSystem/FontManager.swift +++ b/Common/Sources/DesignSystem/FontManager.swift @@ -55,7 +55,12 @@ public enum FontManager { /// 모든 Pretendard 폰트를 한번에 등록하는 함수 (옵션) public static func registerAllFonts() { - let fontNames = ["Pretendard-Regular", "Pretendard-Medium", "Pretendard-SemiBold"] + let fontNames = [ + "GeekbleMalang2-Regular", + "Pretendard-Regular", + "Pretendard-Medium", + "Pretendard-SemiBold", + ] fontNames.forEach { registerFontIfNeeded($0) } } -} \ No newline at end of file +} diff --git a/Common/Sources/DesignSystem/FontProvider.swift b/Common/Sources/DesignSystem/FontProvider.swift index b0aeed8..254a828 100644 --- a/Common/Sources/DesignSystem/FontProvider.swift +++ b/Common/Sources/DesignSystem/FontProvider.swift @@ -25,6 +25,16 @@ public struct PretendardProvider: FontProvider { public init() {} } +// MARK: - Pretendard Font Provider +public struct GeekbleMalang2: FontProvider { + public let regular: String = "GeekbleMalang2-Regular" + public let medium: String = "" + public let semiBold: String = "" + public let bold: String? = nil + + public init() {} +} + // MARK: - Font Weight Enum public enum FontWeight { case regular, medium, semiBold, bold diff --git a/Common/Sources/DesignSystem/HeaderBar.swift b/Common/Sources/DesignSystem/HeaderBar.swift index 169c776..925c9ee 100644 --- a/Common/Sources/DesignSystem/HeaderBar.swift +++ b/Common/Sources/DesignSystem/HeaderBar.swift @@ -9,18 +9,26 @@ import SwiftUI // 상단 헤더 - 로고, 알림 public struct HeaderBar: View { - public init() {} + private let fontStyle: FontStyle + public init() { + fontStyle = .init(.custom("GeekbleMalang2-Regular"), size: 24.0) + } public var body: some View { - HStack(spacing: 10) { + HStack(spacing: 4) { Image("hambug_icon") .resizable() .frame(width: 30, height: 30) Text("햄버그") - .pretendard(.title(.t1)) + .font(fontStyle.font) + .lineSpacing(fontStyle.lineHeight) .foregroundColor(.primaryHambugRed) Spacer() + + Image("notification") + .resizable() + .frame(width: 30, height: 30) } .padding() } diff --git a/Common/Sources/DesignSystem/Resources/Font/GeekbleMalang2.otf b/Common/Sources/DesignSystem/Resources/Font/GeekbleMalang2.otf new file mode 100644 index 0000000000000000000000000000000000000000..64fd3833320a6a19dad5edf928cd94657e19a6fb GIT binary patch literal 2092580 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%0AH{0T7Tik4m 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 z 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

12P0~Z@+iF$bL58|laj{TNRRih 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

Hb`Iv))<4641YW$z!bdIf-?+T+EhVC%GBCe5 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�?@8rF|m!D08M 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 z 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 U%4E;r`zpH*-bp-o59Qzg59}SYdH?_b literal 0 HcmV?d00001 diff --git a/Common/Sources/DesignSystem/Resources/Pretendard-Medium.otf b/Common/Sources/DesignSystem/Resources/Font/Pretendard-Medium.otf similarity index 100% rename from Common/Sources/DesignSystem/Resources/Pretendard-Medium.otf rename to Common/Sources/DesignSystem/Resources/Font/Pretendard-Medium.otf diff --git a/Common/Sources/DesignSystem/Resources/Pretendard-Regular.otf b/Common/Sources/DesignSystem/Resources/Font/Pretendard-Regular.otf similarity index 100% rename from Common/Sources/DesignSystem/Resources/Pretendard-Regular.otf rename to Common/Sources/DesignSystem/Resources/Font/Pretendard-Regular.otf diff --git a/Common/Sources/DesignSystem/Resources/Pretendard-SemiBold.otf b/Common/Sources/DesignSystem/Resources/Font/Pretendard-SemiBold.otf similarity index 100% rename from Common/Sources/DesignSystem/Resources/Pretendard-SemiBold.otf rename to Common/Sources/DesignSystem/Resources/Font/Pretendard-SemiBold.otf diff --git a/Common/Sources/DesignSystem/TextStyle.swift b/Common/Sources/DesignSystem/TextStyle.swift index 01bf844..c98907c 100644 --- a/Common/Sources/DesignSystem/TextStyle.swift +++ b/Common/Sources/DesignSystem/TextStyle.swift @@ -37,15 +37,15 @@ public enum TextStyle { case .body(let body): switch body { case .base: return (.regular, 16) - case .bEmphasis: return (.medium, 16) + case .bEmphasis: return (.semiBold, 16) case .small: return (.regular, 14) - case .sEmphasis: return (.medium, 14) + case .sEmphasis: return (.semiBold, 14) } case .caption(let caption): switch caption { case .base: return (.regular, 12) - case .emphasis: return (.medium, 12) + case .emphasis: return (.semiBold, 12) } } } diff --git a/Hambug/Info.plist b/Hambug/Info.plist index 060f2dd..3a07739 100644 --- a/Hambug/Info.plist +++ b/Hambug/Info.plist @@ -24,11 +24,5 @@ kakaoplus kakaotalk - UIAppFonts - - Pretendard-SemiBold.otf - Pretendard-Regular.otf - Pretendard-Medium.otf - diff --git a/Hambug/Resources/Assets.xcassets/icon/notification.imageset/Contents.json b/Hambug/Resources/Assets.xcassets/icon/notification.imageset/Contents.json new file mode 100644 index 0000000..cf3f603 --- /dev/null +++ b/Hambug/Resources/Assets.xcassets/icon/notification.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "IconBell.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Hambug/Resources/Assets.xcassets/icon/notification.imageset/IconBell.png b/Hambug/Resources/Assets.xcassets/icon/notification.imageset/IconBell.png new file mode 100644 index 0000000000000000000000000000000000000000..21b13ac33b73cdbc33d35e3d8872031d9593cf29 GIT binary patch literal 748 zcmVXl6913^@Px^*MnK7r_!cB!UCnFGWtz^L-DR7z^6Eed|ai z;2#lpM`ss3XrMi)+ibdX;$v~yfgZy$(|*>`)f!ZW42fTh`_P3(qLW^U=~0%j+Jc%2 zxe$lltlUpqs2pe#I?<7-kdplF`PJnyQYt}%_MPT|C^}u3ceh@zzWp@)JcJ@GQ@6dd zeQI(ve={j>R(4gVaOSBSk7j-$rABadc>qP3gL1@Akuxz3A45^5sr&Ok^ArUT(|1c{ z`eqtYQEBg?AfZ@0tF+G)l;IQ>RNOL3znv*4St{WS4-PoY( z#s*zCHfR$0gJLRBd4z(WuWkq4Ae?-0UN4eEFz=~j|S0mpaB(+PuXVh+r-9M-3ViXPE zpI!7}{fCSm1h;m!Q~wQ#jtxg2&iA2783x6t*PQk~CJ!1JUF$OF4N_w82{bYqw7fBU z@#CEYb=R1*R#Pp+ex}|#-~V@lO5!YYP_5nACD2kk>v91w_WeU> zW<01goqp-psyDa9<%5K#FUS7*GZ>J|3snp8 Date: Thu, 8 Jan 2026 18:06:42 +0900 Subject: [PATCH 04/12] =?UTF-8?q?chore:=20NetworkCommon=20Target=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20NetworkConfig=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 응답 타입과 에러 타입을 위해 NetworkCommon 타겟을 만들었으나, Interface와 역할이 다른 점이 명확하지않아 통합 NetworkImpl과 NetworkInterface로 분리하는 것은 의존성을 위함이었는데, baseURL 로 인해 그 규칙이 깨져, NetworkInterface에 NetworkConfig를 추가하여 규칙대로 코드 수정 --- Community/Package.swift | 4 +++- .../Sources/Data/API/CommunityAPIClient.swift | 1 - .../Repositories/CommunityRepositoryImpl.swift | 2 +- .../CommunityRepositoryInterface.swift | 2 +- .../Domain/UseCases/GetBoardsUseCase.swift | 2 +- DI/Package.swift | 1 - Hambug.xcodeproj/project.pbxproj | 7 ------- Home/Package.swift | 10 ++-------- Home/Sources/Data/API/HomeAPI.swift | 5 ++--- .../Repositories/HomeViewRepositoryImpl.swift | 3 --- Infrastructure/Package.swift | 18 +----------------- .../Sources/NetworkImpl/AuthInterceptor.swift | 1 - .../NetworkImpl/NetworkServiceImpl.swift | 2 -- .../NetworkImpl/TokenRefreshEndpoint.swift | 2 +- .../Sources/NetworkInterface/Endpoint.swift | 1 - .../NetworkInterface/NetworkConfig.swift | 14 ++++++++++++++ .../NetworkError.swift | 0 .../NetworkServiceInterface.swift | 1 - .../Responses}/EmptyResponse.swift | 0 .../Responses}/SuccessResponse.swift | 0 Login/Package.swift | 1 - Login/Sources/Data/AuthEndpoint.swift | 3 +-- Login/Sources/Data/LoginRepositoryImpl.swift | 2 -- MyPage/Package.swift | 1 - 24 files changed, 27 insertions(+), 56 deletions(-) create mode 100644 Infrastructure/Sources/NetworkInterface/NetworkConfig.swift rename Infrastructure/Sources/{NetworkCommon => NetworkInterface}/NetworkError.swift (100%) rename Infrastructure/Sources/{NetworkCommon => NetworkInterface/Responses}/EmptyResponse.swift (100%) rename Infrastructure/Sources/{NetworkCommon => NetworkInterface/Responses}/SuccessResponse.swift (100%) diff --git a/Community/Package.swift b/Community/Package.swift index 336a59a..9457e48 100644 --- a/Community/Package.swift +++ b/Community/Package.swift @@ -36,6 +36,9 @@ let package = Package( // Domain: 독립적 (외부 의존성 없음) .target( name: Config.domain.name, + dependencies: [ + .product(name: "NetworkInterface", package: "Infrastructure"), + ], path: Config.domain.path ), @@ -44,7 +47,6 @@ let package = Package( name: Config.data.name, dependencies: [ .target(config: .domain), - .product(name: "NetworkCommon", package: "Infrastructure"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure"), ], diff --git a/Community/Sources/Data/API/CommunityAPIClient.swift b/Community/Sources/Data/API/CommunityAPIClient.swift index a088cde..a69319b 100644 --- a/Community/Sources/Data/API/CommunityAPIClient.swift +++ b/Community/Sources/Data/API/CommunityAPIClient.swift @@ -7,7 +7,6 @@ import Foundation import Combine -import NetworkCommon import NetworkInterface // MARK: - Community API Client Interface diff --git a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift index 08102ad..749e520 100644 --- a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift +++ b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift @@ -7,8 +7,8 @@ import Foundation import Combine -import NetworkCommon import CommunityDomain +import NetworkInterface // MARK: - Community Repository Implementation public final class CommunityRepositoryImpl: CommunityRepositoryInterface { diff --git a/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift b/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift index 01ce3be..d08cfaf 100644 --- a/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift +++ b/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift @@ -7,7 +7,7 @@ import Foundation import Combine -import NetworkCommon +import NetworkInterface // MARK: - Community Repository Interface public protocol CommunityRepositoryInterface { diff --git a/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift b/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift index c222a88..58f4f49 100644 --- a/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift +++ b/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift @@ -7,7 +7,7 @@ import Foundation import Combine -import NetworkCommon +import NetworkInterface // MARK: - Get Boards UseCase Interface public protocol GetBoardsUseCaseInterface { diff --git a/DI/Package.swift b/DI/Package.swift index 192bf1a..44180be 100644 --- a/DI/Package.swift +++ b/DI/Package.swift @@ -54,7 +54,6 @@ let package = Package( .target(config: .interface), .product(name: "DataSources", package: "Common"), .product(name: "Managers", package: "Common"), - .product(name: "NetworkCommon", package: "Infrastructure"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure") ] diff --git a/Hambug.xcodeproj/project.pbxproj b/Hambug.xcodeproj/project.pbxproj index 269440d..f0b6bd2 100644 --- a/Hambug.xcodeproj/project.pbxproj +++ b/Hambug.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ B52285C92E88469C00678ECC /* Managers in Frameworks */ = {isa = PBXBuildFile; productRef = B52285C82E88469C00678ECC /* Managers */; }; B52286032E884E5B00678ECC /* DesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = B52286022E884E5B00678ECC /* DesignSystem */; }; B54128772EF1CD3100CC4938 /* Login in Frameworks */ = {isa = PBXBuildFile; productRef = B54128762EF1CD3100CC4938 /* Login */; }; - B5412A862EF277A200CC4938 /* NetworkCommon in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A852EF277A200CC4938 /* NetworkCommon */; }; B5412A882EF277A200CC4938 /* NetworkImpl in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A872EF277A200CC4938 /* NetworkImpl */; }; B5412A8A2EF277A200CC4938 /* NetworkInterface in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A892EF277A200CC4938 /* NetworkInterface */; }; B54134082EF535FC00CC4938 /* MyPage in Frameworks */ = {isa = PBXBuildFile; productRef = B54134072EF535FC00CC4938 /* MyPage */; }; @@ -100,7 +99,6 @@ B57DE3432E92CB6100575CDA /* Splash in Frameworks */, B52286032E884E5B00678ECC /* DesignSystem in Frameworks */, B54134082EF535FC00CC4938 /* MyPage in Frameworks */, - B5412A862EF277A200CC4938 /* NetworkCommon in Frameworks */, B5EDA8F82F0B9C0C002F72B9 /* DIKit in Frameworks */, B54134FF2EF5B0A400CC4938 /* Home in Frameworks */, B57DE3412E92CB6100575CDA /* Onboarding in Frameworks */, @@ -195,7 +193,6 @@ B57DE3402E92CB6100575CDA /* Onboarding */, B57DE3422E92CB6100575CDA /* Splash */, B54128762EF1CD3100CC4938 /* Login */, - B5412A852EF277A200CC4938 /* NetworkCommon */, B5412A872EF277A200CC4938 /* NetworkImpl */, B5412A892EF277A200CC4938 /* NetworkInterface */, B54134072EF535FC00CC4938 /* MyPage */, @@ -707,10 +704,6 @@ isa = XCSwiftPackageProductDependency; productName = Login; }; - B5412A852EF277A200CC4938 /* NetworkCommon */ = { - isa = XCSwiftPackageProductDependency; - productName = NetworkCommon; - }; B5412A872EF277A200CC4938 /* NetworkImpl */ = { isa = XCSwiftPackageProductDependency; productName = NetworkImpl; diff --git a/Home/Package.swift b/Home/Package.swift index 54c983f..eb3c7ca 100644 --- a/Home/Package.swift +++ b/Home/Package.swift @@ -47,20 +47,14 @@ let package = Package( .product(name: "DataSources", package: "Common"), ], ), - // Domain: NetworkCommon에 의존 - .target( - config: .domain, - dependencies: [ - .product(name: "NetworkCommon", package: "Infrastructure"), - ], - ), + // Domain: 의존하지않음 + .target(config: .domain), // Data: Domain에 의존 .target( config: .data, dependencies: [ .target(config: .domain), - .product(name: "NetworkCommon", package: "Infrastructure"), .product(name: "NetworkInterface", package: "Infrastructure"), ], ), diff --git a/Home/Sources/Data/API/HomeAPI.swift b/Home/Sources/Data/API/HomeAPI.swift index 2385657..9b54894 100644 --- a/Home/Sources/Data/API/HomeAPI.swift +++ b/Home/Sources/Data/API/HomeAPI.swift @@ -2,19 +2,18 @@ // HomeAPI.swift // HomeData // -// Created by Claude on 1/5/26. +// Created by 강동영 on 1/5/26. // import Foundation import NetworkInterface -import NetworkImpl public enum HomeEndpoint: Endpoint { case recommendedBurgers case trendingPosts public var baseURL: String { - return NetworkServiceImpl.baseURL + return NetworkConfig.baseURL } public var path: String { diff --git a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift index 7905bed..fd1da8a 100644 --- a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift +++ b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift @@ -6,10 +6,7 @@ // import Foundation -import Combine -import NetworkCommon import NetworkInterface -import NetworkImpl import HomeDomain public final class HomeViewRepositoryImpl: HomeViewRepository { diff --git a/Infrastructure/Package.swift b/Infrastructure/Package.swift index 90aa56c..0bbb767 100644 --- a/Infrastructure/Package.swift +++ b/Infrastructure/Package.swift @@ -5,10 +5,8 @@ import PackageDescription struct Config { static let name: String = "Infrastructure" - static let common: String = "NetworkCommon" static let networkImpl: String = "NetworkImpl" static let networkInterface: String = "NetworkInterface" - } let package = Package( @@ -17,10 +15,6 @@ let package = Package( .iOS(.v17) ], products: [ - .library( - name: Config.common, - targets: [Config.common] - ), .library( name: Config.networkInterface, targets: [Config.networkInterface] @@ -35,25 +29,15 @@ let package = Package( .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.10.0"), ], targets: [ - .target( - name: Config.common - ), - .target( - name: Config.networkInterface, - dependencies: [ - .target(name: Config.common) - ] - ), + .target(name: Config.networkInterface), .target( name: Config.networkImpl, dependencies: [ - .target(name: Config.common), .target(name: Config.networkInterface), .product(name: "DataSources", package: "Common"), "Alamofire", ] ), - ] ) diff --git a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift index 45cadf6..7a513f2 100644 --- a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift +++ b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift @@ -9,7 +9,6 @@ import Foundation import DataSources import NetworkInterface -import NetworkCommon import Alamofire diff --git a/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift b/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift index 5065467..1d62c81 100644 --- a/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift +++ b/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift @@ -7,13 +7,11 @@ import Foundation import Combine -import NetworkCommon import NetworkInterface import Alamofire public final class NetworkServiceImpl: NetworkServiceInterface { - public static let baseURL: String = Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as! String // MARK: - Properties private let session: Session diff --git a/Infrastructure/Sources/NetworkImpl/TokenRefreshEndpoint.swift b/Infrastructure/Sources/NetworkImpl/TokenRefreshEndpoint.swift index f9d31ea..533862a 100644 --- a/Infrastructure/Sources/NetworkImpl/TokenRefreshEndpoint.swift +++ b/Infrastructure/Sources/NetworkImpl/TokenRefreshEndpoint.swift @@ -9,7 +9,7 @@ import Foundation import NetworkInterface struct TokenRefreshEndpoint: Endpoint { - let baseURL: String = NetworkServiceImpl.baseURL + let baseURL: String = NetworkConfig.baseURL let path: String = "/api/v1/auth/refresh" let method: NetworkInterface.HTTPMethod = .POST let headers: [String : String] diff --git a/Infrastructure/Sources/NetworkInterface/Endpoint.swift b/Infrastructure/Sources/NetworkInterface/Endpoint.swift index 43f0e0f..9c2ac02 100644 --- a/Infrastructure/Sources/NetworkInterface/Endpoint.swift +++ b/Infrastructure/Sources/NetworkInterface/Endpoint.swift @@ -6,7 +6,6 @@ // import Foundation -import NetworkCommon // MARK: - HTTP Method public enum HTTPMethod: String, Sendable { diff --git a/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift b/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift new file mode 100644 index 0000000..5f35b38 --- /dev/null +++ b/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift @@ -0,0 +1,14 @@ +// +// NetworkConfig.swift +// Infrastructure +// +// Created by 강동영 on 1/8/26. +// + +import Foundation + +public struct NetworkConfig { + public static let baseURL: String = Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as! String + + private init() {} +} diff --git a/Infrastructure/Sources/NetworkCommon/NetworkError.swift b/Infrastructure/Sources/NetworkInterface/NetworkError.swift similarity index 100% rename from Infrastructure/Sources/NetworkCommon/NetworkError.swift rename to Infrastructure/Sources/NetworkInterface/NetworkError.swift diff --git a/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift b/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift index 999ae57..24a31de 100644 --- a/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift +++ b/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift @@ -7,7 +7,6 @@ import Foundation import Combine -import NetworkCommon // MARK: - Network Interface Protocol public protocol NetworkServiceInterface { diff --git a/Infrastructure/Sources/NetworkCommon/EmptyResponse.swift b/Infrastructure/Sources/NetworkInterface/Responses/EmptyResponse.swift similarity index 100% rename from Infrastructure/Sources/NetworkCommon/EmptyResponse.swift rename to Infrastructure/Sources/NetworkInterface/Responses/EmptyResponse.swift diff --git a/Infrastructure/Sources/NetworkCommon/SuccessResponse.swift b/Infrastructure/Sources/NetworkInterface/Responses/SuccessResponse.swift similarity index 100% rename from Infrastructure/Sources/NetworkCommon/SuccessResponse.swift rename to Infrastructure/Sources/NetworkInterface/Responses/SuccessResponse.swift diff --git a/Login/Package.swift b/Login/Package.swift index 1123e31..209a292 100644 --- a/Login/Package.swift +++ b/Login/Package.swift @@ -52,7 +52,6 @@ let package = Package( dependencies: [ .target(config: Config.domain), .product(name: "DataSources", package: "Common"), - .product(name: "NetworkCommon", package: "Infrastructure"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure") ], diff --git a/Login/Sources/Data/AuthEndpoint.swift b/Login/Sources/Data/AuthEndpoint.swift index 36ac497..3599b7d 100644 --- a/Login/Sources/Data/AuthEndpoint.swift +++ b/Login/Sources/Data/AuthEndpoint.swift @@ -8,11 +8,10 @@ import Foundation import NetworkInterface -import NetworkImpl enum AuthEndpoint: Endpoint { var baseURL: String { - NetworkServiceImpl.baseURL + NetworkConfig.baseURL } case socialLogin(request: SocialLoginAuthRequestDTO) diff --git a/Login/Sources/Data/LoginRepositoryImpl.swift b/Login/Sources/Data/LoginRepositoryImpl.swift index b53e8a4..07c1198 100644 --- a/Login/Sources/Data/LoginRepositoryImpl.swift +++ b/Login/Sources/Data/LoginRepositoryImpl.swift @@ -6,11 +6,9 @@ // import Foundation -import Alamofire import DataSources import LoginDomain import NetworkInterface -import NetworkCommon public final class LoginRepositoryImpl: LoginRepository { private let networkService: NetworkServiceInterface diff --git a/MyPage/Package.swift b/MyPage/Package.swift index b183210..baa07a9 100644 --- a/MyPage/Package.swift +++ b/MyPage/Package.swift @@ -37,7 +37,6 @@ let package = Package( name: Config.data.name, dependencies: [ .target(config: .domain), - .product(name: "NetworkCommon", package: "Infrastructure"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure") ], From f1964fe341d884245e9a479ad69d1d41013c248a Mon Sep 17 00:00:00 2001 From: kangddong Date: Thu, 8 Jan 2026 18:10:30 +0900 Subject: [PATCH 05/12] =?UTF-8?q?add(chore):=20Combine+Ext=20=EC=9D=84=20N?= =?UTF-8?q?etworkImpl=20->=20Common=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Package.swift | 16 +++++++++------- .../Sources/Util}/Combine+Ext.swift | 0 Home/Package.swift | 1 + Login/Package.swift | 1 + Login/Sources/Data/LoginRepositoryImpl.swift | 1 + 5 files changed, 12 insertions(+), 7 deletions(-) rename {Infrastructure/Sources/NetworkImpl => Common/Sources/Util}/Combine+Ext.swift (100%) diff --git a/Common/Package.swift b/Common/Package.swift index 2a6053b..c0dab6b 100644 --- a/Common/Package.swift +++ b/Common/Package.swift @@ -23,6 +23,10 @@ let package = Package( name: "LocalizedString", targets: ["LocalizedString"] ), + .library( + name: "Util", + targets: ["Util"] + ), ], targets: [ .target( @@ -32,15 +36,13 @@ let package = Package( .target( name: "DesignSystem", resources: [ - .process("Resources") + .process("Resources/Font") ] ), - .target( - name: "DataSources" - ), - .target( - name: "LocalizedString" - ), + .target(name: "DataSources"), + .target(name: "LocalizedString"), + .target(name: "Util"), + .plugin( name: "ColorGenerator", capability: .command( diff --git a/Infrastructure/Sources/NetworkImpl/Combine+Ext.swift b/Common/Sources/Util/Combine+Ext.swift similarity index 100% rename from Infrastructure/Sources/NetworkImpl/Combine+Ext.swift rename to Common/Sources/Util/Combine+Ext.swift diff --git a/Home/Package.swift b/Home/Package.swift index eb3c7ca..17ef8eb 100644 --- a/Home/Package.swift +++ b/Home/Package.swift @@ -56,6 +56,7 @@ let package = Package( dependencies: [ .target(config: .domain), .product(name: "NetworkInterface", package: "Infrastructure"), + .product(name: "Util", package: "Common"), ], ), diff --git a/Login/Package.swift b/Login/Package.swift index 209a292..4f36f4b 100644 --- a/Login/Package.swift +++ b/Login/Package.swift @@ -52,6 +52,7 @@ let package = Package( dependencies: [ .target(config: Config.domain), .product(name: "DataSources", package: "Common"), + .product(name: "Util", package: "Common"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure") ], diff --git a/Login/Sources/Data/LoginRepositoryImpl.swift b/Login/Sources/Data/LoginRepositoryImpl.swift index 07c1198..ef60f15 100644 --- a/Login/Sources/Data/LoginRepositoryImpl.swift +++ b/Login/Sources/Data/LoginRepositoryImpl.swift @@ -9,6 +9,7 @@ import Foundation import DataSources import LoginDomain import NetworkInterface +import Util public final class LoginRepositoryImpl: LoginRepository { private let networkService: NetworkServiceInterface From 85c4f87d80caca25ecb5b5bef1ce88a1b9101e9d Mon Sep 17 00:00:00 2001 From: kangddong Date: Thu, 8 Jan 2026 18:14:34 +0900 Subject: [PATCH 06/12] =?UTF-8?q?feat:=20Home=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Sources/DesignSystem/FontManager.swift | 2 +- .../Sources/DesignSystem/FontProvider.swift | 2 +- Common/Sources/DesignSystem/HeaderBar.swift | 2 +- Home/Sources/DI/HomeDIContainer.swift | 19 +- .../Data/DTO/RecommendedBurgerResponse.swift | 2 +- .../Data/DTO/TrendingPostResponse.swift | 2 +- .../Repositories/HomeViewRepositoryImpl.swift | 115 ++++------ Home/Sources/Domain/Entities/PostModel.swift | 2 +- .../Domain/Entities/RecommendedBurger.swift | 57 +++-- .../Domain/Entities/TrendingPost.swift | 152 +++++++++---- Home/Sources/Domain/Errors/HomeError.swift | 68 ++++++ .../FetchRecommendedBurgersUseCase.swift | 12 - .../FetchRecommendedBurgersUseCaseImpl.swift | 20 -- .../UseCases/FetchTrendingPostsUseCase.swift | 24 -- .../Domain/UseCases/HomeUseCaseImpl.swift | 76 +++++++ Home/Sources/Presentation/HomeView.swift | 6 +- Home/Sources/Presentation/HomeViewModel.swift | 137 ++++++++++-- Home/Sources/Presentation/PostView.swift | 206 +++++++++--------- Home/Sources/Presentation/SuggestView.swift | 107 ++++----- 19 files changed, 613 insertions(+), 398 deletions(-) create mode 100644 Home/Sources/Domain/Errors/HomeError.swift delete mode 100644 Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift delete mode 100644 Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift delete mode 100644 Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift create mode 100644 Home/Sources/Domain/UseCases/HomeUseCaseImpl.swift diff --git a/Common/Sources/DesignSystem/FontManager.swift b/Common/Sources/DesignSystem/FontManager.swift index cff439b..560b247 100644 --- a/Common/Sources/DesignSystem/FontManager.swift +++ b/Common/Sources/DesignSystem/FontManager.swift @@ -56,7 +56,7 @@ public enum FontManager { /// 모든 Pretendard 폰트를 한번에 등록하는 함수 (옵션) public static func registerAllFonts() { let fontNames = [ - "GeekbleMalang2-Regular", + "GeekbleMalang2", "Pretendard-Regular", "Pretendard-Medium", "Pretendard-SemiBold", diff --git a/Common/Sources/DesignSystem/FontProvider.swift b/Common/Sources/DesignSystem/FontProvider.swift index 254a828..b79d925 100644 --- a/Common/Sources/DesignSystem/FontProvider.swift +++ b/Common/Sources/DesignSystem/FontProvider.swift @@ -27,7 +27,7 @@ public struct PretendardProvider: FontProvider { // MARK: - Pretendard Font Provider public struct GeekbleMalang2: FontProvider { - public let regular: String = "GeekbleMalang2-Regular" + public let regular: String = "GeekbleMalang2" public let medium: String = "" public let semiBold: String = "" public let bold: String? = nil diff --git a/Common/Sources/DesignSystem/HeaderBar.swift b/Common/Sources/DesignSystem/HeaderBar.swift index 925c9ee..5845e61 100644 --- a/Common/Sources/DesignSystem/HeaderBar.swift +++ b/Common/Sources/DesignSystem/HeaderBar.swift @@ -11,7 +11,7 @@ import SwiftUI public struct HeaderBar: View { private let fontStyle: FontStyle public init() { - fontStyle = .init(.custom("GeekbleMalang2-Regular"), size: 24.0) + fontStyle = .init(.custom("GeekbleMalang2"), size: 24.0) } public var body: some View { diff --git a/Home/Sources/DI/HomeDIContainer.swift b/Home/Sources/DI/HomeDIContainer.swift index 0141df5..c3eab32 100644 --- a/Home/Sources/DI/HomeDIContainer.swift +++ b/Home/Sources/DI/HomeDIContainer.swift @@ -27,21 +27,16 @@ struct HomeAssembly: Assembly { HomeViewRepositoryImpl(networkService: resolver.resolve(NetworkServiceInterface.self)) } - // Use Cases - Repository 의존 - container.register(FetchRecommendedBurgersUseCase.self) { resolver in - FetchRecommendedBurgersUseCaseImpl(repository: resolver.resolve(HomeViewRepository.self)) + // UseCase - Repository 의존 + container.register(HomeUseCase.self) { resolver in + HomeUseCaseImpl(repository: resolver.resolve(HomeViewRepository.self)) } - container.register(FetchTrendingPostsUseCaseInterface.self) { resolver in - FetchTrendingPostsUseCase(repository: resolver.resolve(HomeViewRepository.self)) - } - - // ViewModel - Use Cases 의존 + // ViewModel - UseCase 의존 container.register(HomeViewModel.self) { resolver in - HomeViewModel( - fetchRecommendedBurgersUseCase: resolver.resolve(FetchRecommendedBurgersUseCase.self), - fetchTrendingPostsUseCase: resolver.resolve(FetchTrendingPostsUseCaseInterface.self) - ) + MainActor.assumeIsolated { + HomeViewModel(homeUseCase: resolver.resolve(HomeUseCase.self)) + } } } } diff --git a/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift b/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift index dcbdaf7..181ca54 100644 --- a/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift +++ b/Home/Sources/Data/DTO/RecommendedBurgerResponse.swift @@ -2,7 +2,7 @@ // RecommendedBurgerResponse.swift // HomeData // -// Created by Claude on 1/5/26. +// Created by 강동영 on 1/5/26. // import Foundation diff --git a/Home/Sources/Data/DTO/TrendingPostResponse.swift b/Home/Sources/Data/DTO/TrendingPostResponse.swift index b0bda7c..9262b04 100644 --- a/Home/Sources/Data/DTO/TrendingPostResponse.swift +++ b/Home/Sources/Data/DTO/TrendingPostResponse.swift @@ -2,7 +2,7 @@ // TrendingPostResponse.swift // HomeData // -// Created by Claude on 1/5/26. +// Created by 강동영 on 1/5/26. // import Foundation diff --git a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift index fd1da8a..58d8fb5 100644 --- a/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift +++ b/Home/Sources/Data/Repositories/HomeViewRepositoryImpl.swift @@ -8,88 +8,65 @@ import Foundation import NetworkInterface import HomeDomain +import Util public final class HomeViewRepositoryImpl: HomeViewRepository { private let networkService: NetworkServiceInterface - + public init(networkService: NetworkServiceInterface) { self.networkService = networkService } - - public func fetchRecommendedBurgers() async throws -> [RecommendedBurger] { - return try await networkService.request( - HomeEndpoint.recommendedBurgers, - responseType: SuccessResponse<[RecommendedBurgerResponse]>.self - ) - .map(\.data) // SuccessResponse 래퍼 언래핑 - .map { responses in - responses.map { $0.toDomain() } - } - .async() - } - - public func fetchTrendingPosts() async throws -> [TrendingPost] { - return try await networkService.request( - HomeEndpoint.trendingPosts, - responseType: SuccessResponse<[TrendingPostResponse]>.self - ) - .map(\.data) // SuccessResponse 래퍼 언래핑 - .map { responses in - responses.map { $0.toDomain() } - } - .async() - } -} -// 테스트용 Dummy Repository (필요 시 사용) -public final class DummyHomeViewRepositoryImpl: HomeViewRepository { - - public init() {} - public func fetchRecommendedBurgers() async throws -> [RecommendedBurger] { - let dummyBurgers = [ - RecommendedBurger( - id: 1, - menuImage: "https://via.placeholder.com/150", - franchise: "맥도날드", - menuName: "빅맥", - menuDescription: "두 장의 순쇠고기 패티가 들어간 클래식 버거" - ), - RecommendedBurger( - id: 2, - menuImage: "https://via.placeholder.com/150", - franchise: "버거킹", - menuName: "와퍼", - menuDescription: "불꽃에 직화 구운 패티의 풍미" + do { + return try await networkService.request( + HomeEndpoint.recommendedBurgers, + responseType: SuccessResponse<[RecommendedBurgerResponse]>.self ) - ] - - return try await Just(dummyBurgers) - .setFailureType(to: NetworkError.self) + .map(\.data) // SuccessResponse 래퍼 언래핑 + .map { responses in + responses.map { $0.toDomain() } + } .async() + } catch let error as NetworkError { + throw mapToHomeError(error) + } catch { + throw HomeError.networkFailure(underlying: error) + } } - + public func fetchTrendingPosts() async throws -> [TrendingPost] { - let dummyPosts = [ - TrendingPost( - id: 1, - title: "인기 게시글 1", - content: "내용입니다.", - category: "FREE_TALK", - imageUrls: [], - authorNickname: "테스트유저", - authorId: 1, - createdAt: Date(), - updatedAt: Date(), - viewCount: 100, - likeCount: 10, - commentCount: 5, - isLiked: false + do { + return try await networkService.request( + HomeEndpoint.trendingPosts, + responseType: SuccessResponse<[TrendingPostResponse]>.self ) - ] - - return try await Just(dummyPosts) - .setFailureType(to: NetworkError.self) + .map(\.data) // SuccessResponse 래퍼 언래핑 + .map { responses in + responses.map { $0.toDomain() } + } .async() + } catch let error as NetworkError { + throw mapToHomeError(error) + } catch { + throw HomeError.networkFailure(underlying: error) + } + } + + // MARK: - Private Methods + + private func mapToHomeError(_ networkError: NetworkError) -> HomeError { + switch networkError { + case .unauthorized: + return .unauthorized + case .serverError(let code), .serverErrorWithMessage(let code, _): + return .serverError(statusCode: code) + case .decodingError: + return .dataCorrupted + case .networkError, .noData, .invalidURL, .encodingError: + return .networkFailure(underlying: networkError) + case .forbidden, .notFound: + return .serverError(statusCode: 403) + } } } diff --git a/Home/Sources/Domain/Entities/PostModel.swift b/Home/Sources/Domain/Entities/PostModel.swift index 6cccfaa..7239fa1 100644 --- a/Home/Sources/Domain/Entities/PostModel.swift +++ b/Home/Sources/Domain/Entities/PostModel.swift @@ -5,7 +5,7 @@ // Created by 차상진 on 9/6/25. // -import SwiftUI +import Foundation public struct PostCodableItem: Codable { public var id: Int64 diff --git a/Home/Sources/Domain/Entities/RecommendedBurger.swift b/Home/Sources/Domain/Entities/RecommendedBurger.swift index 5dc5298..6da87e3 100644 --- a/Home/Sources/Domain/Entities/RecommendedBurger.swift +++ b/Home/Sources/Domain/Entities/RecommendedBurger.swift @@ -2,24 +2,53 @@ // RecommendedBurger.swift // HomeDomain // -// Created by Claude on 1/5/26. +// Created by 강동영 on 1/5/26. // import Foundation public struct RecommendedBurger: Identifiable, Equatable, Sendable { - public let id: Int - public let menuImage: String - public let franchise: String - public let menuName: String - public let menuDescription: String + public let id: Int + public let menuImage: String + public let franchise: String + public let menuName: String + public let menuDescription: String - public init(id: Int, menuImage: String, franchise: String, - menuName: String, menuDescription: String) { - self.id = id - self.menuImage = menuImage - self.franchise = franchise - self.menuName = menuName - self.menuDescription = menuDescription - } + public init(id: Int, menuImage: String, franchise: String, + menuName: String, menuDescription: String) { + self.id = id + self.menuImage = menuImage + self.franchise = franchise + self.menuName = menuName + self.menuDescription = menuDescription + } +} + +// MARK: - Sample Data +extension RecommendedBurger { + public static var sampleData: [RecommendedBurger] { + return [ + RecommendedBurger( + id: 1, + menuImage: "https://via.placeholder.com/300", + franchise: "맥도날드", + menuName: "빅맥", + menuDescription: "클래식한 맛의 대표 버거" + ), + RecommendedBurger( + id: 2, + menuImage: "https://via.placeholder.com/300", + franchise: "버거킹", + menuName: "와퍼", + menuDescription: "불맛 가득한 프리미엄 버거" + ), + RecommendedBurger( + id: 3, + menuImage: "https://via.placeholder.com/300", + franchise: "쉑쉑버거", + menuName: "쉑버거", + menuDescription: "수제 스타일의 신선한 버거" + ) + ] + } } diff --git a/Home/Sources/Domain/Entities/TrendingPost.swift b/Home/Sources/Domain/Entities/TrendingPost.swift index 84f3366..719517f 100644 --- a/Home/Sources/Domain/Entities/TrendingPost.swift +++ b/Home/Sources/Domain/Entities/TrendingPost.swift @@ -2,55 +2,117 @@ // TrendingPost.swift // HomeDomain // -// Created by Claude on 1/5/26. +// Created by 강동영 on 1/5/26. // import Foundation public struct TrendingPost: Identifiable, Equatable, Sendable { - public let id: Int - public let title: String - public let content: String - public let category: String - public let imageUrls: [String] - public let authorNickname: String - public let authorId: Int - public let createdAt: Date - public let updatedAt: Date - public let viewCount: Int - public let likeCount: Int - public let commentCount: Int - public let isLiked: Bool - - // UI 표시용 계산 프로퍼티 - public var formattedDate: String { - let formatter = DateFormatter() - formatter.dateFormat = "MM.dd" - return formatter.string(from: createdAt) - } - - public var formattedTime: String { - let formatter = DateFormatter() - formatter.dateFormat = "HH:mm" - return formatter.string(from: createdAt) - } + public let id: Int + public let title: String + public let content: String + public let category: String + public let imageUrls: [String] + public let authorNickname: String + public let authorId: Int + public let createdAt: Date + public let updatedAt: Date + public let viewCount: Int + public let likeCount: Int + public let commentCount: Int + public let isLiked: Bool + + // UI 표시용 계산 프로퍼티 + public var formattedDate: String { + let formatter = DateFormatter() + formatter.dateFormat = "MM.dd" + return formatter.string(from: createdAt) + } + + public var formattedTime: String { + let formatter = DateFormatter() + formatter.dateFormat = "HH:mm" + return formatter.string(from: createdAt) + } + + public init( + id: Int, + title: String, + content: String, + category: String, + imageUrls: [String], + authorNickname: String, + authorId: Int, + createdAt: Date, + updatedAt: Date, + viewCount: Int, + likeCount: Int, commentCount: Int, isLiked: Bool) { + self.id = id + self.title = title + self.content = content + self.category = category + self.imageUrls = imageUrls + self.authorNickname = authorNickname + self.authorId = authorId + self.createdAt = createdAt + self.updatedAt = updatedAt + self.viewCount = viewCount + self.likeCount = likeCount + self.commentCount = commentCount + self.isLiked = isLiked + } +} - public init(id: Int, title: String, content: String, category: String, - imageUrls: [String], authorNickname: String, authorId: Int, - createdAt: Date, updatedAt: Date, viewCount: Int, - likeCount: Int, commentCount: Int, isLiked: Bool) { - self.id = id - self.title = title - self.content = content - self.category = category - self.imageUrls = imageUrls - self.authorNickname = authorNickname - self.authorId = authorId - self.createdAt = createdAt - self.updatedAt = updatedAt - self.viewCount = viewCount - self.likeCount = likeCount - self.commentCount = commentCount - self.isLiked = isLiked - } +// MARK: - Sample Data +extension TrendingPost { + public static var sampleData: [TrendingPost] { + let now = Date() + return [ + TrendingPost( + id: 1, + title: "맥도날드 신메뉴 후기", + content: "새로 나온 버거가 진짜 맛있어요!", + category: "리뷰", + imageUrls: ["https://via.placeholder.com/400x300"], + authorNickname: "햄버거러버", + authorId: 101, + createdAt: now.addingTimeInterval(-3600), + updatedAt: now.addingTimeInterval(-3600), + viewCount: 152, + likeCount: 24, + commentCount: 8, + isLiked: false + ), + TrendingPost( + id: 2, + title: "버거킹 할인 정보", + content: "이번 주 버거킹 2+1 행사!", + category: "자유게시판", + imageUrls: ["https://via.placeholder.com/400x300"], + authorNickname: "버거헌터", + authorId: 102, + createdAt: now.addingTimeInterval(-7200), + updatedAt: now.addingTimeInterval(-7200), + viewCount: 98, + likeCount: 15, + commentCount: 5, + isLiked: false + ), + TrendingPost( + id: 3, + title: "수제버거 맛집 추천", + content: "홍대 근처 숨은 맛집 발견했어요", + category: "추천", + imageUrls: ["https://via.placeholder.com/400x300"], + authorNickname: "맛집탐험가", + authorId: 103, + createdAt: now.addingTimeInterval(-10800), + updatedAt: now.addingTimeInterval(-10800), + viewCount: 234, + likeCount: 42, + commentCount: 12, + isLiked: true + ) + ] + } } diff --git a/Home/Sources/Domain/Errors/HomeError.swift b/Home/Sources/Domain/Errors/HomeError.swift new file mode 100644 index 0000000..3f7a0ec --- /dev/null +++ b/Home/Sources/Domain/Errors/HomeError.swift @@ -0,0 +1,68 @@ +// +// HomeError.swift +// Hambug +// +// Created by Claude on 01/07/26. +// + +import Foundation + +// MARK: - Home Error +public enum HomeError: Error, LocalizedError { + // 네트워크 관련 + case networkFailure(underlying: Error) + case unauthorized + case serverError(statusCode: Int) + + // 데이터 관련 + case dataCorrupted + case emptyRecommendedBurgers + case emptyTrendingPosts + + // 비즈니스 로직 + case invalidBurgerData(reason: String) + case invalidPostData(reason: String) + + public var errorDescription: String? { + switch self { + case .networkFailure: + return "네트워크 연결을 확인해주세요." + case .unauthorized: + return "로그인이 필요한 서비스입니다." + case .serverError(let code): + return "서버 오류가 발생했습니다. (코드: \(code))" + case .dataCorrupted: + return "데이터를 불러오는 중 문제가 발생했습니다." + case .emptyRecommendedBurgers: + return "추천 버거 정보를 불러올 수 없습니다." + case .emptyTrendingPosts: + return "인기 게시글을 불러올 수 없습니다." + case .invalidBurgerData(let reason): + return "버거 데이터 오류: \(reason)" + case .invalidPostData(let reason): + return "게시글 데이터 오류: \(reason)" + } + } + + // 에러 심각도 (UI 표시 방식 결정) + public var severity: ErrorSeverity { + switch self { + case .unauthorized, .serverError: + return .critical + case .networkFailure, .dataCorrupted: + return .high + case .emptyRecommendedBurgers, .emptyTrendingPosts: + return .medium + case .invalidBurgerData, .invalidPostData: + return .low + } + } +} + +// MARK: - Error Severity +public enum ErrorSeverity { + case critical // Alert로 표시 + case high // Toast로 표시 + case medium // 인라인 메시지 + case low // 콘솔 로그만 +} diff --git a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift deleted file mode 100644 index f4ba773..0000000 --- a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCase.swift +++ /dev/null @@ -1,12 +0,0 @@ -// -// FetchRecommendedBurgersUseCase.swift -// HomeDomain -// -// Created by Claude on 1/5/26. -// - -import Foundation - -public protocol FetchRecommendedBurgersUseCase { - func execute() async throws -> [RecommendedBurger] -} diff --git a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift b/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift deleted file mode 100644 index a41755d..0000000 --- a/Home/Sources/Domain/UseCases/FetchRecommendedBurgersUseCaseImpl.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// FetchRecommendedBurgersUseCase.swift -// HomeDomain -// -// Created by Claude on 1/5/26. -// - -import Foundation - -public final class FetchRecommendedBurgersUseCaseImpl: FetchRecommendedBurgersUseCase { - private let repository: HomeViewRepository - - public init(repository: HomeViewRepository) { - self.repository = repository - } - - public func execute() async throws -> [RecommendedBurger] { - return try await repository.fetchRecommendedBurgers() - } -} diff --git a/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift b/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift deleted file mode 100644 index 62253e1..0000000 --- a/Home/Sources/Domain/UseCases/FetchTrendingPostsUseCase.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// FetchTrendingPostsUseCase.swift -// HomeDomain -// -// Created by Claude on 1/5/26. -// - -import Foundation - -public protocol FetchTrendingPostsUseCaseInterface { - func execute() async throws -> [TrendingPost] -} - -public final class FetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface { - private let repository: HomeViewRepository - - public init(repository: HomeViewRepository) { - self.repository = repository - } - - public func execute() async throws -> [TrendingPost] { - return try await repository.fetchTrendingPosts() - } -} diff --git a/Home/Sources/Domain/UseCases/HomeUseCaseImpl.swift b/Home/Sources/Domain/UseCases/HomeUseCaseImpl.swift new file mode 100644 index 0000000..4332dfc --- /dev/null +++ b/Home/Sources/Domain/UseCases/HomeUseCaseImpl.swift @@ -0,0 +1,76 @@ +// +// HomeUseCase.swift +// HomeDomain +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Home UseCase Interface +public protocol HomeUseCase { + /// 추천 버거 목록을 가져옵니다. + /// - Returns: 검증된 추천 버거 배열 + /// - Throws: HomeError (빈 데이터, 유효하지 않은 데이터 등) + func fetchRecommendedBurgers() async throws -> [RecommendedBurger] + + /// 트렌딩 포스트 목록을 가져옵니다. + /// - Returns: 검증 및 정렬된 트렌딩 포스트 배열 + /// - Throws: HomeError (빈 데이터, 유효하지 않은 데이터 등) + func fetchTrendingPosts() async throws -> [TrendingPost] +} + +// MARK: - Home UseCase Implementation +public final class HomeUseCaseImpl: HomeUseCase { + private let repository: HomeViewRepository + + public init(repository: HomeViewRepository) { + self.repository = repository + } + + // MARK: - Fetch Recommended Burgers + public func fetchRecommendedBurgers() async throws -> [RecommendedBurger] { + // 1. Repository 호출 + let burgers = try await repository.fetchRecommendedBurgers() + + // 2. 비즈니스 로직: 데이터 검증 + guard !burgers.isEmpty else { + throw HomeError.emptyRecommendedBurgers + } + + // 3. 비즈니스 로직: 유효성 검증 + let validBurgers = burgers.filter { burger in + !burger.menuName.isEmpty && !burger.franchise.isEmpty + } + + if validBurgers.isEmpty { + throw HomeError.invalidBurgerData(reason: "유효한 버거 정보가 없습니다") + } + + // 4. 비즈니스 로직: 정렬 (서버 순서 유지) + return validBurgers + } + + // MARK: - Fetch Trending Posts + public func fetchTrendingPosts() async throws -> [TrendingPost] { + // 1. Repository 호출 + let posts = try await repository.fetchTrendingPosts() + + // 2. 비즈니스 로직: 데이터 검증 + guard !posts.isEmpty else { + throw HomeError.emptyTrendingPosts + } + + // 3. 비즈니스 로직: 유효성 검증 + let validPosts = posts.filter { post in + !post.title.isEmpty && !post.content.isEmpty + } + + if validPosts.isEmpty { + throw HomeError.invalidPostData(reason: "유효한 게시글이 없습니다") + } + + // 4. 비즈니스 로직: 최신순 정렬 + return validPosts.sorted { $0.createdAt > $1.createdAt } + } +} diff --git a/Home/Sources/Presentation/HomeView.swift b/Home/Sources/Presentation/HomeView.swift index 81368da..5f7f8c7 100644 --- a/Home/Sources/Presentation/HomeView.swift +++ b/Home/Sources/Presentation/HomeView.swift @@ -36,7 +36,7 @@ public struct HomeView: View { .padding(.horizontal, 18) } - .safeAreaPadding(.bottom, 100) + .safeAreaPadding(.bottom, 60) } .padding(.top, 50) } @@ -47,14 +47,12 @@ public struct HomeView: View { struct PopularPostsView: View { - - var postItems: [TrendingPost] + private let postItems: [TrendingPost] init(postItems: [TrendingPost]) { self.postItems = postItems } - var body: some View { VStack(spacing: 12) { CategoryHeaderText("인기글") diff --git a/Home/Sources/Presentation/HomeViewModel.swift b/Home/Sources/Presentation/HomeViewModel.swift index eaeb0e0..be0ad6c 100644 --- a/Home/Sources/Presentation/HomeViewModel.swift +++ b/Home/Sources/Presentation/HomeViewModel.swift @@ -9,48 +9,137 @@ import Foundation import HomeDomain @Observable +@MainActor public final class HomeViewModel { - private let fetchRecommendedBurgersUseCase: FetchRecommendedBurgersUseCase - private let fetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface + // MARK: - Dependencies + private let homeUseCase: HomeUseCase + // MARK: - Published State + // 데이터 public var recommendedBurgers: [RecommendedBurger] = [] public var trendingPosts: [TrendingPost] = [] - public var isLoading: Bool = false - public var errorMessage: String? - public init( - fetchRecommendedBurgersUseCase: FetchRecommendedBurgersUseCase, - fetchTrendingPostsUseCase: FetchTrendingPostsUseCaseInterface - ) { - self.fetchRecommendedBurgersUseCase = fetchRecommendedBurgersUseCase - self.fetchTrendingPostsUseCase = fetchTrendingPostsUseCase + // 섹션별 로딩 상태 + public var isBurgersLoading: Bool = false + public var isPostsLoading: Bool = false + + // 섹션별 에러 + public var burgersError: HomeError? + public var postsError: HomeError? + + // MARK: - Computed Properties + // 전체 로딩 상태 + public var isLoading: Bool { + isBurgersLoading || isPostsLoading + } + + // 에러 메시지 (UI 표시용) + public var burgersErrorMessage: String? { + burgersError?.localizedDescription + } + + public var postsErrorMessage: String? { + postsError?.localizedDescription + } + + // 전체 에러 여부 + public var hasError: Bool { + burgersError != nil || postsError != nil + } + + // 통합 에러 메시지 + public var displayErrorMessage: String { + if let burgersError = burgersError, postsError == nil { + return burgersError.localizedDescription + } else if let postsError = postsError, burgersError == nil { + return postsError.localizedDescription + } else if burgersError != nil && postsError != nil { + return "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요." + } else { + return "" + } + } + + // MARK: - Initialization + public init(homeUseCase: HomeUseCase) { + self.homeUseCase = homeUseCase Task { await loadHomeData() } } - @MainActor + // MARK: - Public Methods public func loadHomeData() async { - isLoading = true - errorMessage = nil - defer { isLoading = false } + // 섹션별 에러 초기화 + burgersError = nil + postsError = nil + + // 병렬로 각각 독립적으로 로드 + async let burgersResult = loadRecommendedBurgers() + async let postsResult = loadTrendingPosts() + + await burgersResult + await postsResult + + // 로깅 + logHomeDataLoadStatus() + } + + public func refresh() async { + await loadHomeData() + } + + // MARK: - Private Methods + private func loadRecommendedBurgers() async { + isBurgersLoading = true + defer { isBurgersLoading = false } do { - // 병렬 API 호출 - async let burgers = try fetchRecommendedBurgersUseCase.execute() - async let posts = try fetchTrendingPostsUseCase.execute() + recommendedBurgers = try await homeUseCase.fetchRecommendedBurgers() + print("✅ 추천 버거 \(recommendedBurgers.count)개 로드 성공") + } catch let error as HomeError { + burgersError = error + print("❌ 추천 버거 로드 실패: \(error.localizedDescription)") - self.recommendedBurgers = try await burgers - self.trendingPosts = try await posts + // Fallback: 샘플 데이터 제공 + recommendedBurgers = RecommendedBurger.sampleData + print("ℹ️ 추천 버거 샘플 데이터 사용") } catch { - self.errorMessage = error.localizedDescription - print("❌ Home API 에러: \(error)") + burgersError = .networkFailure(underlying: error) + recommendedBurgers = RecommendedBurger.sampleData + print("❌ 추천 버거 로드 실패 (알 수 없는 에러): \(error)") } } - @MainActor - public func refresh() async { - await loadHomeData() + private func loadTrendingPosts() async { + isPostsLoading = true + defer { isPostsLoading = false } + + do { + trendingPosts = try await homeUseCase.fetchTrendingPosts() + print("✅ 트렌딩 포스트 \(trendingPosts.count)개 로드 성공") + } catch let error as HomeError { + postsError = error + print("❌ 트렌딩 포스트 로드 실패: \(error.localizedDescription)") + + // Fallback: 샘플 데이터 + trendingPosts = TrendingPost.sampleData + print("ℹ️ 트렌딩 포스트 샘플 데이터 사용") + } catch { + postsError = .networkFailure(underlying: error) + trendingPosts = TrendingPost.sampleData + print("❌ 트렌딩 포스트 로드 실패 (알 수 없는 에러): \(error)") + } + } + + private func logHomeDataLoadStatus() { + if !hasError { + print("✅ 홈 데이터 전체 로드 성공") + } else if burgersError != nil && postsError != nil { + print("❌ 홈 데이터 전체 로드 실패 (샘플 데이터 사용)") + } else { + print("⚠️ 홈 데이터 부분 로드 성공 (일부 샘플 데이터 사용)") + } } } diff --git a/Home/Sources/Presentation/PostView.swift b/Home/Sources/Presentation/PostView.swift index 94a591b..9fedd9a 100644 --- a/Home/Sources/Presentation/PostView.swift +++ b/Home/Sources/Presentation/PostView.swift @@ -10,122 +10,122 @@ import DesignSystem import HomeDomain public struct PostView: View { - - var post: TrendingPost - - public init(post: TrendingPost) { - self.post = post - } - - public var body: some View { - VStack(alignment: .center) { - HStack { - VStack(alignment: .leading, spacing: 6) { - Text(post.title) - .pretendard(.title(.t2)) - .foregroundColor(.textG800) - - HStack { - Text(post.category) - .pretendard(.caption(.emphasis)) - .foregroundColor(.primaryHambugRed) - - Text("·") - .foregroundColor(.bgG200) - - HStack(spacing: 5) { - Text(post.formattedDate) - .pretendard(.caption(.emphasis)) - .foregroundColor(.iconG600) - - Text(post.formattedTime) - .pretendard(.caption(.emphasis)) - .foregroundColor(.iconG600) - } - } - } - - Spacer() - - // 첫 번째 이미지가 있으면 표시 - if let firstImageUrl = post.imageUrls.first, - let url = URL(string: firstImageUrl) { - AsyncImage(url: url) { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - } placeholder: { - Rectangle() - .foregroundColor(.gray) - } - .frame(width: 56, height: 56) - .cornerRadius(8) - } else { - Rectangle() - .frame(width: 56, height: 56) - .cornerRadius(8) - .foregroundColor(.gray) - } + + var post: TrendingPost + + public init(post: TrendingPost) { + self.post = post + } + + public var body: some View { + VStack(alignment: .center) { + HStack { + VStack(alignment: .leading, spacing: 6) { + Text(post.title) + .pretendard(.title(.t2)) + .foregroundColor(.textG800) + + HStack { + Text(post.category) + .pretendard(.caption(.emphasis)) + .foregroundColor(.primaryHambugRed) + + Text("·") + .foregroundColor(.bgG200) + + HStack(spacing: 5) { + Text(post.formattedDate) + .pretendard(.caption(.emphasis)) + .foregroundColor(.iconG600) + + Text(post.formattedTime) + .pretendard(.caption(.emphasis)) + .foregroundColor(.iconG600) } + } } - .padding() - .background(.white) + + Spacer() + + // 첫 번째 이미지가 있으면 표시 + if let firstImageUrl = post.imageUrls.first, + let url = URL(string: firstImageUrl) { + AsyncImage(url: url) { image in + image + .resizable() + .aspectRatio(contentMode: .fill) + } placeholder: { + Rectangle() + .foregroundColor(.gray) + } + .frame(width: 56, height: 56) + .cornerRadius(8) + } else { + Rectangle() + .frame(width: 56, height: 56) + .cornerRadius(8) + .foregroundColor(.gray) + } + } } + .padding() + .background(.white) + } } struct FeedPostView: View { - var body: some View { - VStack(spacing: 20) { - - Rectangle() - .frame(height: 200) - - VStack(alignment: .leading, spacing: 14) { - Text("제목이 들어가는 자리입니다.") - .fontWeight(.bold) - .font(.system(size: 20)) - .frame(maxWidth: .infinity, alignment: .leading) - - Text("내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다.") - .frame(maxWidth: .infinity, alignment: .leading) - } - .frame(maxWidth: .infinity) - - } - .padding() - .background(.white) + var body: some View { + VStack(spacing: 20) { + + Rectangle() + .frame(height: 200) + + VStack(alignment: .leading, spacing: 14) { + Text("제목이 들어가는 자리입니다.") + .fontWeight(.bold) + .font(.system(size: 20)) + .frame(maxWidth: .infinity, alignment: .leading) + + Text("내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다. 내용이 들어가는 자리입니다.") + .frame(maxWidth: .infinity, alignment: .leading) + } + .frame(maxWidth: .infinity) + } + .padding() + .background(.white) + } } #Preview { - ZStack { - Color.gray - VStack { - PostView( - post: TrendingPost( - id: 1, - title: "글 제목입니다.", - content: "글 내용입니다.", - category: "FREE_TALK", - imageUrls: [], - authorNickname: "테스트", - authorId: 1, - createdAt: Date(), - updatedAt: Date(), - viewCount: 100, - likeCount: 10, - commentCount: 5, - isLiked: false - ) - ) - .padding() - - FeedPostView() - .padding() - } + ZStack { + Color.gray + VStack { + PostView( + post: TrendingPost( + id: 1, + title: "글 제목입니다.", + content: "글 내용입니다.", + category: "FREE_TALK", + imageUrls: [], + authorNickname: "테스트", + authorId: 1, + createdAt: Date(), + updatedAt: Date(), + viewCount: 100, + likeCount: 10, + commentCount: 5, + isLiked: false + ) + ) + .padding() + + FeedPostView() + .padding() } + } } diff --git a/Home/Sources/Presentation/SuggestView.swift b/Home/Sources/Presentation/SuggestView.swift index 5092a02..cea187d 100644 --- a/Home/Sources/Presentation/SuggestView.swift +++ b/Home/Sources/Presentation/SuggestView.swift @@ -48,61 +48,9 @@ struct SingleSuggestView: View { let burger: RecommendedBurger? var body: some View { - VStack(spacing: 4) { + VStack(spacing: 0) { if let burger = burger { - AsyncImage(url: URL(string: burger.menuImage)) { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - } placeholder: { - EmptyView() - } - .frame(width: 170, height: 170) - .clipped() - .padding(.top, 20) - - VStack(spacing: 0) { - Text(burger.franchise) - .pretendard(.title(.t2)) - .padding(7) - .foregroundStyle(Color.bgWhite) - .background(Color.primaryHambugRed) - .clipShape(RoundedRectangle(cornerRadius: 4)) - - Text(burger.menuName) - .pretendard(.title(.t2)) - .frame(maxWidth: .infinity) - - Text(burger.menuDescription) - .pretendard(.body(.small)) - .lineLimit(1) - .frame(maxWidth: .infinity) - } - .padding(.horizontal, 20) - } else { - // Placeholder -// Image(systemName: "birthday.cake") -// .resizable() -// .padding(.top, 20) -// .frame(width: 170, height: 170) - EmptyView() - - VStack(spacing: 0) { - Text("franchiseChip") - .pretendard(.title(.t2)) - .padding(7) - .foregroundStyle(Color.bgWhite) - .background(Color.primaryHambugRed) - .clipShape(RoundedRectangle(cornerRadius: 4)) - Text("Menu Name") - .pretendard(.title(.t2)) - .frame(maxWidth: .infinity) - Text("Menu Descriptionaadasdasdasdasdaasdasd") - .pretendard(.body(.small)) - .lineLimit(1) - .frame(maxWidth: .infinity) - } - .padding(.horizontal, 20) + contentView(burger) } } .frame(width: 290 * 0.85, height: 290) @@ -111,18 +59,47 @@ struct SingleSuggestView: View { .foregroundColor(Color.bgWhite) ) } -} - -class SuggestSizeValue { - - static let shared = SuggestSizeValue() - - var singleSuggestViewWidth: Double { - UIScreen.main.bounds.size.width * 0.7 - } - var safeAreaPadding: Double { - (UIScreen.main.bounds.size.width - singleSuggestViewWidth) / 2 + + private func contentView(_ burger: RecommendedBurger) -> some View { + VStack(spacing: 8) { + AsyncImage(url: URL(string: burger.menuImage)) { image in + image + .resizable() + .aspectRatio(contentMode: .fill) + } placeholder: { + EmptyView() + } + .frame(width: 170, height: 170) + .clipped() + .padding(.top, 20) + + VStack(spacing: 4) { + Text(burger.franchise) + .pretendard(.caption(.emphasis)) + .padding(7) + .foregroundStyle(Color.bgWhite) + .background(Color.primaryHambugRed) + .clipShape(RoundedRectangle(cornerRadius: 4)) + + Text(burger.menuName) + .pretendard(.title(.t2)) + .frame(maxWidth: .infinity) + + Text(burger.menuDescription) + .pretendard(.body(.small)) + .foregroundStyle(Color.iconG600) + .lineLimit(1) + .frame(maxWidth: .infinity) + } + .padding(.horizontal, 20) + .padding(.bottom, 20) } +// .frame(width: 290 * 0.85, height: 290) +// .background( +// RoundedRectangle(cornerRadius: 15) +// .foregroundColor(Color.bgWhite) +// ) + } } From eee0f90fa06c0795c778652b0badded8a298cda4 Mon Sep 17 00:00:00 2001 From: kangddong Date: Fri, 9 Jan 2026 01:39:34 +0900 Subject: [PATCH 07/12] =?UTF-8?q?feat:=20Util=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignSystem/KeyboardObserver.swift | 36 ++++++++ .../Sources/DesignSystem/View+Keyboard.swift | 22 +++++ Common/Sources/Util/DateFormatter+Util.swift | 18 ++++ Common/Sources/Util/ImageProcessor.swift | 92 +++++++++++++++++++ .../Sources/Data/DTO/BoardResponse.swift | 88 +++++++++++++----- .../Sources/Data/DTO/CommentResponse.swift | 71 ++++++++++++++ Home/Package.swift | 4 +- .../Data/DTO/TrendingPostResponse.swift | 39 ++++---- 8 files changed, 326 insertions(+), 44 deletions(-) create mode 100644 Common/Sources/DesignSystem/KeyboardObserver.swift create mode 100644 Common/Sources/DesignSystem/View+Keyboard.swift create mode 100644 Common/Sources/Util/DateFormatter+Util.swift create mode 100644 Common/Sources/Util/ImageProcessor.swift create mode 100644 Community/Sources/Data/DTO/CommentResponse.swift diff --git a/Common/Sources/DesignSystem/KeyboardObserver.swift b/Common/Sources/DesignSystem/KeyboardObserver.swift new file mode 100644 index 0000000..d5fb9ab --- /dev/null +++ b/Common/Sources/DesignSystem/KeyboardObserver.swift @@ -0,0 +1,36 @@ +// +// KeyboardObserver.swift +// Hambug +// +// Created by 강동영 on 1/8/26. +// + +import SwiftUI +import Combine + +public class KeyboardObserver: ObservableObject { + @Published public var keyboardHeight: CGFloat = 0 + @Published public var isKeyboardVisible: Bool = false + + private var cancellables = Set() + + public init() { + NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification) + .compactMap { notification in + notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect + } + .map { $0.height } + .sink { [weak self] height in + self?.keyboardHeight = height + self?.isKeyboardVisible = true + } + .store(in: &cancellables) + + NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification) + .sink { [weak self] _ in + self?.keyboardHeight = 0 + self?.isKeyboardVisible = false + } + .store(in: &cancellables) + } +} diff --git a/Common/Sources/DesignSystem/View+Keyboard.swift b/Common/Sources/DesignSystem/View+Keyboard.swift new file mode 100644 index 0000000..a5247fd --- /dev/null +++ b/Common/Sources/DesignSystem/View+Keyboard.swift @@ -0,0 +1,22 @@ +// +// View+Keyboard.swift +// Hambug +// +// Created by 강동영 on 1/8/26. +// + +import SwiftUI + +public extension View { + /// 뷰의 빈 영역을 탭하면 키보드를 해제합니다 + func dismissKeyboardOnTap() -> some View { + self.onTapGesture { + UIApplication.shared.sendAction( + #selector(UIResponder.resignFirstResponder), + to: nil, + from: nil, + for: nil + ) + } + } +} diff --git a/Common/Sources/Util/DateFormatter+Util.swift b/Common/Sources/Util/DateFormatter+Util.swift new file mode 100644 index 0000000..483ac4b --- /dev/null +++ b/Common/Sources/Util/DateFormatter+Util.swift @@ -0,0 +1,18 @@ +// +// DateFormatter+Util.swift +// Common +// +// Created by 강동영 on 1/9/26. +// + +import Foundation + +public extension DateFormatter { + static let iso8601WithMicroseconds: DateFormatter = { + let formatter = DateFormatter() + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSSSS" + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.timeZone = TimeZone(identifier: "Asia/Seoul") + return formatter + }() +} diff --git a/Common/Sources/Util/ImageProcessor.swift b/Common/Sources/Util/ImageProcessor.swift new file mode 100644 index 0000000..dffcd84 --- /dev/null +++ b/Common/Sources/Util/ImageProcessor.swift @@ -0,0 +1,92 @@ +// +// ImageProcessor.swift +// Common +// +// Created by 강동영 on 1/8/26. +// + +import UIKit + +/// 이미지 리사이징 및 압축 유틸리티 +public enum ImageProcessor { + + // MARK: - Constants + + /// 최대 파일 크기: 10MB + public static let maxFileSize: Int = 10 * 1024 * 1024 + + /// 최대 해상도: 1920px + public static let maxDimension: CGFloat = 1920 + + /// 기본 압축 품질 + public static let compressionQuality: CGFloat = 0.85 + + // MARK: - Public Methods + + /// 이미지를 처리 (리사이징 + 압축) + /// - Parameter image: 원본 UIImage + /// - Returns: 처리된 JPEG Data (10MB 이하), 실패 시 nil + public static func process(_ image: UIImage) -> Data? { + // 1. 해상도가 초과하면 리사이징 + let resizedImage = resize(image, maxDimension: maxDimension) + + // 2. JPEG 압축 + guard var imageData = resizedImage.jpegData(compressionQuality: compressionQuality) else { + return nil + } + + // 3. 10MB 초과 시 품질을 낮추며 재압축 + var currentQuality = compressionQuality + while imageData.count > maxFileSize && currentQuality > 0.5 { + currentQuality -= 0.1 + guard let compressedData = resizedImage.jpegData(compressionQuality: currentQuality) else { + break + } + imageData = compressedData + } + + // 4. 최종 크기 검증 + return imageData.count <= maxFileSize ? imageData : nil + } + + /// 예상 파일 크기 계산 (RGBA 기준) + /// - Parameter image: UIImage + /// - Returns: 예상 크기 (bytes) + public static func estimatedSize(of image: UIImage) -> Int { + return Int(image.size.width * image.size.height * 4) + } + + // MARK: - Private Methods + + /// 이미지 해상도 조정 (비율 유지) + /// - Parameters: + /// - image: 원본 이미지 + /// - maxDimension: 최대 너비/높이 + /// - Returns: 리사이징된 이미지 + private static func resize(_ image: UIImage, maxDimension: CGFloat) -> UIImage { + let size = image.size + + // 이미 범위 내에 있으면 원본 반환 + if size.width <= maxDimension && size.height <= maxDimension { + return image + } + + // 새로운 크기 계산 (비율 유지) + let aspectRatio = size.width / size.height + let newSize: CGSize + + if size.width > size.height { + // 가로가 더 긴 경우 + newSize = CGSize(width: maxDimension, height: maxDimension / aspectRatio) + } else { + // 세로가 더 긴 경우 + newSize = CGSize(width: maxDimension * aspectRatio, height: maxDimension) + } + + // 리사이징 수행 + let renderer = UIGraphicsImageRenderer(size: newSize) + return renderer.image { _ in + image.draw(in: CGRect(origin: .zero, size: newSize)) + } + } +} diff --git a/Community/Sources/Data/DTO/BoardResponse.swift b/Community/Sources/Data/DTO/BoardResponse.swift index b00b99e..51bfef9 100644 --- a/Community/Sources/Data/DTO/BoardResponse.swift +++ b/Community/Sources/Data/DTO/BoardResponse.swift @@ -7,41 +7,83 @@ import Foundation import CommunityDomain +import Util -// MARK: - Unified Board Response Model -public struct BoardResponse: Decodable { +// MARK: - Board Response DTO +public struct BoardResponseDTO: Decodable, Sendable { public let id: Int - public let imageURL: String public let title: String - public let nickName: String - public let content: String? // 목록 조회시 nil, 카테고리에 따라 조회시 값 - public let createdAt: Date - public let likeCount: String - public let commnetCount: String + public let content: String + public let category: String + public let imageUrls: [String] + public let authorNickname: String + public let authorProfileImageUrl: String? + public let authorId: Int + public let createdAt: String + public let updatedAt: String + public let viewCount: Int + public let likeCount: Int + public let commentCount: Int + public let isLiked: Bool + + private enum CodingKeys: String, CodingKey { + case id, title, content, category + case imageUrls + case authorNickname + case authorProfileImageUrl + case authorId + case createdAt + case updatedAt + case viewCount + case likeCount + case commentCount + case isLiked + } } -extension BoardResponse { +// MARK: - Board List Data DTO (Pagination) +public struct BoardListDataDTO: Decodable, Sendable { + public let content: [BoardResponseDTO] + public let nextCursorId: Int? + public let nextPage: Bool + + private enum CodingKeys: String, CodingKey { + case content + case nextCursorId = "netCursorId" + case nextPage + } +} + +// MARK: - DTO to Domain Mapper +extension BoardResponseDTO { func toDomain() -> Board { + let dateFormatter = DateFormatter.iso8601WithMicroseconds + return Board( id: id, - imageURL: imageURL, title: title, - nickName: nickName, - content: content ?? "", - createdAt: createdAt.timeAgoDisplay(), + content: content, + category: BoardCategory(rawValue: category) ?? .freeTalk, + imageUrls: imageUrls, + authorNickname: authorNickname, + authorProfileImageUrl: authorProfileImageUrl, + authorId: authorId, + createdAt: dateFormatter.date(from: createdAt) ?? Date(), + updatedAt: dateFormatter.date(from: updatedAt) ?? Date(), + viewCount: viewCount, likeCount: likeCount, - commnetCount: commnetCount + commentCount: commentCount, + isLiked: isLiked ) } } -public typealias BoardListResponse = BoardResponse -public typealias BoardFeedResponse = BoardResponse - -public enum Category: String { - case all = "ALL" - case freeTalk = "FREE_TALK" // 자유잡담 - case franchise = "FRANCHISE" - case handmade = "HANDMADE" - case recommendation = "RECOMMENDATION" +extension BoardListDataDTO { + func toDomain() -> BoardListData { + return BoardListData( + content: content.map { $0.toDomain() }, + nextCursorId: nextCursorId, + hasNextPage: nextPage + ) + } } diff --git a/Community/Sources/Data/DTO/CommentResponse.swift b/Community/Sources/Data/DTO/CommentResponse.swift new file mode 100644 index 0000000..73f2421 --- /dev/null +++ b/Community/Sources/Data/DTO/CommentResponse.swift @@ -0,0 +1,71 @@ +// +// CommentResponse.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation +import CommunityDomain +import Util + +// MARK: - Comment Response DTO +public struct CommentResponseDTO: Decodable, Sendable { + public let id: Int + public let content: String + public let authorId: Int + public let authorNickname: String + public let authorProfileImageUrl: String? + public let createdAt: String + public let updatedAt: String + + private enum CodingKeys: String, CodingKey { + case id + case content + case authorId + case authorNickname + case authorProfileImageUrl + case createdAt + case updatedAt + } +} + +// MARK: - Comment List Data DTO (Pagination) +public struct CommentListDataDTO: Decodable, Sendable { + public let content: [CommentResponseDTO] + public let nextCursorId: Int? + public let nextPage: Bool + + private enum CodingKeys: String, CodingKey { + case content + case nextCursorId = "netCursorId" + case nextPage + } +} + +// MARK: - DTO to Domain Mapper +extension CommentResponseDTO { + func toDomain() -> Comment { + let dateFormatter = DateFormatter.iso8601WithMicroseconds + + return Comment( + id: id, + content: content, + authorId: authorId, + authorNickname: authorNickname, + authorProfileImageUrl: authorProfileImageUrl, + createdAt: dateFormatter.date(from: createdAt) ?? Date(), + updatedAt: dateFormatter.date(from: updatedAt) ?? Date() + ) + } +} + +extension CommentListDataDTO { + func toDomain() -> CommentListData { + return CommentListData( + content: content.map { $0.toDomain() }, + nextCursorId: nextCursorId, + hasNextPage: nextPage + ) + } +} diff --git a/Home/Package.swift b/Home/Package.swift index 17ef8eb..548609b 100644 --- a/Home/Package.swift +++ b/Home/Package.swift @@ -41,8 +41,8 @@ let package = Package( .target(config: .domain), .target(config: .data), .target(config: .presentation), - .product(name: "DI", package: "DIKit"), - .product(name: "AppDI", package: "DIKit"), + .product(name: "DI", package: "DI"), + .product(name: "AppDI", package: "DI"), .product(name: "Managers", package: "Common"), .product(name: "DataSources", package: "Common"), ], diff --git a/Home/Sources/Data/DTO/TrendingPostResponse.swift b/Home/Sources/Data/DTO/TrendingPostResponse.swift index 9262b04..6d3fe51 100644 --- a/Home/Sources/Data/DTO/TrendingPostResponse.swift +++ b/Home/Sources/Data/DTO/TrendingPostResponse.swift @@ -7,6 +7,7 @@ import Foundation import HomeDomain +import Util public struct TrendingPostResponse: Decodable, Sendable { public let id: Int @@ -25,23 +26,23 @@ public struct TrendingPostResponse: Decodable, Sendable { } extension TrendingPostResponse { - public func toDomain() -> TrendingPost { - let formatter = ISO8601DateFormatter() - - return TrendingPost( - id: id, - title: title, - content: content, - category: category, - imageUrls: imageUrls, - authorNickname: authorNickname, - authorId: authorId, - createdAt: formatter.date(from: createdAt) ?? Date(), - updatedAt: formatter.date(from: updatedAt) ?? Date(), - viewCount: viewCount, - likeCount: likeCount, - commentCount: commentCount, - isLiked: isLiked - ) - } + public func toDomain() -> TrendingPost { + let formatter = DateFormatter.iso8601WithMicroseconds + + return TrendingPost( + id: id, + title: title, + content: content, + category: category, + imageUrls: imageUrls, + authorNickname: authorNickname, + authorId: authorId, + createdAt: formatter.date(from: createdAt) ?? Date(), + updatedAt: formatter.date(from: updatedAt) ?? Date(), + viewCount: viewCount, + likeCount: likeCount, + commentCount: commentCount, + isLiked: isLiked + ) + } } From 6769d280ba6eabd8104cd4583124f70e2be0d0ea Mon Sep 17 00:00:00 2001 From: kangddong Date: Fri, 9 Jan 2026 02:02:51 +0900 Subject: [PATCH 08/12] =?UTF-8?q?feat:=20Community=20List/Card=20View=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/DI/CommunityDIContainer.swift | 223 ++++++++++++++++++ Community/Sources/Data/API/CommunityAPI.swift | 87 +++++-- .../Sources/Data/API/CommunityAPIClient.swift | 211 ++++++++++++----- Community/Sources/Data/DTO/BoardRequest.swift | 28 +++ Community/Sources/Data/DTO/Querys.swift | 34 +++ .../CommunityRepositoryImpl.swift | 116 +++++++-- Community/Sources/Domain/Entities/Board.swift | 169 +++++++++---- .../Repositories/CommunityRepository.swift | 39 +++ .../CommunityRepositoryInterface.swift | 15 -- .../GetBoardsByCategoryUseCaseImpl.swift | 27 +++ .../Domain/UseCases/GetBoardsUseCase.swift | 34 --- .../UseCases/GetBoardsUseCaseImpl.swift | 27 +++ .../{Views => Community}/CommunityView.swift | 97 ++++---- .../Community/CommunityViewModel.swift | 197 ++++++++++++++++ .../BorderTextEditor.swift | 28 ++- .../Component/BottomLineTextField.swift | 43 ++++ .../Presentation/Component/RequiredText.swift | 27 +++ .../ViewModels/CommunityViewModel.swift | 118 --------- .../Views/Write/BottomLineTextField.swift | 29 --- DI/Package.swift | 2 - .../CommunityDI/CommunityDIContainer.swift | 146 ------------ .../Sources/NetworkImpl/AuthInterceptor.swift | 4 +- .../Sources/NetworkImpl/NetworkLogger.swift | 2 +- .../NetworkImpl/NetworkServiceImpl.swift | 76 +++++- .../NetworkInterface/EndPointEncoder.swift | 25 ++ .../Sources/NetworkInterface/Endpoint.swift | 3 + .../NetworkInterface/NetworkConfig.swift | 3 +- 27 files changed, 1261 insertions(+), 549 deletions(-) create mode 100644 Community/Sources/DI/CommunityDIContainer.swift create mode 100644 Community/Sources/Data/DTO/BoardRequest.swift create mode 100644 Community/Sources/Data/DTO/Querys.swift create mode 100644 Community/Sources/Domain/Repositories/CommunityRepository.swift delete mode 100644 Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift create mode 100644 Community/Sources/Domain/UseCases/GetBoardsByCategoryUseCaseImpl.swift delete mode 100644 Community/Sources/Domain/UseCases/GetBoardsUseCase.swift create mode 100644 Community/Sources/Domain/UseCases/GetBoardsUseCaseImpl.swift rename Community/Sources/Presentation/{Views => Community}/CommunityView.swift (87%) create mode 100644 Community/Sources/Presentation/Community/CommunityViewModel.swift rename Community/Sources/Presentation/{Views/Write => Component}/BorderTextEditor.swift (77%) create mode 100644 Community/Sources/Presentation/Component/BottomLineTextField.swift create mode 100644 Community/Sources/Presentation/Component/RequiredText.swift delete mode 100644 Community/Sources/Presentation/ViewModels/CommunityViewModel.swift delete mode 100644 Community/Sources/Presentation/Views/Write/BottomLineTextField.swift delete mode 100644 DI/Sources/CommunityDI/CommunityDIContainer.swift create mode 100644 Infrastructure/Sources/NetworkInterface/EndPointEncoder.swift diff --git a/Community/Sources/DI/CommunityDIContainer.swift b/Community/Sources/DI/CommunityDIContainer.swift new file mode 100644 index 0000000..e5b3753 --- /dev/null +++ b/Community/Sources/DI/CommunityDIContainer.swift @@ -0,0 +1,223 @@ +// +// CommunityDIContainer.swift +// Hambug +// +// Created by 강동영 on 10/17/25. +// + +import Foundation +import DIKit +import AppDI +import NetworkInterface +import NetworkImpl +import CommunityDomain +import CommunityData +import CommunityPresentation + +import SwiftUI +struct CommunityWriteAssembly: Assembly { + func assemble(container: GenericDIContainer) { + container.register(CreateBoardUseCase.self) { resolver in + CreateBoardUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(CommunityWriteViewModel.self) { resolver in + CommunityWriteViewModel(createBoardUseCase: resolver.resolve(CreateBoardUseCase.self)) + } + } +} +// MARK: - Community Assembly +struct CommunityAssembly: Assembly { + + func assemble(container: GenericDIContainer) { + // NetworkService registration (only for mock mode) + // In normal mode, NetworkService comes from parent container +// if isMock { +// container.register(NetworkServiceInterface.self) { _ in +// let config = URLSessionConfiguration.ephemeral +// config.protocolClasses = [CommunityURLProtocol.self] +// setupURLProtocol() +// return NetworkServiceImpl(configuration: config) +// } +// } + + // APIClient registration + container.register(CommunityAPIClientInterface.self) { resolver in +// if self.isMock { +// return MockCommunityAPIClient() +// } else { + return CommunityAPIClient(networkService: resolver.resolve(NetworkServiceInterface.self)) +// } + } + + // Repository registration + container.register(CommunityRepository.self) { resolver in + CommunityRepositoryImpl(apiClient: resolver.resolve(CommunityAPIClientInterface.self)) + } + + // UseCase registration + container.register(GetBoardsUseCaseInterface.self) { resolver in + GetBoardsUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(GetBoardsByCategoryUseCaseInterface.self) { resolver in + GetBoardsByCategoryUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + // MARK: - CommunityViewModel registration + container.register(CommunityViewModel.self) { @MainActor resolver in + CommunityViewModel( + getBoardsUseCase: resolver.resolve(GetBoardsUseCaseInterface.self), + getBoardsByCategoryUseCase: resolver.resolve(GetBoardsByCategoryUseCaseInterface.self) + ) + } + + container.register(GetBoardDetailUseCaseInterface.self) { resolver in + GetBoardDetailUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(GetCommentsUseCaseInterface.self) { resolver in + GetCommentsUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(CreateCommentUseCaseInterface.self) { resolver in + CreateCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(UpdateCommentUseCaseInterface.self) { resolver in + UpdateCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(DeleteCommentUseCaseInterface.self) { resolver in + DeleteCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(GetLikeInfoUseCaseInterface.self) { resolver in + GetLikeInfoUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(ToggleLikeUseCaseInterface.self) { resolver in + ToggleLikeUseCase(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(ReportContentUseCase.self) { resolver in + ReportContentUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) + } + + container.register(CommunityDetailViewModel.self) { @MainActor resolver in + CommunityDetailViewModel( + getBoardDetailUseCase: resolver.resolve(GetBoardDetailUseCaseInterface.self), + getCommentsUseCase: resolver.resolve(GetCommentsUseCaseInterface.self), + createCommentUseCase: resolver.resolve(CreateCommentUseCaseInterface.self), + updateCommentUseCase: resolver.resolve(UpdateCommentUseCaseInterface.self), + deleteCommentUseCase: resolver.resolve(DeleteCommentUseCaseInterface.self), + getLikeInfoUseCase: resolver.resolve(GetLikeInfoUseCaseInterface.self), + toggleLikeUseCase: resolver.resolve(ToggleLikeUseCaseInterface.self), + reportContentUseCase: resolver.resolve(ReportContentUseCase.self) + ) + } + +// container.register(CommunityReportViewModel.self) { resolver in +// CommunityReportViewModel.init +// } + } +} + +// MARK: - Community DI Container +public final class CommunityDIContainer { + + // MARK: - Properties + private let container: GenericDIContainer + + // MARK: - Initialization + public init(appContainer: AppDIContainer = .shared) { + self.container = GenericDIContainer(parent: appContainer.baseContainer) + CommunityAssembly().assemble(container: container) + CommunityWriteAssembly().assemble(container: container) + } + + // MARK: - Factory Methods + @MainActor + public func makeCommunityViewModel() -> CommunityViewModel { + return container.resolve(CommunityViewModel.self) + } + + @MainActor + public func makeCommunityDetailViewModel() -> CommunityDetailViewModel { + return container.resolve(CommunityDetailViewModel.self) + } + + @MainActor + public func makeCommunityReportViewModel() -> CommunityReportViewModel { + return container.resolve(CommunityReportViewModel.self) + } + + public func resolve(_ type: T.Type) -> T { + return container.resolve(type) + } +} + +extension CommunityDIContainer: CommunityWriteFactory { + public func makeWriteViewModel() -> CommunityWriteViewModel { + return container.resolve(CommunityWriteViewModel.self) + } +} + +// MARK: - Mock Setup +private func setupURLProtocol() { + let boardsData: [[String: Any]] = [ + [ + "id": 1, + "imageURL": "https://example.com/image1.jpg", + "title": "첫 번째 게시글", + "nickName": "햄버거러버", + "createdAt": "2024-10-17T10:00:00.000Z", + "likeCount": "15", + "commnetCount": "3" + ], + [ + "id": 2, + "imageURL": "https://example.com/image2.jpg", + "title": "맛있는 햄버거 추천", + "nickName": "음식탐험가", + "createdAt": "2024-10-17T09:30:00.000Z", + "likeCount": "23", + "commnetCount": "7" + ] + ] + + let boardsResponse: [String: Any] = [ + "success": true, + "data": boardsData, + "message": "성공", + "code": 200 + ] + + let boardsResponseData = try! JSONSerialization.data(withJSONObject: boardsResponse, options: []) + + let boardDetailResponse: [String: Any] = [ + "id": 1, + "imageURL": "https://example.com/image1.jpg", + "title": "첫 번째 게시글", + "content": "이것은 첫 번째 게시글의 상세 내용입니다.", + "nickName": "햄버거러버", + "createdAt": "2024-10-17T10:00:00.000Z", + "likeCount": "15", + "commnetCount": "3" + ] + + let boardDetailResponseData = try! JSONSerialization.data(withJSONObject: boardDetailResponse, options: []) + + CommunityURLProtocol.successMock = [ + "/api/v1/boards": (200, boardsResponseData), + "/api/v1/boards?category=FREE_TALK": (200, boardsResponseData), + "/api/v1/boards?category=FRANCHISE": (200, boardsResponseData), + "/api/v1/boards?category=HANDMADE": (200, boardsResponseData), + "/api/v1/boards?category=RECOMMENDATION": (200, boardsResponseData) + ] +} + +//#Preview { +// let diContainer = CommunityDIContainer() +// CommunityView(viewModel: diContainer.makeCommunityViewModel(), diContainer: diContainer) +//} diff --git a/Community/Sources/Data/API/CommunityAPI.swift b/Community/Sources/Data/API/CommunityAPI.swift index 8d6614d..18f085f 100644 --- a/Community/Sources/Data/API/CommunityAPI.swift +++ b/Community/Sources/Data/API/CommunityAPI.swift @@ -7,45 +7,98 @@ import Foundation import NetworkInterface +import CommunityDomain -// MARK: - Board Endpoints (Moya Style) +// MARK: - Board Endpoints public enum BoardEndpoint: Endpoint { - case boards - case boardsBy(_ category: Category) + case createBoard(BoardRequestDTO) + case boards(CursorPagingQuery) + case boardsByCategory(CategoryPagingQuery) + case boardDetail(boardId: Int) + case comments(boardId: Int, query: CursorPagingQuery) + case createComment(boardId: Int, content: String) + case updateComment(boardId: Int, commentId: Int, content: String) + case deleteComment(boardId: Int, commentId: Int) + case likeInfo(boardId: Int) + case toggleLike(boardId: Int) + case report(ReportRequestDTO) public var baseURL: String { - return "https://hambug.p-e.kr/api/v1" + return NetworkConfig.baseURL + "/api/v1" } - + public var path: String { switch self { - case .boards, .boardsBy(_): + case .createBoard(let dto): + return dto.imageUrls.isEmpty ? "/boards" : "/boards/with-image" + case .boards: return "/boards" + case .boardsByCategory: + return "/boards/category" + case .boardDetail(let boardId): + return "/boards/\(boardId)" + case .comments(let boardId, _): + return "/boards/\(boardId)/comments" + case .createComment(let boardId, _): + return "/boards/\(boardId)/comments" + case .updateComment(let boardId, let commentId, _): + return "/boards/\(boardId)/comments/\(commentId)" + case .deleteComment(let boardId, let commentId): + return "/boards/\(boardId)/comments/\(commentId)" + case .likeInfo(let boardId): + return "/boards/\(boardId)/likes" + case .toggleLike(let boardId): + return "/boards/\(boardId)/likes" + case .report: + return "/reports" } } - + public var method: HTTPMethod { switch self { - default: + case .boards, .boardsByCategory, .boardDetail, .comments, .likeInfo: return .GET + case .createBoard, .createComment, .toggleLike, .report: + return .POST + case .updateComment: + return .PUT + case .deleteComment: + return .DELETE } } - + public var headers: [String: String] { - var headers: [String: String] = [:] - return headers + return [:] } - + public var queryParameters: [String: Any] { switch self { - case .boards: + case let .boards(dto): + return queryEncoder.encode(dto) + case let .boardsByCategory(dto): + return queryEncoder.encode(dto) + case let .comments(_, dto): + return queryEncoder.encode(dto) + default: return [:] - case .boardsBy(let category): - return ["category": category.rawValue] } } - + public var body: Data? { - return nil + let encoder = JSONEncoder() + switch self { + case .createBoard(let dto): + return try? encoder.encode(dto) + case .createComment(_, let content): + let body = ["content": content] + return try? encoder.encode(body) + case .updateComment(_, _, let content): + let body = ["content": content] + return try? encoder.encode(body) + case .report(let request): + return try? encoder.encode(request) + default: + return nil + } } } diff --git a/Community/Sources/Data/API/CommunityAPIClient.swift b/Community/Sources/Data/API/CommunityAPIClient.swift index a69319b..9132cdf 100644 --- a/Community/Sources/Data/API/CommunityAPIClient.swift +++ b/Community/Sources/Data/API/CommunityAPIClient.swift @@ -8,11 +8,35 @@ import Foundation import Combine import NetworkInterface +import CommunityDomain +import UIKit // MARK: - Community API Client Interface -public protocol CommunityAPIClientInterface { - func fetchBoards() -> AnyPublisher<[BoardListResponse], NetworkError> - func fetchBoardsByCategory(_ category: Category) -> AnyPublisher<[BoardResponse], NetworkError> +public protocol CommunityAPIClientInterface: Sendable { + func fetchBoards(lastId: Int?, limit: Int, order: String) -> AnyPublisher + func fetchBoardsByCategory(category: String, lastId: Int?, limit: Int, order: String) -> AnyPublisher + func fetchBoardDetail(boardId: Int) -> AnyPublisher + + // Board creation + func createBoard( + title: String, + content: String, + category: String, + images: [UIImage] + ) -> AnyPublisher + + // Comments + func fetchComments(boardId: Int, lastId: Int, limit: Int, order: String) -> AnyPublisher + func createComment(boardId: Int, content: String) -> AnyPublisher + func updateComment(boardId: Int, commentId: Int, content: String) -> AnyPublisher + func deleteComment(boardId: Int, commentId: Int) -> AnyPublisher + + // Likes + func fetchLikeInfo(boardId: Int) -> AnyPublisher + func toggleLike(boardId: Int) -> AnyPublisher + + // Report + func reportContent(request: ReportRequestDTO) -> AnyPublisher } // MARK: - Community API Client Implementation @@ -24,72 +48,131 @@ public final class CommunityAPIClient: CommunityAPIClientInterface { self.networkService = networkService } - public func fetchBoards() -> AnyPublisher<[BoardListResponse], NetworkError> { - return networkService.request(BoardEndpoint.boards, responseType: [BoardListResponse].self) + public func fetchBoards(lastId: Int?, limit: Int, order: String) -> AnyPublisher { + let query: CursorPagingQuery = .init(lastId: lastId, limit: limit, order: order) + return networkService.request( + BoardEndpoint.boards(query), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() } - - public func fetchBoardsByCategory(_ category: Category) -> AnyPublisher<[BoardResponse], NetworkError> { - switch category { - case .all, .freeTalk: - return networkService.request(BoardEndpoint.boardsBy(category), responseType: [BoardListResponse].self) - - case .franchise, .handmade, .recommendation: - return networkService.request(BoardEndpoint.boardsBy(category), responseType: [BoardFeedResponse].self) - } - + + public func fetchBoardsByCategory(category: String, lastId: Int?, limit: Int, order: String) -> AnyPublisher { + let query: CategoryPagingQuery = .init(category: category, cursor: .init(lastId: lastId, limit: limit, order: order)) + return networkService.request( + BoardEndpoint.boardsByCategory(query), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() } -} -// MARK: - Mock API -public final class MockCommunityAPIClient: CommunityAPIClientInterface { - - public init() {} - - public func fetchBoards() -> AnyPublisher<[BoardListResponse], NetworkError> { - let mockData = [ - BoardListResponse( - id: 1, - imageURL: "https://example.com/image1.jpg", - title: "첫 번째 게시글", - nickName: "햄버거러버", - content: nil, - createdAt: Date(), - likeCount: "15", - commnetCount: "3" - ), - BoardListResponse( - id: 2, - imageURL: "https://example.com/image2.jpg", - title: "맛있는 햄버거 추천", - nickName: "음식탐험가", - content: nil, - createdAt: Date(), - likeCount: "23", - commnetCount: "7" - ) - ] - - return Just(mockData) - .setFailureType(to: NetworkError.self) - .eraseToAnyPublisher() + public func fetchBoardDetail(boardId: Int) -> AnyPublisher { + return networkService.request( + BoardEndpoint.boardDetail(boardId: boardId), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() } - - public func fetchBoardsByCategory(_ category: Category) -> AnyPublisher<[BoardFeedResponse], NetworkError> { - let mockData = [ - BoardFeedResponse( - id: 1, - imageURL: "https://example.com/image1.jpg", - title: "첫 번째 게시글", - nickName: "햄버거러버", - content: "이것은 첫 번째 게시글의 상세 내용입니다.", - createdAt: Date(), - likeCount: "15", - commnetCount: "3" + + public func createBoard( + title: String, + content: String, + category: String, + images: [UIImage] + ) -> AnyPublisher { + let dto = BoardRequestDTO( + title: title, + content: content, + category: category, + imageUrls: [] // multipart에서는 사용 안함 + ) + + let endpoint = BoardEndpoint.createBoard(dto) + + if images.isEmpty { + // 이미지 없으면 일반 JSON request + return networkService.request(endpoint, responseType: SuccessResponse.self) + .map(\.data) + .eraseToAnyPublisher() + } else { + // 이미지 있으면 multipart upload + return networkService.uploadMultipart( + endpoint, + images: images, + responseType: SuccessResponse.self ) - ] - - return Just(mockData) - .setFailureType(to: NetworkError.self) + .map(\.data) .eraseToAnyPublisher() + } + } + + // MARK: - Comments + public func fetchComments(boardId: Int, lastId: Int, limit: Int, order: String) -> AnyPublisher { + let query: CursorPagingQuery = .init(lastId: lastId, limit: limit, order: order) + return networkService.request( + BoardEndpoint.comments(boardId: boardId, query: query), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + + public func createComment(boardId: Int, content: String) -> AnyPublisher { + return networkService.request( + BoardEndpoint.createComment(boardId: boardId, content: content), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + + public func updateComment(boardId: Int, commentId: Int, content: String) -> AnyPublisher { + return networkService.request( + BoardEndpoint.updateComment(boardId: boardId, commentId: commentId, content: content), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + + public func deleteComment(boardId: Int, commentId: Int) -> AnyPublisher { + return networkService.request( + BoardEndpoint.deleteComment(boardId: boardId, commentId: commentId), + responseType: SuccessResponse.self + ) + .map { _ in () } + .eraseToAnyPublisher() + } + + // MARK: - Likes + public func fetchLikeInfo(boardId: Int) -> AnyPublisher { + return networkService.request( + BoardEndpoint.likeInfo(boardId: boardId), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + + public func toggleLike(boardId: Int) -> AnyPublisher { + return networkService.request( + BoardEndpoint.toggleLike(boardId: boardId), + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + + // MARK: - Report + public func reportContent(request: ReportRequestDTO) -> AnyPublisher { + return networkService.request( + BoardEndpoint.report(request), + responseType: SuccessResponse.self + ) + .map { _ in () } + .eraseToAnyPublisher() } } diff --git a/Community/Sources/Data/DTO/BoardRequest.swift b/Community/Sources/Data/DTO/BoardRequest.swift new file mode 100644 index 0000000..c0bfdf0 --- /dev/null +++ b/Community/Sources/Data/DTO/BoardRequest.swift @@ -0,0 +1,28 @@ +// +// BoardRequest.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + +import Foundation + +// MARK: - Report Request DTO +public struct BoardRequestDTO: Encodable, Sendable { + public let title: String + public let content: String + public let category: String + public let imageUrls: [String] + + public init( + title: String, + content: String, + category: String, + imageUrls: [String] + ) { + self.title = title + self.content = content + self.category = category + self.imageUrls = imageUrls + } +} diff --git a/Community/Sources/Data/DTO/Querys.swift b/Community/Sources/Data/DTO/Querys.swift new file mode 100644 index 0000000..5863f29 --- /dev/null +++ b/Community/Sources/Data/DTO/Querys.swift @@ -0,0 +1,34 @@ +// +// Querys.swift +// Community +// +// Created by 강동영 on 1/9/26. +// + +import Foundation + + +/// 재사용 되는 페이지네이션 쿼리 +public struct CursorPagingQuery: Encodable, Sendable { + let lastId: Int? + let limit: Int + let order: String +} + +/// CategoryPagingQuery +public struct CategoryPagingQuery: Encodable, Sendable { + let category: String + let cursor: CursorPagingQuery + + public func encode(to encoder: any Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(category, forKey: .category) + try container.encodeIfPresent(cursor.lastId, forKey: .lastId) + try container.encode(cursor.limit, forKey: .limit) + try container.encode(cursor.order, forKey: .order) + } + + enum CodingKeys: String, CodingKey { + case category, lastId, limit, order + } +} diff --git a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift index 749e520..78532b8 100644 --- a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift +++ b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift @@ -9,9 +9,11 @@ import Foundation import Combine import CommunityDomain import NetworkInterface +import Util +import UIKit // MARK: - Community Repository Implementation -public final class CommunityRepositoryImpl: CommunityRepositoryInterface { +public final class CommunityRepositoryImpl: CommunityRepository { private let apiClient: CommunityAPIClientInterface @@ -19,19 +21,103 @@ public final class CommunityRepositoryImpl: CommunityRepositoryInterface { self.apiClient = apiClient } - public func fetchBoards() -> AnyPublisher<[Board], NetworkError> { - return apiClient.fetchBoards() - .map { boardResponses in - return boardResponses.map { $0.toDomain() } - } - .eraseToAnyPublisher() - } - - public func fetchBoardsByCategory(_ category: Category) -> AnyPublisher<[Board], NetworkError> { - return apiClient.fetchBoardsByCategory(category) - .map { boardResponses in - return boardResponses.map { $0.toDomain() } - } - .eraseToAnyPublisher() + public func fetchBoards(lastId: Int?, limit: Int, order: CommunityDomain.SortOrder) async throws -> BoardListData { + return try await apiClient + .fetchBoards(lastId: lastId, limit: limit, order: order.rawValue) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func fetchBoardsByCategory(_ category: BoardCategory, lastId: Int?, limit: Int, order: CommunityDomain.SortOrder) async throws -> BoardListData { + return try await apiClient + .fetchBoardsByCategory(category: category.rawValue, lastId: lastId, limit: limit, order: order.rawValue) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func fetchBoardDetail(boardId: Int) async throws -> Board { + return try await apiClient + .fetchBoardDetail(boardId: boardId) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func createBoard( + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board { + return try await apiClient + .createBoard( + title: title, + content: content, + category: category.rawValue, + images: images + ) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + // MARK: - Comments + public func fetchComments(boardId: Int, lastId: Int, limit: Int, order: CommunityDomain.SortOrder) async throws -> CommentListData { + return try await apiClient + .fetchComments(boardId: boardId, lastId: lastId, limit: limit, order: order.rawValue) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func createComment(boardId: Int, content: String) async throws -> Comment { + return try await apiClient + .createComment(boardId: boardId, content: content) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func updateComment(boardId: Int, commentId: Int, content: String) async throws -> Comment { + return try await apiClient + .updateComment(boardId: boardId, commentId: commentId, content: content) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func deleteComment(boardId: Int, commentId: Int) async throws { + return try await apiClient + .deleteComment(boardId: boardId, commentId: commentId) + .mapError { $0 as Error } + .async() + } + + // MARK: - Likes + public func fetchLikeInfo(boardId: Int) async throws -> LikeInfo { + return try await apiClient + .fetchLikeInfo(boardId: boardId) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + public func toggleLike(boardId: Int) async throws -> LikeInfo { + return try await apiClient + .toggleLike(boardId: boardId) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + + // MARK: - Report + public func reportContent(request: CommunityDomain.ReportRequest) async throws { + let dto = ReportRequestDTO(from: request) + return try await apiClient + .reportContent(request: dto) + .mapError { $0 as Error } + .async() } } diff --git a/Community/Sources/Domain/Entities/Board.swift b/Community/Sources/Domain/Entities/Board.swift index b19a44e..9b15eda 100644 --- a/Community/Sources/Domain/Entities/Board.swift +++ b/Community/Sources/Domain/Entities/Board.swift @@ -7,61 +7,88 @@ import Foundation +// MARK: - Board Category +public enum BoardCategory: String, Codable, Sendable, CaseIterable { + case freeTalk = "FREE_TALK" + case franchise = "FRANCHISE" + case handmade = "HANDMADE" + case review = "REVIEW" + case recommendation = "RECOMMENDATION" + + public var displayName: String { + switch self { + case .freeTalk: + return "자유잡담" + case .franchise: + return "프랜차이즈" + case .handmade: + return "수제버거" + case .review: + return "햄버거리뷰" + case .recommendation: + return "맛집추천" + } + } +} + +// MARK: - Sort Order +public enum SortOrder: String, Sendable { + case asc = "ASC" + case desc = "DESC" +} + // MARK: - Board Entity -public struct Board: Identifiable, Equatable { +public struct Board: Identifiable, Equatable, Sendable { public let id: Int - public let imageURL: String public let title: String - public let nickName: String public let content: String + public let category: BoardCategory + public let imageUrls: [String] + public let authorNickname: String + public let authorProfileImageUrl: String? + public let authorId: Int public let createdAt: String - public let likeCount: String - public let commnetCount: String + public let updatedAt: String + public let viewCount: Int + public let likeCount: Int + public var commentCount: Int + public let isLiked: Bool - public init(id: Int, imageURL: String, title: String, nickName: String, content: String, createdAt: String, likeCount: String, commnetCount: String) { + public init( + id: Int, + title: String, + content: String, + category: BoardCategory, + imageUrls: [String], + authorNickname: String, + authorProfileImageUrl: String?, + authorId: Int, + createdAt: Date, + updatedAt: Date, + viewCount: Int, + likeCount: Int, + commentCount: Int, + isLiked: Bool + ) { self.id = id - self.imageURL = imageURL self.title = title - self.nickName = nickName self.content = content - self.createdAt = createdAt + self.category = category + self.imageUrls = imageUrls + self.authorNickname = authorNickname + self.authorProfileImageUrl = authorProfileImageUrl + self.authorId = authorId + self.createdAt = Self.timeAgoDisplay(createdAt) + self.updatedAt = Self.timeAgoDisplay(updatedAt) + self.viewCount = viewCount self.likeCount = likeCount - self.commnetCount = commnetCount - } - - // Preview용 샘플 데이터 - public static var sampleData: [Board] { - return [Board( - id: 1, - imageURL: "", - title: "다들 햄최몇인가요12345678910121231314?", - nickName: "닉네임1", - content: "요즘 햄버거 맛집이 어디인지 궁금해요!", - createdAt: "1분 전", - likeCount: "11", - commnetCount: "10" - )] + _sampleData - } - - private static let _sampleData: [Board] = (2...18).map { - Board( - id: $0, - imageURL: "", - title: "다들 햄최몇인가요?", - nickName: "닉네임\($0)", - content: "간단한 내용입니다.", - createdAt: "2분 전", - likeCount: "\($0)\($0+1)", - commnetCount: "\($0+1)\($0)" - ) + self.commentCount = commentCount + self.isLiked = isLiked } -} -// MARK: - Date Extension for Time Ago Display -public extension Date { - func timeAgoDisplay() -> String { + private static func timeAgoDisplay(_ date: Date) -> String { let now = Date() - let timeInterval = now.timeIntervalSince(self) + let timeInterval = now.timeIntervalSince(date) if timeInterval < 60 { return "방금 전" @@ -77,7 +104,63 @@ public extension Date { } else { let formatter = DateFormatter() formatter.dateFormat = "MM.dd" - return formatter.string(from: self) + return formatter.string(from: date) } } } + +extension Board { + // Preview용 샘플 데이터 + public static var sampleData: [Board] { + let now = Date() + return [Board( + id: 1, + title: "다들 햄최몇인가요12345678910121231314?", + content: "요즘 햄버거 맛집이 어디인지 궁금해요!", + category: .freeTalk, + imageUrls: [], + authorNickname: "닉네임1", + authorProfileImageUrl: nil, + authorId: 1, + createdAt: now.addingTimeInterval(-60), + updatedAt: now.addingTimeInterval(-60), + viewCount: 100, + likeCount: 11, + commentCount: 10, + isLiked: false + )] + _sampleData + } + + private static let _sampleData: [Board] = (2...18).map { + let now = Date() + return Board( + id: $0, + title: "다들 햄최몇인가요?", + content: "간단한 내용입니다.", + category: .freeTalk, + imageUrls: [], + authorNickname: "닉네임\($0)", + authorProfileImageUrl: nil, + authorId: $0, + createdAt: now.addingTimeInterval(-120), + updatedAt: now.addingTimeInterval(-120), + viewCount: $0 * 10, + likeCount: $0, + commentCount: $0 + 1, + isLiked: false + ) + } +} + +// MARK: - Board List Data (Pagination) +public struct BoardListData: Sendable { + public let content: [Board] + public let nextCursorId: Int? + public let hasNextPage: Bool + + public init(content: [Board], nextCursorId: Int?, hasNextPage: Bool) { + self.content = content + self.nextCursorId = nextCursorId + self.hasNextPage = hasNextPage + } +} diff --git a/Community/Sources/Domain/Repositories/CommunityRepository.swift b/Community/Sources/Domain/Repositories/CommunityRepository.swift new file mode 100644 index 0000000..8cf047b --- /dev/null +++ b/Community/Sources/Domain/Repositories/CommunityRepository.swift @@ -0,0 +1,39 @@ +// +// CommunityRepositoryInterface.swift +// Hambug +// +// Created by 강동영 on 10/17/25. +// + +import Foundation +import NetworkInterface +import UIKit + +// MARK: - Community Repository Interface +public protocol CommunityRepository: Sendable { + // 게시글 조회 + func fetchBoards(lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData + func fetchBoardsByCategory(_ category: BoardCategory, lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData + func fetchBoardDetail(boardId: Int) async throws -> Board + + // 게시글 생성 + func createBoard( + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board + + // 댓글 + func fetchComments(boardId: Int, lastId: Int, limit: Int, order: SortOrder) async throws -> CommentListData + func createComment(boardId: Int, content: String) async throws -> Comment + func updateComment(boardId: Int, commentId: Int, content: String) async throws -> Comment + func deleteComment(boardId: Int, commentId: Int) async throws + + // 좋아요 + func fetchLikeInfo(boardId: Int) async throws -> LikeInfo + func toggleLike(boardId: Int) async throws -> LikeInfo + + // 신고 + func reportContent(request: ReportRequest) async throws +} diff --git a/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift b/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift deleted file mode 100644 index d08cfaf..0000000 --- a/Community/Sources/Domain/Repositories/CommunityRepositoryInterface.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// CommunityRepositoryInterface.swift -// Hambug -// -// Created by 강동영 on 10/17/25. -// - -import Foundation -import Combine -import NetworkInterface - -// MARK: - Community Repository Interface -public protocol CommunityRepositoryInterface { - func fetchBoards() -> AnyPublisher<[Board], NetworkError> -} diff --git a/Community/Sources/Domain/UseCases/GetBoardsByCategoryUseCaseImpl.swift b/Community/Sources/Domain/UseCases/GetBoardsByCategoryUseCaseImpl.swift new file mode 100644 index 0000000..6417bd5 --- /dev/null +++ b/Community/Sources/Domain/UseCases/GetBoardsByCategoryUseCaseImpl.swift @@ -0,0 +1,27 @@ +// +// GetBoardsByCategoryUseCase.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Get Boards By Category UseCase Interface +public protocol GetBoardsByCategoryUseCase: Sendable { + func execute(category: BoardCategory, lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData +} + +// MARK: - Get Boards By Category UseCase Implementation +public final class GetBoardsByCategoryUseCaseImpl: GetBoardsByCategoryUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func execute(category: BoardCategory, lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData { + return try await repository.fetchBoardsByCategory(category, lastId: lastId, limit: limit, order: order) + } +} diff --git a/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift b/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift deleted file mode 100644 index 58f4f49..0000000 --- a/Community/Sources/Domain/UseCases/GetBoardsUseCase.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// GetBoardsUseCase.swift -// Hambug -// -// Created by 강동영 on 10/17/25. -// - -import Foundation -import Combine -import NetworkInterface - -// MARK: - Get Boards UseCase Interface -public protocol GetBoardsUseCaseInterface { - func execute() -> AnyPublisher<[Board], NetworkError> -} - -// MARK: - Get Boards UseCase Implementation -public final class GetBoardsUseCase: GetBoardsUseCaseInterface { - - private let repository: CommunityRepositoryInterface - - public init(repository: CommunityRepositoryInterface) { - self.repository = repository - } - - public func execute() -> AnyPublisher<[Board], NetworkError> { - return repository.fetchBoards() - .map { boards in - // 비즈니스 로직 적용 (예: 정렬, 필터링 등) - return boards.sorted { $0.createdAt > $1.createdAt } - } - .eraseToAnyPublisher() - } -} diff --git a/Community/Sources/Domain/UseCases/GetBoardsUseCaseImpl.swift b/Community/Sources/Domain/UseCases/GetBoardsUseCaseImpl.swift new file mode 100644 index 0000000..28fbf05 --- /dev/null +++ b/Community/Sources/Domain/UseCases/GetBoardsUseCaseImpl.swift @@ -0,0 +1,27 @@ +// +// GetBoardsUseCase.swift +// Hambug +// +// Created by 강동영 on 10/17/25. +// + +import Foundation + +// MARK: - Get Boards UseCase Interface +public protocol GetBoardsUseCase: Sendable { + func execute(lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData +} + +// MARK: - Get Boards UseCase Implementation +public final class GetBoardsUseCaseImpl: GetBoardsUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func execute(lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData { + return try await repository.fetchBoards(lastId: lastId, limit: limit, order: order) + } +} diff --git a/Community/Sources/Presentation/Views/CommunityView.swift b/Community/Sources/Presentation/Community/CommunityView.swift similarity index 87% rename from Community/Sources/Presentation/Views/CommunityView.swift rename to Community/Sources/Presentation/Community/CommunityView.swift index a3a2854..905da13 100644 --- a/Community/Sources/Presentation/Views/CommunityView.swift +++ b/Community/Sources/Presentation/Community/CommunityView.swift @@ -9,15 +9,24 @@ import SwiftUI import DesignSystem import CommunityDomain -public struct CommunityView: View { - @StateObject private var viewModel: CommunityViewModel +public protocol CommunityWriteFactory { + func makeWriteViewModel() -> CommunityWriteViewModel +} - public init(viewModel: CommunityViewModel) { - self._viewModel = StateObject(wrappedValue: viewModel) +public struct CommunityView: View { + @State private var viewModel: CommunityViewModel + private let factory: CommunityWriteFactory + + public init( + viewModel: CommunityViewModel, + factory: CommunityWriteFactory + ) { + self._viewModel = State(initialValue: viewModel) + self.factory = factory } public var body: some View { - NavigationView { + NavigationStack { ZStack { VStack(spacing: 0) { Color.primaryHambugRed @@ -64,7 +73,11 @@ public struct CommunityView: View { Spacer() HStack { Spacer() - NavigationLink(destination: CommunityWriteView()) { + NavigationLink( + destination: CommunityWriteView( + viewModel: factory.makeWriteViewModel() + ) + ) { Color.bgPencil .frame(width: 45, height: 45) .clipShape(Circle()) @@ -214,41 +227,41 @@ fileprivate struct CommunityPostListCard: View { .lineLimit(1) .truncationMode(.tail) .padding(.trailing, 8) - + Text(board.createdAt) .pretendard(.caption(.base)) .foregroundColor(Color.textG600) - + Spacer() } - + HStack(spacing: 4) { - Text(board.nickName) + Text(board.authorNickname) .pretendard(.caption(.base)) .foregroundColor(Color.textG800) - + HStack(spacing: 4) { Image(systemName: "heart.fill") .foregroundColor(Color.textR100) .font(.system(size: 12)) - - Text(board.likeCount) + + Text("\(board.likeCount)") .pretendard(.caption(.base)) .foregroundColor(Color.textG600) - + Image(.communityComment) .resizable() .frame(width: 12, height: 12) - - Text(board.commnetCount) + + Text("\(board.commentCount)") .pretendard(.caption(.base)) .foregroundColor(Color.textG600) } } } - + AsyncThumbnailImage( - imageURL: board.imageURL, + imageURL: board.imageUrls.first ?? "", width: 50, height: 50, cornerRadius: 8 @@ -258,9 +271,6 @@ fileprivate struct CommunityPostListCard: View { .padding(.horizontal, 16) .padding(.vertical, 16) .background(Color.white) - - Divider() - .background(Color.borderG300) } } } @@ -268,12 +278,12 @@ fileprivate struct CommunityPostListCard: View { // MARK: - Feed Card fileprivate struct CommunityPostFeedCard: View { let board: Board - + var body: some View { VStack(alignment: .leading, spacing: 12) { - + AsyncThumbnailImage( - imageURL: board.imageURL, + imageURL: board.imageUrls.first ?? "", height: 192, cornerRadius: 8 ) @@ -284,33 +294,33 @@ fileprivate struct CommunityPostFeedCard: View { .foregroundColor(Color.textG800) .multilineTextAlignment(.leading) .lineLimit(1) - + Spacer() - + Text(board.createdAt) .pretendard(.caption(.base)) .foregroundColor(Color.textG600) } - + HStack { - Text(board.nickName) + Text(board.authorNickname) .pretendard(.caption(.base)) .foregroundColor(Color.textG800) - + HStack(spacing: 4) { Image(systemName: "heart.fill") .foregroundColor(Color.textR100) .font(.system(size: 12)) - - Text(board.likeCount) + + Text("\(board.likeCount)") .pretendard(.caption(.base)) .foregroundColor(Color.textG600) - + Image(.communityComment) .resizable() .frame(width: 12, height: 12) - - Text(board.commnetCount) + + Text("\(board.commentCount)") .pretendard(.caption(.base)) .foregroundColor(Color.textG600) } @@ -330,25 +340,6 @@ fileprivate struct CommunityPostFeedCard: View { } } -// MARK: - Helper Functions -private func timeAgoString(from date: Date) -> String { - let now = Date() - let timeInterval = now.timeIntervalSince(date) - - if timeInterval < 60 { - return "방금 전" - } else if timeInterval < 3600 { - let minutes = Int(timeInterval / 60) - return "\(minutes)분 전" - } else if timeInterval < 86400 { - let hours = Int(timeInterval / 3600) - return "\(hours)시간 전" - } else { - let days = Int(timeInterval / 86400) - return "\(days)일 전" - } -} - struct AsyncThumbnailImage: View { private let imageURL: String? private let width: CGFloat? diff --git a/Community/Sources/Presentation/Community/CommunityViewModel.swift b/Community/Sources/Presentation/Community/CommunityViewModel.swift new file mode 100644 index 0000000..193fe19 --- /dev/null +++ b/Community/Sources/Presentation/Community/CommunityViewModel.swift @@ -0,0 +1,197 @@ +// +// CommunityViewModel.swift +// Hambug +// +// Created by 강동영 on 10/17/25. +// + +import Foundation +import SwiftUI +import CommunityDomain + +public extension CommunityViewModel { + enum Category: CaseIterable { + case all + case board + case review + case recommend + + var title: String { + switch self { + case .all: + "전체" + case .board: + "자유잡담" + case .review: + "햄버거리뷰" + case .recommend: + "맛집추천" + } + } + + var boardCategory: BoardCategory? { + switch self { + case .all: + return nil + case .board: + return .freeTalk + case .review: + return .review + case .recommend: + return .recommendation + } + } + + public var isListView: Bool { + switch self { + case .all, .board: true + case .review, .recommend: false + } + } + } +} + +// MARK: - Community ViewModel +@MainActor +@Observable +public final class CommunityViewModel { + + // MARK: - Published Properties + public var boards: [Board] = [] + public var isLoading: Bool = false + public var isLoadingMore: Bool = false + public var errorMessage: String? = nil + public var selectedCategory: Category = .all + + public var isListView: Bool { + switch selectedCategory { + case .all, .board: true + case .review, .recommend: false + } + } + + // MARK: - Dependencies + private let getBoardsUseCase: GetBoardsUseCase + private let getBoardsByCategoryUseCase: GetBoardsByCategoryUseCase + + // MARK: - Private Properties + private let categories: [Category] = Category.allCases + private var currentPage: Int? = nil + private var hasNextPage: Bool = true + private let pageSize: Int = 10 + + // MARK: - Initialization + public init( + getBoardsUseCase: GetBoardsUseCase, + getBoardsByCategoryUseCase: GetBoardsByCategoryUseCase + ) { + self.getBoardsUseCase = getBoardsUseCase + self.getBoardsByCategoryUseCase = getBoardsByCategoryUseCase + Task { + await loadBoards() + } + } + + // MARK: - Public Methods + public func loadBoards() async { + guard !isLoading else { return } + isLoading = true + errorMessage = nil + currentPage = nil + hasNextPage = true + + do { + let boardListData: BoardListData + + if let category = selectedCategory.boardCategory { + boardListData = try await getBoardsByCategoryUseCase.execute( + category: category, + lastId: currentPage, + limit: pageSize, + order: .desc + ) + } else { + boardListData = try await getBoardsUseCase.execute( + lastId: currentPage, + limit: pageSize, + order: .desc + ) + } + + boards = boardListData.content + hasNextPage = boardListData.hasNextPage + if let nextCursor = boardListData.nextCursorId { + currentPage = nextCursor + } + + print("✅ API Success: \(boardListData.content.count) boards loaded") + } catch { + errorMessage = error.localizedDescription + print("❌ API Error: \(error)") + + // API 실패 시 샘플 데이터 사용 + boards = Board.sampleData + } + + isLoading = false + } + + public func loadMoreBoards() async { + guard !isLoadingMore && hasNextPage else { return } + isLoadingMore = true + + do { + let boardListData: BoardListData + + if let category = selectedCategory.boardCategory { + boardListData = try await getBoardsByCategoryUseCase.execute( + category: category, + lastId: currentPage, + limit: pageSize, + order: .desc + ) + } else { + boardListData = try await getBoardsUseCase.execute( + lastId: currentPage, + limit: pageSize, + order: .desc + ) + } + + boards.append(contentsOf: boardListData.content) + hasNextPage = boardListData.hasNextPage + if let nextCursor = boardListData.nextCursorId { + currentPage = nextCursor + } + + print("✅ Load more success: \(boardListData.content.count) boards added") + } catch { + print("❌ Load more error: \(error)") + } + + isLoadingMore = false + } + + public func refreshBoards() { + Task { + await loadBoards() + } + } + + public func selectCategory(_ category: Category) { + selectedCategory = category + Task { + await loadBoards() + } + } + + // MARK: - Computed Properties + public var filteredBoards: [Board] { + boards +// return boards.isEmpty ? Board.sampleData : boards + } + + public var categoryList: [Category] { + return categories + } +} diff --git a/Community/Sources/Presentation/Views/Write/BorderTextEditor.swift b/Community/Sources/Presentation/Component/BorderTextEditor.swift similarity index 77% rename from Community/Sources/Presentation/Views/Write/BorderTextEditor.swift rename to Community/Sources/Presentation/Component/BorderTextEditor.swift index 95f05fd..7c1a8c4 100644 --- a/Community/Sources/Presentation/Views/Write/BorderTextEditor.swift +++ b/Community/Sources/Presentation/Component/BorderTextEditor.swift @@ -7,17 +7,19 @@ import SwiftUI -public struct BorderTextEditor: View { +public struct BorderTextEditor: View { private let contentPlaceholder = "자유롭게 이야기를 나눠보세요" private let maxCharacterCount: Int @State private var characterCount: Int = 0 @Binding var content: String + var focusedField: FocusState.Binding? + var field: Field? private var isCharacterMax: Bool { characterCount >= maxCharacterCount } - + public var body: some View { VStack(spacing: 2) { if isCharacterMax { @@ -28,14 +30,14 @@ public struct BorderTextEditor: View { .foregroundColor(.textR100) } } - + ZStack(alignment: .topLeading) { RoundedRectangle(cornerRadius: 8) .stroke(isCharacterMax ? Color.borderR100 : Color.borderG400, lineWidth: 1) .background(Color.bgG75) .frame(minHeight: 234) - - TextEditor(text: $content) + + let textEditor = TextEditor(text: $content) .pretendard(.body(.small)) .padding(.horizontal, 12) .padding(.vertical, 10) @@ -48,7 +50,13 @@ public struct BorderTextEditor: View { characterCount = maxCharacterCount } } - + + if let focusedField = focusedField, let field = field { + textEditor.focused(focusedField, equals: field) + } else { + textEditor + } + if content.isEmpty { Text(contentPlaceholder) .pretendard(.body(.small)) @@ -59,12 +67,16 @@ public struct BorderTextEditor: View { } } } - + init( maxCharacterCount: Int = 300, - content: Binding + content: Binding, + focusedField: FocusState.Binding? = nil, + field: Field? = nil ) { self.maxCharacterCount = maxCharacterCount self._content = content + self.focusedField = focusedField + self.field = field } } diff --git a/Community/Sources/Presentation/Component/BottomLineTextField.swift b/Community/Sources/Presentation/Component/BottomLineTextField.swift new file mode 100644 index 0000000..8801f3b --- /dev/null +++ b/Community/Sources/Presentation/Component/BottomLineTextField.swift @@ -0,0 +1,43 @@ +// +// BottomLineTextField.swift +// Hambug +// +// Created by 강동영 on 10/28/25. +// + +import SwiftUI + +public struct BottomLineTextField: View { + @Binding var title: String + var focusedField: FocusState.Binding? + var field: Field? + + public var body: some View { + let textField = TextField("", text: $title) + .pretendard(.body(.base)) + .padding(.horizontal, 16) + .padding(.vertical, 14) + .overlay( + Rectangle() + .frame(height: 1) + .foregroundColor(Color.borderG400), + alignment: .bottom + ) + + if let focusedField = focusedField, let field = field { + textField.focused(focusedField, equals: field) + } else { + textField + } + } + + public init( + title: Binding, + focusedField: FocusState.Binding? = nil, + field: Field? = nil + ) { + self._title = title + self.focusedField = focusedField + self.field = field + } +} diff --git a/Community/Sources/Presentation/Component/RequiredText.swift b/Community/Sources/Presentation/Component/RequiredText.swift new file mode 100644 index 0000000..0f21d25 --- /dev/null +++ b/Community/Sources/Presentation/Component/RequiredText.swift @@ -0,0 +1,27 @@ +// +// RequiredText.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + +import SwiftUI + +struct RequiredText: View { + private let title: String + + init(_ title: String) { + self.title = title + } + + var body: some View { + HStack(spacing: 0) { + Text(title) + .pretendard(.body(.bEmphasis)) + .foregroundColor(.textG900) + Text("*") + .pretendard(.body(.bEmphasis)) + .foregroundColor(.primaryHambugRed) + } + } +} diff --git a/Community/Sources/Presentation/ViewModels/CommunityViewModel.swift b/Community/Sources/Presentation/ViewModels/CommunityViewModel.swift deleted file mode 100644 index d7bd2bf..0000000 --- a/Community/Sources/Presentation/ViewModels/CommunityViewModel.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// CommunityViewModel.swift -// Hambug -// -// Created by 강동영 on 10/17/25. -// - -import Foundation -import Combine -import SwiftUI -import CommunityDomain - -public extension CommunityViewModel { - enum Category: CaseIterable { - case all - case board - case review - case recommend - - var title: String { - switch self { - case .all: - "전체" - case .board: - "자유잡담" - case .review: - "햄버거리뷰" - case .recommend: - "맛집추천" - } - } - - public var isListView: Bool { - switch self { - case .all, .board: true - case .review, .recommend: false - } - } - } -} -// MARK: - Community ViewModel -public final class CommunityViewModel: ObservableObject { - - // MARK: - Published Properties - @Published public var boards: [Board] = [] - @Published public var isLoading: Bool = false - @Published public var errorMessage: String? = nil - @Published public var selectedCategory: Category = .all - - public var isListView: Bool { - switch selectedCategory { - case .all, .board: true - case .review, .recommend: false - } - } - - // MARK: - Dependencies - private let getBoardsUseCase: GetBoardsUseCaseInterface - - // MARK: - Private Properties - private var cancellables = Set() - private let categories: [Category] = Category.allCases - - // MARK: - Initialization - public init(getBoardsUseCase: GetBoardsUseCaseInterface) { - self.getBoardsUseCase = getBoardsUseCase - loadBoards() - } - - // MARK: - Public Methods - public func loadBoards() { - isLoading = true - errorMessage = nil - - getBoardsUseCase.execute() - .receive(on: DispatchQueue.main) - .sink( - receiveCompletion: { [weak self] completion in - self?.isLoading = false - - if case .failure(let error) = completion { - self?.errorMessage = error.localizedDescription - print("❌ API Error: \(error)") - - // API 실패 시 샘플 데이터 사용 - self?.boards = Board.sampleData - } - }, - receiveValue: { [weak self] boards in - print("✅ API Success: \(boards.count) boards loaded") - self?.boards = boards - } - ) - .store(in: &cancellables) - } - - public func refreshBoards() { - loadBoards() - } - - public func selectCategory(_ category: Category) { - selectedCategory = category - } - - // MARK: - Computed Properties - public var filteredBoards: [Board] { - if selectedCategory == .all { - return boards.isEmpty ? Board.sampleData : boards - } else { - // TODO: 실제 카테고리 필터링 로직 구현 - return boards.isEmpty ? Board.sampleData : boards - } - } - - public var categoryList: [Category] { - return categories - } -} diff --git a/Community/Sources/Presentation/Views/Write/BottomLineTextField.swift b/Community/Sources/Presentation/Views/Write/BottomLineTextField.swift deleted file mode 100644 index 15697ee..0000000 --- a/Community/Sources/Presentation/Views/Write/BottomLineTextField.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// BottomLineTextField.swift -// Hambug -// -// Created by 강동영 on 10/28/25. -// - -import SwiftUI - -public struct BottomLineTextField: View { - @Binding var title: String - - public var body: some View { - TextField("", text: $title) - .pretendard(.body(.base)) - .padding(.horizontal, 16) - .padding(.vertical, 14) - .overlay( - Rectangle() - .frame(height: 1) - .foregroundColor(Color.borderG400), - alignment: .bottom - ) - } - - public init(title: Binding) { - self._title = title - } -} diff --git a/DI/Package.swift b/DI/Package.swift index 44180be..c49940e 100644 --- a/DI/Package.swift +++ b/DI/Package.swift @@ -11,7 +11,6 @@ enum Config: String, CaseIterable { case intro = "Intro" case login = "Login" case myPage = "MyPage" - case community = "Community" var name: String { switch self { @@ -44,7 +43,6 @@ let package = Package( .package(name: "Intro", path: "../Intro"), .package(name: "Login", path: "../Login"), .package(name: "MyPage", path: "../MyPage"), - .package(name: "Community", path: "../Community"), ], targets: [ .target(name: Config.interface.name), diff --git a/DI/Sources/CommunityDI/CommunityDIContainer.swift b/DI/Sources/CommunityDI/CommunityDIContainer.swift deleted file mode 100644 index 3a355aa..0000000 --- a/DI/Sources/CommunityDI/CommunityDIContainer.swift +++ /dev/null @@ -1,146 +0,0 @@ -// -// CommunityDIContainer.swift -// Hambug -// -// Created by 강동영 on 10/17/25. -// - -import Foundation -import DataSources -import NetworkInterface -import NetworkImpl -import DIKit -import AppDI -import CommunityDomain -import CommunityData -import CommunityPresentation - -// MARK: - Community Assembly -struct CommunityAssembly: Assembly { - private let isMock: Bool - - init(isMock: Bool = false) { - self.isMock = isMock - } - - func assemble(container: GenericDIContainer) { - // NetworkService registration (only for mock mode) - // In normal mode, NetworkService comes from parent container - if isMock { - container.register(NetworkServiceInterface.self) { _ in - let config = URLSessionConfiguration.ephemeral - config.protocolClasses = [CommunityURLProtocol.self] - setupURLProtocol() - return NetworkServiceImpl(configuration: config) - } - } - - // APIClient registration - container.register(CommunityAPIClientInterface.self) { resolver in - if self.isMock { - return MockCommunityAPIClient() - } else { - return CommunityAPIClient(networkService: resolver.resolve(NetworkServiceInterface.self)) - } - } - - // Repository registration - container.register(CommunityRepositoryInterface.self) { resolver in - CommunityRepositoryImpl(apiClient: resolver.resolve(CommunityAPIClientInterface.self)) - } - - // UseCase registration - container.register(GetBoardsUseCaseInterface.self) { resolver in - GetBoardsUseCase(repository: resolver.resolve(CommunityRepositoryInterface.self)) - } - - // ViewModel registration - container.register(CommunityViewModel.self) { resolver in - CommunityViewModel(getBoardsUseCase: resolver.resolve(GetBoardsUseCaseInterface.self)) - } - } -} - -// MARK: - Community DI Container -public final class CommunityDIContainer { - - // MARK: - Properties - private let container: GenericDIContainer - - // MARK: - Initialization - public init(appContainer: AppDIContainer? = nil, isMock: Bool = false) { - // In mock mode: no parent (creates own NetworkService) - // In normal mode: use AppDIContainer as parent - if isMock { - self.container = GenericDIContainer(parent: nil) - } else { - let parent = appContainer ?? AppDIContainer.shared - self.container = GenericDIContainer(parent: parent.baseContainer) - } - - CommunityAssembly(isMock: isMock).assemble(container: container) - } - - // MARK: - Factory Methods - public func makeCommunityViewModel() -> CommunityViewModel { - return container.resolve(CommunityViewModel.self) - } - - public func resolve(_ type: T.Type) -> T { - return container.resolve(type) - } -} - -// MARK: - Mock Setup -private func setupURLProtocol() { - let boardsData: [[String: Any]] = [ - [ - "id": 1, - "imageURL": "https://example.com/image1.jpg", - "title": "첫 번째 게시글", - "nickName": "햄버거러버", - "createdAt": "2024-10-17T10:00:00.000Z", - "likeCount": "15", - "commnetCount": "3" - ], - [ - "id": 2, - "imageURL": "https://example.com/image2.jpg", - "title": "맛있는 햄버거 추천", - "nickName": "음식탐험가", - "createdAt": "2024-10-17T09:30:00.000Z", - "likeCount": "23", - "commnetCount": "7" - ] - ] - - let boardsResponse: [String: Any] = [ - "success": true, - "data": boardsData, - "message": "성공", - "code": 200 - ] - - let boardsResponseData = try! JSONSerialization.data(withJSONObject: boardsResponse, options: []) - - let boardDetailResponse: [String: Any] = [ - "id": 1, - "imageURL": "https://example.com/image1.jpg", - "title": "첫 번째 게시글", - "content": "이것은 첫 번째 게시글의 상세 내용입니다.", - "nickName": "햄버거러버", - "createdAt": "2024-10-17T10:00:00.000Z", - "likeCount": "15", - "commnetCount": "3" - ] - - let boardDetailResponseData = try! JSONSerialization.data(withJSONObject: boardDetailResponse, options: []) - - CommunityURLProtocol.successMock = [ - "/api/v1/boards": (200, boardsResponseData), - "/api/v1/boards?category=FREE_TALK": (200, boardsResponseData), - "/api/v1/boards?category=FRANCHISE": (200, boardsResponseData), - "/api/v1/boards?category=HANDMADE": (200, boardsResponseData), - "/api/v1/boards?category=RECOMMENDATION": (200, boardsResponseData) - ] -} diff --git a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift index 7a513f2..e92fc2d 100644 --- a/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift +++ b/Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift @@ -135,7 +135,9 @@ public final class AuthInterceptor: RequestInterceptor { private func handleLogout() { try? tokenManager.clear() - NotificationCenter.default.post(name: .userDidLogout, object: nil) + Task { @MainActor in + NotificationCenter.default.post(name: .userDidLogout, object: nil) + } } } diff --git a/Infrastructure/Sources/NetworkImpl/NetworkLogger.swift b/Infrastructure/Sources/NetworkImpl/NetworkLogger.swift index e4dd4a2..2249baf 100644 --- a/Infrastructure/Sources/NetworkImpl/NetworkLogger.swift +++ b/Infrastructure/Sources/NetworkImpl/NetworkLogger.swift @@ -9,7 +9,7 @@ import Foundation // MARK: - Logger #if DEBUG -public final class NetworkLogger { +public final class NetworkLogger: Sendable { public init() {} public func requestLogger(request: URLRequest) { diff --git a/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift b/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift index 1d62c81..3fe9f8d 100644 --- a/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift +++ b/Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift @@ -8,6 +8,7 @@ import Foundation import Combine import NetworkInterface +import UIKit import Alamofire @@ -84,7 +85,80 @@ public final class NetworkServiceImpl: NetworkServiceInterface { .eraseToAnyPublisher() } } - + + public func uploadMultipart( + _ endpoint: any Endpoint, + images: [UIImage], + responseType: T.Type + ) -> AnyPublisher { + do { + guard let url = endpoint.createURL() else { + throw NetworkError.invalidURL + } + + return session.upload( + multipartFormData: { multipartFormData in + // 1. JSON body의 텍스트 필드 추가 (title, content, category) + if let body = endpoint.body, + let jsonObject = try? JSONSerialization.jsonObject(with: body) as? [String: Any] { + for (key, value) in jsonObject { + if let stringValue = "\(value)".data(using: .utf8) { + multipartFormData.append(stringValue, withName: key) + } + } + } + + // 2. 이미지 파일 추가 + for (index, image) in images.enumerated() { + // ImageProcessor는 Util 모듈에 있으므로 여기서는 기본 압축 사용 + if let imageData = image.jpegData(compressionQuality: 0.85) { + let fileName = "image_\(index)_\(UUID().uuidString).jpg" + multipartFormData.append( + imageData, + withName: "images", + fileName: fileName, + mimeType: "image/jpeg" + ) + } + } + }, + to: url, + method: alamofireMethod(from: endpoint.method), + headers: alamofireHeaders(from: endpoint.headers) + ) + .validate() + .publishData() + .tryMap { [weak self] response in + guard let self = self else { throw NetworkError.networkError(NSError()) } + + if let error = response.error { + throw self.mapAlamofireError(error) + } + + guard let data = response.data else { + throw NetworkError.noData + } + +#if DEBUG + if let httpResponse = response.response { + self.logger?.responseLogger(response: httpResponse, data: data) + } +#endif + + return data + } + .decode(type: T.self, decoder: decoder) + .mapError { error in + self.mapError(error) + } + .eraseToAnyPublisher() + + } catch { + return Fail(error: mapError(error)) + .eraseToAnyPublisher() + } + } + // MARK: - Private Methods private func alamofireMethod(from httpMethod: NetworkInterface.HTTPMethod) -> Alamofire.HTTPMethod { switch httpMethod { diff --git a/Infrastructure/Sources/NetworkInterface/EndPointEncoder.swift b/Infrastructure/Sources/NetworkInterface/EndPointEncoder.swift new file mode 100644 index 0000000..b38dc94 --- /dev/null +++ b/Infrastructure/Sources/NetworkInterface/EndPointEncoder.swift @@ -0,0 +1,25 @@ +// +// EndPointEncoder.swift +// Infrastructure +// +// Created by 강동영 on 1/9/26. +// + +import Foundation + +public protocol EndPointEncoder { + func encode(_ value: Encodable) -> [String: Any] +} + +public struct DefaultQueryEncoder: EndPointEncoder { + public init() {} + public func encode(_ value: Encodable) -> [String: Any] { + let encoder = JSONEncoder() + guard + let data = try? encoder.encode(value), + let object = try? JSONSerialization.jsonObject(with: data) as? [String: Any] + else { return [:] } + + return object + } +} diff --git a/Infrastructure/Sources/NetworkInterface/Endpoint.swift b/Infrastructure/Sources/NetworkInterface/Endpoint.swift index 9c2ac02..f096c68 100644 --- a/Infrastructure/Sources/NetworkInterface/Endpoint.swift +++ b/Infrastructure/Sources/NetworkInterface/Endpoint.swift @@ -23,10 +23,13 @@ public protocol Endpoint: Sendable { var method: HTTPMethod { get } var headers: [String: String] { get } var queryParameters: [String: Any] { get } + var queryEncoder: EndPointEncoder { get } var body: Data? { get } } public extension Endpoint { + var queryEncoder: EndPointEncoder { DefaultQueryEncoder() } + var defaultHeaders: [String: String] { [ "Content-Type": "application/json", diff --git a/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift b/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift index 5f35b38..7b5e44a 100644 --- a/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift +++ b/Infrastructure/Sources/NetworkInterface/NetworkConfig.swift @@ -8,7 +8,6 @@ import Foundation public struct NetworkConfig { - public static let baseURL: String = Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as! String - + public static let baseURL: String = (Bundle.main.object(forInfoDictionaryKey: "BASE_URL") as? String) ?? "" private init() {} } From 3fa2b88ef941dfc4a90a5a91c1761508c8247088 Mon Sep 17 00:00:00 2001 From: kangddong Date: Fri, 9 Jan 2026 02:06:13 +0900 Subject: [PATCH 09/12] =?UTF-8?q?feat:=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=EC=9E=91=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sources/DI/CommunityDIContainer.swift | 12 +- .../Domain/Entities/SelectedImage.swift | 47 ++++ .../UseCases/CreateBoardUseCaseImpl.swift | 43 ++++ .../Write/CommunityWriteView.swift | 218 +++++++++++------- .../Write/CommunityWriteViewModel.swift | 188 +++++++++++++++ 5 files changed, 424 insertions(+), 84 deletions(-) create mode 100644 Community/Sources/Domain/Entities/SelectedImage.swift create mode 100644 Community/Sources/Domain/UseCases/CreateBoardUseCaseImpl.swift rename Community/Sources/Presentation/{Views => }/Write/CommunityWriteView.swift (50%) create mode 100644 Community/Sources/Presentation/Write/CommunityWriteViewModel.swift diff --git a/Community/Sources/DI/CommunityDIContainer.swift b/Community/Sources/DI/CommunityDIContainer.swift index e5b3753..782eb42 100644 --- a/Community/Sources/DI/CommunityDIContainer.swift +++ b/Community/Sources/DI/CommunityDIContainer.swift @@ -56,19 +56,19 @@ struct CommunityAssembly: Assembly { } // UseCase registration - container.register(GetBoardsUseCaseInterface.self) { resolver in - GetBoardsUseCase(repository: resolver.resolve(CommunityRepository.self)) + container.register(GetBoardsUseCase.self) { resolver in + GetBoardsUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) } - container.register(GetBoardsByCategoryUseCaseInterface.self) { resolver in - GetBoardsByCategoryUseCase(repository: resolver.resolve(CommunityRepository.self)) + container.register(GetBoardsByCategoryUseCase.self) { resolver in + GetBoardsByCategoryUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) } // MARK: - CommunityViewModel registration container.register(CommunityViewModel.self) { @MainActor resolver in CommunityViewModel( - getBoardsUseCase: resolver.resolve(GetBoardsUseCaseInterface.self), - getBoardsByCategoryUseCase: resolver.resolve(GetBoardsByCategoryUseCaseInterface.self) + getBoardsUseCase: resolver.resolve(GetBoardsUseCase.self), + getBoardsByCategoryUseCase: resolver.resolve(GetBoardsByCategoryUseCase.self) ) } diff --git a/Community/Sources/Domain/Entities/SelectedImage.swift b/Community/Sources/Domain/Entities/SelectedImage.swift new file mode 100644 index 0000000..ff12c98 --- /dev/null +++ b/Community/Sources/Domain/Entities/SelectedImage.swift @@ -0,0 +1,47 @@ +// +// SelectedImage.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + +import Foundation +import UIKit + +/// 사용자가 선택한 이미지를 나타내는 엔티티 +public struct SelectedImage: Identifiable, Sendable { + + /// 고유 ID + public let id: UUID + + /// 이미지 객체 (Sendable을 위해 @unchecked 사용) + public let image: UIImage + + /// 원본 파일 크기 (bytes) + public let originalSize: Int + + /// 파일 이름 + public let fileName: String + + /// 초기화 + /// - Parameters: + /// - id: 고유 ID (기본값: UUID()) + /// - image: UIImage 객체 + /// - originalSize: 원본 크기 (bytes) + /// - fileName: 파일 이름 + public init( + id: UUID = UUID(), + image: UIImage, + originalSize: Int, + fileName: String + ) { + self.id = id + self.image = image + self.originalSize = originalSize + self.fileName = fileName + } +} + +// MARK: - Sendable Conformance +// UIImage는 기본적으로 Sendable이 아니지만, 이미지 처리 시 불변으로 사용하므로 안전 +extension UIImage: @unchecked Sendable {} diff --git a/Community/Sources/Domain/UseCases/CreateBoardUseCaseImpl.swift b/Community/Sources/Domain/UseCases/CreateBoardUseCaseImpl.swift new file mode 100644 index 0000000..ccbcfe2 --- /dev/null +++ b/Community/Sources/Domain/UseCases/CreateBoardUseCaseImpl.swift @@ -0,0 +1,43 @@ +// +// CreateBoardUseCase.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + +import Foundation +import UIKit + +// MARK: - Create Board UseCase Interface +public protocol CreateBoardUseCase: Sendable { + func execute( + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board +} + +// MARK: - Create Board UseCase Implementation +public final class CreateBoardUseCaseImpl: CreateBoardUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func execute( + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board { + return try await repository.createBoard( + title: title, + content: content, + category: category, + images: images + ) + } +} diff --git a/Community/Sources/Presentation/Views/Write/CommunityWriteView.swift b/Community/Sources/Presentation/Write/CommunityWriteView.swift similarity index 50% rename from Community/Sources/Presentation/Views/Write/CommunityWriteView.swift rename to Community/Sources/Presentation/Write/CommunityWriteView.swift index f37ddce..60e6117 100644 --- a/Community/Sources/Presentation/Views/Write/CommunityWriteView.swift +++ b/Community/Sources/Presentation/Write/CommunityWriteView.swift @@ -7,6 +7,8 @@ import SwiftUI import DesignSystem +import PhotosUI +import CommunityDomain public struct CommunityWriteView: View { @Environment(\.dismiss) private var dismiss @@ -14,10 +16,16 @@ public struct CommunityWriteView: View { @State private var title: String = "" @State private var content: String = "" @State private var characterCount: Int = 0 + @StateObject private var keyboardObserver = KeyboardObserver() + @FocusState private var focusedField: Field? + @State private var viewModel: CommunityWriteViewModel + @State private var photosPickerItems: [PhotosPickerItem] = [] private let maxCharacterCount = 300 - public init() {} + public init(viewModel: CommunityWriteViewModel) { + self.viewModel = viewModel + } private var isCharacterMax: Bool { characterCount >= maxCharacterCount @@ -28,40 +36,69 @@ public struct CommunityWriteView: View { case 수제버거 = "수제버거" case 맛집추천 = "맛집추천" } + + enum Field: Hashable { + case title + case content + } public var body: some View { NavigationView { VStack(spacing: 0) { navigationBar - - ScrollView { - VStack(alignment: .leading, spacing: 24) { - categorySelection - titleSection - contentSection - imageAttachmentSection - + + VStack(spacing: 0) { + ScrollView { + VStack(alignment: .leading, spacing: 16) { + categorySelection + titleSection + contentSection + imageAttachmentSection + } + .padding(.top, 20) + .background( + Color.clear + .contentShape(Rectangle()) + .onTapGesture { + focusedField = nil + } + ) + + VStack(alignment: .center) { + addImageButtonSection + } + .padding(.top, 20) } - .padding(.horizontal, 16) - .padding(.top, 20) - - VStack(alignment: .center) { - addImageButtonSection + + Spacer() + + PrimaryButton( + title: viewModel.isSubmitting ? "등록 중..." : "등록", + style: .body(.bEmphasis) + ) { + focusedField = nil + Task { + let success = await viewModel.createBoard( + title: title, + content: content, + category: selectedCategory.toBoardCategory() + ) + if success { + dismiss() + } + } } - .padding(.horizontal, 16) - .padding(.top, 20) - } - - Spacer() - - PrimaryButton( - title: "등록", - style: .body(.bEmphasis) - ) { - // Handle submit action + .padding(.bottom, 20) + .disabled(!viewModel.canSubmit) } + .padding(.horizontal, 20) } .background(Color.bgWhite) + .alert("이미지 크기 초과", isPresented: $viewModel.showImageSizeAlert) { + Button("확인", role: .cancel) { } + } message: { + Text("이미지 크기가 너무 큽니다. 다른 이미지를 선택해주세요.") + } } .navigationBarHidden(true) } @@ -94,16 +131,7 @@ public struct CommunityWriteView: View { private var categorySelection: some View { VStack(alignment: .leading, spacing: 12) { - HStack(spacing: 0) { - Text("카테고리") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.textG900) - - Text("*") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.primaryHambugRed) - } - + RequiredText("카테고리") ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 8) { @@ -124,59 +152,62 @@ public struct CommunityWriteView: View { } } } - .padding(.horizontal, 16) } - .padding(.horizontal, -16) } } private var titleSection: some View { VStack(alignment: .leading, spacing: 12) { - HStack(spacing: 0) { - Text("제목") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.textG900) - Text("*") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.primaryHambugRed) - } - - BottomLineTextField(title: $title) + RequiredText("제목") + + BottomLineTextField( + title: $title, + focusedField: $focusedField, + field: .title + ) } } private let contentPlaceholder: String = "자유롭게 이야기를 나눠보세요" private var contentSection: some View { VStack(alignment: .leading, spacing: 12) { - HStack(spacing: 0) { - Text("내용") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.textG900) - Text("*") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.primaryHambugRed) - } - + RequiredText("내용") + BorderTextEditor( maxCharacterCount: maxCharacterCount, - content: $content + content: $content, + focusedField: $focusedField, + field: .content ) } } private var imageAttachmentSection: some View { - HStack(spacing: 8) { - AddedImageView {} - AddedImageView {} - - Spacer() + Group { + if !viewModel.selectedImages.isEmpty { + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 8) { + ForEach(viewModel.selectedImages) { selectedImage in + AddedImageView( + image: selectedImage.image, + onDelete: { + viewModel.removeImage(id: selectedImage.id) + } + ) + } + } + } + } } } + private var addImageButtonSection: some View { - Button { - - } label: { - Label("사진추가 (2/5)", systemImage: "camera") + PhotosPicker( + selection: $photosPickerItems, + maxSelectionCount: viewModel.maxImages - viewModel.selectedImages.count, + matching: .images + ) { + Label(viewModel.imageCountText, systemImage: "camera") .frame(maxWidth: .infinity) .frame(height: 40) .foregroundColor(Color.primaryHambugRed) @@ -185,15 +216,32 @@ public struct CommunityWriteView: View { .stroke(Color.primaryHambugRed, lineWidth: 1) ) } - - + .onChange(of: photosPickerItems) { _, newValue in + Task { + await viewModel.handleImageSelection(newValue) + photosPickerItems.removeAll() + } + } + .disabled(!viewModel.canAddMoreImages || viewModel.isProcessingImages) } } -#Preview { - CommunityWriteView() +extension CommunityWriteView.Category { + func toBoardCategory() -> BoardCategory { + switch self { + case .자유잡담: return .freeTalk + case .프랜차이즈: return .franchise + case .수제버거: return .handmade + case .맛집추천: return .recommendation + } + } } +//#Preview { +// let diContainer = CommunityDI.CommunityDIContainer() +// CommunityWriteView(viewModel: diContainer.makeCommunityWriteViewModel()) +//} + fileprivate struct CommunityWriteFilterChip: View { let category: String @@ -214,14 +262,25 @@ fileprivate struct CommunityWriteFilterChip: View { } struct AddedImageView: View { + let image: UIImage? private let action: () -> Void + var body: some View { ZStack(alignment: .topTrailing) { - // 메인 사각형 영역 - RoundedRectangle(cornerRadius: 8) - .fill(Color.bgG100) - .frame(width: 80, height: 80) - + // 이미지 또는 플레이스홀더 + if let image = image { + Image(uiImage: image) + .resizable() + .scaledToFill() + .frame(width: 80, height: 80) + .clipped() + .cornerRadius(8) + } else { + RoundedRectangle(cornerRadius: 8) + .fill(Color.bgG100) + .frame(width: 80, height: 80) + } + // X 버튼 (우측 상단) Button(action: { action() @@ -231,11 +290,14 @@ struct AddedImageView: View { .frame(width: 20, height: 20) .padding(10) } - .offset(x: 18, y: -18) // 사각형 밖으로 살짝 나오게 + .offset(x: 20, y: -20) } + .padding(.top, 8) + .padding(.trailing, 8) } - - init(action: @escaping @MainActor () -> Void) { + + init(image: UIImage? = nil, onDelete action: @escaping @MainActor () -> Void) { + self.image = image self.action = action } } diff --git a/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift b/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift new file mode 100644 index 0000000..b66d9d7 --- /dev/null +++ b/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift @@ -0,0 +1,188 @@ +// +// CommunityWriteViewModel.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + +import Foundation +import SwiftUI +import PhotosUI +import Observation +import CommunityDomain +import Util + +@Observable +public final class CommunityWriteViewModel { + + // MARK: - Published State (auto-tracked by @Observable) + + /// 선택된 이미지 목록 + public var selectedImages: [SelectedImage] = [] + + /// 이미지 처리 중 상태 + public var isProcessingImages: Bool = false + + /// 게시물 제출 중 상태 + public var isSubmitting: Bool = false + + /// 에러 메시지 + public var errorMessage: String? = nil + + /// 이미지 크기 초과 알림 표시 여부 + public var showImageSizeAlert: Bool = false + + // MARK: - Constants + + /// 최대 이미지 개수 + public let maxImages: Int = 5 + + // MARK: - Dependencies + + private let createBoardUseCase: CreateBoardUseCase + + // MARK: - Computed Properties + + /// 이미지 추가 가능 여부 + public var canAddMoreImages: Bool { + selectedImages.count < maxImages + } + + /// 이미지 카운터 텍스트 + public var imageCountText: String { + "사진추가 (\(selectedImages.count)/\(maxImages))" + } + + /// 제출 가능 여부 + public var canSubmit: Bool { + !isSubmitting && !isProcessingImages + } + + // MARK: - Initialization + + public init(createBoardUseCase: CreateBoardUseCase) { + self.createBoardUseCase = createBoardUseCase + } + + // MARK: - Image Selection + + /// PhotosPicker에서 선택한 이미지 처리 + /// - Parameter items: 선택된 PhotosPickerItem 배열 + public func handleImageSelection(_ items: [PhotosPickerItem]) async { + guard canAddMoreImages else { + return + } + + isProcessingImages = true + errorMessage = nil + + // 사용 가능한 슬롯 계산 + let availableSlots = maxImages - selectedImages.count + let itemsToProcess = Array(items.prefix(availableSlots)) + + for item in itemsToProcess { + guard let imageData = try? await item.loadTransferable(type: Data.self), + let image = UIImage(data: imageData) else { + continue + } + + let originalSize = imageData.count + let fileName = "image_\(UUID().uuidString).jpg" + + // 크기 검증 (10MB) + if originalSize > ImageProcessor.maxFileSize { + // 처리 시도 + if let _ = ImageProcessor.process(image) { + // 처리 성공 + let selectedImage = SelectedImage( + image: image, + originalSize: originalSize, + fileName: fileName + ) + selectedImages.append(selectedImage) + } else { + // 처리 실패 + showImageSizeAlert = true + } + } else { + // 크기가 괜찮으면 바로 추가 + let selectedImage = SelectedImage( + image: image, + originalSize: originalSize, + fileName: fileName + ) + selectedImages.append(selectedImage) + } + } + + isProcessingImages = false + } + + // MARK: - Image Management + + /// 이미지 삭제 (인덱스) + /// - Parameter index: 삭제할 이미지의 인덱스 + public func removeImage(at index: Int) { + guard index < selectedImages.count else { return } + selectedImages.remove(at: index) + } + + /// 이미지 삭제 (ID) + /// - Parameter id: 삭제할 이미지의 ID + public func removeImage(id: UUID) { + selectedImages.removeAll { $0.id == id } + } + + // MARK: - Board Creation + + /// 게시물 생성 + /// - Parameters: + /// - title: 제목 + /// - content: 내용 + /// - category: 카테고리 + /// - Returns: 성공 여부 + public func createBoard( + title: String, + content: String, + category: BoardCategory + ) async -> Bool { + guard canSubmit else { return false } + guard !title.isEmpty && !content.isEmpty else { + errorMessage = "제목과 내용을 입력해주세요" + return false + } + + isSubmitting = true + errorMessage = nil + + do { + let images = selectedImages.map { $0.image } + + _ = try await createBoardUseCase.execute( + title: title, + content: content, + category: category, + images: images + ) + + print("✅ Board created successfully with \(images.count) images") + isSubmitting = false + return true + + } catch { + errorMessage = "게시글 작성에 실패했습니다: \(error.localizedDescription)" + print("❌ Board creation error: \(error)") + isSubmitting = false + return false + } + } + + // MARK: - Reset + + /// 상태 초기화 + public func reset() { + selectedImages.removeAll() + errorMessage = nil + showImageSizeAlert = false + } +} From 9bf873795a2c2e669e10b29561c5519ad950cf16 Mon Sep 17 00:00:00 2001 From: kangddong Date: Sun, 11 Jan 2026 06:12:44 +0900 Subject: [PATCH 10/12] =?UTF-8?q?feat:=20Custom=20TabView=20visible=20on/o?= =?UTF-8?q?ff=20=EB=A5=BC=20=EC=9C=84=ED=95=B4=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Common/Package.swift | 8 + .../CustomTabView/CustomTabView.swift | 92 +++++++++++ .../SharedUI/CustomTabView/HambugTab.swift | 77 +++++++++ .../CustomTabView/TabBarVisibilityKey.swift | 56 +++++++ Community/Package.swift | 59 ++++++- .../Community/CommunityView.swift | 2 + .../Presentation/Detail/CommunityDetail.swift | 57 +++++++ Hambug.xcodeproj/project.pbxproj | 17 +- Hambug/ContentView.swift | 1 + Home/Package.swift | 5 +- Home/Sources/Presentation/HomeView.swift | 2 + Projects/Components/CustomTabView.swift | 154 ------------------ 12 files changed, 366 insertions(+), 164 deletions(-) create mode 100644 Common/Sources/SharedUI/CustomTabView/CustomTabView.swift create mode 100644 Common/Sources/SharedUI/CustomTabView/HambugTab.swift create mode 100644 Common/Sources/SharedUI/CustomTabView/TabBarVisibilityKey.swift create mode 100644 Community/Sources/Presentation/Detail/CommunityDetail.swift delete mode 100644 Projects/Components/CustomTabView.swift diff --git a/Common/Package.swift b/Common/Package.swift index c0dab6b..168956b 100644 --- a/Common/Package.swift +++ b/Common/Package.swift @@ -27,6 +27,10 @@ let package = Package( name: "Util", targets: ["Util"] ), + .library( + name: "SharedUI", + targets: ["SharedUI"] + ), ], targets: [ .target( @@ -42,6 +46,10 @@ let package = Package( .target(name: "DataSources"), .target(name: "LocalizedString"), .target(name: "Util"), + .target( + name: "SharedUI", + dependencies: ["DesignSystem"] + ), .plugin( name: "ColorGenerator", diff --git a/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift b/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift new file mode 100644 index 0000000..b1c896a --- /dev/null +++ b/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift @@ -0,0 +1,92 @@ +// +// CustomTabView.swift +// Hambug +// +// Created by 강동영 on 12/12/25. +// + +import DesignSystem +import SwiftUI + +public struct CustomTabView: View { + private let tabConfig: [HambugTab] + @ViewBuilder let content: Content + + @Binding private var selectedTab: Int + @State private var isTabBarHidden: Bool = false + + public var body: some View { + VStack(spacing: 0) { + // Content area + TabView(selection: $selectedTab) { + content + .syncTabBarVisibility(with: $isTabBarHidden) + } + .tabViewStyle(.page(indexDisplayMode: .never)) + + // Custom Tab Bar + if !isTabBarHidden { + HStack(spacing: 0) { + ForEach(tabConfig) { tab in + TabBarItem( + config: tab, + isSelected: selectedTab == tab.id + ) { + selectedTab = tab.id + } + } + } + .frame(height: UIScreen.main.bounds.height * 0.11) + .background( + Color.white + .cornerRadius(30, corners: [.topLeft, .topRight]) + ) + .shadow(color: .black.opacity(0.1), radius: 10, y: -5) + .transition(.move(edge: .bottom).combined(with: .opacity)) + } + } + .ignoresSafeArea(.all, edges: .vertical) + } + + public init( + selectedTab: Binding, + tabConfig: [HambugTab] = HambugTab.allCases, + @ViewBuilder content: () -> Content + ) { + self._selectedTab = selectedTab + self.tabConfig = tabConfig + self.content = content() + } +} + + +// MARK: Style 관련 객체들 +fileprivate extension View { + func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View { + clipShape(RoundedCorner(radius: radius, corners: corners)) + } +} + +struct RoundedCorner: Shape { + var radius: CGFloat = .infinity + var corners: UIRectCorner = .allCorners + + func path(in rect: CGRect) -> SwiftUI.Path { + let path = UIBezierPath( + roundedRect: rect, + byRoundingCorners: corners, + cornerRadii: CGSize(width: radius, height: radius) + ) + return SwiftUI.Path(path.cgPath) + } +} + + +// +//#Preview { +// @Previewable @State var selectedTab = 0 +// +// CustomTabView(selectedTab: $selectedTab) { +// Text("Preview") +// } +//} diff --git a/Common/Sources/SharedUI/CustomTabView/HambugTab.swift b/Common/Sources/SharedUI/CustomTabView/HambugTab.swift new file mode 100644 index 0000000..187475f --- /dev/null +++ b/Common/Sources/SharedUI/CustomTabView/HambugTab.swift @@ -0,0 +1,77 @@ +// +// HambugTab.swift +// Common +// +// Created by 강동영 on 1/9/26. +// + +import SwiftUI + +// MARK: CustomTabView 의 HambugTab +extension CustomTabView { + public enum HambugTab: Int, CaseIterable, Identifiable { + case home = 0 + case community = 1 + case myPage = 2 + + public var id: Int { rawValue } + + var iconName: String { + switch self { + case .home: + "tab_home" + case .community: + "tab_community" + case .myPage: + "tab_user" + } + } + + var title: String { + switch self { + case .home: + "홈" + case .community: + "커뮤니티" + case .myPage: + "마이" + } + } + } +} + +// MARK: TabBarItem +extension CustomTabView { + struct TabBarItem: View { + private let config: HambugTab + private let isSelected: Bool + private let action: () -> Void + + var body: some View { + Button(action: action) { + VStack(spacing: 8) { + Image(config.iconName) + .renderingMode(.template) + .resizable() + .scaledToFit() + .frame(width: 21, height: 21) + + Text(config.title) + .pretendard(.caption(.emphasis)) + } + .foregroundColor(isSelected ? .primaryHambugRed : .borderG400) + .frame(maxWidth: .infinity) + } + } + + init( + config: HambugTab, + isSelected: Bool, + action: @escaping () -> Void + ) { + self.config = config + self.isSelected = isSelected + self.action = action + } + } +} diff --git a/Common/Sources/SharedUI/CustomTabView/TabBarVisibilityKey.swift b/Common/Sources/SharedUI/CustomTabView/TabBarVisibilityKey.swift new file mode 100644 index 0000000..4c25a08 --- /dev/null +++ b/Common/Sources/SharedUI/CustomTabView/TabBarVisibilityKey.swift @@ -0,0 +1,56 @@ +// +// TabBarVisibilityKey.swift +// Common +// +// Created by 강동영 on 1/9/26. +// + +import SwiftUI + +// MARK: - TabBar Visibility Environment +private struct TabBarVisibilityKey: EnvironmentKey { + static let defaultValue: Binding = .constant(false) +} + +extension EnvironmentValues { + var tabBarVisibility: Binding { + get { self[TabBarVisibilityKey.self] } + set { self[TabBarVisibilityKey.self] = newValue } + } +} + +public extension View { + /// 커스텀 탭바를 숨기거나 표시합니다. + /// - Parameter hidden: true면 탭바를 숨기고, false면 탭바를 표시합니다. + func tabBarHidden(_ hidden: Bool) -> some View { + self + .onAppear { + // View가 나타날 때 preference를 강제로 다시 전파 + // 이렇게 하면 NavigationStack에서 pop 시에도 제대로 갱신됨 + } + .preference(key: TabBarVisibilityPreference.self, value: hidden) + } +} + +private struct TabBarVisibilityPreference: PreferenceKey { + static var defaultValue: Bool = false + + static func reduce(value: inout Bool, nextValue: () -> Bool) { + // 자식 View의 preference가 우선 + // true(숨김)가 있으면 true를 우선시 + let next = nextValue() + if next { + value = next + } + } +} + +extension View { + func syncTabBarVisibility(with binding: Binding) -> some View { + self.onPreferenceChange(TabBarVisibilityPreference.self) { newValue in + withAnimation(.easeInOut(duration: 0.2)) { + binding.wrappedValue = newValue + } + } + } +} diff --git a/Community/Package.swift b/Community/Package.swift index 9457e48..d2afff7 100644 --- a/Community/Package.swift +++ b/Community/Package.swift @@ -6,6 +6,7 @@ import PackageDescription enum Config: String, CaseIterable { static let name: String = "Community" + case di = "DI" case data = "Data" case domain = "Domain" case presentation = "Presentation" @@ -29,42 +30,86 @@ let package = Package( ), ], dependencies: [ + .package(name: "DI", path: "../DI"), .package(name: "Common", path: "../Common"), .package(name: "Infrastructure", path: "../Infrastructure"), ], targets: [ + .target( + config: .di, + dependencies: [ + .target(config: .domain), + .target(config: .data), + .target(config: .presentation), + .product(name: "DI", package: "DI"), + .product(name: "AppDI", package: "DI"), + .product(name: "NetworkInterface", package: "Infrastructure"), + .product(name: "NetworkImpl", package: "Infrastructure"), + ], + ), // Domain: 독립적 (외부 의존성 없음) .target( - name: Config.domain.name, + config: .domain, dependencies: [ .product(name: "NetworkInterface", package: "Infrastructure"), ], - path: Config.domain.path ), // Data: Domain, Network에 의존 .target( - name: Config.data.name, + config: .data, dependencies: [ .target(config: .domain), + .product(name: "Util", package: "Common"), .product(name: "NetworkInterface", package: "Infrastructure"), .product(name: "NetworkImpl", package: "Infrastructure"), ], - path: Config.data.path ), - // Presentation: Domain, DesignSystem에 의존 + // Presentation: Domain, DesignSystem, Layout에 의존 .target( - name: Config.presentation.name, + config: .presentation, dependencies: [ .target(config: .domain), .product(name: "DesignSystem", package: "Common"), + .product(name: "SharedUI", package: "Common"), ], - path: Config.presentation.path ), ] ) +extension Target { + static func target( + config: Config, + dependencies: [Dependency] = [], + exclude: [String] = [], + sources: [String]? = nil, + resources: [Resource]? = nil, + publicHeadersPath: String? = nil, + packageAccess: Bool = false, + cSettings: [CSetting]? = nil, + cxxSettings: [CXXSetting]? = nil, + swiftSettings: [SwiftSetting]? = nil, + linkerSettings: [LinkerSetting]? = nil, + plugins: [PluginUsage]? = nil, + ) -> Target { + return .target( + name: config.name, + dependencies: dependencies, + path: config.path, + exclude: exclude, + sources: sources, + resources: resources, + publicHeadersPath: publicHeadersPath, + packageAccess: packageAccess, + cSettings: cSettings, + cxxSettings: cxxSettings, + swiftSettings: swiftSettings, + linkerSettings: linkerSettings, + plugins: plugins) + } +} + extension Target.Dependency { static func target(config: Config) -> Self { return .target(name: config.name) diff --git a/Community/Sources/Presentation/Community/CommunityView.swift b/Community/Sources/Presentation/Community/CommunityView.swift index 905da13..2894f49 100644 --- a/Community/Sources/Presentation/Community/CommunityView.swift +++ b/Community/Sources/Presentation/Community/CommunityView.swift @@ -8,6 +8,7 @@ import SwiftUI import DesignSystem import CommunityDomain +import SharedUI public protocol CommunityWriteFactory { func makeWriteViewModel() -> CommunityWriteViewModel @@ -97,6 +98,7 @@ public struct CommunityView: View { viewModel.refreshBoards() } .navigationBarHidden(true) + .tabBarHidden(false) } } } diff --git a/Community/Sources/Presentation/Detail/CommunityDetail.swift b/Community/Sources/Presentation/Detail/CommunityDetail.swift new file mode 100644 index 0000000..216c511 --- /dev/null +++ b/Community/Sources/Presentation/Detail/CommunityDetail.swift @@ -0,0 +1,57 @@ +// +// CommunityDetail.swift +// Hambug +// +// Created by 강동영 on 10/18/25. +// + +import SwiftUI +import DesignSystem +import CommunityDomain +import SharedUI +public struct CommunityDetailView: View { + private func timeAgoDisplay(_ date: Date) -> String { + let now = Date() + let timeInterval = now.timeIntervalSince(date) + + if timeInterval < 60 { + return "방금 전" + } else if timeInterval < 3600 { + let minutes = Int(timeInterval / 60) + return "\(minutes)분 전" + } else if timeInterval < 86400 { + let hours = Int(timeInterval / 3600) + return "\(hours)시간 전" + } else if timeInterval < 604800 { + let days = Int(timeInterval / 86400) + return "\(days)일 전" + } else { + let formatter = DateFormatter() + formatter.dateFormat = "MM.dd" + return formatter.string(from: date) + } + } +} + +struct EllipsisButton: View { + private let action: () -> Void + var body: some View { + Button { + action() + } label: { + Color.bgEllipsis + .frame(width: 24, height: 24) + .clipShape(Circle()) + .overlay { + Image(systemName: "ellipsis") + .rotationEffect(.degrees(90.0)) + .font(.system(size: 14)) + .foregroundColor(.iconG600) + } + } + } + + init(action: @escaping @MainActor () -> Void) { + self.action = action + } +} diff --git a/Hambug.xcodeproj/project.pbxproj b/Hambug.xcodeproj/project.pbxproj index f0b6bd2..e9e8ccd 100644 --- a/Hambug.xcodeproj/project.pbxproj +++ b/Hambug.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ B513799B2EE2ED8F00DAF2F7 /* Common.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = B513799A2EE2ED8F00DAF2F7 /* Common.xcconfig */; }; B52285C92E88469C00678ECC /* Managers in Frameworks */ = {isa = PBXBuildFile; productRef = B52285C82E88469C00678ECC /* Managers */; }; B52286032E884E5B00678ECC /* DesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = B52286022E884E5B00678ECC /* DesignSystem */; }; + B53086D12F115A3800586850 /* SharedUI in Frameworks */ = {isa = PBXBuildFile; productRef = B53086D02F115A3800586850 /* SharedUI */; }; B54128772EF1CD3100CC4938 /* Login in Frameworks */ = {isa = PBXBuildFile; productRef = B54128762EF1CD3100CC4938 /* Login */; }; B5412A882EF277A200CC4938 /* NetworkImpl in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A872EF277A200CC4938 /* NetworkImpl */; }; B5412A8A2EF277A200CC4938 /* NetworkInterface in Frameworks */ = {isa = PBXBuildFile; productRef = B5412A892EF277A200CC4938 /* NetworkInterface */; }; @@ -108,6 +109,7 @@ B5412A882EF277A200CC4938 /* NetworkImpl in Frameworks */, B54134FD2EF5B09D00CC4938 /* Community in Frameworks */, B5412A8A2EF277A200CC4938 /* NetworkInterface in Frameworks */, + B53086D12F115A3800586850 /* SharedUI in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -141,12 +143,12 @@ B513799A2EE2ED8F00DAF2F7 /* Common.xcconfig */, B5E822EB2EA2791900F3E10E /* Intro */, B52285C62E8844BD00678ECC /* Common */, - 915BC5FD2E3CBD5A0062B78E /* Projects */, 915BC5D42E3CB9B50062B78E /* Hambug */, 915BC5E32E3CB9B80062B78E /* HambugTests */, 915BC5ED2E3CB9B80062B78E /* HambugUITests */, B52285C72E88469C00678ECC /* Frameworks */, 915BC5D32E3CB9B50062B78E /* Products */, + B53086BD2F10FB9C00586850 /* Recovered References */, ); sourceTree = ""; }; @@ -167,6 +169,14 @@ name = Frameworks; sourceTree = ""; }; + B53086BD2F10FB9C00586850 /* Recovered References */ = { + isa = PBXGroup; + children = ( + 915BC5FD2E3CBD5A0062B78E /* Projects */, + ); + name = "Recovered References"; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -200,6 +210,7 @@ B54134FE2EF5B0A400CC4938 /* Home */, B541357F2EF5B4CC00CC4938 /* KakaoLogin */, B5EDA8F72F0B9C0C002F72B9 /* DIKit */, + B53086D02F115A3800586850 /* SharedUI */, ); productName = Hambug; productReference = 915BC5D22E3CB9B50062B78E /* Hambug.app */; @@ -700,6 +711,10 @@ isa = XCSwiftPackageProductDependency; productName = DesignSystem; }; + B53086D02F115A3800586850 /* SharedUI */ = { + isa = XCSwiftPackageProductDependency; + productName = SharedUI; + }; B54128762EF1CD3100CC4938 /* Login */ = { isa = XCSwiftPackageProductDependency; productName = Login; diff --git a/Hambug/ContentView.swift b/Hambug/ContentView.swift index 221ae30..22b7358 100644 --- a/Hambug/ContentView.swift +++ b/Hambug/ContentView.swift @@ -13,6 +13,7 @@ import CommunityPresentation import CommunityDI import MyPagePresentation import MyPageDI +import SharedUI struct ContentView: View { @Environment(AppDIContainer.self) var appContainer diff --git a/Home/Package.swift b/Home/Package.swift index 548609b..8e82dab 100644 --- a/Home/Package.swift +++ b/Home/Package.swift @@ -31,7 +31,7 @@ let package = Package( ], dependencies: [ .package(name: "Common", path: "../Common"), - .package(name: "DIKit", path: "../DI"), + .package(name: "DI", path: "../DI"), .package(name: "Infrastructure", path: "../Infrastructure"), ], targets: [ @@ -60,12 +60,13 @@ let package = Package( ], ), - // Presentation: Domain, DesignSystem에 의존 + // Presentation: Domain, DesignSystem, SharedUI에 의존 .target( config: .presentation, dependencies: [ .target(config: .domain), .product(name: "DesignSystem", package: "Common"), + .product(name: "SharedUI", package: "Common"), ], ), ] diff --git a/Home/Sources/Presentation/HomeView.swift b/Home/Sources/Presentation/HomeView.swift index 5f7f8c7..01641a7 100644 --- a/Home/Sources/Presentation/HomeView.swift +++ b/Home/Sources/Presentation/HomeView.swift @@ -8,6 +8,7 @@ import SwiftUI import HomeDomain import DesignSystem +import SharedUI public struct HomeView: View { @@ -41,6 +42,7 @@ public struct HomeView: View { .padding(.top, 50) } .ignoresSafeArea() + .tabBarHidden(false) } } diff --git a/Projects/Components/CustomTabView.swift b/Projects/Components/CustomTabView.swift deleted file mode 100644 index 6e3acda..0000000 --- a/Projects/Components/CustomTabView.swift +++ /dev/null @@ -1,154 +0,0 @@ -// -// CustomTabView.swift -// Hambug -// -// Created by 강동영 on 12/12/25. -// - -import DesignSystem -import SwiftUI - -struct CustomTabView: View { - private let tabConfig: [HambugTab] - @ViewBuilder let content: Content - - @Binding private var selectedTab: Int - - var body: some View { - VStack(spacing: 0) { - // Content area - TabView(selection: $selectedTab) { - content - } - .tabViewStyle(.page(indexDisplayMode: .never)) - - // Custom Tab Bar - HStack(spacing: 0) { - ForEach(tabConfig) { tab in - TabBarItem( - config: tab, - isSelected: selectedTab == tab.id - ) { - selectedTab = tab.id - } - } - } - .frame(height: UIScreen.main.bounds.height * 0.11) - .background( - Color.white - .cornerRadius(30, corners: [.topLeft, .topRight]) - ) - .shadow(color: .black.opacity(0.1), radius: 10, y: -5) - } - .ignoresSafeArea(.all, edges: .vertical) - } - - init( - selectedTab: Binding, - tabConfig: [HambugTab] = HambugTab.allCases, - @ViewBuilder content: () -> Content, - ) { - self._selectedTab = selectedTab - self.tabConfig = tabConfig - self.content = content() - } -} - -// MARK: CustomTabView 의 HambugTab -extension CustomTabView { - enum HambugTab: Int, CaseIterable, Identifiable { - case home = 0 - case community = 1 - case myPage = 2 - - var id: Int { rawValue } - - var iconName: String { - switch self { - case .home: - "tab_home" - case .community: - "tab_community" - case .myPage: - "tab_user" - } - } - - var title: String { - switch self { - case .home: - "홈" - case .community: - "커뮤니티" - case .myPage: - "마이" - } - } - } -} - -// MARK: TabBarItem -extension CustomTabView { - fileprivate struct TabBarItem: View { - private let config: HambugTab - private let isSelected: Bool - private let action: () -> Void - - var body: some View { - Button(action: action) { - VStack(spacing: 8) { - Image(config.iconName) - .renderingMode(.template) - .resizable() - .scaledToFit() - .frame(width: 21, height: 21) - - Text(config.title) - .pretendard(.caption(.emphasis)) - } - .foregroundColor(isSelected ? .primaryHambugRed : .borderG400) - .frame(maxWidth: .infinity) - } - } - - init( - config: HambugTab, - isSelected: Bool, - action: @escaping () -> Void - ) { - self.config = config - self.isSelected = isSelected - self.action = action - } - } -} - - -// MARK: Style 관련 객체들 -fileprivate extension View { - func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View { - clipShape(RoundedCorner(radius: radius, corners: corners)) - } -} - -struct RoundedCorner: Shape { - var radius: CGFloat = .infinity - var corners: UIRectCorner = .allCorners - - func path(in rect: CGRect) -> SwiftUI.Path { - let path = UIBezierPath( - roundedRect: rect, - byRoundingCorners: corners, - cornerRadii: CGSize(width: radius, height: radius) - ) - return SwiftUI.Path(path.cgPath) - } -} - -#Preview { - @Previewable @State var selectedTab = 0 - - CustomTabView(selectedTab: $selectedTab) { - Text("Preview") - } -} From 79ae6ebf0551fafee8cc5422ae8290bec51082a4 Mon Sep 17 00:00:00 2001 From: kangddong Date: Mon, 12 Jan 2026 00:25:13 +0900 Subject: [PATCH 11/12] =?UTF-8?q?feat:=20=EC=BB=A4=EB=AE=A4=EB=8B=88?= =?UTF-8?q?=ED=8B=B0=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8,=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=EB=B3=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignSystem/KeyboardObserver.swift | 36 -- .../DesignSystem/ProfileImageView.swift | 54 +++ .../Contents.json | 21 + ... \354\235\264\353\257\270\354\247\200.png" | Bin 0 -> 5727 bytes .../Sources/DesignSystem/View+Keyboard.swift | 22 - Common/Sources/Managers/AppStorageKey.swift | 1 + .../Managers/UserDefaultsManager.swift | 34 +- .../CustomTabView/CustomTabView.swift | 48 +- .../Sources/DI/CommunityDIContainer.swift | 49 +- Community/Sources/Data/API/CommunityAPI.swift | 6 +- .../Sources/Data/API/CommunityAPIClient.swift | 12 +- .../Data/DTO/BoardDetailResponseDTO.swift | 65 +++ .../Sources/Data/DTO/BoardResponse.swift | 7 +- Community/Sources/Data/DTO/LikeResponse.swift | 33 ++ .../CommunityRepositoryImpl.swift | 30 +- Community/Sources/Domain/Entities/Board.swift | 16 +- .../Sources/Domain/Entities/Comment.swift | 50 ++ Community/Sources/Domain/Entities/Like.swift | 21 + .../Repositories/CommunityRepository.swift | 2 +- .../Domain/UseCases/CommentUseCase.swift | 42 ++ .../UseCases/GetBoardDetailUseCase.swift | 56 +++ .../Sources/Domain/UseCases/LikeUseCase.swift | 32 ++ .../UseCases/ReportContentUseCaseImpl.swift | 27 ++ .../Community/CommunityView.swift | 91 +++- .../Community/CommunityViewModel.swift | 3 - .../Presentation/Detail/CommunityDetail.swift | 453 ++++++++++++++++++ .../Detail/CommunityDetailViewModel.swift | 245 ++++++++++ .../Presentation/Views/CommunityDetail.swift | 303 ------------ Hambug/ContentView.swift | 23 +- Home/Sources/Presentation/HomeView.swift | 4 +- Login/Sources/Data/LoginRepositoryImpl.swift | 14 +- 31 files changed, 1318 insertions(+), 482 deletions(-) delete mode 100644 Common/Sources/DesignSystem/KeyboardObserver.swift create mode 100644 Common/Sources/DesignSystem/ProfileImageView.swift create mode 100644 Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/Contents.json create mode 100644 "Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/\352\270\260\353\263\270 \355\224\204\353\241\234\355\225\204 \354\235\264\353\257\270\354\247\200.png" delete mode 100644 Common/Sources/DesignSystem/View+Keyboard.swift create mode 100644 Community/Sources/Data/DTO/BoardDetailResponseDTO.swift create mode 100644 Community/Sources/Data/DTO/LikeResponse.swift create mode 100644 Community/Sources/Domain/Entities/Comment.swift create mode 100644 Community/Sources/Domain/Entities/Like.swift create mode 100644 Community/Sources/Domain/UseCases/CommentUseCase.swift create mode 100644 Community/Sources/Domain/UseCases/GetBoardDetailUseCase.swift create mode 100644 Community/Sources/Domain/UseCases/LikeUseCase.swift create mode 100644 Community/Sources/Domain/UseCases/ReportContentUseCaseImpl.swift create mode 100644 Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift delete mode 100644 Community/Sources/Presentation/Views/CommunityDetail.swift diff --git a/Common/Sources/DesignSystem/KeyboardObserver.swift b/Common/Sources/DesignSystem/KeyboardObserver.swift deleted file mode 100644 index d5fb9ab..0000000 --- a/Common/Sources/DesignSystem/KeyboardObserver.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// KeyboardObserver.swift -// Hambug -// -// Created by 강동영 on 1/8/26. -// - -import SwiftUI -import Combine - -public class KeyboardObserver: ObservableObject { - @Published public var keyboardHeight: CGFloat = 0 - @Published public var isKeyboardVisible: Bool = false - - private var cancellables = Set() - - public init() { - NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification) - .compactMap { notification in - notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect - } - .map { $0.height } - .sink { [weak self] height in - self?.keyboardHeight = height - self?.isKeyboardVisible = true - } - .store(in: &cancellables) - - NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification) - .sink { [weak self] _ in - self?.keyboardHeight = 0 - self?.isKeyboardVisible = false - } - .store(in: &cancellables) - } -} diff --git a/Common/Sources/DesignSystem/ProfileImageView.swift b/Common/Sources/DesignSystem/ProfileImageView.swift new file mode 100644 index 0000000..87ba084 --- /dev/null +++ b/Common/Sources/DesignSystem/ProfileImageView.swift @@ -0,0 +1,54 @@ +// +// ProfileImageView.swift +// Common +// +// Created by 강동영 on 1/11/26. +// + +import SwiftUI + +public struct ProfileImageView: View { + private let imageUrlString: String + private var width: CGFloat + private var height: CGFloat + private var fillColor: Color + + public init( + with imageUrlString: String, + width: CGFloat = 32, + height: CGFloat = 32, + fillColor: Color = Color.bgG200 + ) { + self.imageUrlString = imageUrlString + self.width = width + self.height = height + self.fillColor = fillColor + } + + public var body: some View { + AsyncImage(url: URL(string: imageUrlString)) { phase in + switch phase { + case .success(let image): + image + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: width, height: height) + case .empty, .failure: + Image(.placeholderProfile) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: width, height: height) + @unknown default: + Image(.placeholderProfile) + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: width, height: height) } + } + } +} + +public extension ProfileImageView { + func applyCilpShape() -> some View { + self.clipShape(Circle()) + } +} diff --git a/Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/Contents.json b/Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/Contents.json new file mode 100644 index 0000000..8946336 --- /dev/null +++ b/Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "기본 프로필 이미지.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/\352\270\260\353\263\270 \355\224\204\353\241\234\355\225\204 \354\235\264\353\257\270\354\247\200.png" "b/Common/Sources/DesignSystem/Resources/Image.xcassets/placeholder_ProfileImage.imageset/\352\270\260\353\263\270 \355\224\204\353\241\234\355\225\204 \354\235\264\353\257\270\354\247\200.png" new file mode 100644 index 0000000000000000000000000000000000000000..a0f87fa007fec69d18ab5b2cae4f21cba59127a3 GIT binary patch literal 5727 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 L8EKZ{2&Df3LvD{v literal 0 HcmV?d00001 diff --git a/Common/Sources/DesignSystem/View+Keyboard.swift b/Common/Sources/DesignSystem/View+Keyboard.swift deleted file mode 100644 index a5247fd..0000000 --- a/Common/Sources/DesignSystem/View+Keyboard.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// View+Keyboard.swift -// Hambug -// -// Created by 강동영 on 1/8/26. -// - -import SwiftUI - -public extension View { - /// 뷰의 빈 영역을 탭하면 키보드를 해제합니다 - func dismissKeyboardOnTap() -> some View { - self.onTapGesture { - UIApplication.shared.sendAction( - #selector(UIResponder.resignFirstResponder), - to: nil, - from: nil, - for: nil - ) - } - } -} diff --git a/Common/Sources/Managers/AppStorageKey.swift b/Common/Sources/Managers/AppStorageKey.swift index c5ebe71..bc8534e 100644 --- a/Common/Sources/Managers/AppStorageKey.swift +++ b/Common/Sources/Managers/AppStorageKey.swift @@ -11,6 +11,7 @@ public extension String { struct Storage { static let hasSeenOnboarding = "hasSeenOnboarding" static let userResponse = "userResponse" + static let currentUserId = "currentUserId" } } diff --git a/Common/Sources/Managers/UserDefaultsManager.swift b/Common/Sources/Managers/UserDefaultsManager.swift index 5e76d35..d90c46d 100644 --- a/Common/Sources/Managers/UserDefaultsManager.swift +++ b/Common/Sources/Managers/UserDefaultsManager.swift @@ -7,24 +7,44 @@ import Foundation +// Helper protocol for optional handling +protocol OptionalProtocol { + var isNil: Bool { get } +} + +extension Optional: OptionalProtocol { + var isNil: Bool { self == nil } +} + @propertyWrapper -struct UDDefaultWrapper { +public struct UDDefaultWrapper { private let ud = UserDefaults.standard - var key: String - var defaultValue: T - var wrappedValue: T { + let key: String + let defaultValue: T + + public var wrappedValue: T { get { return ud.value(forKey: key) as? T ?? defaultValue } - set { - ud.setValue(newValue, forKey: key) + nonmutating set { + if let optional = newValue as? (any OptionalProtocol), optional.isNil { + ud.removeObject(forKey: key) + } else { + ud.setValue(newValue, forKey: key) + } ud.synchronize() } } } -public struct UserDefaultsManager { +public final class UserDefaultsManager { public static let shared = UserDefaultsManager() + + private init() {} + @UDDefaultWrapper(key: .Storage.hasSeenOnboarding, defaultValue: false) var isOnboardingCompleted: Bool + + @UDDefaultWrapper(key: .Storage.currentUserId, defaultValue: nil) + public var currentUserId: Int64? } diff --git a/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift b/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift index b1c896a..5dd769e 100644 --- a/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift +++ b/Common/Sources/SharedUI/CustomTabView/CustomTabView.swift @@ -16,36 +16,42 @@ public struct CustomTabView: View { @State private var isTabBarHidden: Bool = false public var body: some View { - VStack(spacing: 0) { + ZStack { // Content area TabView(selection: $selectedTab) { content .syncTabBarVisibility(with: $isTabBarHidden) } - .tabViewStyle(.page(indexDisplayMode: .never)) - // Custom Tab Bar - if !isTabBarHidden { - HStack(spacing: 0) { - ForEach(tabConfig) { tab in - TabBarItem( - config: tab, - isSelected: selectedTab == tab.id - ) { - selectedTab = tab.id - } - } + VStack { + Spacer() + if !isTabBarHidden { tabView } + } + .ignoresSafeArea(.container, edges: .bottom) + + + } + } + + /// Custom Tab Bar + private var tabView: some View { + HStack(spacing: 0) { + ForEach(tabConfig) { tab in + TabBarItem( + config: tab, + isSelected: selectedTab == tab.id + ) { + selectedTab = tab.id } - .frame(height: UIScreen.main.bounds.height * 0.11) - .background( - Color.white - .cornerRadius(30, corners: [.topLeft, .topRight]) - ) - .shadow(color: .black.opacity(0.1), radius: 10, y: -5) - .transition(.move(edge: .bottom).combined(with: .opacity)) } } - .ignoresSafeArea(.all, edges: .vertical) + .frame(height: UIScreen.main.bounds.height * 0.11) + .background( + Color.white + .cornerRadius(30, corners: [.topLeft, .topRight]) + ) + .shadow(color: .black.opacity(0.1), radius: 10, y: -5) + .transition(.move(edge: .bottom).combined(with: .opacity)) } public init( diff --git a/Community/Sources/DI/CommunityDIContainer.swift b/Community/Sources/DI/CommunityDIContainer.swift index 782eb42..704685f 100644 --- a/Community/Sources/DI/CommunityDIContainer.swift +++ b/Community/Sources/DI/CommunityDIContainer.swift @@ -13,8 +13,8 @@ import NetworkImpl import CommunityDomain import CommunityData import CommunityPresentation +import Managers -import SwiftUI struct CommunityWriteAssembly: Assembly { func assemble(container: GenericDIContainer) { container.register(CreateBoardUseCase.self) { resolver in @@ -72,32 +72,16 @@ struct CommunityAssembly: Assembly { ) } - container.register(GetBoardDetailUseCaseInterface.self) { resolver in - GetBoardDetailUseCase(repository: resolver.resolve(CommunityRepository.self)) + container.register(BoardDetailUseCase.self) { resolver in + BoardDetailUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) } - container.register(GetCommentsUseCaseInterface.self) { resolver in - GetCommentsUseCase(repository: resolver.resolve(CommunityRepository.self)) + container.register(CommentUseCase.self) { resolver in + CommentUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) } - container.register(CreateCommentUseCaseInterface.self) { resolver in - CreateCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) - } - - container.register(UpdateCommentUseCaseInterface.self) { resolver in - UpdateCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) - } - - container.register(DeleteCommentUseCaseInterface.self) { resolver in - DeleteCommentUseCase(repository: resolver.resolve(CommunityRepository.self)) - } - - container.register(GetLikeInfoUseCaseInterface.self) { resolver in - GetLikeInfoUseCase(repository: resolver.resolve(CommunityRepository.self)) - } - - container.register(ToggleLikeUseCaseInterface.self) { resolver in - ToggleLikeUseCase(repository: resolver.resolve(CommunityRepository.self)) + container.register(LikeUseCase.self) { resolver in + LikeUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) } container.register(ReportContentUseCase.self) { resolver in @@ -106,14 +90,11 @@ struct CommunityAssembly: Assembly { container.register(CommunityDetailViewModel.self) { @MainActor resolver in CommunityDetailViewModel( - getBoardDetailUseCase: resolver.resolve(GetBoardDetailUseCaseInterface.self), - getCommentsUseCase: resolver.resolve(GetCommentsUseCaseInterface.self), - createCommentUseCase: resolver.resolve(CreateCommentUseCaseInterface.self), - updateCommentUseCase: resolver.resolve(UpdateCommentUseCaseInterface.self), - deleteCommentUseCase: resolver.resolve(DeleteCommentUseCaseInterface.self), - getLikeInfoUseCase: resolver.resolve(GetLikeInfoUseCaseInterface.self), - toggleLikeUseCase: resolver.resolve(ToggleLikeUseCaseInterface.self), - reportContentUseCase: resolver.resolve(ReportContentUseCase.self) + boardDetailUseCase: resolver.resolve(BoardDetailUseCase.self), + commentUseCase: resolver.resolve(CommentUseCase.self), + likeUseCase: resolver.resolve(LikeUseCase.self), + reportContentUseCase: resolver.resolve(ReportContentUseCase.self), + userDefaultsManager: resolver.resolve(UserDefaultsManager.self) ) } @@ -163,6 +144,12 @@ extension CommunityDIContainer: CommunityWriteFactory { } } +extension CommunityDIContainer: CommunityDetailFactory { + @MainActor + public func makeDetailViewModel() -> CommunityDetailViewModel { + return container.resolve(CommunityDetailViewModel.self) + } +} // MARK: - Mock Setup private func setupURLProtocol() { let boardsData: [[String: Any]] = [ diff --git a/Community/Sources/Data/API/CommunityAPI.swift b/Community/Sources/Data/API/CommunityAPI.swift index 18f085f..09dc96a 100644 --- a/Community/Sources/Data/API/CommunityAPI.swift +++ b/Community/Sources/Data/API/CommunityAPI.swift @@ -11,9 +11,9 @@ import CommunityDomain // MARK: - Board Endpoints public enum BoardEndpoint: Endpoint { - case createBoard(BoardRequestDTO) case boards(CursorPagingQuery) case boardsByCategory(CategoryPagingQuery) + case createBoard(BoardRequestDTO) case boardDetail(boardId: Int) case comments(boardId: Int, query: CursorPagingQuery) case createComment(boardId: Int, content: String) @@ -37,6 +37,8 @@ public enum BoardEndpoint: Endpoint { return "/boards/category" case .boardDetail(let boardId): return "/boards/\(boardId)" + case .deleteBoard(let boardId): + return "/boards/\(boardId)" case .comments(let boardId, _): return "/boards/\(boardId)/comments" case .createComment(let boardId, _): @@ -87,7 +89,7 @@ public enum BoardEndpoint: Endpoint { public var body: Data? { let encoder = JSONEncoder() switch self { - case .createBoard(let dto): + case .createBoard(let dto), .updateBoard(_, let dto): return try? encoder.encode(dto) case .createComment(_, let content): let body = ["content": content] diff --git a/Community/Sources/Data/API/CommunityAPIClient.swift b/Community/Sources/Data/API/CommunityAPIClient.swift index 9132cdf..c6b8b9a 100644 --- a/Community/Sources/Data/API/CommunityAPIClient.swift +++ b/Community/Sources/Data/API/CommunityAPIClient.swift @@ -15,7 +15,7 @@ import UIKit public protocol CommunityAPIClientInterface: Sendable { func fetchBoards(lastId: Int?, limit: Int, order: String) -> AnyPublisher func fetchBoardsByCategory(category: String, lastId: Int?, limit: Int, order: String) -> AnyPublisher - func fetchBoardDetail(boardId: Int) -> AnyPublisher + func fetchBoardDetail(boardId: Int) -> AnyPublisher // Board creation func createBoard( @@ -26,7 +26,7 @@ public protocol CommunityAPIClientInterface: Sendable { ) -> AnyPublisher // Comments - func fetchComments(boardId: Int, lastId: Int, limit: Int, order: String) -> AnyPublisher + func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: String) -> AnyPublisher func createComment(boardId: Int, content: String) -> AnyPublisher func updateComment(boardId: Int, commentId: Int, content: String) -> AnyPublisher func deleteComment(boardId: Int, commentId: Int) -> AnyPublisher @@ -68,10 +68,10 @@ public final class CommunityAPIClient: CommunityAPIClientInterface { .eraseToAnyPublisher() } - public func fetchBoardDetail(boardId: Int) -> AnyPublisher { + public func fetchBoardDetail(boardId: Int) -> AnyPublisher { return networkService.request( BoardEndpoint.boardDetail(boardId: boardId), - responseType: SuccessResponse.self + responseType: SuccessResponse.self ) .map(\.data) .eraseToAnyPublisher() @@ -110,7 +110,7 @@ public final class CommunityAPIClient: CommunityAPIClientInterface { } // MARK: - Comments - public func fetchComments(boardId: Int, lastId: Int, limit: Int, order: String) -> AnyPublisher { + public func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: String) -> AnyPublisher { let query: CursorPagingQuery = .init(lastId: lastId, limit: limit, order: order) return networkService.request( BoardEndpoint.comments(boardId: boardId, query: query), @@ -141,7 +141,7 @@ public final class CommunityAPIClient: CommunityAPIClientInterface { public func deleteComment(boardId: Int, commentId: Int) -> AnyPublisher { return networkService.request( BoardEndpoint.deleteComment(boardId: boardId, commentId: commentId), - responseType: SuccessResponse.self + responseType: SuccessResponse.self ) .map { _ in () } .eraseToAnyPublisher() diff --git a/Community/Sources/Data/DTO/BoardDetailResponseDTO.swift b/Community/Sources/Data/DTO/BoardDetailResponseDTO.swift new file mode 100644 index 0000000..e87fefc --- /dev/null +++ b/Community/Sources/Data/DTO/BoardDetailResponseDTO.swift @@ -0,0 +1,65 @@ +// +// BoardDetailResponseDTO.swift +// Community +// +// Created by 강동영 on 1/11/26. +// + +import Foundation +import CommunityDomain + +// MARK: - Board Response DTO +public struct BoardDetailResponseDTO: Decodable, Sendable { + public let id: Int + public let title: String + public let content: String + public let category: String + public let imageUrls: [String] + public let authorNickname: String + public let authorProfileImageUrl: String? + public let authorId: Int + public let createdAt: String + public let updatedAt: String + public let viewCount: Int + public let likeCount: Int + public let commentCount: Int + public let isLiked: Bool + + private enum CodingKeys: String, CodingKey { + case id, title, content, category + case imageUrls + case authorNickname + case authorProfileImageUrl + case authorId + case createdAt + case updatedAt + case viewCount + case likeCount + case commentCount + case isLiked + } +} + +// MARK: - DTO to Domain Mapper +extension BoardDetailResponseDTO { + func toDomain() -> Board { + let dateFormatter = DateFormatter.iso8601WithMicroseconds + + return Board( + id: id, + title: title, + content: content, + category: BoardCategory(rawValue: category) ?? .freeTalk, + imageUrls: imageUrls, + authorNickname: authorNickname, + authorProfileImageUrl: authorProfileImageUrl, + authorId: authorId, + createdAt: dateFormatter.date(from: createdAt) ?? Date(), + updatedAt: dateFormatter.date(from: updatedAt) ?? Date(), + viewCount: viewCount, + likeCount: likeCount, + commentCount: commentCount, + isLiked: isLiked + ) + } +} diff --git a/Community/Sources/Data/DTO/BoardResponse.swift b/Community/Sources/Data/DTO/BoardResponse.swift index 51bfef9..a18c290 100644 --- a/Community/Sources/Data/DTO/BoardResponse.swift +++ b/Community/Sources/Data/DTO/BoardResponse.swift @@ -16,9 +16,8 @@ public struct BoardResponseDTO: Decodable, Sendable { public let content: String public let category: String public let imageUrls: [String] - public let authorNickname: String - public let authorProfileImageUrl: String? - public let authorId: Int + public let authorNickname: String? + public let authorId: Int? public let createdAt: String public let updatedAt: String public let viewCount: Int @@ -30,7 +29,6 @@ public struct BoardResponseDTO: Decodable, Sendable { case id, title, content, category case imageUrls case authorNickname - case authorProfileImageUrl case authorId case createdAt case updatedAt @@ -66,7 +64,6 @@ extension BoardResponseDTO { category: BoardCategory(rawValue: category) ?? .freeTalk, imageUrls: imageUrls, authorNickname: authorNickname, - authorProfileImageUrl: authorProfileImageUrl, authorId: authorId, createdAt: dateFormatter.date(from: createdAt) ?? Date(), updatedAt: dateFormatter.date(from: updatedAt) ?? Date(), diff --git a/Community/Sources/Data/DTO/LikeResponse.swift b/Community/Sources/Data/DTO/LikeResponse.swift new file mode 100644 index 0000000..a6bcc59 --- /dev/null +++ b/Community/Sources/Data/DTO/LikeResponse.swift @@ -0,0 +1,33 @@ +// +// LikeResponse.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation +import CommunityDomain + +// MARK: - Like Response DTO +public struct LikeResponseDTO: Decodable, Sendable { + public let boardId: Int + public let likeCount: Int + public let liked: Bool + + private enum CodingKeys: String, CodingKey { + case boardId + case likeCount + case liked + } +} + +// MARK: - DTO to Domain Mapper +extension LikeResponseDTO { + func toDomain() -> LikeInfo { + return LikeInfo( + boardId: boardId, + likeCount: likeCount, + isLiked: liked + ) + } +} diff --git a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift index 78532b8..49b9a31 100644 --- a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift +++ b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift @@ -37,6 +37,25 @@ public final class CommunityRepositoryImpl: CommunityRepository { .async() } + // MARK: - Board CRUD + public func createBoard( + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board { + return try await apiClient + .createBoard( + title: title, + content: content, + category: category.rawValue, + images: images + ) + .map { $0.toDomain() } + .mapError { $0 as Error } + .async() + } + public func fetchBoardDetail(boardId: Int) async throws -> Board { return try await apiClient .fetchBoardDetail(boardId: boardId) @@ -62,9 +81,16 @@ public final class CommunityRepositoryImpl: CommunityRepository { .mapError { $0 as Error } .async() } - + + public func deleteBoard(boardId: Int) async throws { + return try await apiClient + .deleteBoard(boardId: boardId) + .mapError { $0 as Error } + .async() + } + // MARK: - Comments - public func fetchComments(boardId: Int, lastId: Int, limit: Int, order: CommunityDomain.SortOrder) async throws -> CommentListData { + public func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: CommunityDomain.SortOrder) async throws -> CommentListData { return try await apiClient .fetchComments(boardId: boardId, lastId: lastId, limit: limit, order: order.rawValue) .map { $0.toDomain() } diff --git a/Community/Sources/Domain/Entities/Board.swift b/Community/Sources/Domain/Entities/Board.swift index 9b15eda..e53f3bb 100644 --- a/Community/Sources/Domain/Entities/Board.swift +++ b/Community/Sources/Domain/Entities/Board.swift @@ -10,8 +10,6 @@ import Foundation // MARK: - Board Category public enum BoardCategory: String, Codable, Sendable, CaseIterable { case freeTalk = "FREE_TALK" - case franchise = "FRANCHISE" - case handmade = "HANDMADE" case review = "REVIEW" case recommendation = "RECOMMENDATION" @@ -19,10 +17,6 @@ public enum BoardCategory: String, Codable, Sendable, CaseIterable { switch self { case .freeTalk: return "자유잡담" - case .franchise: - return "프랜차이즈" - case .handmade: - return "수제버거" case .review: return "햄버거리뷰" case .recommendation: @@ -44,9 +38,9 @@ public struct Board: Identifiable, Equatable, Sendable { public let content: String public let category: BoardCategory public let imageUrls: [String] - public let authorNickname: String + public let authorNickname: String? public let authorProfileImageUrl: String? - public let authorId: Int + public let authorId: Int? public let createdAt: String public let updatedAt: String public let viewCount: Int @@ -60,9 +54,9 @@ public struct Board: Identifiable, Equatable, Sendable { content: String, category: BoardCategory, imageUrls: [String], - authorNickname: String, - authorProfileImageUrl: String?, - authorId: Int, + authorNickname: String?, + authorProfileImageUrl: String? = nil, + authorId: Int?, createdAt: Date, updatedAt: Date, viewCount: Int, diff --git a/Community/Sources/Domain/Entities/Comment.swift b/Community/Sources/Domain/Entities/Comment.swift new file mode 100644 index 0000000..cba7d84 --- /dev/null +++ b/Community/Sources/Domain/Entities/Comment.swift @@ -0,0 +1,50 @@ +// +// Comment.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Comment Entity +public struct Comment: Identifiable, Equatable, Sendable { + public let id: Int + public let content: String + public let authorId: Int + public let authorNickname: String + public let authorProfileImageUrl: String? + public let createdAt: Date + public let updatedAt: Date + + public init( + id: Int, + content: String, + authorId: Int, + authorNickname: String, + authorProfileImageUrl: String?, + createdAt: Date, + updatedAt: Date + ) { + self.id = id + self.content = content + self.authorId = authorId + self.authorNickname = authorNickname + self.authorProfileImageUrl = authorProfileImageUrl + self.createdAt = createdAt + self.updatedAt = updatedAt + } +} + +// MARK: - Comment List Data (Pagination) +public struct CommentListData: Sendable { + public let content: [Comment] + public let nextCursorId: Int? + public let hasNextPage: Bool + + public init(content: [Comment], nextCursorId: Int?, hasNextPage: Bool) { + self.content = content + self.nextCursorId = nextCursorId + self.hasNextPage = hasNextPage + } +} diff --git a/Community/Sources/Domain/Entities/Like.swift b/Community/Sources/Domain/Entities/Like.swift new file mode 100644 index 0000000..35cf9e9 --- /dev/null +++ b/Community/Sources/Domain/Entities/Like.swift @@ -0,0 +1,21 @@ +// +// Like.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Like Info +public struct LikeInfo: Equatable, Sendable { + public let boardId: Int + public let likeCount: Int + public let isLiked: Bool + + public init(boardId: Int, likeCount: Int, isLiked: Bool) { + self.boardId = boardId + self.likeCount = likeCount + self.isLiked = isLiked + } +} diff --git a/Community/Sources/Domain/Repositories/CommunityRepository.swift b/Community/Sources/Domain/Repositories/CommunityRepository.swift index 8cf047b..a81bdb3 100644 --- a/Community/Sources/Domain/Repositories/CommunityRepository.swift +++ b/Community/Sources/Domain/Repositories/CommunityRepository.swift @@ -25,7 +25,7 @@ public protocol CommunityRepository: Sendable { ) async throws -> Board // 댓글 - func fetchComments(boardId: Int, lastId: Int, limit: Int, order: SortOrder) async throws -> CommentListData + func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: SortOrder) async throws -> CommentListData func createComment(boardId: Int, content: String) async throws -> Comment func updateComment(boardId: Int, commentId: Int, content: String) async throws -> Comment func deleteComment(boardId: Int, commentId: Int) async throws diff --git a/Community/Sources/Domain/UseCases/CommentUseCase.swift b/Community/Sources/Domain/UseCases/CommentUseCase.swift new file mode 100644 index 0000000..2ab86e2 --- /dev/null +++ b/Community/Sources/Domain/UseCases/CommentUseCase.swift @@ -0,0 +1,42 @@ +// +// CommentUseCase.swift +// Hambug +// +// Created by Claude on 01/10/26. +// + +import Foundation + +// MARK: - Comment UseCase Protocol +public protocol CommentUseCase: Sendable { + func getComments(boardId: Int, lastId: Int?, limit: Int, order: SortOrder) async throws -> CommentListData + func createComment(boardId: Int, content: String) async throws -> Comment + func updateComment(boardId: Int, commentId: Int, content: String) async throws -> Comment + func deleteComment(boardId: Int, commentId: Int) async throws +} + +// MARK: - Comment UseCase Implementation +public final class CommentUseCaseImpl: CommentUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func getComments(boardId: Int, lastId: Int?, limit: Int, order: SortOrder) async throws -> CommentListData { + return try await repository.fetchComments(boardId: boardId, lastId: lastId, limit: limit, order: order) + } + + public func createComment(boardId: Int, content: String) async throws -> Comment { + return try await repository.createComment(boardId: boardId, content: content) + } + + public func updateComment(boardId: Int, commentId: Int, content: String) async throws -> Comment { + return try await repository.updateComment(boardId: boardId, commentId: commentId, content: content) + } + + public func deleteComment(boardId: Int, commentId: Int) async throws { + try await repository.deleteComment(boardId: boardId, commentId: commentId) + } +} diff --git a/Community/Sources/Domain/UseCases/GetBoardDetailUseCase.swift b/Community/Sources/Domain/UseCases/GetBoardDetailUseCase.swift new file mode 100644 index 0000000..26bfc8e --- /dev/null +++ b/Community/Sources/Domain/UseCases/GetBoardDetailUseCase.swift @@ -0,0 +1,56 @@ +// +// GetBoardDetailUseCase.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation +import UIKit + +// MARK: - Get Board Detail UseCase Interface +public protocol BoardDetailUseCase: Sendable { + func getBoard(boardId: Int) async throws -> Board + + func updateBoard( + boardId: Int, + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board + + func deleteBoard(boardId: Int) async throws +} +public final class BoardDetailUseCaseImpl: BoardDetailUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func getBoard(boardId: Int) async throws -> Board { + return try await repository.fetchBoardDetail(boardId: boardId) + } + + public func updateBoard( + boardId: Int, + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board { + return try await repository.updateBoard( + boardId: boardId, + title: title, + content: content, + category: category, + images: images + ) + } + + public func deleteBoard(boardId: Int) async throws { + return try await repository.deleteBoard(boardId: boardId) + } +} diff --git a/Community/Sources/Domain/UseCases/LikeUseCase.swift b/Community/Sources/Domain/UseCases/LikeUseCase.swift new file mode 100644 index 0000000..4140d7c --- /dev/null +++ b/Community/Sources/Domain/UseCases/LikeUseCase.swift @@ -0,0 +1,32 @@ +// +// LikeUseCase.swift +// Hambug +// +// Created by Claude on 01/10/26. +// + +import Foundation + +// MARK: - Like UseCase Protocol +public protocol LikeUseCase: Sendable { + func getLikeInfo(boardId: Int) async throws -> LikeInfo + func toggleLike(boardId: Int) async throws -> LikeInfo +} + +// MARK: - Like UseCase Implementation +public final class LikeUseCaseImpl: LikeUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func getLikeInfo(boardId: Int) async throws -> LikeInfo { + return try await repository.fetchLikeInfo(boardId: boardId) + } + + public func toggleLike(boardId: Int) async throws -> LikeInfo { + return try await repository.toggleLike(boardId: boardId) + } +} diff --git a/Community/Sources/Domain/UseCases/ReportContentUseCaseImpl.swift b/Community/Sources/Domain/UseCases/ReportContentUseCaseImpl.swift new file mode 100644 index 0000000..a37d6c9 --- /dev/null +++ b/Community/Sources/Domain/UseCases/ReportContentUseCaseImpl.swift @@ -0,0 +1,27 @@ +// +// ReportContentUseCase.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Report Content UseCase Interface +public protocol ReportContentUseCase: Sendable { + func execute(request: ReportRequest) async throws +} + +// MARK: - Report Content UseCase Implementation +public final class ReportContentUseCaseImpl: ReportContentUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func execute(request: ReportRequest) async throws { + try await repository.reportContent(request: request) + } +} diff --git a/Community/Sources/Presentation/Community/CommunityView.swift b/Community/Sources/Presentation/Community/CommunityView.swift index 2894f49..ae9ac48 100644 --- a/Community/Sources/Presentation/Community/CommunityView.swift +++ b/Community/Sources/Presentation/Community/CommunityView.swift @@ -12,29 +12,33 @@ import SharedUI public protocol CommunityWriteFactory { func makeWriteViewModel() -> CommunityWriteViewModel +public protocol CommunityDetailFactory { + func makeDetailViewModel() -> CommunityDetailViewModel } public struct CommunityView: View { @State private var viewModel: CommunityViewModel private let factory: CommunityWriteFactory + private let detailFactory: CommunityDetailFactory public init( viewModel: CommunityViewModel, factory: CommunityWriteFactory + detailFactory: CommunityDetailFactory, ) { self._viewModel = State(initialValue: viewModel) self.factory = factory + self.detailFactory = detailFactory } public var body: some View { - NavigationStack { ZStack { VStack(spacing: 0) { Color.primaryHambugRed .frame(height: UIScreen.main.bounds.height * 0.25) Color.bgG75 } - .ignoresSafeArea(.all, edges: .top) + .ignoresSafeArea(.container, edges: .vertical) VStack(spacing: 0) { // 헤더 @@ -60,9 +64,15 @@ public struct CommunityView: View { // 컨텐츠 영역 ZStack { if viewModel.isListView { - CommunityListView(boards: viewModel.filteredBoards) + CommunityListView( + boards: viewModel.filteredBoards, + detailFactory: detailFactory + ) } else { - CommunityFeedView(boards: viewModel.filteredBoards) + CommunityFeedView( + boards: viewModel.filteredBoards, + detailFactory: detailFactory + ) } } } @@ -94,12 +104,12 @@ public struct CommunityView: View { } } } + .safeAreaPadding(.bottom, 100) .refreshable { viewModel.refreshBoards() } .navigationBarHidden(true) .tabBarHidden(false) - } } } @@ -168,30 +178,45 @@ fileprivate struct CommunityFilterChip: View { // MARK: - List View struct CommunityListView: View { let boards: [Board] + let detailFactory: CommunityDetailFactory var body: some View { ScrollView { LazyVStack(spacing: 0) { - ForEach(boards) { board in - NavigationLink(destination: CommunityDetailView()) { + ForEach(Array(boards.enumerated()), id: \.element.id) { index, board in + NavigationLink( + destination: CommunityDetailView( + viewModel: detailFactory.makeDetailViewModel(), + boardId: board.id + )) { CommunityPostListCard(board: board) } .buttonStyle(PlainButtonStyle()) + .onAppear { + // 마지막에서 3개 전부터 미리 로드 시작 + if index >= boards.count - 3 { + Task { + await viewModel.loadMoreBoards() + } + } + } + } + + if viewModel.isLoadingMore { + HStack { + Spacer() + ProgressView() + Spacer() + } + .padding(.vertical, 16) } } + .cornerRadius(8) + .shadow(color: Color.black.opacity(0.05), radius: 2, x: 0, y: 1) } - .background( - RoundedRectangle(cornerRadius: 8) - .fill(Color.white) - .padding(-2) - .shadow( - color: Color.black.opacity(0.1), - radius: 4.5, - x: 0, - y: 0 - ) - ) - .background(Color.white) + .scrollIndicators(.hidden) + .cornerRadius(8) + .shadow(color: Color.black.opacity(0.05), radius: 2, x: 0, y: 1) } } @@ -203,10 +228,33 @@ fileprivate struct CommunityFeedView: View { ScrollView { LazyVStack(spacing: 16) { ForEach(boards) { board in - NavigationLink(destination: CommunityDetailView()) { + ForEach(Array(boards.enumerated()), id: \.element.id) { index, board in + NavigationLink( + destination: CommunityDetailView( + viewModel: detailFactory.makeDetailViewModel(), + boardId: board.id + ) + ) { CommunityPostFeedCard(board: board) } .buttonStyle(PlainButtonStyle()) + .onAppear { + // 마지막에서 3개 전부터 미리 로드 시작 + if index >= boards.count - 3 { + Task { + await viewModel.loadMoreBoards() + } + } + } + } + + if viewModel.isLoadingMore { + HStack { + Spacer() + ProgressView() + Spacer() + } + .padding(.vertical, 16) } } .padding(.top, 8) @@ -270,8 +318,7 @@ fileprivate struct CommunityPostListCard: View { ) } - .padding(.horizontal, 16) - .padding(.vertical, 16) + .padding(16) .background(Color.white) } } diff --git a/Community/Sources/Presentation/Community/CommunityViewModel.swift b/Community/Sources/Presentation/Community/CommunityViewModel.swift index 193fe19..50bdba1 100644 --- a/Community/Sources/Presentation/Community/CommunityViewModel.swift +++ b/Community/Sources/Presentation/Community/CommunityViewModel.swift @@ -128,9 +128,6 @@ public final class CommunityViewModel { } catch { errorMessage = error.localizedDescription print("❌ API Error: \(error)") - - // API 실패 시 샘플 데이터 사용 - boards = Board.sampleData } isLoading = false diff --git a/Community/Sources/Presentation/Detail/CommunityDetail.swift b/Community/Sources/Presentation/Detail/CommunityDetail.swift index 216c511..589a12e 100644 --- a/Community/Sources/Presentation/Detail/CommunityDetail.swift +++ b/Community/Sources/Presentation/Detail/CommunityDetail.swift @@ -9,7 +9,455 @@ import SwiftUI import DesignSystem import CommunityDomain import SharedUI + +public protocol UpdateBoardFactory { + func makeViewModel() -> CommunityWriteViewModelProtocol +} + public struct CommunityDetailView: View { + @Environment(\.dismiss) private var dismiss + @State private var viewModel: CommunityDetailViewModel + @State private var commentText: String = "" + @State private var showDeletePopup: Bool = false + + // Comment action states + @State private var selectedComment: Comment? + @State private var showCommentActionSheet: Bool = false + @State private var showDeleteCommentAlert: Bool = false + @State private var editingCommentId: Int? + @State private var editingCommentText: String = "" + + // Board action states + @State private var showBoardActionSheet: Bool = false + + // Report states + @State private var reportTargetId: Int? + @State private var reportTargetType: ReportTargetType? + @State private var reportReason: String = "" + + private let boardId: Int + private let updateFactory: UpdateBoardFactory + + public init( + viewModel: CommunityDetailViewModel, + boardId: Int, + updateFactory: UpdateBoardFactory + ) { + _viewModel = State(initialValue: viewModel) + self.boardId = boardId + self.updateFactory = updateFactory + } + + public var body: some View { + NavigationView { + VStack(spacing: 0) { + navigationBar + + ScrollView { + VStack(alignment: .leading, spacing: 0) { + postHeader + postContent + + if !(viewModel.board?.imageUrls.isEmpty ?? true) { + imageSection + } + + likeCommentSection + Divider() + .background(Color.borderG300) + .padding(.vertical, 16) + commentSection + } + .padding(.horizontal, 16) + } + + commentInputSection + } + .background(Color.bgWhite) + .overlay( + HambugCommonAlertView( + isPresented: $showDeletePopup, + content: { + Text("게시물을 삭제하시겠어요?") + .pretendard(.title(.t2)) + .foregroundStyle(Color.textG900) + .padding(.top, 16) + }, + secondaryButton: AlertButton(title: "취소") { + print("취소") + + }, + primaryButton: AlertButton(title: "삭제") { + print("삭제") + Task { + await viewModel.deleteBoard(boardId: boardId) + dismiss() + } + } + ) + .opacity(showDeletePopup ? 1 : 0) + ) + .tabBarHidden(true) + .onAppear { + Task { + await viewModel.loadBoardDetail(boardId: boardId) + await viewModel.loadComments(boardId: boardId) + await viewModel.loadLikeInfo(boardId: boardId) + } + } + } + .navigationBarHidden(true) + .confirmationDialog("댓글", isPresented: $showCommentActionSheet, presenting: selectedComment) { comment in + // Only show edit/delete buttons if the current user is the author + if let currentUserId = viewModel.currentUserId, + Int64(comment.authorId) == currentUserId { + Button("수정") { + editingCommentId = comment.id + editingCommentText = comment.content + } + Button("삭제", role: .destructive) { + selectedComment = comment + showDeleteCommentAlert = true + } + } + + // Only show report button if the current user is NOT the author + if let currentUserId = viewModel.currentUserId, + Int64(comment.authorId) != currentUserId { + NavigationLink( + // TODO: CommunityReportView 추가 + destination: Text("신고") + ) { + Text("신고") + } + } + + Button("취소", role: .cancel) {} + } + .confirmationDialog("게시물", isPresented: $showBoardActionSheet) { + // Only show delete button if the current user is the author + if let currentUserId = viewModel.currentUserId, + let authorId = viewModel.board?.authorId, + Int64(authorId) == currentUserId { + NavigationLink( + destination: CommunityWriteView( + viewModel: updateFactory.makeViewModel(), + title: viewModel.board?.title ?? "", + content: viewModel.board?.content ?? "" + ) + ) { + Button("수정") { + } + } + + Button("삭제", role: .destructive) { + showDeletePopup = true + } + } + + // Only show report button if the current user is NOT the author + if let currentUserId = viewModel.currentUserId, + let authorId = viewModel.board?.authorId, + Int64(authorId) != currentUserId { + Button("신고") { + reportTargetId = boardId + reportTargetType = .board + } + } + + Button("취소", role: .cancel) {} + } + .alert("댓글 삭제", isPresented: $showDeleteCommentAlert, presenting: selectedComment) { comment in + Button("취소", role: .cancel) {} + Button("삭제", role: .destructive) { + Task { + await viewModel.deleteComment(boardId: boardId, commentId: comment.id) + } + } + } message: { _ in + Text("댓글을 삭제하시겠어요?") + } + } + + private var navigationBar: some View { + HStack { + Button { + dismiss() + } label: { + Image(systemName: "chevron.left") + .font(.system(size: 18, weight: .medium)) + .foregroundColor(.iconG800) + } + + ProfileImageView(with: viewModel.board?.authorProfileImageUrl ?? "") + .applyCilpShape() + + Text(viewModel.board?.authorNickname ?? "") + .pretendard(.title(.t2)) + .foregroundColor(.textG900) + + Spacer() + + EllipsisButton { + showBoardActionSheet = true + } + } + .padding(.horizontal, 16) + .padding(.vertical, 12) + .background(Color.bgWhite) + } + + private var postHeader: some View { + VStack(alignment: .leading, spacing: 8) { + Text(viewModel.board?.title ?? "") + .pretendard(.title(.t1)) + .foregroundColor(.textG900) + .multilineTextAlignment(.leading) + + Text(viewModel.board?.createdAt ?? "") + .pretendard(.caption(.base)) + .foregroundColor(.textG600) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, 20) + } + + private var postContent: some View { + Text(viewModel.board?.content ?? "") + .pretendard(.body(.base)) + .foregroundColor(.textG800) + .lineLimit(nil) + .multilineTextAlignment(.leading) + .allowsTightening(true) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.top, 16) + } + + private var imageSection: some View { + ScrollView(.horizontal) { + HStack(spacing: 12) { + ForEach(viewModel.board?.imageUrls ?? [], id: \.self) { imageUrl in + AsyncImage(url: URL(string: imageUrl)) { phase in + switch phase { + case .empty: + Rectangle() + .fill(Color.bgG200) + .frame(width: 270, height: 270) + .overlay { + ProgressView() + } + case .success(let image): + image + .resizable() + .aspectRatio(contentMode: .fill) + .frame(width: 270, height: 270) + .clipped() + case .failure: + Rectangle() + .fill(Color.bgG200) + .frame(width: 270, height: 270) + @unknown default: + Rectangle() + .fill(Color.bgG200) + .frame(width: 270, height: 270) + } + } + .cornerRadius(8) + } + } + } + .scrollIndicators(.hidden) + .padding(.top, 20) + + } + + private var likeCommentSection: some View { + HStack(spacing: 16) { + Button { + Task { + await viewModel.toggleLike(boardId: boardId) + } + } label: { + HStack(spacing: 4) { + Image(systemName: (viewModel.likeInfo?.isLiked ?? false) ? "heart.fill" : "heart") + .font(.system(size: 20)) + .foregroundColor(.primaryHambugRed) + + Text("\(viewModel.likeInfo?.likeCount ?? 0)") + .pretendard(.caption(.base)) + .foregroundColor(.textG600) + } + } + + HStack(spacing: 4) { + Image(.communityComment) + .resizable() + .frame(width: 20, height: 20) + + Text("\(viewModel.board?.commentCount ?? 0)") + .pretendard(.caption(.base)) + .foregroundColor(.textG600) + } + + Spacer() + } + .padding(.top, 20) + } + + private var commentSection: some View { + VStack(alignment: .leading, spacing: 16) { + // 코멘트 헤더 + Text("댓글 \(viewModel.comments.count)") + .pretendard(.body(.bEmphasis)) + .foregroundColor(.textG900) + + if viewModel.comments.isEmpty { + // 댓글이 없을 때 + VStack(spacing: 8) { + Spacer() + .frame(height: 40) + Text("첫 댓글을 남겨보세요") + .pretendard(.body(.base)) + .foregroundColor(.textG600) + Spacer() + .frame(height: 40) + } + .frame(maxWidth: .infinity) + } else { + // 댓글이 있을 때 + ForEach(Array(viewModel.comments.enumerated()), id: \.element.id) { index, comment in + commentRow(comment: comment) + .onAppear { + if index == viewModel.comments.count - 1 { + Task { + await viewModel.loadMoreComments(boardId: boardId) + } + } + } + } + } + + if viewModel.isLoadingMoreComments { + HStack { + Spacer() + ProgressView() + Spacer() + } + .padding(.vertical, 8) + } + } + } + + private func commentRow(comment: Comment) -> some View { + HStack(alignment: .top, spacing: 12) { + ProfileImageView(with: comment.authorProfileImageUrl ?? "") + .applyCilpShape() + + VStack(alignment: .leading, spacing: 4) { + HStack { + Text(comment.authorNickname) + .pretendard(.body(.sEmphasis)) + .foregroundColor(.textG900) + + Spacer() + + EllipsisButton { + selectedComment = comment + showCommentActionSheet = true + } + } + + Text(timeAgoDisplay(comment.createdAt)) + .pretendard(.caption(.base)) + .foregroundColor(.textG600) + + if editingCommentId == comment.id { + HStack { + TextField("댓글 수정", text: $editingCommentText) + .pretendard(.body(.base)) + .padding(.horizontal, 12) + .padding(.vertical, 8) + .background( + RoundedRectangle(cornerRadius: 8) + .fill(Color.bgG100) + ) + + Button("완료") { + Task { + await viewModel.updateComment(boardId: boardId, commentId: comment.id, content: editingCommentText) + editingCommentId = nil + editingCommentText = "" + } + } + .pretendard(.body(.sEmphasis)) + .foregroundColor(.primaryHambugRed) + + Button("취소") { + editingCommentId = nil + editingCommentText = "" + } + .pretendard(.body(.base)) + .foregroundColor(.textG600) + } + .padding(.top, 4) + } else if !comment.content.isEmpty { + Text(comment.content) + .pretendard(.body(.base)) + .foregroundColor(.textG800) + .multilineTextAlignment(.leading) + .padding(.top, 4) + } + } + } + } + + private var commentInputSection: some View { + HStack(spacing: 12) { + TextField("댓글을 입력하세요", text: $commentText) + .pretendard(.body(.base)) + .padding(.horizontal, 16) + .padding(.vertical, 12) + .background( + RoundedRectangle(cornerRadius: 20) + .fill(Color.bgG100) + ) + + Button { + if !commentText.isEmpty { + Task { + await viewModel.createComment(boardId: boardId, content: commentText) + commentText = "" + } + } + } label: { + Image(systemName: "paperplane.fill") + .font(.system(size: 16)) + .foregroundColor(.primaryHambugRed) + } + } + .padding(.horizontal, 16) + .padding(.vertical, 12) + .background(Color.bgWhite) + .overlay( + Rectangle() + .frame(height: 1) + .foregroundColor(.borderG300), + alignment: .top + ) + } + +// Button { +// Task { +// if let targetId = reportTargetId, let targetType = reportTargetType { +// await viewModel.reportContent(targetId: targetId, targetType: targetType, reason: reportReason) +// reportReason = "" +// reportTargetId = nil +// reportTargetType = nil +// } +// } + + + private func timeAgoDisplay(_ date: Date) -> String { let now = Date() let timeInterval = now.timeIntervalSince(date) @@ -55,3 +503,8 @@ struct EllipsisButton: View { self.action = action } } + +// Preview requires mock ViewModel with all dependencies +// #Preview { +// CommunityDetailView(viewModel: mockViewModel, boardId: 1) +// } diff --git a/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift b/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift new file mode 100644 index 0000000..9fb9819 --- /dev/null +++ b/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift @@ -0,0 +1,245 @@ +// +// CommunityDetailViewModel.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation +import SwiftUI +import CommunityDomain +import Managers + +// MARK: - Community Detail ViewModel +@MainActor +@Observable +public final class CommunityDetailViewModel { + + // MARK: - Published Properties + public var board: Board? + public var comments: [Comment] = [] + public var likeInfo: LikeInfo? + public var isLoadingBoard: Bool = false + public var isLoadingComments: Bool = false + public var isLoadingMoreComments: Bool = false + public var errorMessage: String? = nil + + // MARK: - Dependencies + private let boardDetailUseCase: BoardDetailUseCase + private let commentUseCase: CommentUseCase + private let likeUseCase: LikeUseCase + private let reportContentUseCase: ReportContentUseCase + private let userDefaultsManager: UserDefaultsManager + + // MARK: - Private Properties + private var currentCommentPage: Int? = nil + private var hasNextCommentPage: Bool = true + private let commentPageSize: Int = 10 + + // MARK: - Computed Properties + public var currentUserId: Int64? { + userDefaultsManager.currentUserId + } + + // MARK: - Initialization + public init( + boardDetailUseCase: BoardDetailUseCase, + commentUseCase: CommentUseCase, + likeUseCase: LikeUseCase, + reportContentUseCase: ReportContentUseCase, + userDefaultsManager: UserDefaultsManager + ) { + self.boardDetailUseCase = boardDetailUseCase + self.commentUseCase = commentUseCase + self.likeUseCase = likeUseCase + self.reportContentUseCase = reportContentUseCase + self.userDefaultsManager = userDefaultsManager + } + + // MARK: - Board Detail Methods + public func loadBoardDetail(boardId: Int) async { + guard !isLoadingBoard else { return } + isLoadingBoard = true + errorMessage = nil + + do { + + board = try await boardDetailUseCase.getBoard(boardId: boardId) + print("✅ Board detail loaded: \(board?.title ?? "")") + } catch { + errorMessage = error.localizedDescription + print("❌ Board detail error: \(error)") + } + + isLoadingBoard = false + } + + public func deleteBoard(boardId: Int) async { + errorMessage = nil + + do { + try await boardDetailUseCase.deleteBoard(boardId: boardId) + } catch { + errorMessage = error.localizedDescription + print("❌ Board detail error: \(error)") + } + } + + // MARK: - Comment Methods + public func loadComments(boardId: Int) async { + guard !isLoadingComments else { return } + isLoadingComments = true + errorMessage = nil + currentCommentPage = nil + hasNextCommentPage = true + + do { + let commentListData = try await commentUseCase.getComments( + boardId: boardId, + lastId: currentCommentPage, + limit: commentPageSize, + order: .desc + ) + + comments = commentListData.content + hasNextCommentPage = commentListData.hasNextPage + if let nextCursor = commentListData.nextCursorId { + currentCommentPage = nextCursor + } + + print("✅ Comments loaded: \(commentListData.content.count) comments") + } catch { + errorMessage = error.localizedDescription + print("❌ Comments error: \(error)") + } + + isLoadingComments = false + } + + public func loadMoreComments(boardId: Int) async { + guard !isLoadingMoreComments && hasNextCommentPage else { return } + isLoadingMoreComments = true + + do { + let commentListData = try await commentUseCase.getComments( + boardId: boardId, + lastId: currentCommentPage, + limit: commentPageSize, + order: .desc + ) + + comments.append(contentsOf: commentListData.content) + hasNextCommentPage = commentListData.hasNextPage + if let nextCursor = commentListData.nextCursorId { + currentCommentPage = nextCursor + } + + print("✅ Load more comments success: \(commentListData.content.count) comments added") + } catch { + print("❌ Load more comments error: \(error)") + } + + isLoadingMoreComments = false + } + + public func createComment(boardId: Int, content: String) async { + guard !content.isEmpty else { return } + + do { + let newComment = try await commentUseCase.createComment(boardId: boardId, content: content) + comments.insert(newComment, at: 0) + + // Update board comment count + if let currentBoard = board { + var newBoard = currentBoard + newBoard.commentCount += 1 + board = newBoard + } + + print("✅ Comment created: \(newComment.content)") + } catch { + errorMessage = error.localizedDescription + print("❌ Create comment error: \(error)") + } + } + + public func updateComment(boardId: Int, commentId: Int, content: String) async { + guard !content.isEmpty else { return } + + do { + let updatedComment = try await commentUseCase.updateComment( + boardId: boardId, + commentId: commentId, + content: content + ) + + if let index = comments.firstIndex(where: { $0.id == commentId }) { + comments[index] = updatedComment + } + + print("✅ Comment updated: \(updatedComment.content)") + } catch { + errorMessage = error.localizedDescription + print("❌ Update comment error: \(error)") + } + } + + public func deleteComment(boardId: Int, commentId: Int) async { + do { + try await commentUseCase.deleteComment(boardId: boardId, commentId: commentId) + comments.removeAll { $0.id == commentId } + + // Update board comment count + if let currentBoard = board { + var newBoard = currentBoard + newBoard.commentCount = max(0, newBoard.commentCount - 1) + board = newBoard + } + + print("✅ Comment deleted") + } catch { + errorMessage = error.localizedDescription + print("❌ Delete comment error: \(error)") + } + } + + // MARK: - Like Methods + public func loadLikeInfo(boardId: Int) async { + do { + likeInfo = try await likeUseCase.getLikeInfo(boardId: boardId) + print("✅ Like info loaded: \(likeInfo?.likeCount ?? 0) likes") + } catch { + print("❌ Like info error: \(error)") + } + } + + public func toggleLike(boardId: Int) async { + do { + let updatedLikeInfo = try await likeUseCase.toggleLike(boardId: boardId) + likeInfo = updatedLikeInfo + + // Update board like info + if let currentBoard = board { + board = currentBoard + } + + print("✅ Like toggled: \(updatedLikeInfo.isLiked ? "liked" : "unliked")") + } catch { + errorMessage = error.localizedDescription + print("❌ Toggle like error: \(error)") + } + } + + // MARK: - Report Methods + public func reportContent(targetId: Int, targetType: ReportTargetType, reason: String) async { + let request = ReportRequest(targetId: targetId, targetType: targetType, reason: reason) + + do { + try await reportContentUseCase.execute(request: request) + print("✅ Content reported") + } catch { + errorMessage = error.localizedDescription + print("❌ Report error: \(error)") + } + } +} diff --git a/Community/Sources/Presentation/Views/CommunityDetail.swift b/Community/Sources/Presentation/Views/CommunityDetail.swift deleted file mode 100644 index 212c157..0000000 --- a/Community/Sources/Presentation/Views/CommunityDetail.swift +++ /dev/null @@ -1,303 +0,0 @@ -// -// CommunityDetailView.swift -// Hambug -// -// Created by 강동영 on 10/18/25. -// - -import SwiftUI -import DesignSystem -import CommunityDomain - -public struct CommunityDetailView: View { - @Environment(\.dismiss) private var dismiss - @State private var commentText: String = "" - @State private var isLiked: Bool = false - @State private var likeCount: Int = 1 - @State private var commentCount: Int = 6 - @State private var showDeletePopup: Bool = false - - public init() {} - - let post = PostData( - title: "제목이 들어가는 공간입니다.", - content: """ - 햄버거, 간단히 버거는 속 재료를 잘라낸 빵이나 롤빵 안에 넣어 만든다. 패티에는 종종 치즈, 양상추, 토마토, 양파, 피클, 베이컨, 고추 등이 함께 제공되며, 케첩, 머스터드, 마요네즈, 렐리시 또는 "특별 소스"와 같은 양념이 곁들여지고, - 종종 참깨빵에 담겨 나온다 - """, - timestamp: "15분 전", - author: "익명이여기", - images: ["sample_image_1", "sample_image_2"] - ) - - let comments = [ - CommentData(author: "상하이버거", content: "댓글 내용이 들어가는 곳입니다. 햄버거 참말로 맛있겠네요.", timestamp: "15분 전"), - CommentData(author: "상하이버거", content: "댓글 내용이 들어가는 곳입니다. 햄버거 참말로 맛있겠네요.", timestamp: "15분 전"), - ] - - public var body: some View { - NavigationView { - VStack(spacing: 0) { - navigationBar - - ScrollView { - VStack(alignment: .leading, spacing: 0) { - postHeader - postContent - imageSection - likeCommentSection - Divider() - .background(Color.borderG300) - .padding(.vertical, 16) - commentSection - } - .padding(.horizontal, 16) - } - - commentInputSection - } - .background(Color.bgWhite) - .overlay( - HambugCommonAlertView( - isPresented: $showDeletePopup, - content: { - Text("게시물을 삭제하시겠어요?") - .pretendard(.title(.t2)) - .foregroundStyle(Color.textG900) - .padding(.top, 16) - }, - secondaryButton: AlertButton(title: "취소") { - print("취소") - - }, - primaryButton: AlertButton(title: "삭제") { - print("삭제") - - } - ) - .opacity(showDeletePopup ? 1 : 0) - ) - } - .navigationBarHidden(true) - } - - private var navigationBar: some View { - HStack { - Button { - dismiss() - } label: { - Image(systemName: "chevron.left") - .font(.system(size: 18, weight: .medium)) - .foregroundColor(.iconG800) - } - - - Circle() - .fill(Color.bgG200) - .frame(width: 32, height: 32) - - Text("익명이") - .pretendard(.title(.t2)) - .foregroundColor(.textG900) - - Spacer() - - EllipsisButton { - showDeletePopup = true - } - } - .padding(.horizontal, 16) - .padding(.vertical, 12) - .background(Color.bgWhite) - } - - private var postHeader: some View { - VStack(alignment: .leading, spacing: 8) { - Text(post.title) - .pretendard(.title(.t1)) - .foregroundColor(.textG900) - .multilineTextAlignment(.leading) - - Text(post.timestamp) - .pretendard(.caption(.base)) - .foregroundColor(.textG600) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.top, 20) - } - - private var postContent: some View { - Text(post.content) - .pretendard(.body(.base)) - .foregroundColor(.textG800) - .lineLimit(nil) - .multilineTextAlignment(.leading) - .allowsTightening(true) - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.top, 16) - } - - private var imageSection: some View { - ScrollView(.horizontal) { - HStack(spacing: 12) { - ForEach(0..<3, id: \.self) { index in - Rectangle() - .fill(Color.bgG200) - .frame(width: 270, height: 270) - .cornerRadius(8) - } - } - } - .scrollIndicators(.hidden) - .padding(.top, 20) - - } - - private var likeCommentSection: some View { - HStack(spacing: 16) { - Button { - isLiked.toggle() - likeCount += isLiked ? 1 : -1 - } label: { - HStack(spacing: 4) { - Image(systemName: isLiked ? "heart.fill" : "heart") - .font(.system(size: 20)) - .foregroundColor(.primaryHambugRed) - - Text("\(likeCount)") - .pretendard(.caption(.base)) - .foregroundColor(.textG600) - } - } - - HStack(spacing: 4) { - Image(.communityComment) - .resizable() - .frame(width: 20, height: 20) - - Text("\(commentCount)") - .pretendard(.caption(.base)) - .foregroundColor(.textG600) - } - - Spacer() - } - .padding(.top, 20) - } - - private var commentSection: some View { - VStack(alignment: .leading, spacing: 16) { - ForEach(comments.indices, id: \.self) { index in - commentRow(comment: comments[index]) - } - } - } - - private func commentRow(comment: CommentData) -> some View { - HStack(alignment: .top, spacing: 12) { - Circle() - .fill(Color.bgG200) - .frame(width: 32, height: 32) - - VStack(alignment: .leading, spacing: 4) { - HStack { - Text(comment.author) - .pretendard(.body(.sEmphasis)) - .foregroundColor(.textG900) - - Spacer() - - EllipsisButton { - - } - } - - Text(comment.timestamp) - .pretendard(.caption(.base)) - .foregroundColor(.textG600) - - if !comment.content.isEmpty { - Text(comment.content) - .pretendard(.body(.base)) - .foregroundColor(.textG800) - .multilineTextAlignment(.leading) - .padding(.top, 4) - } - } - } - } - - private var commentInputSection: some View { - HStack(spacing: 12) { - TextField("댓글을 입력하세요", text: $commentText) - .pretendard(.body(.base)) - .padding(.horizontal, 16) - .padding(.vertical, 12) - .background( - RoundedRectangle(cornerRadius: 20) - .fill(Color.bgG100) - ) - - Button { - // Handle send comment - if !commentText.isEmpty { - commentText = "" - } - } label: { - Image(systemName: "paperplane.fill") - .font(.system(size: 16)) - .foregroundColor(.primaryHambugRed) - } - } - .padding(.horizontal, 16) - .padding(.vertical, 12) - .background(Color.bgWhite) - .overlay( - Rectangle() - .frame(height: 1) - .foregroundColor(.borderG300), - alignment: .top - ) - } -} - -struct EllipsisButton: View { - private let action: () -> Void - var body: some View { - Button { - action() - } label: { - Color.bgEllipsis - .frame(width: 24, height: 24) - .clipShape(Circle()) - .overlay { - Image(systemName: "ellipsis") - .rotationEffect(.degrees(90.0)) - .font(.system(size: 14)) - .foregroundColor(.iconG600) - } - } - } - - init(action: @escaping @MainActor () -> Void) { - self.action = action - } -} - -struct PostData { - let title: String - let content: String - let timestamp: String - let author: String - let images: [String] -} - -struct CommentData { - let author: String - let content: String - let timestamp: String -} - -#Preview { - CommunityDetailView() -} diff --git a/Hambug/ContentView.swift b/Hambug/ContentView.swift index 22b7358..e9bef31 100644 --- a/Hambug/ContentView.swift +++ b/Hambug/ContentView.swift @@ -34,14 +34,23 @@ struct ContentView: View { var body: some View { CustomTabView(selectedTab: $selectedTab) { - HomeView(viewModel: homeDIContainer.homeViewModel) - .tag(0) - - CommunityView(viewModel: communityDIContainer.makeCommunityViewModel()) + Group { + HomeView(viewModel: homeDIContainer.homeViewModel) + .tag(0) + + NavigationStack { + CommunityView( + viewModel: communityDIContainer.makeCommunityViewModel(), + detailFactory: communityDIContainer + ) + } .tag(1) - - MyPageView(viewModel: mypageDIContainer.makeMyPageViewModel()) - .tag(2) + + + Text("MyPage") + .tag(2) + } + .toolbar(.hidden, for: .tabBar) } } } diff --git a/Home/Sources/Presentation/HomeView.swift b/Home/Sources/Presentation/HomeView.swift index 01641a7..df2fbad 100644 --- a/Home/Sources/Presentation/HomeView.swift +++ b/Home/Sources/Presentation/HomeView.swift @@ -37,11 +37,11 @@ public struct HomeView: View { .padding(.horizontal, 18) } - .safeAreaPadding(.bottom, 60) + .safeAreaPadding(.bottom, 100) } .padding(.top, 50) } - .ignoresSafeArea() + .ignoresSafeArea(.container, edges: .top) .tabBarHidden(false) } } diff --git a/Login/Sources/Data/LoginRepositoryImpl.swift b/Login/Sources/Data/LoginRepositoryImpl.swift index ef60f15..5a60fde 100644 --- a/Login/Sources/Data/LoginRepositoryImpl.swift +++ b/Login/Sources/Data/LoginRepositoryImpl.swift @@ -10,14 +10,21 @@ import DataSources import LoginDomain import NetworkInterface import Util +import Managers public final class LoginRepositoryImpl: LoginRepository { private let networkService: NetworkServiceInterface private let tokenStorage: TokenStorage + private let userDefaultsManager: UserDefaultsManager - public init(networkService: NetworkServiceInterface, tokenStorage: TokenStorage) { + public init( + networkService: NetworkServiceInterface, + tokenStorage: TokenStorage, + userDefaultsManager: UserDefaultsManager + ) { self.networkService = networkService self.tokenStorage = tokenStorage + self.userDefaultsManager = userDefaultsManager } public func login(request: SocialLoginRequest) async throws { @@ -42,7 +49,12 @@ public final class LoginRepositoryImpl: LoginRepository { accessToken: apiResponse.data.token.accessToken, refreshToken: apiResponse.data.token.refreshToken ) + + // Save user ID to UserDefaults + userDefaultsManager.currentUserId = apiResponse.data.user.userId + print("✅ Tokens saved to Keychain") + print("✅ User ID saved: \(apiResponse.data.user.userId)") print("✅ accessToken: \(apiResponse.data.token.accessToken,)") print("✅ refreshToken \(apiResponse.data.token.refreshToken)") } From 5deff77f9a0427b6eddf52753f254de26d1daf1f Mon Sep 17 00:00:00 2001 From: kangddong Date: Mon, 12 Jan 2026 01:29:40 +0900 Subject: [PATCH 12/12] =?UTF-8?q?feat:=20Board=20Edit,=20Report=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ABOUT_MODULE.MD | 687 ++++++++++++++++ CLAUDME.MD | 741 ++++++++++++++++++ .../Sources/DI/CommunityDIContainer.swift | 45 +- Community/Sources/Data/API/CommunityAPI.swift | 8 +- .../Sources/Data/API/CommunityAPIClient.swift | 54 ++ .../Sources/Data/DTO/ReportRequest.swift | 37 + .../CommunityRepositoryImpl.swift | 12 +- .../Sources/Domain/Entities/Report.swift | 27 + .../Repositories/CommunityRepository.swift | 12 + .../UseCases/UpdateBoardUseCaseImpl.swift | 46 ++ .../Community/CommunityView.swift | 74 +- .../Presentation/Detail/CommunityDetail.swift | 50 +- .../Detail/CommunityDetailViewModel.swift | 13 - .../CommunityReportView.swift | 75 +- .../Report/CommunityReportViewModel.swift | 58 ++ .../Write/CommunityWriteView.swift | 53 +- .../Write/CommunityWriteViewModel.swift | 211 ++++- DI/Sources/LoginDI/LoginDIContainer.swift | 3 +- Hambug/ContentView.swift | 21 +- Home/Sources/Presentation/HomeView.swift | 1 - .../NetworkServiceInterface.swift | 9 +- 21 files changed, 2082 insertions(+), 155 deletions(-) create mode 100644 ABOUT_MODULE.MD create mode 100644 CLAUDME.MD create mode 100644 Community/Sources/Data/DTO/ReportRequest.swift create mode 100644 Community/Sources/Domain/Entities/Report.swift create mode 100644 Community/Sources/Domain/UseCases/UpdateBoardUseCaseImpl.swift rename Community/Sources/Presentation/{Views/Write => Report}/CommunityReportView.swift (57%) create mode 100644 Community/Sources/Presentation/Report/CommunityReportViewModel.swift diff --git a/ABOUT_MODULE.MD b/ABOUT_MODULE.MD new file mode 100644 index 0000000..12cc30e --- /dev/null +++ b/ABOUT_MODULE.MD @@ -0,0 +1,687 @@ +# Hambug iOS - 모듈 구조 + +> SPM 기반 모듈러 아키텍처 상세 가이드 + +## 목차 +- [전체 모듈 구조](#전체-모듈-구조) +- [Common 모듈](#common-모듈) +- [Infrastructure 모듈](#infrastructure-모듈) +- [기능 모듈](#기능-모듈) +- [DI 모듈](#di-모듈) +- [모듈 의존성 규칙](#모듈-의존성-규칙) +- [새 모듈 생성 가이드](#새-모듈-생성-가이드) + +--- + +## 전체 모듈 구조 + +``` +Hambug-iOS/ +├── Hambug/ # 메인 앱 (호스트) +│ ├── HambugApp.swift # 앱 진입점 +│ ├── RootView.swift # 상태 기반 루트 네비게이션 +│ └── ContentView.swift # 메인 탭 뷰 +│ +├── Common/ # 공통 모듈 (모든 모듈이 의존 가능) +│ ├── Managers # 앱 상태, 유틸리티 매니저 +│ ├── DesignSystem # 색상, 폰트, 타이포그래피 +│ ├── DataSources # Keychain, UserDefaults +│ ├── LocalizedString # 로컬라이제이션 +│ ├── Util # 공통 유틸리티, Extension +│ └── SharedUI # 공유 UI 컴포넌트 +│ +├── Infrastructure/ # 인프라 레이어 +│ ├── NetworkInterface/ # 네트워크 프로토콜 정의 +│ └── NetworkImpl/ # Alamofire 기반 구현체 +│ +├── Home/ # 홈 기능 모듈 +├── Community/ # 커뮤니티 기능 모듈 +├── MyPage/ # 마이페이지 기능 모듈 +├── Login/ # 로그인 기능 모듈 +├── Intro/ # 온보딩/스플래시 +│ +├── 3rdParty/ # 서드파티 SDK 래퍼 +│ └── KakaoLogin # Kakao SDK 래퍼 +│ +└── DI/ # 의존성 주입 컨테이너 + ├── DIKit # Generic DI Container + ├── AppDI # 앱 레벨 DI + ├── IntroDI + ├── LoginDI + ├── HomeDI + ├── CommunityDI + └── MyPageDI +``` + +### 의존성 그래프 + +``` + Hambug (Main App) + │ + ┌─────────────────┼─────────────────┐ + ▼ ▼ ▼ + Home Community MyPage + │ │ │ + └─────────────────┼─────────────────┘ + ▼ + DI (DIKit + AppDI) + │ + ┌─────────────────┼─────────────────┐ + ▼ ▼ ▼ + Infrastructure Common 3rdParty + (NetworkInterface) (모든 공통) (KakaoLogin) + │ + ▼ + NetworkImpl + (Alamofire) +``` + +--- + +## Common 모듈 + +**위치**: `/Common/` + +**역할**: 모든 모듈에서 공통으로 사용하는 유틸리티, UI 컴포넌트, 디자인 시스템 + +### Package.swift + +```swift +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "Common", + platforms: [.iOS(.v17)], + products: [ + .library(name: "Managers", targets: ["Managers"]), + .library(name: "DesignSystem", targets: ["DesignSystem"]), + .library(name: "DataSources", targets: ["DataSources"]), + .library(name: "LocalizedString", targets: ["LocalizedString"]), + .library(name: "Util", targets: ["Util"]), + .library(name: "SharedUI", targets: ["SharedUI"]), + ], + dependencies: [ + // KeychainAccess for secure storage + ], + targets: [ + .target(name: "Managers", dependencies: []), + .target(name: "DesignSystem", resources: [.process("Resources")]), + .target(name: "DataSources", dependencies: ["KeychainAccess"]), + .target(name: "LocalizedString", dependencies: []), + .target(name: "Util", dependencies: []), + .target(name: "SharedUI", dependencies: ["DesignSystem"]), + ] +) +``` + +### 주요 컴포넌트 + +#### Managers +- `AppStateManager`: 앱 상태 관리 (splash → onboarding → login → main) +- `UserDefaultsManager`: UserDefaults 래퍼 +- `FontManager`: 커스텀 폰트 관리 + +#### DesignSystem +- `Color.xcassets`: 브랜드 컬러 +- `Font/`: 커스텀 폰트 파일 +- `Typography.swift`: 타이포그래피 정의 +- `View+Keyboard.swift`: 키보드 관련 extension + +#### DataSources +- `KeychainTokenStorage`: 토큰 저장 (Keychain) +- `TokenStorage` protocol + +#### SharedUI +- `CustomTabView/`: 커스텀 탭 바 컴포넌트 +- `HambugTab`: 탭 정의 +- `TabBarVisibilityKey`: 탭 바 숨김/표시 environment key + +#### Util +- `Combine+Ext.swift`: Publisher → async/await 브릿지 +- 기타 공통 extension + +**의존성**: 없음 (최하위 레이어) + +--- + +## Infrastructure 모듈 + +**위치**: `/Infrastructure/` + +**역할**: 네트워크 레이어 추상화 + +### Package.swift + +```swift +let package = Package( + name: "Infrastructure", + platforms: [.iOS(.v17)], + products: [ + .library(name: "NetworkInterface", targets: ["NetworkInterface"]), + .library(name: "NetworkImpl", targets: ["NetworkImpl"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0"), + ], + targets: [ + .target(name: "NetworkInterface", dependencies: ["Common"]), + .target(name: "NetworkImpl", dependencies: ["NetworkInterface", "Alamofire"]), + ] +) +``` + +### 구조 + +``` +Infrastructure/ +└── Sources/ + ├── NetworkInterface/ + │ ├── NetworkServiceInterface.swift (프로토콜) + │ ├── Endpoint.swift (요청 추상화) + │ ├── NetworkError.swift + │ ├── NetworkConfig.swift + │ └── Responses/ + │ ├── SuccessResponse.swift + │ └── EmptyResponse.swift + └── NetworkImpl/ + ├── NetworkServiceImpl.swift (Alamofire 구현) + ├── AuthInterceptor.swift (토큰 관리) + ├── TokenRefreshEndpoint.swift + └── NetworkLogger.swift (DEBUG only) +``` + +### 핵심 컴포넌트 + +#### NetworkServiceInterface +```swift +public protocol NetworkServiceInterface: Sendable { + func request(_ endpoint: any Endpoint, responseType: T.Type) + -> AnyPublisher + + func uploadMultipart( + _ endpoint: any Endpoint, + images: [UIImage], + responseType: T.Type + ) -> AnyPublisher +} +``` + +#### Endpoint Protocol +```swift +public protocol Endpoint: Sendable { + var baseURL: String { get } + var path: String { get } + var method: HTTPMethod { get } + var headers: [String: String] { get } + var queryParameters: [String: Any] { get } + var body: Data? { get } +} +``` + +**의존성**: Common (DataSources, Managers) + +--- + +## 기능 모듈 + +각 기능 모듈은 Clean Architecture의 3개 레이어로 구성됩니다. + +### 표준 구조 + +``` +/ +├── Package.swift +└── Sources/ + ├── DI/ + │ └── DIContainer.swift + ├── Domain/ + │ ├── Entities/ + │ ├── Repositories/ (프로토콜) + │ ├── UseCases/ + │ └── Errors/ + ├── Data/ + │ ├── Repositories/ (구현체) + │ ├── API/ + │ └── DTO/ + └── Presentation/ + ├── View.swift + ├── ViewModel.swift + └── Subviews/ +``` + +### Home 모듈 + +**위치**: `/Home/` + +**역할**: 홈 화면 (추천 버거, 인기 게시글) + +#### Package.swift +```swift +let package = Package( + name: "Home", + platforms: [.iOS(.v17)], + products: [ + .library(name: "HomeDomain", targets: ["HomeDomain"]), + .library(name: "HomeData", targets: ["HomeData"]), + .library(name: "HomePresentation", targets: ["HomePresentation"]), + .library(name: "HomeDI", targets: ["HomeDI"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + .package(name: "Infrastructure", path: "../Infrastructure"), + .package(name: "DI", path: "../DI"), + ], + targets: [ + .target(name: "HomeDomain", dependencies: []), + .target(name: "HomeData", dependencies: ["HomeDomain", "NetworkInterface"]), + .target(name: "HomePresentation", dependencies: ["HomeDomain", "DesignSystem", "SharedUI"]), + .target(name: "HomeDI", dependencies: ["HomeDomain", "HomeData", "HomePresentation", "DIKit"]), + ] +) +``` + +**주요 파일**: +- Domain: `RecommendedBurger.swift`, `TrendingPost.swift`, `HomeUseCase.swift` +- Data: `HomeViewRepositoryImpl.swift`, `HomeAPI.swift` +- Presentation: `HomeView.swift`, `HomeViewModel.swift` + +### Community 모듈 + +**위치**: `/Community/` + +**역할**: 커뮤니티 게시판 (목록, 상세, 작성, 댓글, 좋아요, 신고) + +#### Package.swift +```swift +let package = Package( + name: "Community", + platforms: [.iOS(.v17)], + products: [ + .library(name: "CommunityDomain", targets: ["CommunityDomain"]), + .library(name: "CommunityData", targets: ["CommunityData"]), + .library(name: "CommunityPresentation", targets: ["CommunityPresentation"]), + .library(name: "CommunityDI", targets: ["CommunityDI"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + .package(name: "Infrastructure", path: "../Infrastructure"), + .package(name: "DI", path: "../DI"), + ], + targets: [ + .target(name: "CommunityDomain", dependencies: []), + .target(name: "CommunityData", dependencies: ["CommunityDomain", "NetworkInterface"]), + .target(name: "CommunityPresentation", dependencies: ["CommunityDomain", "DesignSystem", "SharedUI", "Util"]), + .target(name: "CommunityDI", dependencies: ["CommunityDomain", "CommunityData", "CommunityPresentation", "DIKit"]), + ] +) +``` + +**주요 파일**: +- Domain: `Board.swift`, `Comment.swift`, `Like.swift`, `Report.swift`, `GetBoardsUseCase.swift`, `CommentUseCase.swift` +- Data: `CommunityRepositoryImpl.swift`, `CommunityAPIClient.swift`, `BoardResponse.swift` +- Presentation: `CommunityView.swift`, `CommunityDetailView.swift`, `CommunityWriteView.swift` + +**특징**: +- 페이지네이션 지원 (`BoardListData`) +- Multipart 업로드 (이미지) +- Factory 패턴 (하위 ViewModel 생성) + +### MyPage 모듈 + +**위치**: `/MyPage/` + +**역할**: 사용자 프로필 및 설정 + +(구조는 Home/Community와 동일) + +### Login 모듈 + +**위치**: `/Login/` + +**역할**: 로그인/회원가입 (Kakao 로그인) + +**특징**: +- 3rdParty (KakaoLogin) 의존 + +### Intro 모듈 + +**위치**: `/Intro/` + +**역할**: 온보딩 및 스플래시 화면 + +**특징**: +- Domain/Data 레이어 없음 (순수 Presentation) +- 2개 product: `Onboarding`, `Splash` + +```swift +let package = Package( + name: "Intro", + products: [ + .library(name: "Onboarding", targets: ["Onboarding"]), + .library(name: "Splash", targets: ["Splash"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + ], + targets: [ + .target(name: "Onboarding", dependencies: ["DesignSystem", "Managers"]), + .target(name: "Splash", dependencies: ["DesignSystem", "Managers"]), + ] +) +``` + +--- + +## DI 모듈 + +**위치**: `/DI/` + +**역할**: 의존성 주입 컨테이너 + +### Package.swift + +```swift +let package = Package( + name: "DI", + platforms: [.iOS(.v17)], + products: [ + .library(name: "DIKit", targets: ["DIKit"]), + .library(name: "AppDI", targets: ["AppDI"]), + .library(name: "IntroDI", targets: ["IntroDI"]), + .library(name: "LoginDI", targets: ["LoginDI"]), + .library(name: "HomeDI", targets: ["HomeDI"]), + .library(name: "MyPageDI", targets: ["MyPageDI"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + .package(name: "Infrastructure", path: "../Infrastructure"), + ], + targets: [ + .target(name: "DIKit", dependencies: []), + .target(name: "AppDI", dependencies: ["DIKit", "Common", "NetworkImpl"]), + .target(name: "IntroDI", dependencies: ["DIKit", "AppDI"]), + // 각 기능별 DI도 동일한 구조 + ] +) +``` + +### 구조 + +``` +DI/ +└── Sources/ + ├── DIKit/ + │ ├── DIContainer.swift + │ ├── DIContainer+Assembly.swift + │ └── Assembly.swift + ├── AppDI/ + │ └── AppDIContainer.swift + ├── IntroDI/ + │ └── IntroDIContainer.swift + ├── LoginDI/ + ├── HomeDI/ + ├── MyPageDI/ + └── CommunityDI/ +``` + +**특징**: +- DIKit: Generic DI Container (재사용 가능) +- AppDI: 앱 레벨 싱글톤 서비스 등록 +- 각 기능 DI: AppDI를 부모로 하는 자식 컨테이너 + +--- + +## 모듈 의존성 규칙 + +### ✅ 허용 + +``` +기능 모듈 (Home, Community, ...) → Common +기능 모듈 Data 레이어 → Infrastructure +기능 모듈 → DI +모든 모듈 → Common +``` + +### ❌ 금지 + +``` +Common → 기능 모듈 (순환 의존성) +기능 모듈 → 다른 기능 모듈 (기능 간 직접 의존) +Domain 레이어 → Infrastructure (레이어 역전) +Presentation → Data (레이어 건너뛰기) +``` + +### 의존성 방향 + +``` +상위 (구체적) + ↓ + 기능 모듈 + ↓ +Infrastructure / DI + ↓ + Common + ↓ +하위 (추상적) +``` + +### 레이어 간 의존성 + +``` +Presentation → Domain ← Data + ↓ ↓ + DesignSystem Infrastructure + ↓ ↓ + Common (Util) +``` + +--- + +## 새 모듈 생성 가이드 + +### 1. 디렉토리 생성 + +```bash +mkdir MyNewFeature +cd MyNewFeature +mkdir -p Sources/MyNewFeatureDomain/{Entities,Repositories,UseCases,Errors} +mkdir -p Sources/MyNewFeatureData/{Repositories,API,DTO} +mkdir -p Sources/MyNewFeaturePresentation +mkdir -p Sources/MyNewFeatureDI +``` + +### 2. Package.swift 작성 + +```swift +// swift-tools-version: 5.9 +import PackageDescription + +let package = Package( + name: "MyNewFeature", + platforms: [.iOS(.v17)], + products: [ + .library(name: "MyNewFeatureDomain", targets: ["MyNewFeatureDomain"]), + .library(name: "MyNewFeatureData", targets: ["MyNewFeatureData"]), + .library(name: "MyNewFeaturePresentation", targets: ["MyNewFeaturePresentation"]), + .library(name: "MyNewFeatureDI", targets: ["MyNewFeatureDI"]), + ], + dependencies: [ + .package(name: "Common", path: "../Common"), + .package(name: "Infrastructure", path: "../Infrastructure"), + .package(name: "DI", path: "../DI"), + ], + targets: [ + // Domain: 의존성 없음 + .target( + name: "MyNewFeatureDomain", + dependencies: [] + ), + + // Data: Domain + Infrastructure + .target( + name: "MyNewFeatureData", + dependencies: [ + "MyNewFeatureDomain", + .product(name: "NetworkInterface", package: "Infrastructure"), + ] + ), + + // Presentation: Domain + Common + .target( + name: "MyNewFeaturePresentation", + dependencies: [ + "MyNewFeatureDomain", + .product(name: "DesignSystem", package: "Common"), + .product(name: "SharedUI", package: "Common"), + .product(name: "Util", package: "Common"), + ] + ), + + // DI: 모든 레이어 + DIKit + .target( + name: "MyNewFeatureDI", + dependencies: [ + "MyNewFeatureDomain", + "MyNewFeatureData", + "MyNewFeaturePresentation", + .product(name: "DIKit", package: "DI"), + .product(name: "AppDI", package: "DI"), + ] + ), + ] +) +``` + +### 3. DIContainer 생성 + +```swift +// Sources/MyNewFeatureDI/MyNewFeatureDIContainer.swift + +import DIKit +import AppDI +import MyNewFeatureDomain +import MyNewFeatureData +import MyNewFeaturePresentation +import NetworkInterface + +struct MyNewFeatureAssembly: Assembly { + func assemble(container: GenericDIContainer) { + // API Client + container.register(MyNewFeatureAPIClientInterface.self) { resolver in + MyNewFeatureAPIClient(networkService: resolver.resolve(NetworkServiceInterface.self)) + } + + // Repository + container.register(MyNewFeatureRepository.self) { resolver in + MyNewFeatureRepositoryImpl(apiClient: resolver.resolve(MyNewFeatureAPIClientInterface.self)) + } + + // UseCase + container.register(MyNewFeatureUseCase.self) { resolver in + MyNewFeatureUseCaseImpl(repository: resolver.resolve(MyNewFeatureRepository.self)) + } + + // ViewModel + container.register(MyNewFeatureViewModel.self) { @MainActor resolver in + MyNewFeatureViewModel(useCase: resolver.resolve(MyNewFeatureUseCase.self)) + } + } +} + +public final class MyNewFeatureDIContainer { + private let container: GenericDIContainer + + public init(appContainer: AppDIContainer = .shared) { + self.container = GenericDIContainer(parent: appContainer.baseContainer) + MyNewFeatureAssembly().assemble(container: container) + } + + @MainActor + public func makeViewModel() -> MyNewFeatureViewModel { + return container.resolve(MyNewFeatureViewModel.self) + } +} +``` + +### 4. Xcode 프로젝트에 추가 + +1. Xcode에서 `Hambug.xcodeproj` 열기 +2. File > Add Package Dependencies > Add Local... +3. MyNewFeature 폴더 선택 +4. Target (Hambug) > Build Phases > Link Binary With Libraries에 추가 + +### 5. 메인 앱에서 사용 + +```swift +// ContentView.swift + +let myNewFeatureDI = MyNewFeatureDIContainer(appContainer: appContainer) + +MyNewFeatureView(viewModel: myNewFeatureDI.makeViewModel()) +``` + +--- + +## 모듈 간 통신 + +### ❌ 잘못된 방법 (직접 의존) + +```swift +// Home 모듈에서 +import CommunityDomain // ❌ 기능 모듈 간 직접 의존 금지 + +func navigateToCommunity() { + // ... +} +``` + +### ✅ 올바른 방법 (공통 인터페이스) + +```swift +// Common/Util에 정의 +public protocol Navigator { + func navigateTo(route: AppRoute) +} + +public enum AppRoute { + case home + case community(boardId: Int?) + case myPage +} + +// 각 모듈은 Navigator 프로토콜에만 의존 +``` + +--- + +## 요약 + +### 핵심 원칙 + +1. **모듈 독립성**: 각 모듈은 독립적으로 빌드 가능 +2. **의존성 역전**: 상위 레이어는 하위 레이어에만 의존 +3. **순환 의존 금지**: 모듈 간 순환 참조 절대 불가 +4. **Common 공유**: 공통 기능은 Common 모듈로 +5. **레이어 분리**: Domain/Data/Presentation 엄격 분리 + +### 의존성 체크리스트 + +- [ ] Domain 레이어는 외부 의존성 없음 (순수 Swift) +- [ ] Data 레이어는 Infrastructure에만 의존 +- [ ] Presentation은 Domain + Common에만 의존 +- [ ] 기능 모듈은 다른 기능 모듈에 직접 의존하지 않음 +- [ ] 순환 의존성 없음 + +### 참고 파일 + +| 모듈 | Package.swift 위치 | +|------|---------------------| +| Common | `/Common/Package.swift` | +| Infrastructure | `/Infrastructure/Package.swift` | +| Home | `/Home/Package.swift` | +| Community | `/Community/Package.swift` | +| DI | `/DI/Package.swift` | + +**모듈 구조에 대한 질문이 있으면 이 문서를 참조하세요!** diff --git a/CLAUDME.MD b/CLAUDME.MD new file mode 100644 index 0000000..d9825ae --- /dev/null +++ b/CLAUDME.MD @@ -0,0 +1,741 @@ +# Hambug iOS - 개발 가이드 + +> AI 어시스턴트와 개발자를 위한 핵심 패턴 및 컨벤션 가이드 + +## 목차 +- [프로젝트 개요](#프로젝트-개요) +- [Clean Architecture](#clean-architecture) +- [Swift 6 패턴](#swift-6-패턴) +- [네이밍 컨벤션](#네이밍-컨벤션) +- [에러 처리](#에러-처리) +- [네트워크 레이어](#네트워크-레이어) +- [의존성 주입](#의존성-주입) +- [동시성 패턴](#동시성-패턴) +- [개발 가이드라인](#개발-가이드라인) +- [주요 파일 참조](#주요-파일-참조) +- [트러블슈팅](#트러블슈팅) + +**📦 모듈 구조는 [ABOUT_MODULE.MD](./ABOUT_MODULE.MD) 참조** + +--- + +## 프로젝트 개요 + +**Hambug**는 햄버거 애호가를 위한 커뮤니티 iOS 앱입니다. + +### 기술 스택 +- **UI**: SwiftUI +- **아키텍처**: SPM 모듈러 + Clean Architecture +- **동시성**: async/await (primary), Combine (network layer) +- **네트워킹**: Alamofire +- **의존성 주입**: 커스텀 DIKit +- **최소 버전**: iOS 17.0, Swift 6 + +### 핵심 원칙 +1. **모듈화**: 기능별 SPM 모듈 분리 +2. **Clean Architecture**: Domain/Data/Presentation 레이어 분리 +3. **의존성 역전**: 프로토콜 기반 추상화 +4. **타입 안전**: Sendable, async/await 준수 + +--- + +## Clean Architecture + +각 기능 모듈은 3개 레이어로 구성: + +``` +/ +├── Domain/ # 순수 비즈니스 로직 (의존성 없음) +├── Data/ # Repository 구현, API, DTO +└── Presentation/# ViewModel, View +``` + +### 1. Domain 레이어 + +#### Entity 패턴 +```swift +public struct Board: Identifiable, Equatable, Sendable { + public let id: Int + public let title: String + public var commentCount: Int // 가변 프로퍼티 가능 + + // 도메인 로직 포함 가능 + private static func timeAgoDisplay(_ date: Date) -> String { } +} +``` + +**핵심**: +- `Sendable`, `Identifiable`, `Equatable` 준수 +- Computed properties로 UI 로직 캡슐화 +- Preview용 `sampleData` static 프로퍼티 + +**참조**: `Community/Sources/Domain/Entities/Board.swift` + +#### Repository 프로토콜 +```swift +public protocol CommunityRepository: Sendable { + func fetchBoards(lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData + func createBoard(title: String, content: String, category: BoardCategory, images: [UIImage]) async throws -> Board +} +``` + +**핵심**: +- `Sendable` 준수 +- async/await 기반 +- 도메인 타입 반환 (DTO 아님) + +#### UseCase 패턴 +```swift +public protocol GetBoardsUseCase: Sendable { + func execute(lastId: Int?, limit: Int, order: SortOrder) async throws -> BoardListData +} + +public final class GetBoardsUseCaseImpl: GetBoardsUseCase { + private let repository: CommunityRepository + + public func execute(...) async throws -> BoardListData { + let data = try await repository.fetchBoards(...) + // 비즈니스 로직 검증 + guard !data.content.isEmpty else { + throw CommunityError.emptyBoards + } + return data + } +} +``` + +**핵심**: +- Protocol + Implementation 패턴 +- 데이터 검증 및 변환 +- 도메인 에러 throw + +**참조**: `Community/Sources/Domain/UseCases/GetBoardsUseCaseImpl.swift` + +#### Domain Error +```swift +public enum HomeError: Error, LocalizedError { + case networkFailure(underlying: Error) + case emptyRecommendedBurgers + case invalidBurgerData(reason: String) + + public var errorDescription: String? { + switch self { + case .networkFailure: + return "네트워크 연결을 확인해주세요." + case .invalidBurgerData(let reason): + return "버거 데이터 오류: \(reason)" + } + } + + public var severity: ErrorSeverity { + switch self { + case .networkFailure: return .high + case .emptyRecommendedBurgers: return .medium + case .invalidBurgerData: return .low + } + } +} +``` + +**참조**: `Home/Sources/Domain/Errors/HomeError.swift` + +### 2. Data 레이어 + +#### DTO + Mapper 패턴 +```swift +public struct BoardResponseDTO: Decodable, Sendable { + public let id: Int + public let title: String + public let createdAt: String // ISO8601 +} + +extension BoardResponseDTO { + func toDomain() -> Board { + return Board( + id: id, + title: title, + createdAt: DateFormatter.iso8601.date(from: createdAt) ?? Date() + ) + } +} +``` + +**핵심**: DTO는 네트워크 전용, `toDomain()`으로 변환 + +**참조**: `Community/Sources/Data/DTO/BoardResponse.swift` + +#### API Client +```swift +public protocol CommunityAPIClientInterface: Sendable { + func fetchBoards(...) -> AnyPublisher +} + +public final class CommunityAPIClient: CommunityAPIClientInterface { + private let networkService: NetworkServiceInterface + + public func fetchBoards(...) -> AnyPublisher { + return networkService.request( + BoardEndpoint.boards(query), + responseType: SuccessResponse.self + ) + .map(\.data) // 래퍼 제거 + .eraseToAnyPublisher() + } +} +``` + +**핵심**: Combine Publisher 반환, DTO 타입 사용 + +**참조**: `Community/Sources/Data/API/CommunityAPIClient.swift` + +#### Repository 구현체 +```swift +public final class CommunityRepositoryImpl: CommunityRepository { + private let apiClient: CommunityAPIClientInterface + + public func fetchBoards(...) async throws -> BoardListData { + return try await apiClient + .fetchBoards(...) + .map { $0.toDomain() } // DTO → Domain + .mapError { $0 as Error } + .async() // Publisher → async/await + } +} +``` + +**핵심**: `.async()` extension으로 Combine → async/await 변환 + +**참조**: +- Repository: `Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift` +- Bridge: `Common/Sources/Util/Combine+Ext.swift` + +### 3. Presentation 레이어 + +#### ViewModel 패턴 +```swift +@Observable +@MainActor +public final class HomeViewModel { + private let homeUseCase: HomeUseCase + + // State + public var data: [Model] = [] + public var isLoading = false + public var error: HomeError? + + public init(homeUseCase: HomeUseCase) { + self.homeUseCase = homeUseCase + Task { await loadData() } + } + + public func loadData() async { + isLoading = true + defer { isLoading = false } + + do { + data = try await homeUseCase.fetchData() + print("✅ 데이터 로드 성공") + } catch let error as HomeError { + self.error = error + data = Model.sampleData // Fallback + print("❌ 로드 실패: \(error.localizedDescription)") + } + } +} +``` + +**핵심**: +- `@Observable` + `@MainActor` +- `public final class` +- Task 초기화로 자동 로딩 +- 에러 시 샘플 데이터 폴백 +- 이모지 로그 (✅❌ℹ️⚠️) + +**참조**: `Home/Sources/Presentation/HomeViewModel.swift` + +#### View 패턴 +```swift +public struct CommunityView: View { + @State private var viewModel: CommunityViewModel + private let writeFactory: CommunityWriteFactory // Factory 패턴 + + public init(viewModel: CommunityViewModel, writeFactory: CommunityWriteFactory) { + self._viewModel = State(initialValue: viewModel) + self.writeFactory = writeFactory + } + + public var body: some View { + NavigationStack { + // ... + } + .refreshable { + await viewModel.loadData() + } + } +} +``` + +**핵심**: ViewModel은 `@State`, Factory로 하위 ViewModel 생성 + +--- + +## Swift 6 패턴 + +### @Observable 매크로 + +```swift +// ✅ 최신 +@Observable +@MainActor +public final class ViewModel { + public var data: [Model] = [] // 자동 추적 +} + +// ❌ Deprecated +class ViewModel: ObservableObject { + @Published var data: [Model] = [] +} +``` + +### Sendable 프로토콜 + +모든 Entity, Protocol, DTO는 `Sendable` 준수: + +```swift +public struct Board: Identifiable, Sendable { } +public protocol HomeUseCase: Sendable { } +public struct ResponseDTO: Decodable, Sendable { } +``` + +### async/await 동시성 + +```swift +// 기본 +public func loadData() async { + isLoading = true + defer { isLoading = false } + data = try await useCase.execute() +} + +// 병렬 +async let result1 = load1() +async let result2 = load2() +await result1 +await result2 + +// Task 초기화 +public init(useCase: UseCase) { + Task { await loadData() } +} +``` + +### Combine → async/await 브릿지 + +**위치**: `Common/Sources/Util/Combine+Ext.swift` + +```swift +public extension Publisher where Output: Sendable { + func async() async throws -> Output { + try await withCheckedThrowingContinuation { continuation in + var cancellable: AnyCancellable? + cancellable = first().sink { ... } + } + } +} +``` + +**사용**: Repository에서 `publisher.async()` + +--- + +## 네이밍 컨벤션 + +### 파일명 + +| 타입 | 패턴 | 예시 | +|------|------|------| +| ViewModel | `ViewModel.swift` | `HomeViewModel.swift` | +| UseCase | `UseCaseImpl.swift` | `GetBoardsUseCaseImpl.swift` | +| Repository | `RepositoryImpl.swift` | `CommunityRepositoryImpl.swift` | +| API Client | `APIClient.swift` | `CommunityAPIClient.swift` | +| Endpoint | `API.swift` | `HomeAPI.swift` | +| DTO | `Response.swift` | `BoardResponse.swift` | +| Entity | `.swift` | `Board.swift` | +| Error | `Error.swift` | `HomeError.swift` | + +### 변수/함수명 + +```swift +// 로딩 상태 +public var isLoading: Bool +public var isBurgersLoading: Bool + +// 에러 +public var errorMessage: String? +public var burgersError: HomeError? + +// 비동기 함수 +public func loadData() async +public func fetchBoards() async throws -> [Board] +public func createBoard(...) async throws -> Board +``` + +--- + +## 에러 처리 + +### 플로우 + +``` +NetworkError (Infrastructure) + ↓ +DomainError (Repository 매핑) + ↓ +ViewModel catch → UI 표시 or 샘플 데이터 폴백 +``` + +### ViewModel 에러 처리 패턴 + +```swift +do { + data = try await useCase.execute() + print("✅ 성공") +} catch let error as HomeError { + self.error = error + data = Model.sampleData // Fallback + print("❌ 실패: \(error.localizedDescription)") +} catch { + self.error = .networkFailure(underlying: error) + data = Model.sampleData +} +``` + +--- + +## 네트워크 레이어 + +### 아키텍처 + +``` +ViewModel → UseCase → Repository → APIClient → NetworkService (Alamofire) +``` + +### 핵심 컴포넌트 + +| 컴포넌트 | 파일 | +|----------|------| +| NetworkServiceInterface | `Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift` | +| NetworkServiceImpl | `Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift` | +| AuthInterceptor | `Infrastructure/Sources/NetworkImpl/AuthInterceptor.swift` | +| KeychainTokenStorage | `Common/Sources/DataSources/KeychainTokenStorage.swift` | + +### 요청 흐름 + +1. **Endpoint 정의** +```swift +public enum HomeEndpoint: Endpoint { + case recommendedBurgers + public var path: String { "/api/v1/burgers/recommended" } + public var method: HTTPMethod { .GET } +} +``` + +2. **APIClient 호출** (Combine) +```swift +networkService.request(HomeEndpoint.recommendedBurgers, responseType: SuccessResponse<[DTO]>.self) + .map(\.data) +``` + +3. **Repository 변환** (DTO → Domain + async) +```swift +try await apiClient.fetch().map { $0.toDomain() }.async() +``` + +4. **UseCase 검증** +```swift +let data = try await repository.fetch() +guard !data.isEmpty else { throw Error.empty } +``` + +5. **ViewModel 상태 업데이트** + +--- + +## 의존성 주입 + +### DIKit 패턴 + +**위치**: `DI/Sources/DIKit/` + +```swift +public protocol Assembly { + func assemble(container: GenericDIContainer) +} + +public enum Scope { + case singleton // 한 번 생성, 캐싱 + case transient // 매번 새로 생성 +} +``` + +### App DI Container + +**위치**: `DI/Sources/AppDI/AppDIContainer.swift` + +```swift +struct AppAssembly: Assembly { + func assemble(container: GenericDIContainer) { + container.register(NetworkServiceInterface.self, scope: .singleton) { resolver in + NetworkServiceImpl(interceptor: AuthInterceptor(...)) + } + } +} + +@Observable +public final class AppDIContainer: @unchecked Sendable { + public static let shared = AppDIContainer() +} +``` + +### 기능 DI Container + +```swift +public final class CommunityDIContainer { + private let container: GenericDIContainer + + public init(appContainer: AppDIContainer = .shared) { + // 부모 컨테이너 상속 + self.container = GenericDIContainer(parent: appContainer.baseContainer) + CommunityAssembly().assemble(container: container) + } + + @MainActor + public func makeViewModel() -> CommunityViewModel { + return container.resolve(CommunityViewModel.self) + } +} +``` + +**참조**: `Community/Sources/DI/CommunityDIContainer.swift` + +### Factory 패턴 + +```swift +public protocol CommunityWriteFactory { + func makeWriteViewModel() -> CommunityWriteViewModel +} + +extension CommunityDIContainer: CommunityWriteFactory { + public func makeWriteViewModel() -> CommunityWriteViewModel { + return container.resolve(CommunityWriteViewModel.self) + } +} +``` + +--- + +## 동시성 패턴 + +### 기본 패턴 +```swift +public func loadData() async { + isLoading = true + defer { isLoading = false } + data = try await useCase.execute() +} +``` + +### 병렬 로딩 +```swift +async let result1 = load1() +async let result2 = load2() +await result1 +await result2 +``` + +### Task 취소 +```swift +private var loadTask: Task? + +loadTask?.cancel() +loadTask = Task { await load() } +``` + +--- + +## 개발 가이드라인 + +### ✅ 권장 (DO) + +**아키텍처**: +- ViewModel에 `@Observable` + `@MainActor` +- Entity를 `Sendable`로 +- Domain에서 async/await +- Protocol + Implementation 패턴 +- 도메인별 에러 enum +- 에러 시 샘플 데이터 폴백 + +**코드 스타일**: +- MARK 주석으로 섹션 구분 +- 이모지 로그 (✅❌ℹ️⚠️) +- 한글 에러 메시지 + +### ❌ 금지 (DON'T) + +- `@ObservedObject`, `@Published` 사용 +- force-unwrapping (`!`) +- 순환 모듈 의존성 +- Domain에 Presentation 로직 혼합 +- 동기 네트워크 호출 +- `Sendable` 요구사항 무시 + +--- + +## 주요 파일 참조 + +### 앱 구조 +- 앱 진입점: `Hambug/HambugApp.swift` +- 루트 네비게이션: `Hambug/RootView.swift` +- 메인 콘텐츠: `Hambug/ContentView.swift` + +### DI +- App DI: `DI/Sources/AppDI/AppDIContainer.swift` +- DIKit: `DI/Sources/DIKit/DIContainer+Assembly.swift` + +### Network +- Interface: `Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift` +- Implementation: `Infrastructure/Sources/NetworkImpl/NetworkServiceImpl.swift` +- Token Storage: `Common/Sources/DataSources/KeychainTokenStorage.swift` + +### Common +- Combine Bridge: `Common/Sources/Util/Combine+Ext.swift` +- DesignSystem: `Common/Sources/DesignSystem/` +- CustomTabView: `Common/Sources/SharedUI/CustomTabView/CustomTabView.swift` + +### 기능 모듈 예시 +- Home ViewModel: `Home/Sources/Presentation/HomeViewModel.swift` +- Home Error: `Home/Sources/Domain/Errors/HomeError.swift` +- Community ViewModel: `Community/Sources/Presentation/Community/CommunityViewModel.swift` +- Board Entity: `Community/Sources/Domain/Entities/Board.swift` + +--- + +## 트러블슈팅 + +### 1. Sendable 에러 +``` +Type '...' does not conform to protocol 'Sendable' +``` + +**해결**: Entity/Protocol/DTO에 `Sendable` 추가 +```swift +public struct Board: Identifiable, Sendable { } +public protocol UseCase: Sendable { } +``` + +### 2. MainActor 에러 +``` +Call to main actor-isolated initializer in a synchronous context +``` + +**해결**: DI Container에서 `@MainActor` 명시 +```swift +container.register(ViewModel.self) { @MainActor resolver in + ViewModel(...) +} +``` + +### 3. @Published 에러 +``` +Cannot convert 'Published<...>.Publisher' +``` + +**해결**: `@Observable` 사용 +```swift +// ❌ +@Published var data: [Model] + +// ✅ +@Observable +class ViewModel { + var data: [Model] +} +``` + +### 4. 샘플 데이터가 계속 표시됨 + +**확인**: +1. 콘솔 로그 (❌ 에러 메시지) +2. `error` 프로퍼티 확인 +3. 네트워크 연결 +4. 토큰 유효성 + +### 5. Module not found + +**해결**: +```bash +# Xcode +File > Packages > Reset Package Caches + +# 터미널 +rm -rf .build +xcodebuild -resolvePackageDependencies +``` + +--- + +## 마이그레이션 노트 + +### ObservableObject → @Observable + +**구식 (iOS 13-16)**: +```swift +class ViewModel: ObservableObject { + @Published var data: [Model] = [] +} + +struct View: View { + @ObservedObject var viewModel: ViewModel +} +``` + +**최신 (iOS 17+)**: +```swift +@Observable +@MainActor +final class ViewModel { + var data: [Model] = [] +} + +struct View: View { + @State private var viewModel: ViewModel +} +``` + +--- + +## 현재 개발 상태 + +- **활성 브랜치**: `feature/community` +- **메인 브랜치**: `develop` +- **최근 작업**: Community list/detail/write, CustomTabView, Report/Comment/Like + +--- + +## 참고 문서 + +- 📦 **모듈 구조**: [ABOUT_MODULE.MD](./ABOUT_MODULE.MD) + +--- + +## 요약 + +**Hambug iOS 핵심 원칙**: +1. SPM 모듈화 + Clean Architecture +2. Swift 6 (@Observable, Sendable, async/await) +3. 프로토콜 기반 추상화 +4. 도메인 에러 + 샘플 데이터 폴백 +5. DIKit 계층적 DI +6. async/await 우선, Combine은 네트워크만 + +**파일을 읽을 때는 실제 파일을 직접 읽으세요. 여기는 패턴 참조용입니다!** diff --git a/Community/Sources/DI/CommunityDIContainer.swift b/Community/Sources/DI/CommunityDIContainer.swift index 704685f..5bb4adc 100644 --- a/Community/Sources/DI/CommunityDIContainer.swift +++ b/Community/Sources/DI/CommunityDIContainer.swift @@ -24,6 +24,10 @@ struct CommunityWriteAssembly: Assembly { container.register(CommunityWriteViewModel.self) { resolver in CommunityWriteViewModel(createBoardUseCase: resolver.resolve(CreateBoardUseCase.self)) } + + container.register(UpdateBoardUseCase.self) { resolver in + UpdateBoardUseCaseImpl(repository: resolver.resolve(CommunityRepository.self)) + } } } // MARK: - Community Assembly @@ -97,10 +101,6 @@ struct CommunityAssembly: Assembly { userDefaultsManager: resolver.resolve(UserDefaultsManager.self) ) } - -// container.register(CommunityReportViewModel.self) { resolver in -// CommunityReportViewModel.init -// } } } @@ -122,25 +122,11 @@ public final class CommunityDIContainer { public func makeCommunityViewModel() -> CommunityViewModel { return container.resolve(CommunityViewModel.self) } - - @MainActor - public func makeCommunityDetailViewModel() -> CommunityDetailViewModel { - return container.resolve(CommunityDetailViewModel.self) - } - - @MainActor - public func makeCommunityReportViewModel() -> CommunityReportViewModel { - return container.resolve(CommunityReportViewModel.self) - } - - public func resolve(_ type: T.Type) -> T { - return container.resolve(type) - } } extension CommunityDIContainer: CommunityWriteFactory { - public func makeWriteViewModel() -> CommunityWriteViewModel { - return container.resolve(CommunityWriteViewModel.self) + public func makeWriteViewModel() -> any CommunityWriteViewModelProtocol { + container.resolve(CommunityWriteViewModel.self) } } @@ -150,6 +136,25 @@ extension CommunityDIContainer: CommunityDetailFactory { return container.resolve(CommunityDetailViewModel.self) } } + +extension CommunityDIContainer: UpdateBoardFactory { + public func makeViewModel(boardId: Int) -> CommunityWriteViewModelProtocol { + return UpdateBoardViewModel( + boardId: boardId, + updateBoardUseCase: container.resolve(UpdateBoardUseCase.self) + ) + } +} + +extension CommunityDIContainer: ReportBoardFactory { + public func makeViewModel(req: ReportRequest) -> CommunityReportViewModel { + return CommunityReportViewModel( + usecase: container.resolve(ReportContentUseCase.self), + reportInfo: req + ) + } +} + // MARK: - Mock Setup private func setupURLProtocol() { let boardsData: [[String: Any]] = [ diff --git a/Community/Sources/Data/API/CommunityAPI.swift b/Community/Sources/Data/API/CommunityAPI.swift index 09dc96a..ae9c461 100644 --- a/Community/Sources/Data/API/CommunityAPI.swift +++ b/Community/Sources/Data/API/CommunityAPI.swift @@ -15,6 +15,8 @@ public enum BoardEndpoint: Endpoint { case boardsByCategory(CategoryPagingQuery) case createBoard(BoardRequestDTO) case boardDetail(boardId: Int) + case updateBoard(boardId: Int, body: BoardRequestDTO) + case deleteBoard(boardId: Int) case comments(boardId: Int, query: CursorPagingQuery) case createComment(boardId: Int, content: String) case updateComment(boardId: Int, commentId: Int, content: String) @@ -31,6 +33,8 @@ public enum BoardEndpoint: Endpoint { switch self { case .createBoard(let dto): return dto.imageUrls.isEmpty ? "/boards" : "/boards/with-image" + case .updateBoard(let id, let dto): + return dto.imageUrls.isEmpty ? "/boards/\(id)" : "/boards/\(id)/with-image" case .boards: return "/boards" case .boardsByCategory: @@ -62,9 +66,9 @@ public enum BoardEndpoint: Endpoint { return .GET case .createBoard, .createComment, .toggleLike, .report: return .POST - case .updateComment: + case .updateBoard, .updateComment: return .PUT - case .deleteComment: + case .deleteBoard, .deleteComment: return .DELETE } } diff --git a/Community/Sources/Data/API/CommunityAPIClient.swift b/Community/Sources/Data/API/CommunityAPIClient.swift index c6b8b9a..18b6cbe 100644 --- a/Community/Sources/Data/API/CommunityAPIClient.swift +++ b/Community/Sources/Data/API/CommunityAPIClient.swift @@ -24,6 +24,16 @@ public protocol CommunityAPIClientInterface: Sendable { category: String, images: [UIImage] ) -> AnyPublisher + + func updateBoard( + boardId: Int, + title: String, + content: String, + category: String, + images: [UIImage] + ) -> AnyPublisher + + func deleteBoard(boardId: Int) -> AnyPublisher // Comments func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: String) -> AnyPublisher @@ -108,6 +118,50 @@ public final class CommunityAPIClient: CommunityAPIClientInterface { .eraseToAnyPublisher() } } + + public func updateBoard( + boardId: Int, + title: String, + content: String, + category: String, + images: [UIImage] + ) -> AnyPublisher { + let dto = BoardRequestDTO( + title: title, + content: content, + category: category, + imageUrls: [] // multipart에서는 사용 안함 + ) + + let endpoint = BoardEndpoint.updateBoard(boardId: boardId, body: dto) + + if images.isEmpty { + // 이미지 없으면 일반 JSON request + return networkService.request(endpoint, responseType: SuccessResponse.self) + .map(\.data) + .eraseToAnyPublisher() + } else { + // 이미지 있으면 multipart upload + return networkService.uploadMultipart( + endpoint, + images: images, + responseType: SuccessResponse.self + ) + .map(\.data) + .eraseToAnyPublisher() + } + } + + public func deleteBoard(boardId: Int) -> AnyPublisher { + let endpoint = BoardEndpoint.deleteBoard(boardId: boardId) + + return networkService.request( + endpoint, + responseType: SuccessResponse.self + ) + .map { _ in () } + .eraseToAnyPublisher() + } // MARK: - Comments public func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: String) -> AnyPublisher { diff --git a/Community/Sources/Data/DTO/ReportRequest.swift b/Community/Sources/Data/DTO/ReportRequest.swift new file mode 100644 index 0000000..7df764e --- /dev/null +++ b/Community/Sources/Data/DTO/ReportRequest.swift @@ -0,0 +1,37 @@ +// +// ReportRequest.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation +import CommunityDomain + +// MARK: - Report Request DTO +public struct ReportRequestDTO: Encodable, Sendable { + public let targetId: Int + public let targetType: String // BOARD, COMMENT + public let reason: String + + public init(targetId: Int, targetType: String, reason: String) { + self.targetId = targetId + self.targetType = targetType + self.reason = reason + } + + private enum CodingKeys: String, CodingKey { + case targetId + case targetType + case reason + } +} + +// MARK: - Domain to DTO Mapper +extension ReportRequestDTO { + public init(from domain: CommunityDomain.ReportRequest) { + self.targetId = domain.targetId + self.targetType = domain.targetType.rawValue + self.reason = domain.reason + } +} diff --git a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift index 49b9a31..f6be76a 100644 --- a/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift +++ b/Community/Sources/Data/Repositories/CommunityRepositoryImpl.swift @@ -63,15 +63,17 @@ public final class CommunityRepositoryImpl: CommunityRepository { .mapError { $0 as Error } .async() } - - public func createBoard( + + public func updateBoard( + boardId: Int, title: String, content: String, - category: BoardCategory, + category: CommunityDomain.BoardCategory, images: [UIImage] - ) async throws -> Board { + ) async throws -> CommunityDomain.Board { return try await apiClient - .createBoard( + .updateBoard( + boardId: boardId, title: title, content: content, category: category.rawValue, diff --git a/Community/Sources/Domain/Entities/Report.swift b/Community/Sources/Domain/Entities/Report.swift new file mode 100644 index 0000000..46feaa3 --- /dev/null +++ b/Community/Sources/Domain/Entities/Report.swift @@ -0,0 +1,27 @@ +// +// Report.swift +// Hambug +// +// Created by 강동영 on 01/07/26. +// + +import Foundation + +// MARK: - Report Target Type +public enum ReportTargetType: String, Codable, Sendable { + case board = "BOARD" + case comment = "COMMENT" +} + +// MARK: - Report Request +public struct ReportRequest: Sendable { + public let targetId: Int + public let targetType: ReportTargetType + public let reason: String + + public init(targetId: Int, targetType: ReportTargetType, reason: String) { + self.targetId = targetId + self.targetType = targetType + self.reason = reason + } +} diff --git a/Community/Sources/Domain/Repositories/CommunityRepository.swift b/Community/Sources/Domain/Repositories/CommunityRepository.swift index a81bdb3..da53386 100644 --- a/Community/Sources/Domain/Repositories/CommunityRepository.swift +++ b/Community/Sources/Domain/Repositories/CommunityRepository.swift @@ -23,6 +23,18 @@ public protocol CommunityRepository: Sendable { category: BoardCategory, images: [UIImage] ) async throws -> Board + + // 게시글 수정 + func updateBoard( + boardId: Int, + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board + + // 게시글 삭제 + func deleteBoard(boardId: Int) async throws // 댓글 func fetchComments(boardId: Int, lastId: Int?, limit: Int, order: SortOrder) async throws -> CommentListData diff --git a/Community/Sources/Domain/UseCases/UpdateBoardUseCaseImpl.swift b/Community/Sources/Domain/UseCases/UpdateBoardUseCaseImpl.swift new file mode 100644 index 0000000..42c4fea --- /dev/null +++ b/Community/Sources/Domain/UseCases/UpdateBoardUseCaseImpl.swift @@ -0,0 +1,46 @@ +// +// UpdateBoardUseCaseImpl.swift +// Community +// +// Created by 강동영 on 1/11/26. +// + +import Foundation +import UIKit + +// MARK: - Create Board UseCase Interface +public protocol UpdateBoardUseCase: Sendable { + func execute( + boardId: Int, + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board +} + +// MARK: - Create Board UseCase Implementation +public final class UpdateBoardUseCaseImpl: UpdateBoardUseCase { + + private let repository: CommunityRepository + + public init(repository: CommunityRepository) { + self.repository = repository + } + + public func execute( + boardId: Int, + title: String, + content: String, + category: BoardCategory, + images: [UIImage] + ) async throws -> Board { + return try await repository.updateBoard( + boardId: boardId, + title: title, + content: content, + category: category, + images: images + ) + } +} diff --git a/Community/Sources/Presentation/Community/CommunityView.swift b/Community/Sources/Presentation/Community/CommunityView.swift index ae9ac48..fcddd8e 100644 --- a/Community/Sources/Presentation/Community/CommunityView.swift +++ b/Community/Sources/Presentation/Community/CommunityView.swift @@ -11,24 +11,32 @@ import CommunityDomain import SharedUI public protocol CommunityWriteFactory { - func makeWriteViewModel() -> CommunityWriteViewModel + func makeWriteViewModel() -> CommunityWriteViewModelProtocol +} + public protocol CommunityDetailFactory { func makeDetailViewModel() -> CommunityDetailViewModel } public struct CommunityView: View { @State private var viewModel: CommunityViewModel - private let factory: CommunityWriteFactory + private let writeFactory: CommunityWriteFactory private let detailFactory: CommunityDetailFactory + private let updateFactory: UpdateBoardFactory + private let reportFactory: ReportBoardFactory public init( viewModel: CommunityViewModel, - factory: CommunityWriteFactory + writeFactory: CommunityWriteFactory, detailFactory: CommunityDetailFactory, + updateFactory: UpdateBoardFactory, + reportFactory: ReportBoardFactory ) { self._viewModel = State(initialValue: viewModel) - self.factory = factory + self.writeFactory = writeFactory self.detailFactory = detailFactory + self.updateFactory = updateFactory + self.reportFactory = reportFactory } public var body: some View { @@ -66,12 +74,18 @@ public struct CommunityView: View { if viewModel.isListView { CommunityListView( boards: viewModel.filteredBoards, - detailFactory: detailFactory + detailFactory: detailFactory, + updateFactory: updateFactory, + reportFactory: reportFactory, + viewModel: viewModel ) } else { CommunityFeedView( boards: viewModel.filteredBoards, - detailFactory: detailFactory + detailFactory: detailFactory, + updateFactory: updateFactory, + reportFactory: reportFactory, + viewModel: viewModel ) } } @@ -86,7 +100,7 @@ public struct CommunityView: View { Spacer() NavigationLink( destination: CommunityWriteView( - viewModel: factory.makeWriteViewModel() + viewModel: writeFactory.makeWriteViewModel() ) ) { Color.bgPencil @@ -179,7 +193,25 @@ fileprivate struct CommunityFilterChip: View { struct CommunityListView: View { let boards: [Board] let detailFactory: CommunityDetailFactory + let updateFactory: UpdateBoardFactory + let reportFactory: ReportBoardFactory + @State private var viewModel: CommunityViewModel + + init( + boards: [Board], + detailFactory: CommunityDetailFactory, + updateFactory: UpdateBoardFactory, + reportFactory: ReportBoardFactory, + viewModel: CommunityViewModel + ) { + self.boards = boards + self.detailFactory = detailFactory + self.updateFactory = updateFactory + self.reportFactory = reportFactory + self._viewModel = State(initialValue: viewModel) + } + var body: some View { ScrollView { LazyVStack(spacing: 0) { @@ -187,7 +219,9 @@ struct CommunityListView: View { NavigationLink( destination: CommunityDetailView( viewModel: detailFactory.makeDetailViewModel(), - boardId: board.id + boardId: board.id, + updateFactory: updateFactory, + reportFactory: reportFactory )) { CommunityPostListCard(board: board) } @@ -223,16 +257,36 @@ struct CommunityListView: View { // MARK: - Feed View fileprivate struct CommunityFeedView: View { let boards: [Board] + let detailFactory: CommunityDetailFactory + let updateFactory: UpdateBoardFactory + let reportFactory: ReportBoardFactory + @State private var viewModel: CommunityViewModel + + init( + boards: [Board], + detailFactory: CommunityDetailFactory, + updateFactory: UpdateBoardFactory, + reportFactory: ReportBoardFactory, + viewModel: CommunityViewModel + ) { + self.boards = boards + self.detailFactory = detailFactory + self.updateFactory = updateFactory + self.reportFactory = reportFactory + self._viewModel = State(initialValue: viewModel) + } + var body: some View { ScrollView { LazyVStack(spacing: 16) { - ForEach(boards) { board in ForEach(Array(boards.enumerated()), id: \.element.id) { index, board in NavigationLink( destination: CommunityDetailView( viewModel: detailFactory.makeDetailViewModel(), - boardId: board.id + boardId: board.id, + updateFactory: updateFactory, + reportFactory: reportFactory ) ) { CommunityPostFeedCard(board: board) diff --git a/Community/Sources/Presentation/Detail/CommunityDetail.swift b/Community/Sources/Presentation/Detail/CommunityDetail.swift index 589a12e..42ce982 100644 --- a/Community/Sources/Presentation/Detail/CommunityDetail.swift +++ b/Community/Sources/Presentation/Detail/CommunityDetail.swift @@ -11,7 +11,10 @@ import CommunityDomain import SharedUI public protocol UpdateBoardFactory { - func makeViewModel() -> CommunityWriteViewModelProtocol + func makeViewModel(boardId: Int) -> CommunityWriteViewModelProtocol +} +public protocol ReportBoardFactory { + func makeViewModel(req: ReportRequest) -> CommunityReportViewModel } public struct CommunityDetailView: View { @@ -37,15 +40,18 @@ public struct CommunityDetailView: View { private let boardId: Int private let updateFactory: UpdateBoardFactory + private let reportFactory: ReportBoardFactory public init( viewModel: CommunityDetailViewModel, boardId: Int, - updateFactory: UpdateBoardFactory + updateFactory: UpdateBoardFactory, + reportFactory: ReportBoardFactory, ) { _viewModel = State(initialValue: viewModel) self.boardId = boardId self.updateFactory = updateFactory + self.reportFactory = reportFactory } public var body: some View { @@ -125,8 +131,15 @@ public struct CommunityDetailView: View { if let currentUserId = viewModel.currentUserId, Int64(comment.authorId) != currentUserId { NavigationLink( - // TODO: CommunityReportView 추가 - destination: Text("신고") + destination: CommunityReportView( + viewModel: reportFactory.makeViewModel( + req: CommunityDomain.ReportRequest.init( + targetId: comment.id, + targetType: .comment, + reason: "" + ) + ) + ) ) { Text("신고") } @@ -141,7 +154,7 @@ public struct CommunityDetailView: View { Int64(authorId) == currentUserId { NavigationLink( destination: CommunityWriteView( - viewModel: updateFactory.makeViewModel(), + viewModel: updateFactory.makeViewModel(boardId: boardId), title: viewModel.board?.title ?? "", content: viewModel.board?.content ?? "" ) @@ -159,9 +172,18 @@ public struct CommunityDetailView: View { if let currentUserId = viewModel.currentUserId, let authorId = viewModel.board?.authorId, Int64(authorId) != currentUserId { - Button("신고") { - reportTargetId = boardId - reportTargetType = .board + NavigationLink( + destination: CommunityReportView( + viewModel: reportFactory.makeViewModel( + req: CommunityDomain.ReportRequest.init( + targetId: boardId, + targetType: .board, + reason: "" + ) + ) + ) + ) { + Text("신고") } } @@ -446,18 +468,6 @@ public struct CommunityDetailView: View { ) } -// Button { -// Task { -// if let targetId = reportTargetId, let targetType = reportTargetType { -// await viewModel.reportContent(targetId: targetId, targetType: targetType, reason: reportReason) -// reportReason = "" -// reportTargetId = nil -// reportTargetType = nil -// } -// } - - - private func timeAgoDisplay(_ date: Date) -> String { let now = Date() let timeInterval = now.timeIntervalSince(date) diff --git a/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift b/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift index 9fb9819..a279c32 100644 --- a/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift +++ b/Community/Sources/Presentation/Detail/CommunityDetailViewModel.swift @@ -229,17 +229,4 @@ public final class CommunityDetailViewModel { print("❌ Toggle like error: \(error)") } } - - // MARK: - Report Methods - public func reportContent(targetId: Int, targetType: ReportTargetType, reason: String) async { - let request = ReportRequest(targetId: targetId, targetType: targetType, reason: reason) - - do { - try await reportContentUseCase.execute(request: request) - print("✅ Content reported") - } catch { - errorMessage = error.localizedDescription - print("❌ Report error: \(error)") - } - } } diff --git a/Community/Sources/Presentation/Views/Write/CommunityReportView.swift b/Community/Sources/Presentation/Report/CommunityReportView.swift similarity index 57% rename from Community/Sources/Presentation/Views/Write/CommunityReportView.swift rename to Community/Sources/Presentation/Report/CommunityReportView.swift index e23d157..e90bc07 100644 --- a/Community/Sources/Presentation/Views/Write/CommunityReportView.swift +++ b/Community/Sources/Presentation/Report/CommunityReportView.swift @@ -7,28 +7,39 @@ import SwiftUI import DesignSystem - + public struct CommunityReportView: View { + @State var viewModel: CommunityReportViewModel @Environment(\.dismiss) private var dismiss - @State private var title: String = "" - @State private var content: String = "" + @FocusState private var focusedField: Field? - private let maxCharacterCount = 300 + enum Field: Hashable { + case title + case content + } - public init() {} + public init(viewModel: CommunityReportViewModel) { + self._viewModel = State(initialValue: viewModel) + } public var body: some View { - NavigationView { + VStack(spacing: 0) { + navigationBar + VStack(spacing: 0) { - navigationBar - ScrollView { VStack(alignment: .leading, spacing: 24) { titleSection contentSection } - .padding(.horizontal, 16) .padding(.top, 20) + .background( + Color.clear + .contentShape(Rectangle()) + .onTapGesture { + focusedField = nil + } + ) } Spacer() @@ -37,11 +48,15 @@ public struct CommunityReportView: View { title: "신고 등록", style: .body(.bEmphasis) ) { + focusedField = nil // Handle submit action } + .padding(.bottom, 20) + .disabled(!viewModel.canSubmit) } - .background(Color.bgWhite) + .padding(.horizontal, 18) } + .background(Color.bgWhite) .navigationBarHidden(true) } @@ -73,38 +88,30 @@ public struct CommunityReportView: View { private var titleSection: some View { VStack(alignment: .leading, spacing: 12) { - HStack { - Text("제목") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.textG900) - Text("*") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.primaryHambugRed) - } - - BottomLineTextField(title: $title) + RequiredText("제목") + + BottomLineTextField( + title: $viewModel.title, + focusedField: $focusedField, + field: .title + ) } } private var contentSection: some View { VStack(alignment: .leading, spacing: 12) { - HStack { - Text("내용") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.textG900) - Text("*") - .pretendard(.body(.bEmphasis)) - .foregroundColor(.primaryHambugRed) - } - + RequiredText("내용") + BorderTextEditor( - maxCharacterCount: maxCharacterCount, - content: $content + maxCharacterCount: viewModel.maxCharacterCount, + content: $viewModel.content, + focusedField: $focusedField, + field: .content ) } } } -#Preview { - CommunityReportView() -} +//#Preview { +// CommunityReportView(viewModel: CommunityReportViewModel()) +//} diff --git a/Community/Sources/Presentation/Report/CommunityReportViewModel.swift b/Community/Sources/Presentation/Report/CommunityReportViewModel.swift new file mode 100644 index 0000000..ef5474e --- /dev/null +++ b/Community/Sources/Presentation/Report/CommunityReportViewModel.swift @@ -0,0 +1,58 @@ +// +// CommunityReportViewModel.swift +// Community +// +// Created by 강동영 on 1/8/26. +// + + +import Foundation +import Observation +import CommunityDomain + +@Observable +public class CommunityReportViewModel { + private let usecase: ReportContentUseCase + private let targetId: Int + private let targetType: ReportTargetType + + private let _maxCharacterCount = 300 + + var title: String = "" + var content: String = "" + var maxCharacterCount: Int { _maxCharacterCount } + + // 게시물 제출 중 상태 + public var isSubmitting: Bool = false + + /// 제출 가능 여부 + public var canSubmit: Bool { !isSubmitting } + + public var errorMessage: String? = nil + + public init( + usecase: ReportContentUseCase, + reportInfo: ReportRequest + ) { + self.usecase = usecase + self.targetId = reportInfo.targetId + self.targetType = reportInfo.targetType + } + + // MARK: - Report Methods + func report() async { + let request: ReportRequest = .init( + targetId: targetId, + targetType: targetType, + reason: "\(title): \(content)" + ) + + do { + try await usecase.execute(request: request) + print("✅ Content reported") + } catch { + errorMessage = error.localizedDescription + print("❌ Report error: \(error)") + } + } +} diff --git a/Community/Sources/Presentation/Write/CommunityWriteView.swift b/Community/Sources/Presentation/Write/CommunityWriteView.swift index 60e6117..3f27768 100644 --- a/Community/Sources/Presentation/Write/CommunityWriteView.swift +++ b/Community/Sources/Presentation/Write/CommunityWriteView.swift @@ -9,34 +9,41 @@ import SwiftUI import DesignSystem import PhotosUI import CommunityDomain +import SharedUI public struct CommunityWriteView: View { @Environment(\.dismiss) private var dismiss - @State private var selectedCategory: Category = .자유잡담 + @State private var viewModel: CommunityWriteViewModelProtocol + + @State private var selectedCategory: BoardCategory = .freeTalk @State private var title: String = "" @State private var content: String = "" @State private var characterCount: Int = 0 - @StateObject private var keyboardObserver = KeyboardObserver() @FocusState private var focusedField: Field? - @State private var viewModel: CommunityWriteViewModel + @State private var photosPickerItems: [PhotosPickerItem] = [] - private let maxCharacterCount = 300 + private let maxCharacterCount: Int - public init(viewModel: CommunityWriteViewModel) { + public init( + viewModel: CommunityWriteViewModelProtocol, + title: String = "", + content: String = "", + characterCount: Int = 0, + maxCharacterCount: Int = 300 + ) { self.viewModel = viewModel + + self.title = title + self.content = content + self.characterCount = content.count + self.maxCharacterCount = maxCharacterCount } private var isCharacterMax: Bool { characterCount >= maxCharacterCount } - enum Category: String, CaseIterable { - case 자유잡담 = "자유잡담" - case 프랜차이즈 = "프랜차이즈" - case 수제버거 = "수제버거" - case 맛집추천 = "맛집추천" - } - + enum Field: Hashable { case title case content @@ -78,10 +85,10 @@ public struct CommunityWriteView: View { ) { focusedField = nil Task { - let success = await viewModel.createBoard( + let success = await viewModel.writeBoard( title: title, content: content, - category: selectedCategory.toBoardCategory() + category: selectedCategory ) if success { dismiss() @@ -99,6 +106,7 @@ public struct CommunityWriteView: View { } message: { Text("이미지 크기가 너무 큽니다. 다른 이미지를 선택해주세요.") } + .tabBarHidden(true) } .navigationBarHidden(true) } @@ -135,11 +143,11 @@ public struct CommunityWriteView: View { ScrollView(.horizontal, showsIndicators: false) { HStack(spacing: 8) { - ForEach(Category.allCases, id: \.self) { category in + ForEach(BoardCategory.allCases, id: \.self) { category in Button { selectedCategory = category } label: { - Text(category.rawValue) + Text(category.displayName) .pretendard(.caption(.emphasis)) .foregroundColor(selectedCategory == category ? Color.primaryHambugRed : .textG600) .padding(.horizontal, 10) @@ -204,7 +212,7 @@ public struct CommunityWriteView: View { private var addImageButtonSection: some View { PhotosPicker( selection: $photosPickerItems, - maxSelectionCount: viewModel.maxImages - viewModel.selectedImages.count, + maxSelectionCount: viewModel.maxSelectionCount, matching: .images ) { Label(viewModel.imageCountText, systemImage: "camera") @@ -226,17 +234,6 @@ public struct CommunityWriteView: View { } } -extension CommunityWriteView.Category { - func toBoardCategory() -> BoardCategory { - switch self { - case .자유잡담: return .freeTalk - case .프랜차이즈: return .franchise - case .수제버거: return .handmade - case .맛집추천: return .recommendation - } - } -} - //#Preview { // let diContainer = CommunityDI.CommunityDIContainer() // CommunityWriteView(viewModel: diContainer.makeCommunityWriteViewModel()) diff --git a/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift b/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift index b66d9d7..e8e71a7 100644 --- a/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift +++ b/Community/Sources/Presentation/Write/CommunityWriteViewModel.swift @@ -12,14 +12,57 @@ import Observation import CommunityDomain import Util -@Observable -public final class CommunityWriteViewModel { +public protocol CommunityWriteViewModelProtocol { + /// 선택된 이미지 목록 + var selectedImages: [SelectedImage] { get set } + + /// Photo picker 최대 선택 가능 갯수 + var maxSelectionCount: Int { get } + + /// 이미지 처리 중 상태 + var isProcessingImages: Bool { get set } + + /// 게시물 제출 중 상태 + var isSubmitting: Bool { get set } - // MARK: - Published State (auto-tracked by @Observable) + /// 이미지 크기 초과 알림 표시 여부 + var showImageSizeAlert: Bool { get set } + + /// 이미지 추가 가능 여부 + var canAddMoreImages: Bool { get } + + /// 이미지 카운터 텍스트 + var imageCountText: String { get } + + /// 제출 가능 여부 + var canSubmit: Bool { get } + + /// PhotosPicker에서 선택한 이미지 처리 + /// - Parameter items: 선택된 PhotosPickerItem 배열 + func handleImageSelection(_ items: [PhotosPickerItem]) async + + /// 이미지 삭제 (ID) + /// - Parameter id: 삭제할 이미지의 ID + func removeImage(id: UUID) + + func writeBoard( + title: String, + content: String, + category: BoardCategory + ) async -> Bool +} +@Observable +public final class CommunityWriteViewModel: CommunityWriteViewModelProtocol { + // MARK: - Published State (auto-tracked by @Observable) /// 선택된 이미지 목록 public var selectedImages: [SelectedImage] = [] + /// Photo picker 최대 선택 가능 갯수 + public var maxSelectionCount: Int { + maxImages - selectedImages.count + } + /// 이미지 처리 중 상태 public var isProcessingImages: Bool = false @@ -35,7 +78,7 @@ public final class CommunityWriteViewModel { // MARK: - Constants /// 최대 이미지 개수 - public let maxImages: Int = 5 + private let maxImages: Int = 5 // MARK: - Dependencies @@ -120,13 +163,6 @@ public final class CommunityWriteViewModel { // MARK: - Image Management - /// 이미지 삭제 (인덱스) - /// - Parameter index: 삭제할 이미지의 인덱스 - public func removeImage(at index: Int) { - guard index < selectedImages.count else { return } - selectedImages.remove(at: index) - } - /// 이미지 삭제 (ID) /// - Parameter id: 삭제할 이미지의 ID public func removeImage(id: UUID) { @@ -141,7 +177,7 @@ public final class CommunityWriteViewModel { /// - content: 내용 /// - category: 카테고리 /// - Returns: 성공 여부 - public func createBoard( + public func writeBoard( title: String, content: String, category: BoardCategory @@ -186,3 +222,154 @@ public final class CommunityWriteViewModel { showImageSizeAlert = false } } + +@Observable +public final class UpdateBoardViewModel: CommunityWriteViewModelProtocol { + /// 최대 이미지 개수 + private let maxImages: Int = 5 + + // MARK: - Dependencies + + private let updateBoardUseCase: UpdateBoardUseCase + private let boardId: Int + + public init(boardId: Int, updateBoardUseCase: UpdateBoardUseCase) { + self.boardId = boardId + self.updateBoardUseCase = updateBoardUseCase + } + + public var selectedImages: [CommunityDomain.SelectedImage] = [] + + /// Photo picker 최대 선택 가능 갯수 + public var maxSelectionCount: Int { + maxImages - selectedImages.count + } + + /// 이미지 처리 중 상태 + public var isProcessingImages: Bool = false + + /// 게시물 제출 중 상태 + public var isSubmitting: Bool = false + + /// 에러 메시지 + public var errorMessage: String? = nil + + /// 이미지 크기 초과 알림 표시 여부 + public var showImageSizeAlert: Bool = false + + /// 이미지 추가 가능 여부 + public var canAddMoreImages: Bool { + selectedImages.count < maxImages + } + + /// 이미지 카운터 텍스트 + public var imageCountText: String { + "사진추가 (\(selectedImages.count)/\(maxImages))" + } + + /// 제출 가능 여부 + public var canSubmit: Bool { + !isSubmitting && !isProcessingImages + } + + public func handleImageSelection(_ items: [PhotosPickerItem]) async { + guard canAddMoreImages else { + return + } + + isProcessingImages = true + errorMessage = nil + + // 사용 가능한 슬롯 계산 + let availableSlots = maxImages - selectedImages.count + let itemsToProcess = Array(items.prefix(availableSlots)) + + for item in itemsToProcess { + guard let imageData = try? await item.loadTransferable(type: Data.self), + let image = UIImage(data: imageData) else { + continue + } + + let originalSize = imageData.count + let fileName = "image_\(UUID().uuidString).jpg" + + // 크기 검증 (10MB) + if originalSize > ImageProcessor.maxFileSize { + // 처리 시도 + if let _ = ImageProcessor.process(image) { + // 처리 성공 + let selectedImage = SelectedImage( + image: image, + originalSize: originalSize, + fileName: fileName + ) + selectedImages.append(selectedImage) + } else { + // 처리 실패 + showImageSizeAlert = true + } + } else { + // 크기가 괜찮으면 바로 추가 + let selectedImage = SelectedImage( + image: image, + originalSize: originalSize, + fileName: fileName + ) + selectedImages.append(selectedImage) + } + } + + isProcessingImages = false + } + + public func removeImage(id: UUID) { + selectedImages.removeAll { $0.id == id } + } + + public func writeBoard( + title: String, + content: String, + category: BoardCategory + ) async -> Bool { + guard canSubmit else { return false } + + guard !title.isEmpty && !content.isEmpty else { + errorMessage = "제목과 내용을 입력해주세요" + return false + } + + isSubmitting = true + errorMessage = nil + + do { + let images = selectedImages.map { $0.image } + + _ = try await updateBoardUseCase.execute( + boardId: boardId, + title: title, + content: content, + category: category, + images: images + ) + + print("✅ Board created successfully with \(images.count) images") + isSubmitting = false + return true + + } catch { + errorMessage = "게시글 작성에 실패했습니다: \(error.localizedDescription)" + print("❌ Board creation error: \(error)") + isSubmitting = false + return false + } + } + + // MARK: - Reset + + /// 상태 초기화 + public func reset() { + selectedImages.removeAll() + errorMessage = nil + showImageSizeAlert = false + } +} diff --git a/DI/Sources/LoginDI/LoginDIContainer.swift b/DI/Sources/LoginDI/LoginDIContainer.swift index b3531e4..aedaa61 100644 --- a/DI/Sources/LoginDI/LoginDIContainer.swift +++ b/DI/Sources/LoginDI/LoginDIContainer.swift @@ -30,7 +30,8 @@ struct LoginAssembly: Assembly { container.register(LoginRepository.self) { resolver in LoginRepositoryImpl( networkService: resolver.resolve(NetworkServiceInterface.self), - tokenStorage: resolver.resolve(TokenStorage.self) + tokenStorage: resolver.resolve(TokenStorage.self), + userDefaultsManager: resolver.resolve(UserDefaultsManager.self) ) } diff --git a/Hambug/ContentView.swift b/Hambug/ContentView.swift index e9bef31..e58c5de 100644 --- a/Hambug/ContentView.swift +++ b/Hambug/ContentView.swift @@ -11,9 +11,9 @@ import HomePresentation import HomeDI import CommunityPresentation import CommunityDI -import MyPagePresentation -import MyPageDI import SharedUI +//import MyPagePresentation +//import MyPageDI struct ContentView: View { @Environment(AppDIContainer.self) var appContainer @@ -26,22 +26,27 @@ struct ContentView: View { CommunityDIContainer(appContainer: appContainer) } - private var mypageDIContainer: MyPageDIContainer { - MyPageDIContainer(appContainer: appContainer) - } +// private var mypageDIContainer: MyPageDIContainer { +// MyPageDIContainer(appContainer: appContainer) +// } @State private var selectedTab: Int = 0 var body: some View { CustomTabView(selectedTab: $selectedTab) { Group { - HomeView(viewModel: homeDIContainer.homeViewModel) - .tag(0) + NavigationStack { + HomeView(viewModel: homeDIContainer.homeViewModel) + } + .tag(0) NavigationStack { CommunityView( viewModel: communityDIContainer.makeCommunityViewModel(), - detailFactory: communityDIContainer + writeFactory: communityDIContainer, + detailFactory: communityDIContainer, + updateFactory: communityDIContainer, + reportFactory: communityDIContainer ) } .tag(1) diff --git a/Home/Sources/Presentation/HomeView.swift b/Home/Sources/Presentation/HomeView.swift index df2fbad..fb55503 100644 --- a/Home/Sources/Presentation/HomeView.swift +++ b/Home/Sources/Presentation/HomeView.swift @@ -19,7 +19,6 @@ public struct HomeView: View { } public var body: some View { - ZStack { Color.bgG100 diff --git a/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift b/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift index 24a31de..1d2da3e 100644 --- a/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift +++ b/Infrastructure/Sources/NetworkInterface/NetworkServiceInterface.swift @@ -7,8 +7,15 @@ import Foundation import Combine +import UIKit // MARK: - Network Interface Protocol -public protocol NetworkServiceInterface { +public protocol NetworkServiceInterface: Sendable { func request(_ endpoint: any Endpoint, responseType: T.Type) -> AnyPublisher + + func uploadMultipart( + _ endpoint: any Endpoint, + images: [UIImage], + responseType: T.Type + ) -> AnyPublisher }