diff --git a/Poppool/.swiftlint.yml b/Poppool/.swiftlint.yml index 9e132e30..4718cfd2 100644 --- a/Poppool/.swiftlint.yml +++ b/Poppool/.swiftlint.yml @@ -10,6 +10,7 @@ disabled_rules: - identifier_name - cyclomatic_complexity - redundant_optional_initialization + - function_parameter_count # 기본(default) 룰이 아닌 룰들을 활성화 opt_in_rules: diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj b/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj index 75cc80c7..49b3761e 100644 --- a/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj +++ b/Poppool/CoreLayer/Infrastructure/Infrastructure.xcodeproj/project.pbxproj @@ -46,7 +46,6 @@ files = ( 4EBC91D32DB8039800495C3B /* OSLog.framework in Frameworks */, 0522C1D72DB67B4F00B141FF /* RxSwift in Frameworks */, - 05EC93DE2DB6612100771CB3 /* RxGesture in Frameworks */, 05EC93D92DB6605100771CB3 /* RxCocoa in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -112,7 +111,6 @@ name = Infrastructure; packageProductDependencies = ( 05EC93D82DB6605100771CB3 /* RxCocoa */, - 05EC93DD2DB6612100771CB3 /* RxGesture */, 0522C1D62DB67B4F00B141FF /* RxSwift */, ); productName = Infrastructure; @@ -436,11 +434,6 @@ package = 05C1D82E2DB53CE300508FFD /* XCRemoteSwiftPackageReference "RxSwift" */; productName = RxCocoa; }; - 05EC93DD2DB6612100771CB3 /* RxGesture */ = { - isa = XCSwiftPackageProductDependency; - package = 05EC93DC2DB6612100771CB3 /* XCRemoteSwiftPackageReference "RxGesture" */; - productName = RxGesture; - }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 058CC90F2DB5383C0084221A /* Project object */; diff --git a/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift index d3ef879b..52211c19 100644 --- a/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift +++ b/Poppool/CoreLayer/Infrastructure/Infrastructure/Service/UserDefaultService.swift @@ -66,3 +66,63 @@ public final class UserDefaultService { UserDefaults.standard.removeObject(forKey: key) } } + +// MARK: - Key base +extension UserDefaultService { + public enum Key: String { + case searchKeyword = "searchList" + } + + /// Userdefault 데이터 저장 메서드 + /// - Parameters: + /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등 + /// - value: 저장하는 데이터 값 i.e) access token 등 + /// - to: 로컬 데이터베이스 타입 - DatabaseType + /// - Returns: 별도 안내 없음 + public func save(keyType: Key, value: String) { + UserDefaults.standard.set(value, forKey: keyType.rawValue) + } + + /// Userdefault 데이터 저장 메서드 + /// - Parameters: + /// - key: 저장하는 데이터의 키 값 i.e) 유저 id 등 + /// - value: 저장하는 데이터 값 i.e) access token 등 + /// - to: 로컬 데이터베이스 타입 - DatabaseType + /// - Returns: 별도 안내 없음 + public func save(keyType: Key, value: [String]) { + UserDefaults.standard.set(value, forKey: keyType.rawValue) + } + + /// Userdefault 데이터 발견 메서드 + /// - Parameters: + /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등 + /// - from: 로컬 데이터베이스 타입 - DatabaseType + /// - Returns: 찾은 데이터 - String 타입 + public func fetch(keyType: Key) -> String? { + if let token = UserDefaults.standard.string(forKey: keyType.rawValue) { + return token + } + return nil + } + + /// Userdefault 데이터 발견 메서드 + /// - Parameters: + /// - key: 찾는 데이터의 키 값 i.e) 유저 id 등 + /// - from: 로컬 데이터베이스 타입 - DatabaseType + /// - Returns: 찾은 데이터 - String 타입 + public func fetchArray(keyType: Key) -> [String]? { + if let token = UserDefaults.standard.array(forKey: keyType.rawValue) as? [String] { + return token + } + return nil + } + + /// Userdefault 데이터 삭제 메서드 + /// - Parameters: + /// - key: 삭제하는 데이터의 키 값 i.e) 유저 id 등 + /// - from: 로컬 데이터베이스 타입 - DatabaseType + /// - Returns: 별도 안내 없음 + public func delete(keyType: Key) { + UserDefaults.standard.removeObject(forKey: keyType.rawValue) + } +} diff --git a/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj b/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj index dfaf69fc..427daac0 100644 --- a/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj +++ b/Poppool/DataLayer/Data/Data.xcodeproj/project.pbxproj @@ -31,6 +31,8 @@ Network/API/AuthAPI/AuthAPIEndPoint.swift, Network/API/AuthAPI/ResponseDTO/LoginResponseDTO.swift, Network/API/AuthAPI/ResponseDTO/PostTokenReissueResponseDTO.swift, + Network/API/CategoryAPI/CategoryAPIEndpoint.swift, + Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift, Network/API/CommentAPI/CommentAPIEndPoint.swift, Network/API/CommentAPI/RequestDTO/DeleteCommentRequestDTO.swift, Network/API/CommentAPI/RequestDTO/PostCommentRequestDTO.swift, @@ -57,9 +59,11 @@ Network/API/PreSignedAPI/RequestDTO/PresignedURLRequestDTO.swift, Network/API/PreSignedAPI/ResponseDTO/PreSignedURLDTO.swift, Network/API/PreSignedAPI/ResponseDTO/PreSignedURLResponseDTO.swift, + Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift, + Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift, + Network/API/SearchAPI/SearchAPIEndPoint.swift, Network/API/SignUpAPI/RequestDTO/CheckNickNameRequestDTO.swift, Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift, - Network/API/SignUpAPI/ResponseDTO/GetCategoryListResponseDTO.swift, Network/API/SignUpAPI/SignUpAPIEndpoint.swift, Network/API/UserAPI/RequesetDTO/CommentLikeRequestDTO.swift, Network/API/UserAPI/RequesetDTO/GetMyCommentRequestDTO.swift, @@ -96,6 +100,7 @@ RepositoryImpl/AdminRepositoryImpl.swift, RepositoryImpl/AppleLoginRepositoryImpl.swift, RepositoryImpl/AuthAPIRepositoryImpl.swift, + RepositoryImpl/CategoryRepositoryImpl.swift, RepositoryImpl/CommentAPIRepositoryImpl.swift, RepositoryImpl/HomeAPIRepositoryImpl.swift, RepositoryImpl/KakaoLoginRepositoryImpl.swift, @@ -103,6 +108,7 @@ RepositoryImpl/MapRepositoryImpl.swift, RepositoryImpl/PopUpAPIRepositoryImpl.swift, RepositoryImpl/PreSignedRepositoryImpl.swift, + RepositoryImpl/Search/SearchAPIRepositoryImpl.swift, RepositoryImpl/SignUpRepositoryImpl.swift, RepositoryImpl/UserAPIRepositoryImpl.swift, ); diff --git a/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift new file mode 100644 index 00000000..5ad42b7d --- /dev/null +++ b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/CategoryAPIEndpoint.swift @@ -0,0 +1,16 @@ +import Foundation + +import Infrastructure + +struct CategoryAPIEndpoint { + + /// 관심사 목록을 가져옵니다. + /// - Returns: Endpoint + static func getCategoryList() -> Endpoint { + return Endpoint( + baseURL: Secrets.popPoolBaseURL, + path: "/categories", + method: .get + ) + } +} diff --git a/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/ResponseDTO/GetCategoryListResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift similarity index 76% rename from Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/ResponseDTO/GetCategoryListResponseDTO.swift rename to Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift index f964e045..63e0520b 100644 --- a/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/ResponseDTO/GetCategoryListResponseDTO.swift +++ b/Poppool/DataLayer/Data/Data/Network/API/CategoryAPI/ResponseDTO/GetCategoryListResponseDTO.swift @@ -9,12 +9,12 @@ struct GetCategoryListResponseDTO: Codable { // MARK: - InterestResponse struct CategoryResponseDTO: Codable { - let categoryId: Int64 + let categoryId: Int32 let categoryName: String } extension CategoryResponseDTO { func toDomain() -> CategoryResponse { - return CategoryResponse(categoryId: categoryId, category: categoryName) + return CategoryResponse(categoryId: Int(categoryId), category: categoryName) } } diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift new file mode 100644 index 00000000..679b1e63 --- /dev/null +++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/RequestDTO/GetSearchPopupStoreRequestDTO.swift @@ -0,0 +1,5 @@ +import Foundation + +struct GetSearchPopupStoreRequestDTO: Encodable { + let query: String +} diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift new file mode 100644 index 00000000..2872bf8a --- /dev/null +++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/ResponseDTO/GetSearchPopupStoreResponseDTO.swift @@ -0,0 +1,17 @@ +import Foundation + +import DomainInterface + +struct GetSearchPopupStoreResponseDTO: Decodable { + var popUpStoreList: [PopUpStoreResponseDTO] + var loginYn: Bool +} + +extension GetSearchPopupStoreResponseDTO { + func toDomain() -> KeywordBasePopupStoreListResponse { + return KeywordBasePopupStoreListResponse( + popupStoreList: popUpStoreList.map { $0.toDomain() }, + loginYn: loginYn + ) + } +} diff --git a/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift new file mode 100644 index 00000000..9235420d --- /dev/null +++ b/Poppool/DataLayer/Data/Data/Network/API/SearchAPI/SearchAPIEndPoint.swift @@ -0,0 +1,17 @@ +import Foundation + +import Infrastructure + +import RxSwift + +struct SearchAPIEndPoint { + + static func getSearchPopUpList(request: GetSearchPopupStoreRequestDTO) -> Endpoint { + return Endpoint( + baseURL: Secrets.popPoolBaseURL, + path: "/search/popup-stores", + method: .get, + queryParameters: request + ) + } +} diff --git a/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift index 74cd1019..044c86ff 100644 --- a/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift +++ b/Poppool/DataLayer/Data/Data/Network/API/SignUpAPI/RequestDTO/SignUpRequestDTO.swift @@ -13,6 +13,6 @@ struct SignUpRequestDTO: Encodable { var age: Int32 var socialEmail: String var socialType: String - var interestCategories: [Int64] + var interestCategories: [Int] var appleAuthorizationCode: String? } diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift index da3f0d33..838ddbad 100644 --- a/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/AdminRepositoryImpl.swift @@ -44,7 +44,7 @@ public final class AdminRepositoryImpl: AdminRepository { AdminStoreDetail( id: dto.id, name: dto.name, - categoryId: dto.categoryId, + categoryId: Int(dto.categoryId), categoryName: dto.categoryName, description: dto.desc, address: dto.address, @@ -77,7 +77,7 @@ public final class AdminRepositoryImpl: AdminRepository { public func createStore(params: CreateStoreParams) -> Completable { let dto = CreatePopUpStoreRequestDTO( name: params.name, - categoryId: params.categoryId, + categoryId: Int64(params.categoryId), desc: params.desc, address: params.address, startDate: params.startDate, @@ -99,7 +99,7 @@ public final class AdminRepositoryImpl: AdminRepository { popUpStore: UpdatePopUpStoreRequestDTO.PopUpStore( id: params.id, name: params.name, - categoryId: params.categoryId, + categoryId: Int64(params.categoryId), desc: params.desc, address: params.address, startDate: params.startDate, diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift new file mode 100644 index 00000000..5616be38 --- /dev/null +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/CategoryRepositoryImpl.swift @@ -0,0 +1,21 @@ +import Foundation + +import DomainInterface + +import RxSwift + +public final class CategoryRepositoryImpl: CategoryRepository { + + private let provider: Provider + + public init(provider: Provider) { + self.provider = provider + } + + public func fetchCategoryList() -> Observable<[CategoryResponse]> { + let endPoint = CategoryAPIEndpoint.getCategoryList() + return provider.requestData(with: endPoint, interceptor: TokenInterceptor()).map { responseDTO in + return responseDTO.categoryResponseList.map({ $0.toDomain() }) + } + } +} diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift index 74f1b2ea..c6a9ba90 100644 --- a/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/MapRepositoryImpl.swift @@ -18,7 +18,7 @@ public final class MapRepositoryImpl: MapRepository { northEastLon: Double, southWestLat: Double, southWestLon: Double, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> { return provider.requestData( with: MapAPIEndpoint.locations_fetchStoresInBounds( @@ -26,7 +26,7 @@ public final class MapRepositoryImpl: MapRepository { northEastLon: northEastLon, southWestLat: southWestLat, southWestLon: southWestLon, - categories: categories + categories: categories.map { Int64($0 ) } ), interceptor: TokenInterceptor() ) @@ -35,12 +35,12 @@ public final class MapRepositoryImpl: MapRepository { public func searchStores( query: String, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> { return provider.requestData( with: MapAPIEndpoint.locations_searchStores( query: query, - categories: categories + categories: categories.map { Int64($0 ) } ), interceptor: TokenInterceptor() ) diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift new file mode 100644 index 00000000..1e190673 --- /dev/null +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/Search/SearchAPIRepositoryImpl.swift @@ -0,0 +1,41 @@ +import Foundation + +import DomainInterface +import Infrastructure + +import RxSwift + +public final class SearchAPIRepositoryImpl: SearchAPIRepository { + + private let provider: Provider + private let tokenInterceptor = TokenInterceptor() + private let userDefaultService: UserDefaultService + + public init( + provider: Provider, + userDefaultService: UserDefaultService + ) { + self.provider = provider + self.userDefaultService = userDefaultService + } + + public func fetchSearchResult(by query: String) -> Observable { + + let request = GetSearchPopupStoreRequestDTO(query: query) + let endPoint = SearchAPIEndPoint.getSearchPopUpList(request: request) + return provider.requestData( + with: endPoint, + interceptor: tokenInterceptor + ) + .map { $0.toDomain() } + .do { _ in self.saveSearchKeyword(keyword: query) } + } +} + +private extension SearchAPIRepositoryImpl { + func saveSearchKeyword(keyword: String) { + let existingList = userDefaultService.fetchArray(keyType: .searchKeyword) ?? [] + let updatedList = [keyword] + existingList.filter { $0 != keyword } + userDefaultService.save(keyType: .searchKeyword, value: updatedList) + } +} diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift index f8009fbb..8b769303 100644 --- a/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/SignUpRepositoryImpl.swift @@ -30,7 +30,7 @@ public final class SignUpRepositoryImpl: SignUpRepository { age: Int32, socialEmail: String, socialType: String, - interests: [Int64], + interests: [Int], appleAuthorizationCode: String? ) -> Completable { let endPoint = SignUpAPIEndpoint.signUp_trySignUp(with: .init( diff --git a/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift b/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift index 2e8d9c98..ae4713ae 100644 --- a/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift +++ b/Poppool/DataLayer/Data/Data/RepositoryImpl/UserAPIRepositoryImpl.swift @@ -86,14 +86,14 @@ public final class UserAPIRepositoryImpl: UserAPIRepository { } public func putUserCategory( - interestCategoriesToAdd: [Int64], - interestCategoriesToDelete: [Int64], - interestCategoriesToKeep: [Int64] + interestCategoriesToAdd: [Int], + interestCategoriesToDelete: [Int], + interestCategoriesToKeep: [Int] ) -> Completable { let request = PutUserCategoryRequestDTO( - interestCategoriesToAdd: interestCategoriesToAdd, - interestCategoriesToDelete: interestCategoriesToDelete, - interestCategoriesToKeep: interestCategoriesToKeep + interestCategoriesToAdd: interestCategoriesToAdd.map { Int64($0 ) }, + interestCategoriesToDelete: interestCategoriesToDelete.map { Int64($0 ) }, + interestCategoriesToKeep: interestCategoriesToKeep.map { Int64($0 ) } ) let endPoint = UserAPIEndPoint.putUserCategory(request: request) return provider.request(with: endPoint, interceptor: tokenInterceptor) diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift new file mode 100644 index 00000000..aab8b580 --- /dev/null +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/FetchCategoryListUseCaseImpl.swift @@ -0,0 +1,18 @@ +import Foundation + +import DomainInterface + +import RxSwift + +public final class FetchCategoryListUseCaseImpl: FetchCategoryListUseCase { + + private let repository: CategoryRepository + + public init(repository: CategoryRepository) { + self.repository = repository + } + + public func execute() -> Observable<[CategoryResponse]> { + return repository.fetchCategoryList() + } +} diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift index 457d8a8c..ac9a4998 100644 --- a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/MapUseCaseImpl.swift @@ -22,7 +22,7 @@ public final class MapUseCaseImpl: MapUseCase { northEastLon: Double, southWestLat: Double, southWestLon: Double, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> { return repository.fetchStoresInBounds( northEastLat: northEastLat, @@ -40,7 +40,7 @@ public final class MapUseCaseImpl: MapUseCase { public func searchStores( query: String, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> { return repository.searchStores( query: query, diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift index 716f1304..ee20c061 100644 --- a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/PopUpAPIUseCaseImpl.swift @@ -12,7 +12,7 @@ public final class PopUpAPIUseCaseImpl: PopUpAPIUseCase { self.repository = repository } - public func getSearchBottomPopUpList(isOpen: Bool, categories: [Int64], page: Int32?, size: Int32, sort: String?) -> Observable { + public func getSearchBottomPopUpList(isOpen: Bool, categories: [Int], page: Int32?, size: Int32, sort: String?) -> Observable { var categoryString: String? if !categories.isEmpty { categoryString = categories.map { String($0) + "," }.reduce("", +) diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift new file mode 100644 index 00000000..4b723585 --- /dev/null +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/Search/FetchKeywordBasePopupStoreListImpl.swift @@ -0,0 +1,18 @@ +import Foundation + +import DomainInterface + +import RxSwift + +public final class FetchKeywordBasePopupListUseCaseImpl: FetchKeywordBasePopupListUseCase { + + private let repository: SearchAPIRepository + + public init(repository: SearchAPIRepository) { + self.repository = repository + } + + public func execute(keyword: String) -> Observable { + return repository.fetchSearchResult(by: keyword) + } +} diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift index 1086c284..f1b3497e 100644 --- a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/SignUpAPIUseCaseImpl.swift @@ -17,7 +17,7 @@ public final class SignUpAPIUseCaseImpl: SignUpAPIUseCase { age: Int32, socialEmail: String, socialType: String, - interests: [Int64], + interests: [Int], appleAuthorizationCode: String? ) -> Completable { return repository.trySignUp( diff --git a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift index c70de393..b42fed78 100644 --- a/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift +++ b/Poppool/DomainLayer/Domain/Domain/UseCaseImpl/UserAPIUseCaseImpl.swift @@ -76,9 +76,9 @@ public final class UserAPIUseCaseImpl: UserAPIUseCase { } public func putUserCategory( - interestCategoriesToAdd: [Int64], - interestCategoriesToDelete: [Int64], - interestCategoriesToKeep: [Int64] + interestCategoriesToAdd: [Int], + interestCategoriesToDelete: [Int], + interestCategoriesToKeep: [Int] ) -> Completable { return repository.putUserCategory( interestCategoriesToAdd: interestCategoriesToAdd, diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift index 7dbb50b8..fe4a5a2e 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/AdminStoreDetail.swift @@ -1,7 +1,7 @@ import Foundation public struct AdminStoreDetail { - public init(id: Int64, name: String, categoryId: Int64, categoryName: String, description: String, address: String, startDate: String, endDate: String, createUserId: String, createDateTime: String, mainImageUrl: String, bannerYn: Bool, images: [StoreImage], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String) { + public init(id: Int64, name: String, categoryId: Int, categoryName: String, description: String, address: String, startDate: String, endDate: String, createUserId: String, createDateTime: String, mainImageUrl: String, bannerYn: Bool, images: [StoreImage], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String) { self.id = id self.name = name self.categoryId = categoryId @@ -23,7 +23,7 @@ public struct AdminStoreDetail { public let id: Int64 public let name: String - public let categoryId: Int64 + public let categoryId: Int public let categoryName: String public let description: String public let address: String diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift index 029b9793..8e5f46fe 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AdminResponse/Params/AdminParams.swift @@ -1,7 +1,7 @@ import Foundation public struct CreateStoreParams { - public init(name: String, categoryId: Int64, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) { + public init(name: String, categoryId: Int, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) { self.name = name self.categoryId = categoryId self.desc = desc @@ -18,7 +18,7 @@ public struct CreateStoreParams { } public let name: String - public let categoryId: Int64 + public let categoryId: Int public let desc: String public let address: String public let startDate: String @@ -33,7 +33,7 @@ public struct CreateStoreParams { } public struct UpdateStoreParams { - public init(id: Int64, name: String, categoryId: Int64, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], imagesToDelete: [Int64], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) { + public init(id: Int64, name: String, categoryId: Int, desc: String, address: String, startDate: String, endDate: String, mainImageUrl: String, imageUrlList: [String?], imagesToDelete: [Int64], latitude: Double, longitude: Double, markerTitle: String, markerSnippet: String, startDateBeforeEndDate: Bool) { self.id = id self.name = name self.categoryId = categoryId @@ -53,7 +53,7 @@ public struct UpdateStoreParams { public let id: Int64 public let name: String - public let categoryId: Int64 + public let categoryId: Int public let desc: String public let address: String public let startDate: String diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift index 23d1c6e0..84810945 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/AuthResponse/CategoryResponse.swift @@ -1,11 +1,11 @@ import Foundation public struct CategoryResponse { - public init(categoryId: Int64, category: String) { + public init(categoryId: Int, category: String) { self.categoryId = categoryId self.category = category } - public let categoryId: Int64 + public let categoryId: Int public let category: String } diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift b/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift new file mode 100644 index 00000000..b1c60718 --- /dev/null +++ b/Poppool/DomainLayer/Domain/DomainInterface/Entity/SearchResponse/KeywordBasePopupStoreListResponse.swift @@ -0,0 +1,11 @@ +import Foundation + +public struct KeywordBasePopupStoreListResponse { + public init(popupStoreList: [PopUpStoreResponse], loginYn: Bool) { + self.popupStoreList = popupStoreList + self.loginYn = loginYn + } + + public var popupStoreList: [PopUpStoreResponse] + public var loginYn: Bool +} diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift new file mode 100644 index 00000000..1df92582 --- /dev/null +++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/CategoryRepository.swift @@ -0,0 +1,7 @@ +import Foundation + +import RxSwift + +public protocol CategoryRepository { + func fetchCategoryList() -> Observable<[CategoryResponse]> +} diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift index 4f086267..cf86192f 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/MapRepository.swift @@ -8,12 +8,12 @@ public protocol MapRepository { northEastLon: Double, southWestLat: Double, southWestLon: Double, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> func searchStores( query: String, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> func fetchCategories() -> Observable<[CategoryResponse]> diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift new file mode 100644 index 00000000..4d428540 --- /dev/null +++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SearchAPIRepository.swift @@ -0,0 +1,7 @@ +import Foundation + +import RxSwift + +public protocol SearchAPIRepository { + func fetchSearchResult(by query: String) -> Observable +} diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift index 7ce31985..5aca1507 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/SignUpRepository.swift @@ -11,7 +11,7 @@ public protocol SignUpRepository { age: Int32, socialEmail: String, socialType: String, - interests: [Int64], + interests: [Int], appleAuthorizationCode: String? ) -> Completable } diff --git a/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift b/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift index 2b2658a0..ba4f8e6c 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/Repository/UserAPIRepository.swift @@ -27,9 +27,9 @@ public protocol UserAPIRepository { func putUserTailoredInfo(gender: String?, age: Int32) -> Completable func putUserCategory( - interestCategoriesToAdd: [Int64], - interestCategoriesToDelete: [Int64], - interestCategoriesToKeep: [Int64] + interestCategoriesToAdd: [Int], + interestCategoriesToDelete: [Int], + interestCategoriesToKeep: [Int] ) -> Completable func putUserProfile( diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift new file mode 100644 index 00000000..14e35064 --- /dev/null +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/FetchCategoryListUseCase.swift @@ -0,0 +1,7 @@ +import Foundation + +import RxSwift + +public protocol FetchCategoryListUseCase { + func execute() -> Observable<[CategoryResponse]> +} diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift index b4c82a70..a56de0c9 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/MapUseCase.swift @@ -9,12 +9,12 @@ public protocol MapUseCase { northEastLon: Double, southWestLat: Double, southWestLon: Double, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> func searchStores( query: String, - categories: [Int64] + categories: [Int] ) -> Observable<[MapPopUpStore]> func filterStoresByLocation(_ stores: [MapPopUpStore], selectedRegions: [String]) -> [MapPopUpStore] diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift index 7748b47f..5c34b07b 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/PopUpAPIUseCase.swift @@ -3,7 +3,7 @@ import Foundation import RxSwift public protocol PopUpAPIUseCase { - func getSearchBottomPopUpList(isOpen: Bool, categories: [Int64], page: Int32?, size: Int32, sort: String?) -> Observable + func getSearchBottomPopUpList(isOpen: Bool, categories: [Int], page: Int32?, size: Int32, sort: String?) -> Observable func getSearchPopUpList(query: String?) -> Observable func getPopUpDetail(commentType: String?, popUpStoredId: Int64, isViewCount: Bool?) -> Observable func getPopUpComment(commentType: String?, page: Int32?, size: Int32?, sort: String?, popUpStoreId: Int64) -> Observable diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift new file mode 100644 index 00000000..0ecfceab --- /dev/null +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/Search/FetchKeywordBasePopupStoreList.swift @@ -0,0 +1,7 @@ +import Foundation + +import RxSwift + +public protocol FetchKeywordBasePopupListUseCase { + func execute(keyword: String) -> Observable +} diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift index dc8fb97d..89883291 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/SignUpAPIUseCase.swift @@ -9,7 +9,7 @@ public protocol SignUpAPIUseCase { age: Int32, socialEmail: String, socialType: String, - interests: [Int64], + interests: [Int], appleAuthorizationCode: String? ) -> Completable diff --git a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift index 6f74f9f8..b488b1a1 100644 --- a/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift +++ b/Poppool/DomainLayer/Domain/DomainInterface/UseCase/UserAPIUseCase.swift @@ -16,7 +16,7 @@ public protocol UserAPIUseCase { func postWithdrawl(surveyList: [GetWithdrawlListDataResponse]) -> Completable func getMyProfile() -> Observable func putUserTailoredInfo(gender: String?, age: Int32) -> Completable - func putUserCategory(interestCategoriesToAdd: [Int64], interestCategoriesToDelete: [Int64], interestCategoriesToKeep: [Int64]) -> Completable + func putUserCategory(interestCategoriesToAdd: [Int], interestCategoriesToDelete: [Int], interestCategoriesToKeep: [Int]) -> Completable func putUserProfile(profileImageUrl: String?, nickname: String?, email: String?, instagramId: String?, intro: String?) -> Completable func getMyCommentedPopUp(page: Int32?, size: Int32?, sort: String?) -> Observable func getBlockUserList(page: Int32?, size: Int32?, sort: String?) -> Observable diff --git a/Poppool/Poppool.xcodeproj/project.pbxproj b/Poppool/Poppool.xcodeproj/project.pbxproj index a858dfe7..42b9bd8c 100644 --- a/Poppool/Poppool.xcodeproj/project.pbxproj +++ b/Poppool/Poppool.xcodeproj/project.pbxproj @@ -9,6 +9,18 @@ /* Begin PBXBuildFile section */ 0522C1D92DB67C5900B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1D82DB67C5900B141FF /* RxSwift */; }; 0522C3C62DB67D7800B141FF /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C3C52DB67D7800B141FF /* RxGesture */; }; + 05734C5A2DCDFAC20093825D /* SearchFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C582DCDFAC20093825D /* SearchFeature.framework */; }; + 05734C5B2DCDFAC20093825D /* SearchFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C582DCDFAC20093825D /* SearchFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C5C2DCDFAC20093825D /* SearchFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */; }; + 05734C5D2DCDFAC20093825D /* SearchFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C5F2DCE04CE0093825D /* PresentationInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */; }; + 05734C602DCE04CE0093825D /* PresentationInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C632DCE04FA0093825D /* Pageboy in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C622DCE04FA0093825D /* Pageboy */; }; + 05734C662DCE05070093825D /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C652DCE05070093825D /* PanModal */; }; + 05734C682DCE05240093825D /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C672DCE05240093825D /* SnapKit */; }; + 05734C6B2DCE05550093825D /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C6A2DCE05550093825D /* ReactorKit */; }; + 05734C6E2DCE05680093825D /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C6D2DCE05680093825D /* Tabman */; }; + 05734C712DCE059D0093825D /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C702DCE059D0093825D /* Then */; }; 05BBA73E2DB75DA60047A061 /* KakaoSDKUser in Frameworks */ = {isa = PBXBuildFile; productRef = 05BBA73D2DB75DA60047A061 /* KakaoSDKUser */; }; 05BDD3D62DB66E1700C1E192 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */; }; 05BDD3D72DB66E1700C1E192 /* DomainInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; @@ -20,6 +32,8 @@ 05C1D6102DB53A4900508FFD /* Infrastructure.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D6092DB53A4900508FFD /* Infrastructure.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 05C1D6112DB53A4900508FFD /* Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D60A2DB53A4900508FFD /* Presentation.framework */; }; 05C1D6122DB53A4900508FFD /* Presentation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D60A2DB53A4900508FFD /* Presentation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFC432DCC83290051129F /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05CFFC422DCC83290051129F /* DesignSystem.framework */; }; + 05CFFC442DCC83290051129F /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05CFFC422DCC83290051129F /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 4E15142A2D99480200DFD08F /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 4E1514292D99480200DFD08F /* NMapsMap */; }; 4E15142E2D994A3A00DFD08F /* KakaoSDKAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 4E15142D2D994A3A00DFD08F /* KakaoSDKAuth */; }; 4EE360FD2D91876300D2441D /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 4EE360FC2D91876300D2441D /* NMapsMap */; }; @@ -32,10 +46,14 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 05734C5B2DCDFAC20093825D /* SearchFeature.framework in Embed Frameworks */, 05BDD3D72DB66E1700C1E192 /* DomainInterface.framework in Embed Frameworks */, 05C1D6102DB53A4900508FFD /* Infrastructure.framework in Embed Frameworks */, 05C1D60E2DB53A4900508FFD /* Domain.framework in Embed Frameworks */, + 05734C602DCE04CE0093825D /* PresentationInterface.framework in Embed Frameworks */, + 05CFFC442DCC83290051129F /* DesignSystem.framework in Embed Frameworks */, 05C1D6122DB53A4900508FFD /* Presentation.framework in Embed Frameworks */, + 05734C5D2DCDFAC20093825D /* SearchFeatureInterface.framework in Embed Frameworks */, 05C1D60C2DB53A4900508FFD /* Data.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -45,11 +63,15 @@ /* Begin PBXFileReference section */ 05229DD02D99519200D88E73 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; + 05734C582DCDFAC20093825D /* SearchFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SearchFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SearchFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PresentationInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D6072DB53A4900508FFD /* Data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Data.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D6082DB53A4900508FFD /* Domain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Domain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D6092DB53A4900508FFD /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D60A2DB53A4900508FFD /* Presentation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Presentation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05CFFC422DCC83290051129F /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BDCA41BD2CF35AC0005EECF6 /* Poppool.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Poppool.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -83,16 +105,26 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 05734C662DCE05070093825D /* PanModal in Frameworks */, 05C1D60F2DB53A4900508FFD /* Infrastructure.framework in Frameworks */, 05BDD3D62DB66E1700C1E192 /* DomainInterface.framework in Frameworks */, 0522C1D92DB67C5900B141FF /* RxSwift in Frameworks */, 4E15142E2D994A3A00DFD08F /* KakaoSDKAuth in Frameworks */, + 05734C6E2DCE05680093825D /* Tabman in Frameworks */, 05C1D60D2DB53A4900508FFD /* Domain.framework in Frameworks */, 05C1D6112DB53A4900508FFD /* Presentation.framework in Frameworks */, + 05734C5C2DCDFAC20093825D /* SearchFeatureInterface.framework in Frameworks */, 05C1D60B2DB53A4900508FFD /* Data.framework in Frameworks */, + 05734C712DCE059D0093825D /* Then in Frameworks */, 05BBA73E2DB75DA60047A061 /* KakaoSDKUser in Frameworks */, + 05734C6B2DCE05550093825D /* ReactorKit in Frameworks */, + 05734C5A2DCDFAC20093825D /* SearchFeature.framework in Frameworks */, + 05734C5F2DCE04CE0093825D /* PresentationInterface.framework in Frameworks */, 0522C3C62DB67D7800B141FF /* RxGesture in Frameworks */, + 05CFFC432DCC83290051129F /* DesignSystem.framework in Frameworks */, 4EE360FD2D91876300D2441D /* NMapsMap in Frameworks */, + 05734C682DCE05240093825D /* SnapKit in Frameworks */, + 05734C632DCE04FA0093825D /* Pageboy in Frameworks */, 4E15142A2D99480200DFD08F /* NMapsMap in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -103,6 +135,10 @@ 05C1D6062DB53A4900508FFD /* Frameworks */ = { isa = PBXGroup; children = ( + 05734C5E2DCE04CE0093825D /* PresentationInterface.framework */, + 05734C582DCDFAC20093825D /* SearchFeature.framework */, + 05734C592DCDFAC20093825D /* SearchFeatureInterface.framework */, + 05CFFC422DCC83290051129F /* DesignSystem.framework */, 05BDD3D52DB66E1700C1E192 /* DomainInterface.framework */, 05C1D6072DB53A4900508FFD /* Data.framework */, 05C1D6082DB53A4900508FFD /* Domain.framework */, @@ -157,6 +193,12 @@ 0522C1D82DB67C5900B141FF /* RxSwift */, 0522C3C52DB67D7800B141FF /* RxGesture */, 05BBA73D2DB75DA60047A061 /* KakaoSDKUser */, + 05734C622DCE04FA0093825D /* Pageboy */, + 05734C652DCE05070093825D /* PanModal */, + 05734C672DCE05240093825D /* SnapKit */, + 05734C6A2DCE05550093825D /* ReactorKit */, + 05734C6D2DCE05680093825D /* Tabman */, + 05734C702DCE059D0093825D /* Then */, ); productName = Poppool; productReference = BDCA41BD2CF35AC0005EECF6 /* Poppool.app */; @@ -191,6 +233,11 @@ 05BDD5C32DB674E500C1E192 /* XCRemoteSwiftPackageReference "SnapKit" */, 05BDD5D62DB6783C00C1E192 /* XCRemoteSwiftPackageReference "RxSwift" */, 0522C3C42DB67D7800B141FF /* XCRemoteSwiftPackageReference "RxGesture" */, + 05734C612DCE04FA0093825D /* XCRemoteSwiftPackageReference "Pageboy" */, + 05734C642DCE05070093825D /* XCRemoteSwiftPackageReference "PanModal" */, + 05734C692DCE05550093825D /* XCRemoteSwiftPackageReference "ReactorKit" */, + 05734C6C2DCE05680093825D /* XCRemoteSwiftPackageReference "Tabman" */, + 05734C6F2DCE059D0093825D /* XCRemoteSwiftPackageReference "Then" */, ); preferredProjectObjectVersion = 56; productRefGroup = BDCA41BE2CF35AC0005EECF6 /* Products */; @@ -491,6 +538,46 @@ minimumVersion = 4.0.4; }; }; + 05734C612DCE04FA0093825D /* XCRemoteSwiftPackageReference "Pageboy" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/uias/Pageboy"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.2.0; + }; + }; + 05734C642DCE05070093825D /* XCRemoteSwiftPackageReference "PanModal" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/slackhq/PanModal"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.2.7; + }; + }; + 05734C692DCE05550093825D /* XCRemoteSwiftPackageReference "ReactorKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactorKit/ReactorKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.2.0; + }; + }; + 05734C6C2DCE05680093825D /* XCRemoteSwiftPackageReference "Tabman" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/uias/Tabman"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.2.0; + }; + }; + 05734C6F2DCE059D0093825D /* XCRemoteSwiftPackageReference "Then" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/devxoul/Then"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.0; + }; + }; 05BDD5C32DB674E500C1E192 /* XCRemoteSwiftPackageReference "SnapKit" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SnapKit/SnapKit"; @@ -544,6 +631,36 @@ package = 0522C3C42DB67D7800B141FF /* XCRemoteSwiftPackageReference "RxGesture" */; productName = RxGesture; }; + 05734C622DCE04FA0093825D /* Pageboy */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C612DCE04FA0093825D /* XCRemoteSwiftPackageReference "Pageboy" */; + productName = Pageboy; + }; + 05734C652DCE05070093825D /* PanModal */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C642DCE05070093825D /* XCRemoteSwiftPackageReference "PanModal" */; + productName = PanModal; + }; + 05734C672DCE05240093825D /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05BDD5C32DB674E500C1E192 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; + 05734C6A2DCE05550093825D /* ReactorKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C692DCE05550093825D /* XCRemoteSwiftPackageReference "ReactorKit" */; + productName = ReactorKit; + }; + 05734C6D2DCE05680093825D /* Tabman */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C6C2DCE05680093825D /* XCRemoteSwiftPackageReference "Tabman" */; + productName = Tabman; + }; + 05734C702DCE059D0093825D /* Then */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C6F2DCE059D0093825D /* XCRemoteSwiftPackageReference "Then" */; + productName = Then; + }; 05BBA73D2DB75DA60047A061 /* KakaoSDKUser */ = { isa = XCSwiftPackageProductDependency; package = 08F403312D884F4D00BFA61A /* XCRemoteSwiftPackageReference "kakao-ios-sdk" */; diff --git a/Poppool/Poppool.xcworkspace/contents.xcworkspacedata b/Poppool/Poppool.xcworkspace/contents.xcworkspacedata index 5e470cb2..67537ffe 100644 --- a/Poppool/Poppool.xcworkspace/contents.xcworkspacedata +++ b/Poppool/Poppool.xcworkspace/contents.xcworkspacedata @@ -24,6 +24,12 @@ + + + + + + + + IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded + + + diff --git a/Poppool/Poppool/Application/AppDelegate.swift b/Poppool/Poppool/Application/AppDelegate.swift index 46c60253..82d5d5a8 100644 --- a/Poppool/Poppool/Application/AppDelegate.swift +++ b/Poppool/Poppool/Application/AppDelegate.swift @@ -5,6 +5,10 @@ import Data import Domain import DomainInterface import Infrastructure +import Presentation +import PresentationInterface +import SearchFeature +import SearchFeatureInterface import KakaoSDKCommon import NMapsMap @@ -20,6 +24,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { locationManager.requestWhenInUseAuthorization() self.registerDependencies() + self.registerFactory() return true } @@ -36,10 +41,12 @@ extension AppDelegate { private func registerDependencies() { // MARK: Register Service DIContainer.register(Provider.self) { return ProviderImpl() } + DIContainer.register(UserDefaultService.self) { return UserDefaultService() } DIContainer.register(KeyChainService.self) { return KeyChainService() } // MARK: Resolve service @Dependency var provider: Provider + @Dependency var userDefaultService: UserDefaultService // MARK: Register repository DIContainer.register(MapRepository.self) { return MapRepositoryImpl(provider: provider) } @@ -54,6 +61,8 @@ extension AppDelegate { DIContainer.register(PreSignedRepository.self) { return PreSignedRepositoryImpl() } DIContainer.register(KakaoLoginRepository.self) { return KakaoLoginRepositoryImpl() } DIContainer.register(AppleLoginRepository.self) { return AppleLoginRepositoryImpl() } + DIContainer.register(CategoryRepository.self) { return CategoryRepositoryImpl(provider: provider) } + DIContainer.register(SearchAPIRepository.self) { return SearchAPIRepositoryImpl(provider: provider, userDefaultService: userDefaultService) } // MARK: Resolve repository @Dependency var mapRepository: MapRepository @@ -67,6 +76,8 @@ extension AppDelegate { @Dependency var preSignedRepository: PreSignedRepository @Dependency var kakaoLoginRepository: KakaoLoginRepository @Dependency var appleLoginRepository: AppleLoginRepository + @Dependency var categoryRepository: CategoryRepository + @Dependency var searchAPIRepository: SearchAPIRepository // MARK: Register UseCase DIContainer.register(MapUseCase.self) { return MapUseCaseImpl(repository: mapRepository) } @@ -80,5 +91,14 @@ extension AppDelegate { DIContainer.register(PreSignedUseCase.self) { return PreSignedUseCaseImpl(repository: preSignedRepository) } DIContainer.register(KakaoLoginUseCase.self) { return KakaoLoginUseCaseImpl(repository: kakaoLoginRepository) } DIContainer.register(AppleLoginUseCase.self) { return AppleLoginUseCaseImpl(repository: appleLoginRepository) } + DIContainer.register(FetchCategoryListUseCase.self) { return FetchCategoryListUseCaseImpl(repository: categoryRepository) } + DIContainer.register(FetchKeywordBasePopupListUseCase.self) { return FetchKeywordBasePopupListUseCaseImpl(repository: searchAPIRepository) } + } + + private func registerFactory() { + DIContainer.register(PopupSearchFactory.self) { return PopupSearchFactoryImpl() } + DIContainer.register(DetailFactory.self) { return DetailFactoryImpl() } + DIContainer.register(CategorySelectorFactory.self) { return CategorySelectorFactoryImpl() } + DIContainer.register(FilterSelectorFactory.self) { return FilterSelectorFactoryImpl() } } } diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/Contents.json index c203dc7e..f64986bb 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "icon_bookmark_fill.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "solid.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/icon_bookmark_fill.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/icon_bookmark_fill.png deleted file mode 100644 index d52d7e28..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/icon_bookmark_fill.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/solid.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/solid.svg new file mode 100644 index 00000000..1ef76aed --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark.imageset/solid.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/Contents.json index fb8ebfdd..44808aa2 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "solid.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "solid-1.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid-1.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid-1.svg new file mode 100644 index 00000000..6d836093 --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid-1.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid.png deleted file mode 100644 index 0dfdebb1..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_bookmark/icon_bookmark_fill.imageset/solid.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/Contents.json deleted file mode 100644 index d67ddcf1..00000000 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "filename" : "icon_clearButton.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/icon_clearButton.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/icon_clearButton.png deleted file mode 100644 index b8a1cd0d..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clearButton.imageset/icon_clearButton.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/Contents.json new file mode 100644 index 00000000..f64986bb --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "solid.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/solid.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/solid.svg new file mode 100644 index 00000000..71a10b2e --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_clear_button.imageset/solid.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/Contents.json index fb8ebfdd..f64986bb 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "solid.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "solid.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.png deleted file mode 100644 index 17de8bbf..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.svg new file mode 100644 index 00000000..ec4c794b --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_dropdown.imageset/solid.svg @@ -0,0 +1,3 @@ + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/Contents.json index 25625b1d..d86eb988 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "line.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "line.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.png deleted file mode 100644 index 6cee2193..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.svg new file mode 100644 index 00000000..6dd06be5 --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_search/icon_search_gray.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/Contents.json index 0f28cb44..d86eb988 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "icon_xmark.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "line.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/icon_xmark.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/icon_xmark.png deleted file mode 100644 index 0125c188..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/icon_xmark.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/line.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/line.svg new file mode 100644 index 00000000..c95be2c3 --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/Contents.json index 3184723c..d86eb988 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "icon_xmark_gray.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "line.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/icon_xmark_gray.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/icon_xmark_gray.png deleted file mode 100644 index 37daacff..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/icon_xmark_gray.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/line.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/line.svg new file mode 100644 index 00000000..6a318745 --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_gray.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/Contents.json b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/Contents.json index b3d1a689..d86eb988 100644 --- a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/Contents.json +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/Contents.json @@ -1,17 +1,8 @@ { "images" : [ { - "filename" : "icon_xmark_white.png", - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" + "filename" : "line.svg", + "idiom" : "universal" } ], "info" : { diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/icon_xmark_white.png b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/icon_xmark_white.png deleted file mode 100644 index 6de5ee2f..00000000 Binary files a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/icon_xmark_white.png and /dev/null differ diff --git a/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/line.svg b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/line.svg new file mode 100644 index 00000000..b55257a1 --- /dev/null +++ b/Poppool/Poppool/Resource/Assets.xcassets/Icon/icon_xmark/icon_xmark_white.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/Poppool/Resource/Info.plist b/Poppool/Poppool/Resource/Info.plist index 560ae1a9..3f04e5cc 100644 --- a/Poppool/Poppool/Resource/Info.plist +++ b/Poppool/Poppool/Resource/Info.plist @@ -39,17 +39,6 @@ ${POPPOOL_BASE_URL} POPPOOL_S3_BASE_URL ${POPPOOL_S3_BASE_URL} - UIAppFonts - - GothicA1-Bold.ttf - GothicA1-Light.ttf - GothicA1-Medium.ttf - GothicA1-Regular.ttf - Poppins-Bold.ttf - Poppins-Light.ttf - Poppins-Medium.ttf - Poppins-Regular.ttf - UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem.xcodeproj/project.pbxproj b/Poppool/PresentationLayer/DesignSystem/DesignSystem.xcodeproj/project.pbxproj new file mode 100644 index 00000000..c6b12b47 --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem.xcodeproj/project.pbxproj @@ -0,0 +1,478 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 0516312C2DC3D1E900A6C0D1 /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0516312B2DC3D1E900A6C0D1 /* Infrastructure.framework */; }; + 051631602DC3D28400A6C0D1 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 0516315F2DC3D28400A6C0D1 /* RxCocoa */; }; + 051631622DC3D28400A6C0D1 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 051631612DC3D28400A6C0D1 /* RxSwift */; }; + 051631652DC3D29400A6C0D1 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 051631642DC3D29400A6C0D1 /* SnapKit */; }; + 051631682DC3D3FA00A6C0D1 /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = 051631672DC3D3FA00A6C0D1 /* Tabman */; }; + 0516316B2DC3D50700A6C0D1 /* Pageboy in Frameworks */ = {isa = PBXBuildFile; productRef = 0516316A2DC3D50700A6C0D1 /* Pageboy */; }; + 05CFFCBE2DCCB3810051129F /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 05CFFCBD2DCCB3810051129F /* Then */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 051630B82DC3D1A000A6C0D1 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0516312B2DC3D1E900A6C0D1 /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 051630BA2DC3D1A000A6C0D1 /* DesignSystem */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = DesignSystem; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 051630B52DC3D1A000A6C0D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0516316B2DC3D50700A6C0D1 /* Pageboy in Frameworks */, + 051631682DC3D3FA00A6C0D1 /* Tabman in Frameworks */, + 051631622DC3D28400A6C0D1 /* RxSwift in Frameworks */, + 05CFFCBE2DCCB3810051129F /* Then in Frameworks */, + 051631652DC3D29400A6C0D1 /* SnapKit in Frameworks */, + 051631602DC3D28400A6C0D1 /* RxCocoa in Frameworks */, + 0516312C2DC3D1E900A6C0D1 /* Infrastructure.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 051630AE2DC3D1A000A6C0D1 = { + isa = PBXGroup; + children = ( + 051630BA2DC3D1A000A6C0D1 /* DesignSystem */, + 0516312A2DC3D1E900A6C0D1 /* Frameworks */, + 051630B92DC3D1A000A6C0D1 /* Products */, + ); + sourceTree = ""; + }; + 051630B92DC3D1A000A6C0D1 /* Products */ = { + isa = PBXGroup; + children = ( + 051630B82DC3D1A000A6C0D1 /* DesignSystem.framework */, + ); + name = Products; + sourceTree = ""; + }; + 0516312A2DC3D1E900A6C0D1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0516312B2DC3D1E900A6C0D1 /* Infrastructure.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 051630B32DC3D1A000A6C0D1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 051630B72DC3D1A000A6C0D1 /* DesignSystem */ = { + isa = PBXNativeTarget; + buildConfigurationList = 051630BF2DC3D1A000A6C0D1 /* Build configuration list for PBXNativeTarget "DesignSystem" */; + buildPhases = ( + 051630B32DC3D1A000A6C0D1 /* Headers */, + 051630B42DC3D1A000A6C0D1 /* Sources */, + 051630B52DC3D1A000A6C0D1 /* Frameworks */, + 051630B62DC3D1A000A6C0D1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 051630BA2DC3D1A000A6C0D1 /* DesignSystem */, + ); + name = DesignSystem; + packageProductDependencies = ( + 0516315F2DC3D28400A6C0D1 /* RxCocoa */, + 051631612DC3D28400A6C0D1 /* RxSwift */, + 051631642DC3D29400A6C0D1 /* SnapKit */, + 051631672DC3D3FA00A6C0D1 /* Tabman */, + 0516316A2DC3D50700A6C0D1 /* Pageboy */, + 05CFFCBD2DCCB3810051129F /* Then */, + ); + productName = DesignSystem; + productReference = 051630B82DC3D1A000A6C0D1 /* DesignSystem.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 051630AF2DC3D1A000A6C0D1 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1630; + LastUpgradeCheck = 1630; + TargetAttributes = { + 051630B72DC3D1A000A6C0D1 = { + CreatedOnToolsVersion = 16.3; + }; + }; + }; + buildConfigurationList = 051630B22DC3D1A000A6C0D1 /* Build configuration list for PBXProject "DesignSystem" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 051630AE2DC3D1A000A6C0D1; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 0516315E2DC3D28400A6C0D1 /* XCRemoteSwiftPackageReference "RxSwift" */, + 051631632DC3D29400A6C0D1 /* XCRemoteSwiftPackageReference "SnapKit" */, + 051631662DC3D3FA00A6C0D1 /* XCRemoteSwiftPackageReference "Tabman" */, + 051631692DC3D50700A6C0D1 /* XCRemoteSwiftPackageReference "Pageboy" */, + 05CFFCBC2DCCB3810051129F /* XCRemoteSwiftPackageReference "Then" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 051630B92DC3D1A000A6C0D1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 051630B72DC3D1A000A6C0D1 /* DesignSystem */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 051630B62DC3D1A000A6C0D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 051630B42DC3D1A000A6C0D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 051630BD2DC3D1A000A6C0D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 051630BE2DC3D1A000A6C0D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 051630C02DC3D1A000A6C0D1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.DesignSystem; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 051630C12DC3D1A000A6C0D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.DesignSystem; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 051630B22DC3D1A000A6C0D1 /* Build configuration list for PBXProject "DesignSystem" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 051630BD2DC3D1A000A6C0D1 /* Debug */, + 051630BE2DC3D1A000A6C0D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 051630BF2DC3D1A000A6C0D1 /* Build configuration list for PBXNativeTarget "DesignSystem" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 051630C02DC3D1A000A6C0D1 /* Debug */, + 051630C12DC3D1A000A6C0D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 0516315E2DC3D28400A6C0D1 /* XCRemoteSwiftPackageReference "RxSwift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactiveX/RxSwift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.9.0; + }; + }; + 051631632DC3D29400A6C0D1 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.7.1; + }; + }; + 051631662DC3D3FA00A6C0D1 /* XCRemoteSwiftPackageReference "Tabman" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/uias/Tabman"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.2.0; + }; + }; + 051631692DC3D50700A6C0D1 /* XCRemoteSwiftPackageReference "Pageboy" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/uias/Pageboy"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.2.0; + }; + }; + 05CFFCBC2DCCB3810051129F /* XCRemoteSwiftPackageReference "Then" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/devxoul/Then"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 0516315F2DC3D28400A6C0D1 /* RxCocoa */ = { + isa = XCSwiftPackageProductDependency; + package = 0516315E2DC3D28400A6C0D1 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxCocoa; + }; + 051631612DC3D28400A6C0D1 /* RxSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 0516315E2DC3D28400A6C0D1 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxSwift; + }; + 051631642DC3D29400A6C0D1 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 051631632DC3D29400A6C0D1 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; + 051631672DC3D3FA00A6C0D1 /* Tabman */ = { + isa = XCSwiftPackageProductDependency; + package = 051631662DC3D3FA00A6C0D1 /* XCRemoteSwiftPackageReference "Tabman" */; + productName = Tabman; + }; + 0516316A2DC3D50700A6C0D1 /* Pageboy */ = { + isa = XCSwiftPackageProductDependency; + package = 051631692DC3D50700A6C0D1 /* XCRemoteSwiftPackageReference "Pageboy" */; + productName = Pageboy; + }; + 05CFFCBD2DCCB3810051129F /* Then */ = { + isa = XCSwiftPackageProductDependency; + package = 05CFFCBC2DCCB3810051129F /* XCRemoteSwiftPackageReference "Then" */; + productName = Then; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 051630AF2DC3D1A000A6C0D1 /* Project object */; +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPButton.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPButton.swift similarity index 92% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPButton.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPButton.swift index 5d99f435..c4e2a4cd 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPButton.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPButton.swift @@ -1,15 +1,8 @@ -// -// PPButton.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit -class PPButton: UIButton { +public class PPButton: UIButton { - enum ButtonStyle { + public enum ButtonStyle { case primary case secondary case tertiary @@ -69,7 +62,7 @@ class PPButton: UIButton { } } - init( + public init( style: ButtonStyle, text: String, disabledText: String = "", @@ -100,7 +93,7 @@ class PPButton: UIButton { /// - Parameters: /// - color: 색상 /// - state: 상태 - func setBackgroundColor(_ color: UIColor, for state: UIControl.State) { + public func setBackgroundColor(_ color: UIColor, for state: UIControl.State) { UIGraphicsBeginImageContext(CGSize(width: 1.0, height: 1.0)) guard let context = UIGraphicsGetCurrentContext() else { return } context.setFillColor(color.cgColor) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPCancelHeaderView.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPCancelHeaderView.swift similarity index 85% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPCancelHeaderView.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPCancelHeaderView.swift index 4e1bd069..777f79cf 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPCancelHeaderView.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPCancelHeaderView.swift @@ -1,25 +1,18 @@ -// -// PPCancelHeaderView.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit import SnapKit -final class PPCancelHeaderView: UIView { +public final class PPCancelHeaderView: UIView { // MARK: - Components - let backButton: UIButton = { + public let backButton: UIButton = { let button = UIButton(type: .system) button.setImage(UIImage(named: "icon_backButton"), for: .normal) button.tintColor = .black return button }() - let cancelButton: UIButton = { + public let cancelButton: UIButton = { let button = UIButton(type: .system) button.setTitle("취소", for: .normal) button.titleLabel?.font = .korFont(style: .regular, size: 14) @@ -28,7 +21,7 @@ final class PPCancelHeaderView: UIView { }() // MARK: - init - init() { + public init() { super.init(frame: .zero) setUpConstraints() } diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPLabel.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPLabel.swift similarity index 84% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPLabel.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPLabel.swift index 614638ac..32ce068f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPLabel.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPLabel.swift @@ -1,15 +1,8 @@ -// -// PPLabel.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit -class PPLabel: UILabel { +public class PPLabel: UILabel { - init( + public init( style: UIFont.FontStyle, fontSize: CGFloat, text: String = "", diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPPicker.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPPicker.swift similarity index 78% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPPicker.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPPicker.swift index acaa9456..21f007cb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPPicker.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPPicker.swift @@ -1,20 +1,14 @@ -// -// PPPicker.swift -// PopPool -// -// Created by SeoJunYoung on 7/3/24. -// +import UIKit import RxCocoa import RxSwift import SnapKit -import UIKit -final class PPPicker: UIView { +public final class PPPicker: UIView { // MARK: - Components private let components: [String] - let pickerView = UIPickerView() + public let pickerView = UIPickerView() private var selectView: UIView = { let view = UIView() view.backgroundColor = .g50 @@ -28,7 +22,7 @@ final class PPPicker: UIView { // MARK: - init /// PickerCPNT init /// - Parameter components: UIPickerView에 표시할 문자열 배열입니다. - init(components: [String]) { + public init(components: [String]) { self.components = components super.init(frame: .zero) setUp() @@ -78,22 +72,22 @@ extension PPPicker { /// 지정된 인덱스로 UIPickerView를 설정 /// - Parameter index: 설정할 인덱스 값 - func setIndex(index: Int) { + public func setIndex(index: Int) { pickerView.selectRow(index, inComponent: 0, animated: true) } } // MARK: - Delegate extension PPPicker: UIPickerViewDelegate, UIPickerViewDataSource { - func numberOfComponents(in pickerView: UIPickerView) -> Int { + public func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } - func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return components.count } - func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { + public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView { let label = UILabel() label.text = components[row] label.textAlignment = .center @@ -107,11 +101,11 @@ extension PPPicker: UIPickerViewDelegate, UIPickerViewDataSource { return label } - func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { + public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat { return 48 } - func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + public func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { pickerView.reloadAllComponents() } } diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressIndicator.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressIndicator.swift similarity index 87% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressIndicator.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressIndicator.swift index ec709b83..55537a9e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressIndicator.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressIndicator.swift @@ -1,17 +1,10 @@ -// -// PPProgressIndicator.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// +import UIKit -import Foundation import RxCocoa import RxSwift import SnapKit -import UIKit -final class PPProgressIndicator: UIStackView { +public final class PPProgressIndicator: UIStackView { // MARK: - Properties private var progressViews: [PPProgressView] @@ -22,7 +15,7 @@ final class PPProgressIndicator: UIStackView { /// - Parameters: /// - totalStep: 전체 단계 수 /// - startPoint: 초기 시작 지점 (1부터 시작하는 인덱스) - init(totalStep: Int, startPoint: Int) { + public init(totalStep: Int, startPoint: Int) { self.progressViews = (1...totalStep).map({ index in return PPProgressView(isSelected: index == startPoint) }) @@ -59,7 +52,7 @@ private extension PPProgressIndicator { extension PPProgressIndicator { /// 진행 인디케이터를 한 단계 앞으로 이동 - func increaseIndicator() { + public func increaseIndicator() { if progressIndex < progressViews.count { progressViews[progressIndex - 1].disappearAnimation(option: .fromLeft) progressIndex += 1 @@ -68,7 +61,7 @@ extension PPProgressIndicator { } /// 진행 인디케이터를 한 단계 뒤로 이동 - func decreaseIndicator() { + public func decreaseIndicator() { if progressIndex - 1 > 0 { progressViews[progressIndex - 1].disappearAnimation(option: .fromRight) progressIndex -= 1 diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressView.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressView.swift similarity index 95% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressView.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressView.swift index 60a3137a..b456b27e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPProgressIndicator/PPProgressView.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPProgressIndicator/PPProgressView.swift @@ -1,18 +1,11 @@ -// -// PPProgressView.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - -import Foundation -import SnapKit import UIKit -final class PPProgressView: UIView { +import SnapKit + +public final class PPProgressView: UIView { /// CMTPProgressView Animation Type - enum ProgressFillAnimation { + public enum ProgressFillAnimation { case fromLeft case fromRight } @@ -34,7 +27,7 @@ final class PPProgressView: UIView { /// CMTPProgressView 초기화 /// - Parameter isSelected: 선택 여부 - init(isSelected: Bool) { + public init(isSelected: Bool) { self.selectedView.isHidden = !isSelected super.init(frame: .zero) setUpConstraints() diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPReturnHeaderView.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPReturnHeaderView.swift similarity index 85% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPReturnHeaderView.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPReturnHeaderView.swift index f8589886..21dd41f9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPReturnHeaderView.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPReturnHeaderView.swift @@ -1,24 +1,18 @@ -// -// PPReturnHeaderView.swift -// Poppool -// -// Created by Porori on 11/27/24. -// +import UIKit import SnapKit -import UIKit -final class PPReturnHeaderView: UIView { +public final class PPReturnHeaderView: UIView { // MARK: - Components - let backButton: UIButton = { + public let backButton: UIButton = { let button = UIButton(type: .system) button.setImage(UIImage(named: "icon_backButton"), for: .normal) button.tintColor = .black return button }() - let headerLabel: UILabel = { + public let headerLabel: UILabel = { let label = UILabel() label.font = .korFont(style: .regular, size: 15) label.textColor = .g1000 @@ -26,7 +20,7 @@ final class PPReturnHeaderView: UIView { }() // MARK: - init - init() { + public init() { super.init(frame: .zero) setUpConstraints() } diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSearchBarView.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSearchBarView.swift new file mode 100644 index 00000000..230078f1 --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSearchBarView.swift @@ -0,0 +1,85 @@ +import UIKit + +import SnapKit +import Then + +public class PPSearchBarView: UIView { + + private let stackView = UIStackView().then { + $0.spacing = 16 + $0.alignment = .center + $0.axis = .horizontal + } + + public let searchBar = UISearchBar().then { + $0.searchTextField.setPlaceholder(text: "팝업스토어명을 입력해보세요", color: .g400, font: .korFont(style: .regular, size: 14)) + $0.tintColor = .g400 + $0.backgroundColor = .g50 + $0.setImage(UIImage(named: "icon_search_gray"), for: .search, state: .normal) + $0.searchBarStyle = .minimal + $0.searchTextField.clearButtonMode = .never + $0.searchTextField.subviews.first?.isHidden = true + } + + public let clearButton = UIButton(type: .custom).then { + $0.setImage(UIImage(named: "icon_clear_button"), for: .normal) + $0.isHidden = true + } + + public let cancelButton = UIButton(type: .system).then { + $0.setTitle("취소", for: .normal) + $0.tintColor = .g1000 + $0.titleLabel?.font = .korFont(style: .regular, size: 14) + } + + public init() { + super.init(frame: .zero) + + self.addViews() + self.setupConstraints() + } + + @available(*, unavailable) + public required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } +} + +private extension PPSearchBarView { + func addViews() { + [stackView].forEach { + self.addSubview($0) + } + + [searchBar, cancelButton].forEach { + self.stackView.addArrangedSubview($0) + } + + [clearButton].forEach { + self.searchBar.addSubview($0) + } + } + + func setupConstraints() { + stackView.snp.makeConstraints { make in + make.top.equalToSuperview().inset(12) + make.leading.equalToSuperview().inset(20) + make.trailing.equalToSuperview().inset(16) + make.bottom.equalToSuperview().inset(7) + } + + searchBar.snp.makeConstraints { make in + make.height.equalToSuperview() + } + + clearButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().inset(12) + make.centerY.equalToSuperview() + make.size.equalTo(20) + } + + cancelButton.snp.makeConstraints { make in + make.height.equalToSuperview() + } + } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPSegmentedControl.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSegmentedControl.swift similarity index 91% rename from Poppool/PresentationLayer/Presentation/Presentation/Components/PPSegmentedControl.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSegmentedControl.swift index e9cde785..1f869e68 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Components/PPSegmentedControl.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPSegmentedControl.swift @@ -1,17 +1,11 @@ -// -// PPSegmentedControl.swift -// PopPool -// -// Created by SeoJunYoung on 6/27/24. -// +import UIKit import SnapKit -import UIKit -final class PPSegmentedControl: UISegmentedControl { +public final class PPSegmentedControl: UISegmentedControl { /// 세그먼트 컨트롤 타입 - enum SegmentedControlType { + public enum SegmentedControlType { case radio case base case tab @@ -32,7 +26,7 @@ final class PPSegmentedControl: UISegmentedControl { return view }() - init(type: SegmentedControlType, segments: [String], selectedSegmentIndex: Int? = nil) { + public init(type: SegmentedControlType, segments: [String], selectedSegmentIndex: Int? = nil) { super.init(frame: .zero) setUpSegments(type: type, segments: segments) if let selectedSegmentIndex = selectedSegmentIndex { @@ -46,7 +40,7 @@ final class PPSegmentedControl: UISegmentedControl { } /// 서브뷰 레이아웃 설정 - override func layoutSubviews() { + public override func layoutSubviews() { super.layoutSubviews() // layout이 업데이트 될 때 underbar 업데이트 let underlineFinalXPosition = (self.bounds.width / CGFloat(self.numberOfSegments)) * CGFloat(self.selectedSegmentIndex) @@ -66,7 +60,7 @@ private extension PPSegmentedControl { /// - Parameters: /// - type: 세그먼트 컨트롤 타입 /// - segments: 세그먼트 타이틀 배열 - func setUpSegments(type: SegmentedControlType, segments: [String]) { + public func setUpSegments(type: SegmentedControlType, segments: [String]) { let emptyImage = UIImage() for seg in segments.reversed() { self.insertSegment(withTitle: seg, at: 0, animated: true) @@ -128,7 +122,7 @@ private extension PPSegmentedControl { /// - color: 폰트 색상 /// - font: 폰트 스타일 /// - state: 세그먼트 상태 - func setFont(color: UIColor, font: UIFont?, state: UIControl.State) { + public func setFont(color: UIColor, font: UIFont?, state: UIControl.State) { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineHeightMultiple = 1.2 self.setTitleTextAttributes([ diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPTagCollectionViewCell/PPTagCollectionViewCell.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPTagCollectionViewCell/PPTagCollectionViewCell.swift new file mode 100644 index 00000000..304d3456 --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PPTagCollectionViewCell/PPTagCollectionViewCell.swift @@ -0,0 +1,114 @@ +import UIKit + +import RxSwift +import SnapKit + +public final class PPTagCollectionViewCell: UICollectionViewCell { + + // MARK: - Components + + public var disposeBag = DisposeBag() + + public let titleLabel = PPLabel(style: .medium, fontSize: 11) + + public let cancelButton = UIButton() + + private let contentStackView = UIStackView().then { + $0.alignment = .center + $0.spacing = 2 + } + + // MARK: - init + + override init(frame: CGRect) { + super.init(frame: frame) + + self.addViews() + self.setupConstraints() + self.configureUI() + } + + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } + + public override func prepareForReuse() { + super.prepareForReuse() + + configureCell( + title: nil, + id: nil, + isSelected: false, + isCancelable: false, + fontSize: 11, + cornerRadius: 15.5 + ) + + disposeBag = DisposeBag() + } +} + +// MARK: - SetUp +private extension PPTagCollectionViewCell { + func addViews() { + [contentStackView].forEach { + self.contentView.addSubview($0) + } + + [titleLabel, cancelButton].forEach { + contentStackView.addArrangedSubview($0) + } + } + + func setupConstraints() { + contentStackView.snp.makeConstraints { make in + make.top.bottom.equalToSuperview() + make.leading.equalToSuperview().inset(12) + make.trailing.equalToSuperview().inset(8) + } + + titleLabel.snp.makeConstraints { make in + make.height.equalTo(18) + } + + cancelButton.snp.makeConstraints { make in + make.size.equalTo(16) + } + } + + func configureUI() { + contentView.layer.cornerRadius = 15.5 + contentView.clipsToBounds = true + contentView.layer.borderWidth = 1 + } +} + +extension PPTagCollectionViewCell { + public func configureCell(title: String? = nil, id: Int?, isSelected: Bool = false, isCancelable: Bool = true, fontSize: CGFloat = 11, cornerRadius: CGFloat = 15.5) { + let xmarkImage = isSelected ? UIImage(named: "icon_xmark_white") : UIImage(named: "icon_xmark_gray") + cancelButton.setImage(xmarkImage, for: .normal) + if isSelected { + contentView.backgroundColor = .blu500 + titleLabel.setLineHeightText(text: title, font: .korFont(style: .medium, size: fontSize), lineHeight: 1.15) + titleLabel.textColor = .w100 + contentView.layer.borderColor = UIColor.blu500.cgColor + } else { + contentView.backgroundColor = .clear + titleLabel.setLineHeightText(text: title, font: .korFont(style: .medium, size: fontSize), lineHeight: 1.15) + titleLabel.textColor = .g400 + contentView.layer.borderColor = UIColor.g200.cgColor + } + cancelButton.isHidden = !isCancelable + contentView.layer.cornerRadius = cornerRadius + + if isCancelable { + contentStackView.snp.updateConstraints { make in + make.trailing.equalToSuperview().inset(8) + } + } else { + contentStackView.snp.updateConstraints { make in + make.trailing.equalToSuperview().inset(12) + } + } + } +} diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PopupGridCollectionViewCell/PPPopupGridCollectionViewCell.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PopupGridCollectionViewCell/PPPopupGridCollectionViewCell.swift new file mode 100644 index 00000000..0e8d1944 --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Components/PopupGridCollectionViewCell/PPPopupGridCollectionViewCell.swift @@ -0,0 +1,160 @@ +import UIKit + +import Infrastructure + +import RxSwift +import SnapKit + +public final class PPPopupGridCollectionViewCell: UICollectionViewCell { + + // MARK: - Properties + + public var disposeBag = DisposeBag() + + private let imageView = UIImageView().then { + $0.contentMode = .scaleAspectFill + } + + private let categoryLabel = PPLabel(style: .bold, fontSize: 11).then { + $0.textColor = .blu500 + $0.setLineHeightText(text: "category", font: .korFont(style: .bold, size: 11)) + } + + private let titleLabel = PPLabel(style: .bold, fontSize: 14).then { + $0.numberOfLines = 2 + $0.lineBreakMode = .byTruncatingTail + $0.setLineHeightText(text: "title", font: .korFont(style: .bold, size: 14)) + } + + private let addressLabel = PPLabel(style: .medium, fontSize: 11).then { + $0.numberOfLines = 1 + $0.lineBreakMode = .byTruncatingTail + $0.textColor = .g400 + $0.setLineHeightText(text: "address", font: .korFont(style: .medium, size: 11)) + } + + private let dateLabel = PPLabel(style: .medium, fontSize: 11).then { + $0.lineBreakMode = .byTruncatingTail + $0.textColor = .g400 + $0.setLineHeightText(text: "date", font: .korFont(style: .medium, size: 11)) + } + + public let bookmarkButton = UIButton() + + private let rankLabel = UILabel().then { + $0.backgroundColor = .w10 + $0.layer.cornerRadius = 12 + $0.clipsToBounds = true + $0.isHidden = true + $0.textColor = .w100 + $0.textAlignment = .center + $0.setLineHeightText(text: "rank", font: .korFont(style: .medium, size: 11), lineHeight: 1) + } + + // MARK: - init + override init(frame: CGRect) { + super.init(frame: frame) + + self.addViews() + self.setupConstraints() + self.configureUI() + } + + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } + + public override func prepareForReuse() { + super.prepareForReuse() + disposeBag = DisposeBag() + } +} + +// MARK: - SetUp +private extension PPPopupGridCollectionViewCell { + func addViews() { + [imageView, categoryLabel, titleLabel, dateLabel, addressLabel, bookmarkButton].forEach { + self.contentView.addSubview($0) + } + + [rankLabel].forEach { + imageView.addSubview($0) + } + } + + func setupConstraints() { + imageView.snp.makeConstraints { make in + make.width.equalTo(contentView.bounds.width) + make.height.equalTo(140) + make.top.equalToSuperview() + make.centerX.equalToSuperview() + } + + categoryLabel.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.top.equalTo(imageView.snp.bottom).offset(12) + make.height.equalTo(15) + } + + titleLabel.snp.makeConstraints { make in + make.top.equalTo(categoryLabel.snp.bottom).offset(4) + make.leading.trailing.equalToSuperview() + } + + dateLabel.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.height.equalTo(15).priority(.high) + make.bottom.equalToSuperview() + } + + addressLabel.snp.makeConstraints { make in + make.leading.trailing.equalToSuperview() + make.bottom.equalTo(dateLabel.snp.top) + make.height.equalTo(17).priority(.high) + } + + bookmarkButton.snp.makeConstraints { make in + make.size.equalTo(24) + make.top.trailing.equalToSuperview().inset(8) + } + + rankLabel.snp.makeConstraints { make in + make.height.equalTo(24) + make.width.equalTo(37) + make.leading.bottom.equalToSuperview().inset(12) + } + } + + func configureUI() { + self.contentView.layer.cornerRadius = 4 + self.contentView.clipsToBounds = true + + imageView.layer.cornerRadius = 4 + imageView.clipsToBounds = true + } +} + +extension PPPopupGridCollectionViewCell { + public func configureCell(imagePath: String?, id: Int64, category: String?, title: String?, address: String?, startDate: String?, endDate: String?, isBookmark: Bool, isLogin: Bool, isPopular: Bool = false, row: Int?) { + + categoryLabel.text = "#" + (category ?? "") + titleLabel.text = title + addressLabel.text = address + + let date = startDate.toDate().toPPDateString() + " ~ " + endDate.toDate().toPPDateString() + dateLabel.text = date + + let bookmarkImage = isBookmark ? UIImage(named: "icon_bookmark_fill") : UIImage(named: "icon_bookmark") + bookmarkButton.setImage(bookmarkImage, for: .normal) + + imageView.setPPImage(path: imagePath) + + bookmarkButton.isHidden = !isLogin + rankLabel.isHidden = !isPopular + + if let rank = row { + rankLabel.text = "\(rank)" + rankLabel.isHidden = rank > 2 + } + } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIApplication+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIApplication+.swift similarity index 100% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIApplication+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIApplication+.swift diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UICollectionReusableView+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UICollectionReusableView+.swift new file mode 100644 index 00000000..1edd36fe --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UICollectionReusableView+.swift @@ -0,0 +1,7 @@ +import UIKit + +public extension UICollectionReusableView { + static var identifiers: String { + return String(describing: self) + } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIColor+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIColor+.swift similarity index 100% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIColor+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIColor+.swift diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIFont+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIFont+.swift new file mode 100644 index 00000000..9723e545 --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIFont+.swift @@ -0,0 +1,37 @@ +import UIKit + +private final class BundleFinder { + static let module = Bundle(for: BundleFinder.self) +} + +fileprivate extension Bundle { + static let module = BundleFinder.module +} + +public extension UIFont { + static func korFont(style: FontStyle, size: CGFloat) -> UIFont { + let fontName = "GothicA1-\(style.rawValue)" + + if let font = UIFont(name: fontName, size: size) { return font } else { return registerAndGetFont(name: fontName, size: size) } + } + + static func engFont(style: FontStyle, size: CGFloat) -> UIFont { + let fontName = "Poppins-\(style.rawValue)" + + if let font = UIFont(name: fontName, size: size) { return font } else { return registerAndGetFont(name: fontName, size: size) } + } + + private static func registerAndGetFont(name: String, size: CGFloat) -> UIFont { + let url = Bundle.module.url(forResource: name, withExtension: "ttf")! + CTFontManagerRegisterFontURLs([url as CFURL] as CFArray, .process, true, nil) + return UIFont(name: name, size: size)! + + } + + enum FontStyle: String { + case bold = "Bold" + case medium = "Medium" + case regular = "Regular" + case light = "Light" + } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UILabel+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UILabel+.swift similarity index 84% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UILabel+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UILabel+.swift index 592fa79a..eb0caec1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UILabel+.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UILabel+.swift @@ -1,13 +1,6 @@ -// -// UILabel+.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit -extension UILabel { +public extension UILabel { func setLineHeightText(text: String?, font: UIFont?, lineHeight: CGFloat = 1.3) { guard let text = text, let font = font else { return } let paragraphStyle = NSMutableParagraphStyle() diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UINavigationController+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UINavigationController+.swift similarity index 68% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UINavigationController+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UINavigationController+.swift index 62923a54..b154ee64 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UINavigationController+.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UINavigationController+.swift @@ -1,13 +1,6 @@ -// -// UINavigationController+.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit -extension UINavigationController { +public extension UINavigationController { func popViewController(animated: Bool, completion: (() -> Void)?) { CATransaction.begin() CATransaction.setCompletionBlock { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UITableViewCell+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UITableViewCell+.swift similarity index 100% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UITableViewCell+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UITableViewCell+.swift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UITextField+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UITextField+.swift similarity index 69% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UITextField+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UITextField+.swift index da25f377..883720b9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UITextField+.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UITextField+.swift @@ -1,13 +1,6 @@ -// -// UITextField+.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - import UIKit -extension UITextField { +public extension UITextField { func setPlaceholder(text: String, color: UIColor, font: UIFont) { self.attributedPlaceholder = NSAttributedString( string: text, diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIView+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIView+.swift similarity index 79% rename from Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIView+.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIView+.swift index a24684e7..44394f22 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIView+.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIView+.swift @@ -1,13 +1,6 @@ -// -// UIView+.swift -// Poppool -// -// Created by SeoJunYoung on 12/2/24. -// - import UIKit -extension UIView { +public extension UIView { func shake() { let animation = CAKeyframeAnimation(keyPath: "transform.translation.x") animation.timingFunction = CAMediaTimingFunction(name: .linear) diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIViewController+.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIViewController+.swift new file mode 100644 index 00000000..034c7b7e --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Extension/UIViewController+.swift @@ -0,0 +1,191 @@ +import UIKit + +import Infrastructure + +private struct PPModalConstants { + static let animationDuration: TimeInterval = 0.2 + static let presentAnimationOptions: UIView.AnimationOptions = .curveEaseOut + static let dismissAnimationOptions: UIView.AnimationOptions = .curveEaseIn +} + +// modal의 subView와 상태를 들고있는 매니저 +private class PPModalManager { + weak var presentingVC: UIViewController? + weak var presentedViewController: (UIViewController & PPModalPresentable)? + var dimmingView: UIView? + var containerView: UIView? + + init(presenting: UIViewController) { + self.presentingVC = presenting + } +} + +extension UIViewController { + // MARK: - Storage + private struct PPModalStorage { + static var managers: [ObjectIdentifier: PPModalManager] = [:] + } + + private var pp_manager: PPModalManager { + let id = ObjectIdentifier(self) + + if let modalManager = PPModalStorage.managers[id] { + return modalManager + } + + let modalManager = PPModalManager(presenting: self) + PPModalStorage.managers[id] = modalManager + + return modalManager + } + + // MARK: - Present as Bottom Sheet + /// view controller를 bottom-sheet modal처럼 present 해줍니다 + public func PPPresent(_ viewController: UIViewController & PPModalPresentable, animated: Bool = true) { + let manager = pp_manager + manager.presentedViewController = viewController + + // presentingView에 dimming을 조절 + let dimView = UIView(frame: view.bounds) + dimView.backgroundColor = viewController.backgroundColor + dimView.alpha = 0 + dimView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + view.addSubview(dimView) + manager.dimmingView = dimView + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handlePPTap(_:))) + dimView.addGestureRecognizer(tapGesture) + + // 높이를 결정. 값이 주워진다면 해당 값을 쓰고, 없다면 view의 기본 frame을 씀 + let height = viewController.modalHeight ?? viewController.view.frame.height + let container = UIView(frame: CGRect( + x: 0, + y: view.bounds.height, + width: view.bounds.width, + height: height + )) + container.backgroundColor = .clear + container.autoresizingMask = [.flexibleWidth, .flexibleTopMargin] + view.addSubview(container) + manager.containerView = container + + // Embed child + addChild(viewController) + viewController.view.frame = container.bounds + viewController.view.layer.cornerRadius = viewController.cornerRadius + viewController.view.clipsToBounds = true + container.addSubview(viewController.view) + viewController.didMove(toParent: self) + + let pan = UIPanGestureRecognizer(target: self, action: #selector(handlePPPan(_:))) + container.addGestureRecognizer(pan) + + // Animate in + let animateIn = { + dimView.alpha = 1 + container.frame.origin.y = self.view.bounds.height - height + } + if animated { + UIView.animate( + withDuration: PPModalConstants.animationDuration, + delay: 0, + options: PPModalConstants.presentAnimationOptions, + animations: animateIn, + completion: nil + ) + } else { + animateIn() + } + } + + @objc private func handlePPTap(_ gesture: UITapGestureRecognizer) { + PPDismiss(animated: true) + } + + // MARK: - Dismiss + /// bottom-sheet modal을 Dismiss 합니다. + func PPDismiss(animated: Bool = true) { + guard let manager = PPModalStorage.managers[ObjectIdentifier(self)], + let container = manager.containerView, + let dimView = manager.dimmingView else { return } + + let finish = { + if let vc = manager.presentedViewController { + vc.willMove(toParent: nil) + vc.view.removeFromSuperview() + vc.removeFromParent() + } + dimView.removeFromSuperview() + container.removeFromSuperview() + PPModalStorage.managers.removeValue(forKey: ObjectIdentifier(self)) + } + + let animateOut = { + container.frame.origin.y = self.view.bounds.height + dimView.alpha = 0 + } + if animated { + UIView.animate( + withDuration: PPModalConstants.animationDuration, + delay: 0, + options: PPModalConstants.dismissAnimationOptions, + animations: animateOut, + completion: { _ in finish() } + ) + } else { + animateOut() + finish() + } + } + + // MARK: - Pan Gesture Handler + @objc private func handlePPPan(_ pan: UIPanGestureRecognizer) { + guard let manager = PPModalStorage.managers[ObjectIdentifier(self)], + let container = manager.containerView, + let dimView = manager.dimmingView, + let vc = manager.presentedViewController else { return } + + let translation = pan.translation(in: container) + let velocity = pan.velocity(in: container) + let height = vc.modalHeight ?? vc.view.frame.height + let threshold: CGFloat = 100 + + switch pan.state { + case .changed: + let minY = view.bounds.height - height + let newY = max(minY, container.frame.origin.y + translation.y) + container.frame.origin.y = newY + let progress = 1 - ((newY - minY) / height) + dimView.alpha = progress + pan.setTranslation(.zero, in: container) + + case .ended: + let minY = view.bounds.height - height + let shouldDismiss = velocity.y > threshold || container.frame.origin.y > minY + height / 2 + let animate = { + if shouldDismiss { + container.frame.origin.y = self.view.bounds.height + dimView.alpha = 0 + } else { + container.frame.origin.y = minY + dimView.alpha = 1 + } + } + UIView.animate( + withDuration: PPModalConstants.animationDuration, + delay: 0, + options: PPModalConstants.presentAnimationOptions, + animations: animate, + completion: { _ in if shouldDismiss { self.PPDismiss(animated: false) } } + ) + default: + break + } + } +} + +// Convenience dismiss inside presented VC +public extension PPModalPresentable where Self: UIViewController { + func dismissModal(animated: Bool = true) { + parent?.PPDismiss(animated: animated) + } +} diff --git a/Poppool/Poppool/Resource/Font/GothicA1-Bold.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Bold.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/GothicA1-Bold.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Bold.ttf diff --git a/Poppool/Poppool/Resource/Font/GothicA1-Light.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Light.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/GothicA1-Light.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Light.ttf diff --git a/Poppool/Poppool/Resource/Font/GothicA1-Medium.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Medium.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/GothicA1-Medium.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Medium.ttf diff --git a/Poppool/Poppool/Resource/Font/GothicA1-Regular.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Regular.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/GothicA1-Regular.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/GothicA1-Regular.ttf diff --git a/Poppool/Poppool/Resource/Font/Poppins-Bold.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Bold.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/Poppins-Bold.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Bold.ttf diff --git a/Poppool/Poppool/Resource/Font/Poppins-Light.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Light.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/Poppins-Light.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Light.ttf diff --git a/Poppool/Poppool/Resource/Font/Poppins-Medium.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Medium.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/Poppins-Medium.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Medium.ttf diff --git a/Poppool/Poppool/Resource/Font/Poppins-Regular.ttf b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Regular.ttf similarity index 100% rename from Poppool/Poppool/Resource/Font/Poppins-Regular.ttf rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Font/Poppins-Regular.ttf diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseTabmanController.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseTabmanController.swift similarity index 76% rename from Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseTabmanController.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseTabmanController.swift index 2b3dc171..9947d740 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseTabmanController.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseTabmanController.swift @@ -5,8 +5,8 @@ import Infrastructure import Pageboy import Tabman -class BaseTabmanController: TabmanViewController { - init() { +open class BaseTabmanController: TabmanViewController { + public init() { super.init(nibName: nil, bundle: nil) Logger.log( "\(self) init", @@ -14,11 +14,11 @@ class BaseTabmanController: TabmanViewController { ) } - required init?(coder aDecoder: NSCoder) { + public required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } - override func viewDidLoad() { + open override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .systemBackground self.navigationController?.navigationBar.isHidden = true diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseViewController.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseViewController.swift similarity index 84% rename from Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseViewController.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseViewController.swift index 7680932f..54a4b629 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Controllers/BaseViewController.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Controllers/BaseViewController.swift @@ -5,9 +5,9 @@ import Infrastructure import RxCocoa import RxSwift -public class BaseViewController: UIViewController { +open class BaseViewController: UIViewController { - var systemStatusBarIsDark: BehaviorRelay = .init(value: true) + public var systemStatusBarIsDark: BehaviorRelay = .init(value: true) var systemStatusBarDisposeBag = DisposeBag() public init() { @@ -22,14 +22,14 @@ public class BaseViewController: UIViewController { fatalError("init(coder:) has not been implemented") } - public override func viewDidLoad() { + open override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .white self.navigationController?.navigationBar.isHidden = true systemStatusBarIsDarkBind() } - public override func viewWillAppear(_ animated: Bool) { + open override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) systemStatusBarIsDark.accept(systemStatusBarIsDark.value) } diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/InOutputable.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/InOutputable.swift new file mode 100644 index 00000000..e78b7ffe --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/InOutputable.swift @@ -0,0 +1,12 @@ +import UIKit + +public protocol InOutputable: Inputable, Outputable { } + +public protocol Inputable: Hashable { + associatedtype Input + func injection(with input: Input) +} + +public protocol Outputable { + associatedtype Output +} diff --git a/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/PPModalPresentable.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/PPModalPresentable.swift new file mode 100644 index 00000000..45ddb08f --- /dev/null +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/PPModalPresentable.swift @@ -0,0 +1,11 @@ +import UIKit + +// Protocol that presented view controllers must conform to +public protocol PPModalPresentable: AnyObject { + /// The height of the modal view. If nil, falls back to the view's own height. + var modalHeight: CGFloat? { get } + /// The background dimming color behind the modal view + var backgroundColor: UIColor { get } + /// The corner radius for the modal's top corners + var cornerRadius: CGFloat { get } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionDecorationItem.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionDecorationItem.swift similarity index 70% rename from Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionDecorationItem.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionDecorationItem.swift index 5b37a557..586255b9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionDecorationItem.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionDecorationItem.swift @@ -9,22 +9,32 @@ import UIKit /// `SectionDecorationItem` 구조체는 섹션에 추가될 데코레이션 뷰에 대한 정보를 정의합니다. /// 제네릭 타입 `View`는 `UICollectionReusableView`와 `Inputable` 프로토콜을 준수해야 합니다. -struct SectionDecorationItem: SectionDecorationItemable { - typealias ReusableView = View +public struct SectionDecorationItem: SectionDecorationItemable { + public init( + elementKind: String, + reusableView: ReusableView, + viewInput: ReusableView.Input + ) { + self.elementKind = elementKind + self.reusableView = reusableView + self.viewInput = viewInput + } + + public typealias ReusableView = View /// 데코레이션 뷰의 종류를 나타내는 문자열입니다. - var elementKind: String + public var elementKind: String /// 데코레이션 뷰의 인스턴스입니다. - var reusableView: ReusableView + public var reusableView: ReusableView /// 데코레이션 뷰에 주입될 데이터입니다. - var viewInput: ReusableView.Input + public var viewInput: ReusableView.Input } /// `SectionDecorationItemable` 프로토콜은 데코레이션 뷰에 대한 인터페이스를 정의합니다. /// 이 프로토콜을 준수하는 타입은 데코레이션 뷰를 설정하고 반환하는 기능을 가져야 합니다. -protocol SectionDecorationItemable { +public protocol SectionDecorationItemable { /// 데코레이션 뷰의 타입을 정의합니다. 이 뷰는 `UICollectionReusableView`와 `Inputable` 프로토콜을 준수해야 합니다. associatedtype ReusableView: UICollectionReusableView & Inputable diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift similarity index 80% rename from Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift index f7f7d23a..00b9c7fe 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/SectionSupplementaryItem.swift @@ -4,19 +4,19 @@ import Infrastructure /// `SectionSupplementaryItem` 구조체는 섹션에 추가될 Supplementary View에 대한 정보를 정의합니다. /// 제네릭 타입 `View`는 `UICollectionReusableView`와 `InOutputable` 프로토콜을 준수해야 합니다. -struct SectionSupplementaryItem: SectionSupplementaryItemable { - typealias ReusableView = View - var widthDimension: NSCollectionLayoutDimension - var heightDimension: NSCollectionLayoutDimension - var elementKind: String - var alignment: NSRectAlignment - var reusableView: ReusableView - var viewInput: ReusableView.Input +public struct SectionSupplementaryItem: SectionSupplementaryItemable { + public typealias ReusableView = View + public var widthDimension: NSCollectionLayoutDimension + public var heightDimension: NSCollectionLayoutDimension + public var elementKind: String + public var alignment: NSRectAlignment + public var reusableView: ReusableView + public var viewInput: ReusableView.Input } /// `SectionSupplementaryItemable` 프로토콜은 Supplementary View에 대한 인터페이스를 정의합니다. /// 해당 프로토콜을 준수하는 타입은 Supplementary View를 설정하고 반환하는 기능을 가져야 합니다. -protocol SectionSupplementaryItemable { +public protocol SectionSupplementaryItemable { /// Supplementary View의 타입을 정의합니다. 이 뷰는 `UICollectionReusableView`와 `Inputable` 프로토콜을 준수해야 합니다. associatedtype ReusableView: UICollectionReusableView, Inputable @@ -58,12 +58,12 @@ extension SectionSupplementaryItemable { collectionView.register( ReusableView.self, forSupplementaryViewOfKind: kind, - withReuseIdentifier: reusableView.identifiers + withReuseIdentifier: ReusableView.identifiers ) guard let view = collectionView.dequeueReusableSupplementaryView( ofKind: kind, - withReuseIdentifier: reusableView.identifiers, + withReuseIdentifier: ReusableView.identifiers, for: indexPath ) as? ReusableView else { Logger.log( diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/Sectionable.swift b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/Sectionable.swift similarity index 99% rename from Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/Sectionable.swift rename to Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/Sectionable.swift index a3cbb3d6..b1a0ce5f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/Sectionable/Sectionable.swift +++ b/Poppool/PresentationLayer/DesignSystem/DesignSystem/Utills/Interfaces/Sectionable/Sectionable.swift @@ -7,7 +7,7 @@ import SnapKit /// `Sectionable` 프로토콜은 컬렉션 뷰의 섹션 및 셀을 설정하기 위한 인터페이스를 정의합니다. /// 해당 프로토콜은 제네릭 타입 `CellType`을 사용하여 유연하게 컬렉션 뷰 셀을 처리할 수 있습니다. -protocol Sectionable { +public protocol Sectionable { /// 컬렉션 뷰 셀의 타입을 정의합니다. 이 셀은 `UICollectionViewCell`과 `Inputable` 프로토콜을 준수해야 합니다. associatedtype CellType: UICollectionViewCell, Inputable @@ -62,7 +62,7 @@ protocol Sectionable { ) -> UICollectionReusableView } -extension Sectionable { +public extension Sectionable { /// `setSection` 메서드를 호출하여 섹션 레이아웃을 설정하고, Supplementary View를 추가합니다. /// diff --git a/Poppool/PresentationLayer/Presentation/Presentation.xcodeproj/project.pbxproj b/Poppool/PresentationLayer/Presentation/Presentation.xcodeproj/project.pbxproj index d67c1f31..f64f8ae2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation.xcodeproj/project.pbxproj +++ b/Poppool/PresentationLayer/Presentation/Presentation.xcodeproj/project.pbxproj @@ -9,7 +9,16 @@ /* Begin PBXBuildFile section */ 05125B982DB626E3001342A2 /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05125B972DB626E3001342A2 /* ReactorKit */; }; 05125BA12DB6275C001342A2 /* PanModal in Frameworks */ = {isa = PBXBuildFile; productRef = 05125BA02DB6275C001342A2 /* PanModal */; }; + 051631302DC3D1FD00A6C0D1 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0516312F2DC3D1FD00A6C0D1 /* DesignSystem.framework */; }; + 051631312DC3D1FD00A6C0D1 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0516312F2DC3D1FD00A6C0D1 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 0522C1E12DB67C8300B141FF /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 0522C1E02DB67C8300B141FF /* RxSwift */; }; + 05734C3C2DCDF6FE0093825D /* PresentationInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C352DCDF6EC0093825D /* PresentationInterface.framework */; }; + 05734C3D2DCDF6FE0093825D /* PresentationInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C352DCDF6EC0093825D /* PresentationInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C412DCDF7190093825D /* SearchFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C402DCDF7190093825D /* SearchFeatureInterface.framework */; }; + 05734C422DCDF7190093825D /* SearchFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C402DCDF7190093825D /* SearchFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C492DCDF7960093825D /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C482DCDF7960093825D /* DesignSystem.framework */; }; + 05734C4A2DCDF7960093825D /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C482DCDF7960093825D /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C572DCDF9E80093825D /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 05734C562DCDF9E80093825D /* NMapsMap */; }; 05BDD5CC2DB6756500C1E192 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05BDD5CB2DB6756500C1E192 /* SnapKit */; }; 05BDD5CF2DB6770300C1E192 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 05BDD5CE2DB6770300C1E192 /* Lottie */; }; 05C1D62C2DB53A8200508FFD /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05C1D62A2DB53A8200508FFD /* DomainInterface.framework */; }; @@ -24,13 +33,37 @@ 08B2A36A2DB66BF200E57EFA /* RxGesture in Frameworks */ = {isa = PBXBuildFile; productRef = 08B2A3692DB66BF200E57EFA /* RxGesture */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 05734C3E2DCDF6FE0093825D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 058CC8FB2DB537960084221A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 05734C342DCDF6EC0093825D; + remoteInfo = PresentationInterface; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ + 05734C4B2DCDF7960093825D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 05734C4A2DCDF7960093825D /* DesignSystem.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 05BDD5C22DB6744000C1E192 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( + 05734C422DCDF7190093825D /* SearchFeatureInterface.framework in Embed Frameworks */, + 05734C3D2DCDF6FE0093825D /* PresentationInterface.framework in Embed Frameworks */, + 051631312DC3D1FD00A6C0D1 /* DesignSystem.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -38,12 +71,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0516312F2DC3D1FD00A6C0D1 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C352DCDF6EC0093825D /* PresentationInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PresentationInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C402DCDF7190093825D /* SearchFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SearchFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C482DCDF7960093825D /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 058CC9042DB537960084221A /* Presentation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Presentation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D62A2DB53A8200508FFD /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 05C1D62B2DB53A8200508FFD /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ + 05734C362DCDF6EC0093825D /* PresentationInterface */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = PresentationInterface; + sourceTree = ""; + }; 058CC9062DB537960084221A /* Presentation */ = { isa = PBXFileSystemSynchronizedRootGroup; path = Presentation; @@ -52,20 +94,32 @@ /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ + 05734C322DCDF6EC0093825D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 05734C492DCDF7960093825D /* DesignSystem.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 058CC9012DB537960084221A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 08B2A3672DB66BD400E57EFA /* Pageboy in Frameworks */, + 051631302DC3D1FD00A6C0D1 /* DesignSystem.framework in Frameworks */, 05BDD5CC2DB6756500C1E192 /* SnapKit in Frameworks */, 08B2A36A2DB66BF200E57EFA /* RxGesture in Frameworks */, 05C1D62C2DB53A8200508FFD /* DomainInterface.framework in Frameworks */, + 05734C3C2DCDF6FE0093825D /* PresentationInterface.framework in Frameworks */, 05125B982DB626E3001342A2 /* ReactorKit in Frameworks */, 05BDD5CF2DB6770300C1E192 /* Lottie in Frameworks */, 08B2A35B2DB66B5A00E57EFA /* FloatingPanel in Frameworks */, 08B2A3612DB66BAB00E57EFA /* Then in Frameworks */, + 05734C572DCDF9E80093825D /* NMapsMap in Frameworks */, 0522C1E12DB67C8300B141FF /* RxSwift in Frameworks */, 05C1D62E2DB53A8200508FFD /* Infrastructure.framework in Frameworks */, + 05734C412DCDF7190093825D /* SearchFeatureInterface.framework in Frameworks */, 05125BA12DB6275C001342A2 /* PanModal in Frameworks */, 08B2A3642DB66BBC00E57EFA /* Tabman in Frameworks */, 05EC93D32DB6536200771CB3 /* RxCocoa in Frameworks */, @@ -81,6 +135,7 @@ isa = PBXGroup; children = ( 058CC9062DB537960084221A /* Presentation */, + 05734C362DCDF6EC0093825D /* PresentationInterface */, 05C1D6292DB53A8200508FFD /* Frameworks */, 058CC9052DB537960084221A /* Products */, ); @@ -90,6 +145,7 @@ isa = PBXGroup; children = ( 058CC9042DB537960084221A /* Presentation.framework */, + 05734C352DCDF6EC0093825D /* PresentationInterface.framework */, ); name = Products; sourceTree = ""; @@ -97,6 +153,9 @@ 05C1D6292DB53A8200508FFD /* Frameworks */ = { isa = PBXGroup; children = ( + 05734C482DCDF7960093825D /* DesignSystem.framework */, + 05734C402DCDF7190093825D /* SearchFeatureInterface.framework */, + 0516312F2DC3D1FD00A6C0D1 /* DesignSystem.framework */, 05C1D62A2DB53A8200508FFD /* DomainInterface.framework */, 05C1D62B2DB53A8200508FFD /* Infrastructure.framework */, ); @@ -106,6 +165,13 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 05734C302DCDF6EC0093825D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 058CC8FF2DB537960084221A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -116,6 +182,30 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 05734C342DCDF6EC0093825D /* PresentationInterface */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05734C3B2DCDF6EC0093825D /* Build configuration list for PBXNativeTarget "PresentationInterface" */; + buildPhases = ( + 05734C302DCDF6EC0093825D /* Headers */, + 05734C312DCDF6EC0093825D /* Sources */, + 05734C322DCDF6EC0093825D /* Frameworks */, + 05734C332DCDF6EC0093825D /* Resources */, + 05734C4B2DCDF7960093825D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 05734C362DCDF6EC0093825D /* PresentationInterface */, + ); + name = PresentationInterface; + packageProductDependencies = ( + ); + productName = PresentationInterface; + productReference = 05734C352DCDF6EC0093825D /* PresentationInterface.framework */; + productType = "com.apple.product-type.framework"; + }; 058CC9032DB537960084221A /* Presentation */ = { isa = PBXNativeTarget; buildConfigurationList = 058CC90B2DB537960084221A /* Build configuration list for PBXNativeTarget "Presentation" */; @@ -129,6 +219,7 @@ buildRules = ( ); dependencies = ( + 05734C3F2DCDF6FE0093825D /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 058CC9062DB537960084221A /* Presentation */, @@ -148,6 +239,7 @@ 05BDD5CB2DB6756500C1E192 /* SnapKit */, 05BDD5CE2DB6770300C1E192 /* Lottie */, 0522C1E02DB67C8300B141FF /* RxSwift */, + 05734C562DCDF9E80093825D /* NMapsMap */, ); productName = Presentation; productReference = 058CC9042DB537960084221A /* Presentation.framework */; @@ -163,6 +255,9 @@ LastSwiftUpdateCheck = 1630; LastUpgradeCheck = 1630; TargetAttributes = { + 05734C342DCDF6EC0093825D = { + CreatedOnToolsVersion = 16.3; + }; 058CC9032DB537960084221A = { CreatedOnToolsVersion = 16.3; }; @@ -190,6 +285,7 @@ 08B2A3652DB66BD400E57EFA /* XCRemoteSwiftPackageReference "Pageboy" */, 08B2A3682DB66BF200E57EFA /* XCRemoteSwiftPackageReference "RxGesture" */, 05BDD5CD2DB6770300C1E192 /* XCRemoteSwiftPackageReference "lottie-ios" */, + 05734C552DCDF9E80093825D /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */, ); preferredProjectObjectVersion = 77; productRefGroup = 058CC9052DB537960084221A /* Products */; @@ -197,11 +293,19 @@ projectRoot = ""; targets = ( 058CC9032DB537960084221A /* Presentation */, + 05734C342DCDF6EC0093825D /* PresentationInterface */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 05734C332DCDF6EC0093825D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 058CC9022DB537960084221A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -212,6 +316,13 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 05734C312DCDF6EC0093825D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 058CC9002DB537960084221A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -221,7 +332,89 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 05734C3F2DCDF6FE0093825D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 05734C342DCDF6EC0093825D /* PresentationInterface */; + targetProxy = 05734C3E2DCDF6FE0093825D /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 05734C392DCDF6EC0093825D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.PresentationInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 05734C3A2DCDF6EC0093825D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.PresentationInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; 058CC9092DB537960084221A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -372,11 +565,15 @@ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Presentation; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_MODULE = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Debug; }; @@ -405,17 +602,30 @@ PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.Presentation; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_MODULE = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = 1; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 05734C3B2DCDF6EC0093825D /* Build configuration list for PBXNativeTarget "PresentationInterface" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 05734C392DCDF6EC0093825D /* Debug */, + 05734C3A2DCDF6EC0093825D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 058CC8FE2DB537960084221A /* Build configuration list for PBXProject "Presentation" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -469,6 +679,14 @@ minimumVersion = 1.2.7; }; }; + 05734C552DCDF9E80093825D /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/navermaps/SPM-NMapsMap"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.21.0; + }; + }; 05BDD5CD2DB6770300C1E192 /* XCRemoteSwiftPackageReference "lottie-ios" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/airbnb/lottie-ios"; @@ -551,6 +769,11 @@ package = 05125B932DB62295001342A2 /* XCRemoteSwiftPackageReference "RxSwift" */; productName = RxSwift; }; + 05734C562DCDF9E80093825D /* NMapsMap */ = { + isa = XCSwiftPackageProductDependency; + package = 05734C552DCDF9E80093825D /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */; + productName = NMapsMap; + }; 05BDD5CB2DB6756500C1E192 /* SnapKit */ = { isa = XCSwiftPackageProductDependency; package = 05125B992DB626ED001342A2 /* XCRemoteSwiftPackageReference "SnapKit" */; diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionReusableView+.swift b/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionReusableView+.swift deleted file mode 100644 index 384b685b..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionReusableView+.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// UICollectionReusableView+.swift -// MomsVillage -// -// Created by SeoJunYoung on 8/29/24. -// - -import UIKit - -extension UICollectionReusableView { - var identifiers: String { - return String(describing: self) - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionViewCell+.swift b/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionViewCell+.swift deleted file mode 100644 index 3c10fbac..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UICollectionViewCell+.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// UICollectionViewCell+.swift -// MomsVillage -// -// Created by SeoJunYoung on 8/20/24. -// - -import UIKit - -extension UICollectionViewCell { - static var identifiers: String { - return String(describing: self) - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIFont+.swift b/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIFont+.swift deleted file mode 100644 index 3720eb67..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/DesignSystem/Extension/UIFont+.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation - -import UIKit - -public extension UIFont { - static func korFont(style: FontStyle, size: CGFloat) -> UIFont? { - return UIFont(name: "GothicA1\(style.rawValue)", size: size) - } - - static func engFont(style: FontStyle, size: CGFloat) -> UIFont? { - return UIFont(name: "Poppins\(style.rawValue)", size: size) - } - - enum FontStyle: String { - case bold = "-Bold" - case medium = "-Medium" - case regular = "-Regular" - case light = "-Light" - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetView.swift index d8e74495..09248345 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetView.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import Infrastructure import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetViewController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetViewController.swift index a143fbe3..a02c00e7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetViewController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminBottomSheet/AdminBottomSheetViewController.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import Infrastructure import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpImagesCollectionView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpImagesCollectionView.swift index e36be825..a54c62b5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpImagesCollectionView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpImagesCollectionView.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import SnapKit final class PopUpImagesCollectionView: UICollectionView { @@ -43,7 +45,7 @@ private extension PopUpImagesCollectionView { func configureUI() { self.backgroundColor = .clear - self.register(ImageCell.self, forCellWithReuseIdentifier: ImageCell.identifier) + self.register(ImageCell.self, forCellWithReuseIdentifier: ImageCell.identifiers) self.dataSource = self self.delegate = self self.showsHorizontalScrollIndicator = false @@ -66,7 +68,7 @@ extension PopUpImagesCollectionView: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell( - withReuseIdentifier: ImageCell.identifier, + withReuseIdentifier: ImageCell.identifiers, for: indexPath ) as? ImageCell else { return UICollectionViewCell() diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterReactor.swift index 5ec2c51c..ffde70f6 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterReactor.swift @@ -110,7 +110,7 @@ final class PopUpStoreRegisterReactor: Reactor { var lon: String = "" var description: String = "" var category: String = "" - var categoryId: Int64 = 0 + var categoryId: Int = 0 var markerTitle: String = "마커 제목" var markerSnippet: String = "마커 설명" @@ -277,7 +277,7 @@ final class PopUpStoreRegisterReactor: Reactor { case let .setCategory(category): newState.category = category - newState.categoryId = Int64(getCategoryId(from: category)) + newState.categoryId = getCategoryId(from: category) case let .setMarkerTitle(title): newState.markerTitle = title diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterViewController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterViewController.swift index 6d4523e8..da9ccb95 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterViewController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminRegister/PopUpStoreRegisterViewController.swift @@ -2,6 +2,7 @@ import CoreLocation import PhotosUI import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminView.swift index 2d13cc17..7393cd2a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminView.swift @@ -1,6 +1,9 @@ +import UIKit + +import DesignSystem + import SnapKit import Then -import UIKit final class AdminView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminViewController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminViewController.swift index 4a2ce2e1..c599adae 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminViewController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/AdminViewController.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/ImageCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/ImageCell.swift index 04704d15..dbf1da59 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/ImageCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Admin/ImageCell.swift @@ -1,9 +1,10 @@ -import SnapKit import UIKit -final class ImageCell: UICollectionViewCell { - static let identifier = "ImageCell" +import DesignSystem +import SnapKit + +final class ImageCell: UICollectionViewCell { // UI private let thumbnailImageView = UIImageView().then { $0.contentMode = .scaleAspectFill diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckController.swift index f1e20e9f..68fd16d9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckController.swift @@ -1,12 +1,7 @@ -// -// CommentCheckController.swift -// Poppool -// -// Created by SeoJunYoung on 12/15/24. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckView.swift index c16fb508..610435fd 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentCheck/CommentCheckView.swift @@ -1,12 +1,7 @@ -// -// CommentCheckView.swift -// Poppool -// -// Created by SeoJunYoung on 12/15/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentCheckView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailController.swift index 6c8b4cbc..aec59f84 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailController.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailReactor.swift index ba634aef..c5a24de3 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/CommentDetailReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSection.swift index b127b716..49dbefca 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSection.swift @@ -1,12 +1,7 @@ -// -// CommentDetailContentSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import RxSwift struct CommentDetailContentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSectionCell.swift index 43237524..96bea9e7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailContentSection/CommentDetailContentSectionCell.swift @@ -1,12 +1,7 @@ -// -// CommentDetailContentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailImageSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailImageSection.swift index a3c61126..d307848f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailImageSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailImageSection.swift @@ -1,12 +1,7 @@ -// -// CommentDetailImageSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import RxSwift struct CommentDetailImageSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailView.swift index c75acd0f..efbe9281 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentDetail/View/CommentDetailView.swift @@ -1,12 +1,7 @@ -// -// CommentDetailView.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentDetailView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuController.swift index 088653fe..5d672f41 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuController.swift @@ -1,12 +1,7 @@ -// -// CommentMyMenuController.swift -// Poppool -// -// Created by SeoJunYoung on 2/1/25. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuView.swift index a6034782..96d8daa8 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentMyMenu/CommentMyMenuView.swift @@ -1,12 +1,7 @@ -// -// CommentMyMenuView.swift -// Poppool -// -// Created by SeoJunYoung on 2/1/25. -// - import UIKit +import DesignSystem + import SnapKit final class CommentMyMenuView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoController.swift index 41bbe402..d5adc11a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoController.swift @@ -1,12 +1,7 @@ -// -// CommentUserInfoController.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoView.swift index f3a6927e..4ace72f5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentInfoMenu/CommentUserInfo/CommentUserInfoView.swift @@ -1,12 +1,7 @@ -// -// CommentUserInfoView.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentUserInfoView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListController.swift index a11d2f53..574bc41a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListController.swift @@ -1,12 +1,7 @@ -// -// CommentListController.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListReactor.swift index 5f88d677..d673ae97 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/CommentListReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSection.swift index 74440198..9e5ee0ae 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSection.swift @@ -1,12 +1,7 @@ -// -// CommentListTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import RxSwift struct CommentListTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSectionCell.swift index da43fc9a..a4d6fd3d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListTitleSection/CommentListTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// CommentListTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListView.swift index 66c5c957..2a8a2735 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentList/View/CommentListView.swift @@ -1,12 +1,7 @@ -// -// CommentListView.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentListView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedController.swift index 0756496e..03495b7b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedController.swift @@ -1,12 +1,7 @@ -// -// CommentSelectedController.swift -// Poppool -// -// Created by SeoJunYoung on 12/13/24. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedView.swift index e77d939b..0c6b341d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentSelected/CommentSelectedView.swift @@ -1,12 +1,7 @@ -// -// CommentSelectedView.swift -// Poppool -// -// Created by SeoJunYoung on 12/13/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentSelectedView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockController.swift index 75166c4d..8500bae7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockController.swift @@ -1,12 +1,7 @@ -// -// CommentUserBlockController.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockView.swift index 3ca9705b..f178c28a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/CommentUserBlock/CommentUserBlockView.swift @@ -1,12 +1,7 @@ -// -// CommentUserBlockView.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import SnapKit final class CommentUserBlockView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddController.swift index c2cf2ca4..4545885d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddController.swift @@ -1,12 +1,7 @@ -// -// NormalCommentAddController.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxKeyboard diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddReactor.swift index 9ff04140..a3c2b594 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/NormalCommentAddReactor.swift @@ -1,6 +1,7 @@ import PhotosUI import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSection.swift index b7559602..ba483b34 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSection.swift @@ -1,12 +1,7 @@ -// -// AddCommentDescriptionSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift struct AddCommentDescriptionSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSectionCell.swift index dd8cd85f..a42a0fbb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentDescriptionSection/AddCommentDescriptionSectionCell.swift @@ -1,12 +1,7 @@ -// -// AddCommentDescriptionSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSection.swift index f1df7177..52d47c0e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSection.swift @@ -1,12 +1,7 @@ -// -// AddCommentImageSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift struct AddCommentImageSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSectionCell.swift index dc954aa0..8d732900 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentImageSection/AddCommentImageSectionCell.swift @@ -1,12 +1,7 @@ -// -// AddCommentImageSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSection.swift index 9ef3468c..ef8bdb14 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSection.swift @@ -1,12 +1,7 @@ -// -// AddCommentSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/15/24. -// - import UIKit +import DesignSystem + import RxSwift struct AddCommentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSectionCell.swift index b81b98f3..a2447743 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentSection/AddCommentSectionCell.swift @@ -1,12 +1,7 @@ -// -// AddCommentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/15/24. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSection.swift index d8e99796..0b5f1f4a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSection.swift @@ -1,12 +1,7 @@ -// -// AddCommentTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift struct AddCommentTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSectionCell.swift index b5847ee0..fbbf718b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/AddCommentTitleSection/AddCommentTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// AddCommentTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/NormalCommentAddView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/NormalCommentAddView.swift index 819e9200..a969b3d2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/NormalCommentAddView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentAdd/View/NormalCommentAddView.swift @@ -1,12 +1,7 @@ -// -// NormalCommentAddView.swift -// Poppool -// -// Created by SeoJunYoung on 12/14/24. -// - import UIKit +import DesignSystem + import SnapKit final class NormalCommentAddView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditController.swift index e451afc4..d7dc9399 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditController.swift @@ -1,12 +1,7 @@ -// -// NormalCommentEditController.swift -// Poppool -// -// Created by SeoJunYoung on 2/1/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxKeyboard diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditReactor.swift index dc616f45..dc535c64 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditReactor.swift @@ -1,6 +1,7 @@ import PhotosUI import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditView.swift index ee06753a..93eaf9b5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/NormalCommentEdit/NormalCommentEditView.swift @@ -1,12 +1,7 @@ -// -// NormalCommentEditView.swift -// Poppool -// -// Created by SeoJunYoung on 2/1/25. -// - import UIKit +import DesignSystem + import SnapKit final class NormalCommentEditView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentController.swift index cbe375f7..9c5c5e0e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentController.swift @@ -1,12 +1,7 @@ -// -// OtherUserCommentController.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentReactor.swift index 8d8506db..69d98d5b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/OtherUserCommentReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSection.swift index 42954f36..d6c4fcca 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSection.swift @@ -1,12 +1,7 @@ -// -// OtherUserCommentSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/28/24. -// - import UIKit +import DesignSystem + import RxSwift struct OtherUserCommentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSectionCell.swift index 7f1a0770..4b232be9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentSection/OtherUserCommentSectionCell.swift @@ -1,12 +1,7 @@ -// -// OtherUserCommentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/28/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentView.swift index 0cd89426..782faaaf 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Comment/OtherUserComment/View/OtherUserCommentView.swift @@ -1,12 +1,7 @@ -// -// OtherUserCommentView.swift -// Poppool -// -// Created by SeoJunYoung on 12/27/24. -// - import UIKit +import DesignSystem + import SnapKit final class OtherUserCommentView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailController.swift index ee001146..d863da13 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailController.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift @@ -63,7 +65,7 @@ private extension DetailController { mainView.contentCollectionView.register(DetailCommentTitleSectionCell.self, forCellWithReuseIdentifier: DetailCommentTitleSectionCell.identifiers) mainView.contentCollectionView.register(DetailCommentSectionCell.self, forCellWithReuseIdentifier: DetailCommentSectionCell.identifiers) mainView.contentCollectionView.register(DetailEmptyCommetSectionCell.self, forCellWithReuseIdentifier: DetailEmptyCommetSectionCell.identifiers) - mainView.contentCollectionView.register(SearchTitleSectionCell.self, forCellWithReuseIdentifier: SearchTitleSectionCell.identifiers) + mainView.contentCollectionView.register(SimilarTitleSectionCell.self, forCellWithReuseIdentifier: SimilarTitleSectionCell.identifiers) mainView.contentCollectionView.register(DetailSimilarSectionCell.self, forCellWithReuseIdentifier: DetailSimilarSectionCell.identifiers) view.addSubview(mainView) mainView.snp.makeConstraints { make in diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailReactor.swift index 6c766d50..e6626483 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/DetailReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure @@ -85,7 +86,7 @@ final class DetailReactor: Reactor { private var commentTitleSection = DetailCommentTitleSection(inputDataList: []) private var commentSection = DetailCommentSection(inputDataList: []) private var commentEmptySection = DetailEmptyCommetSection(inputDataList: [.init()]) - private var similarTitleSecion = SearchTitleSection(inputDataList: [.init(title: "지금 보고있는 팝업과 비슷한 팝업")]) + private var similarTitleSecion = SimilarTitleSection(inputDataList: [.init(title: "지금 보고있는 팝업과 비슷한 팝업")]) private var similarSection = DetailSimilarSection(inputDataList: []) private var spacing70Section = SpacingSection(inputDataList: [.init(spacing: 70)]) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/FactoryImpl/DetailFactoryImpl.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/FactoryImpl/DetailFactoryImpl.swift new file mode 100644 index 00000000..d4339120 --- /dev/null +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/FactoryImpl/DetailFactoryImpl.swift @@ -0,0 +1,23 @@ +import DesignSystem +import DomainInterface +import Infrastructure +import PresentationInterface + +public final class DetailFactoryImpl: DetailFactory { + public init() { } + + public func make(popupID: Int) -> BaseViewController { + let viewController = DetailController() + let reactor = DetailReactor( + popUpID: Int64(popupID), + userAPIUseCase: DIContainer.resolve(UserAPIUseCase.self), + popUpAPIUseCase: DIContainer.resolve(PopUpAPIUseCase.self), + commentAPIUseCase: DIContainer.resolve(CommentAPIUseCase.self), + preSignedUseCase: DIContainer.resolve(PreSignedUseCase.self) + ) + + viewController.reactor = reactor + + return viewController + } +} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentImageCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentImageCell.swift index 514b9bf9..e2702c91 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentImageCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentImageCell.swift @@ -1,12 +1,7 @@ -// -// DetailCommentImageCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentProfileView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentProfileView.swift index 44ec4a67..ea9b6839 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentProfileView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentProfileView.swift @@ -1,12 +1,7 @@ -// -// DetailCommentProfileView.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import SnapKit final class DetailCommentProfileView: UIStackView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSection.swift index 4f08bab2..478205b0 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSection.swift @@ -1,12 +1,7 @@ -// -// DetailCommentSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailCommentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSectionCell.swift index 4251a119..b270dcd1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentSection/DetailCommentSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailCommentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit @@ -326,20 +321,20 @@ extension DetailCommentSectionCell: Inputable { // 기본 스타일 (폰트, 색상 등) let normalAttributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.korFont(style: .regular, size: 14)!, + .font: UIFont.korFont(style: .regular, size: 14), .foregroundColor: UIColor.g1000, .paragraphStyle: paragraphStyle ] // 스타일을 다르게 할 부분 (팝업스토어명, 생생한 후기) let popupStoreAttributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.korFont(style: .bold, size: 14)!, // 다른 폰트 스타일 + .font: UIFont.korFont(style: .bold, size: 14), // 다른 폰트 스타일 .foregroundColor: UIColor.blu500, // 다른 색상 .paragraphStyle: paragraphStyle ] let reviewAttributes: [NSAttributedString.Key: Any] = [ - .font: UIFont.korFont(style: .bold, size: 14)!, // 이탤릭체 + .font: UIFont.korFont(style: .bold, size: 14), // 이탤릭체 .foregroundColor: UIColor.g1000, // 다른 색상 .paragraphStyle: paragraphStyle ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSection.swift index d2979800..48012717 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSection.swift @@ -1,12 +1,7 @@ -// -// DetailCommentTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/18/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailCommentTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSectionCell.swift index f7c37325..c0ebbf91 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailCommentTitleSection/DetailCommentTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailCommentTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/18/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit @@ -28,7 +23,7 @@ final class DetailCommentTitleSectionCell: UICollectionViewCell { let attributedTitle = NSAttributedString( string: "전체보기", attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 커스텀 폰트 적용 + .font: UIFont.korFont(style: .regular, size: 13), // 커스텀 폰트 적용 .underlineStyle: NSUnderlineStyle.single.rawValue // 밑줄 스타일 ] ) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSection.swift index 8d9c926c..5f1ee0cc 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSection.swift @@ -1,12 +1,7 @@ -// -// DetailContentSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/10/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailContentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSectionCell.swift index 02e98e1c..012be73b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailContentSection/DetailContentSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailContentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/10/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSection.swift index 3cda98e4..3cbc9fda 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSection.swift @@ -1,12 +1,7 @@ -// -// DetailEmptyCommetSection.swift -// Poppool -// -// Created by SeoJunYoung on 2/4/25. -// - import UIKit +import DesignSystem + import RxSwift struct DetailEmptyCommetSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSectionCell.swift index 76e43892..58fb2834 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailEmptyCommetSection/DetailEmptyCommetSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailEmptyCommetSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 2/4/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit @@ -27,7 +22,7 @@ final class DetailEmptyCommetSectionCell: UICollectionViewCell { let attributedTitle = NSAttributedString( string: "첫번째 코멘트 남기기", attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 커스텀 폰트 적용 + .font: UIFont.korFont(style: .regular, size: 13), // 커스텀 폰트 적용 .underlineStyle: NSUnderlineStyle.single.rawValue // 밑줄 스타일 ] ) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSection.swift index f869c617..0bc8ff41 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSection.swift @@ -1,12 +1,7 @@ -// -// DetailInfoSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/18/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailInfoSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSectionCell.swift index 2a81ca35..160a5eee 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailInfoSection/DetailInfoSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailInfoSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/18/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSection.swift index c62203f8..245ade0c 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSection.swift @@ -1,12 +1,7 @@ -// -// DetailSimilarSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailSimilarSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSectionCell.swift index 3ca56575..265b2a10 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailSimilarSection/DetailSimilarSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailSimilarSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/19/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSection.swift index 8b2b7ee2..674ee593 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSection.swift @@ -1,12 +1,7 @@ -// -// DetailTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/10/24. -// - import UIKit +import DesignSystem + import RxSwift struct DetailTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSectionCell.swift index 907df869..d014e76d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailTitleSection/DetailTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// DetailTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/10/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailView.swift index 0e286f01..fabc06b0 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/DetailView.swift @@ -1,12 +1,7 @@ -// -// DetailView.swift -// Poppool -// -// Created by SeoJunYoung on 12/9/24. -// - import UIKit +import DesignSystem + import SnapKit final class DetailView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SearchTitleSection.swift similarity index 85% rename from Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSection.swift rename to Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SearchTitleSection.swift index 3731bbaa..ec700e25 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SearchTitleSection.swift @@ -1,19 +1,14 @@ -// -// SearchTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - import UIKit +import DesignSystem + import RxSwift -struct SearchTitleSection: Sectionable { +struct SimilarTitleSection: Sectionable { var currentPage: PublishSubject = .init() - typealias CellType = SearchTitleSectionCell + typealias CellType = SimilarTitleSectionCell var inputDataList: [CellType.Input] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SimilarTitleSectionCell.swift similarity index 88% rename from Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSectionCell.swift rename to Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SimilarTitleSectionCell.swift index 63dad364..8226579f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchTitleSection/SearchTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Detail/View/SimilarTitleSection/SimilarTitleSectionCell.swift @@ -1,16 +1,11 @@ -// -// SearchTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit -final class SearchTitleSectionCell: UICollectionViewCell { +final class SimilarTitleSectionCell: UICollectionViewCell { // MARK: - Components @@ -43,7 +38,7 @@ final class SearchTitleSectionCell: UICollectionViewCell { } // MARK: - SetUp -private extension SearchTitleSectionCell { +private extension SimilarTitleSectionCell { func setUpConstraints() { self.addSubview(sectionTitleLabel) sectionTitleLabel.snp.makeConstraints { make in @@ -61,7 +56,7 @@ private extension SearchTitleSectionCell { } } -extension SearchTitleSectionCell: Inputable { +extension SimilarTitleSectionCell: Inputable { struct Input { var title: String? var buttonTitle: String? @@ -73,7 +68,7 @@ extension SearchTitleSectionCell: Inputable { titleButton.isHidden = false let attributes: [NSAttributedString.Key: Any] = [ .underlineStyle: NSUnderlineStyle.single.rawValue, - .font: UIFont.korFont(style: .regular, size: 13)! + .font: UIFont.korFont(style: .regular, size: 13) ] let attributedTitle = NSAttributedString(string: buttonTitle, attributes: attributes) titleButton.setAttributedTitle(attributedTitle, for: .normal) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListController.swift index 8fe382bf..50d0c9bc 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListController.swift @@ -1,12 +1,7 @@ -// -// HomeListController.swift -// Poppool -// -// Created by SeoJunYoung on 12/2/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListReactor.swift index f958730d..9dc1332a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/HomeListReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeCardGridSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeCardGridSection.swift index 92406df4..404ee0f9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeCardGridSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeCardGridSection.swift @@ -7,6 +7,8 @@ import UIKit +import DesignSystem + import RxSwift struct HomeCardGridSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeListView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeListView.swift index e4769564..3ff3adc7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeListView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/List/View/HomeListView.swift @@ -1,12 +1,7 @@ -// -// HomeListView.swift -// Poppool -// -// Created by SeoJunYoung on 12/2/24. -// - import UIKit +import DesignSystem + import SnapKit final class HomeListView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeController.swift index fcf6d180..990f7ce3 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeController.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeReactor.swift index b27415c1..4a45bd65 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/HomeReactor.swift @@ -1,7 +1,9 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure +import SearchFeatureInterface import ReactorKit import RxCocoa @@ -141,9 +143,8 @@ final class HomeReactor: Reactor { newState.isReloadView = false switch mutation { case .moveToSearchScene(let controller): - let nextController = SearchMainController() - nextController.reactor = SearchMainReactor() - controller.navigationController?.pushViewController(nextController, animated: true) + @Dependency var factory: PopupSearchFactory + controller.navigationController?.pushViewController(factory.make(), animated: true) case .loadView: newState.isReloadView = true newState.sections = getSection() diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSection.swift index 23e570ee..1b27d1b2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSection.swift @@ -1,12 +1,7 @@ -// -// HomeCardSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift struct HomeCardSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSectionCell.swift index c69e6409..664f82c1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeCardSection/HomeCardSectionCell.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeHeaderView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeHeaderView.swift index ed9aadf7..28dac37a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeHeaderView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeHeaderView.swift @@ -1,12 +1,7 @@ -// -// HomeHeaderView.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import SnapKit final class HomeHeaderView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSection.swift index 4196db68..c64754ff 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSection.swift @@ -1,12 +1,7 @@ -// -// HomePopularCardSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift struct HomePopularCardSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSectionCell.swift index 33170f64..a7f8816f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomePopularCardSection/HomePopularCardSectionCell.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSection.swift index 3be6b834..9ec1db9c 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSection.swift @@ -1,12 +1,7 @@ -// -// HomeTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift struct HomeTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSectionCell.swift index cf0f58cb..eeebf6c6 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeTitleSection/HomeTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// HomeTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeView.swift index 3710e7e0..3a47888e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/HomeView.swift @@ -1,10 +1,3 @@ -// -// HomeView.swift -// Poppool -// -// Created by SeoJunYoung on 11/28/24. -// - import UIKit import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSection.swift index 8d323718..43cecf09 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSection.swift @@ -1,12 +1,7 @@ -// -// ImageBannerChildSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/29/24. -// - import UIKit +import DesignSystem + import RxSwift struct ImageBannerChildSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSectionCell.swift index 173f05ed..15784d70 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerChildSection/ImageBannerChildSectionCell.swift @@ -1,12 +1,7 @@ -// -// ImageBannerChildSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 11/29/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSection.swift index e60a5a6d..2aaab02c 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSection.swift @@ -1,12 +1,7 @@ -// -// ImageBannerSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/28/24. -// - import UIKit +import DesignSystem + import RxSwift struct ImageBannerSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSectionCell.swift index c6d16cef..5b904b9f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/ImageBannerSection/ImageBannerSection/ImageBannerSectionCell.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SectionBackGroundDecorationView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SectionBackGroundDecorationView.swift index 300f838a..3f47504a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SectionBackGroundDecorationView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SectionBackGroundDecorationView.swift @@ -1,12 +1,7 @@ -// -// SectionBackGroundDecorationView.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + class SectionBackGroundDecorationView: UICollectionReusableView { // Decoration view의 UI 요소를 추가합니다. override init(frame: CGRect) { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSection.swift index 0c7ae8ee..97591ef2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSection.swift @@ -1,12 +1,7 @@ -// -// SpacingSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift struct SpacingSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSectionCell.swift index 5cb66eb4..a03d7330 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Home/Main/View/SpacingSection/SpacingSectionCell.swift @@ -1,12 +1,7 @@ -// -// SpacingSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 11/30/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailController.swift index 49a2a231..c0e4035f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailController.swift @@ -1,12 +1,7 @@ -// -// ImageDetailController.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailReactor.swift index f94bb7bc..7af5a8c5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/ImageDetail/ImageDetailReactor.swift @@ -1,9 +1,4 @@ -// -// ImageDetailReactor.swift -// Poppool -// -// Created by SeoJunYoung on 12/25/24. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginController.swift index b8824c0d..b24a556f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginController.swift @@ -1,12 +1,6 @@ -// -// LoginController.swift -// Poppool -// -// Created by SeoJunYoung on 11/24/24. -// - import UIKit +import DesignSystem import Infrastructure import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginReactor.swift index e4c22d6e..56fcff23 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginReactor.swift @@ -1,3 +1,4 @@ +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginView.swift index 437232c9..62d5b8ad 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Main/LoginView.swift @@ -1,12 +1,7 @@ -// -// LoginView.swift -// Poppool -// -// Created by SeoJunYoung on 11/24/24. -// - import UIKit +import DesignSystem + import SnapKit final class LoginView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginController.swift index 37e32b43..f1d42ee9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginController.swift @@ -1,12 +1,7 @@ -// -// SubLoginController.swift -// Poppool -// -// Created by SeoJunYoung on 12/28/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginReactor.swift index 8b194b1b..ce0c960b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginReactor.swift @@ -1,3 +1,4 @@ +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginView.swift index c1a34e01..cea96869 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Login/Sub/SubLoginView.swift @@ -1,12 +1,7 @@ -// -// SubLoginView.swift -// Poppool -// -// Created by SeoJunYoung on 12/28/24. -// - import UIKit +import DesignSystem + import SnapKit final class SubLoginView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/BalloonChipCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/BalloonChipCell.swift index 558af950..3612b976 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/BalloonChipCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/BalloonChipCell.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import Infrastructure import SnapKit @@ -74,7 +75,7 @@ final class BalloonChipCell: UICollectionViewCell { attributedTitle.addAttribute( .font, - value: UIFont.korFont(style: .bold, size: Constant.fontSize)!, + value: UIFont.korFont(style: .bold, size: Constant.fontSize), range: NSRange(location: .zero, length: attributedTitle.length) ) } else { @@ -96,7 +97,7 @@ final class BalloonChipCell: UICollectionViewCell { attributedTitle.addAttribute( .font, - value: UIFont.korFont(style: .medium, size: Constant.fontSize)!, + value: UIFont.korFont(style: .medium, size: Constant.fontSize), range: NSRange(location: .zero, length: attributedTitle.length) ) } diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterBottomSheetView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterBottomSheetView.swift index a1b0dca4..bf932add 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterBottomSheetView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterBottomSheetView.swift @@ -1,5 +1,7 @@ import UIKit +import DesignSystem + import SnapKit import Then diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterChipsView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterChipsView.swift index 9e05b052..03c81149 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterChipsView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FillterSheetView/FilterChipsView.swift @@ -1,6 +1,9 @@ -import SnapKit import UIKit +import DesignSystem + +import SnapKit + final class FilterChipsView: UIView { // MARK: - Components var onRemoveChip: ((String) -> Void)? diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FindMap/MapGuideView/FullScreenMapViewController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FindMap/MapGuideView/FullScreenMapViewController.swift index a6cdd98d..16449153 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FindMap/MapGuideView/FullScreenMapViewController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/FindMap/MapGuideView/FullScreenMapViewController.swift @@ -1,6 +1,7 @@ import CoreLocation import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapMarker.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapMarker.swift index a79bf643..e6b9f007 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapMarker.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapMarker.swift @@ -1,6 +1,9 @@ +import UIKit + +import DesignSystem + import NMapsMap import SnapKit -import UIKit final class MapMarker: UIView { // MARK: - Components diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapReactor.swift index 3c8405c9..d5d1c543 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapReactor.swift @@ -46,7 +46,7 @@ final class MapReactor: Reactor { case setSelectedStore(MapPopUpStore) // 선택된 스토어 상태 case setViewportStores([MapPopUpStore]) case setError(Error?) - case setCategoryMapping([String: Int64]) + case setCategoryMapping([String: Int]) } struct State { @@ -64,7 +64,7 @@ final class MapReactor: Reactor { var selectedStore: MapPopUpStore? = nil // 선택된 스토어 var viewportStores: [MapPopUpStore] = [] var error: Error? = nil - var categoryMapping: [String: Int64] = [:] + var categoryMapping: [String: Int] = [:] } let initialState: State @@ -96,7 +96,7 @@ final class MapReactor: Reactor { case .fetchCategories: return mapUseCase.fetchCategories() .map { categories in - let mapping = categories.reduce(into: [String: Int64]()) { dict, category in + let mapping = categories.reduce(into: [String: Int]()) { dict, category in dict[category.category] = category.categoryId } return .setCategoryMapping(mapping) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapViewController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapViewController.swift index 88ce0efa..5160514e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapViewController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/MapView/MapViewController.swift @@ -1,8 +1,10 @@ import CoreLocation import UIKit +import DesignSystem import DomainInterface import Infrastructure +import SearchFeatureInterface import FloatingPanel import NMapsMap @@ -459,9 +461,8 @@ class MapViewController: BaseViewController, View, CLLocationManagerDelegate, NM .throttle(.milliseconds(500), scheduler: MainScheduler.instance) .withUnretained(self) .subscribe(onNext: { owner, _ in - let searchMainVC = SearchMainController() - searchMainVC.reactor = SearchMainReactor() - owner.navigationController?.pushViewController(searchMainVC, animated: true) + @Dependency var factory: PopupSearchFactory + owner.navigationController?.pushViewController(factory.make(), animated: true) }) .disposed(by: disposeBag) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/StoreListView/StoreListCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/StoreListView/StoreListCell.swift index 7b12cfb5..bdfb71b8 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/StoreListView/StoreListCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Map/StoreListView/StoreListCell.swift @@ -1,7 +1,10 @@ +import UIKit + +import DesignSystem + import ReactorKit import RxSwift import SnapKit -import UIKit final class StoreListCell: UICollectionViewCell { static let identifier = "StoreListCell" diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageController.swift index ac172875..4c7cecc7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageController.swift @@ -1,12 +1,7 @@ -// -// BlockUserManageController.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageReactor.swift index 7d8bc987..b750673d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/BlockUserManageReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSection.swift index 43dd9f31..f5ceb6a5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSection.swift @@ -1,12 +1,7 @@ -// -// BlockUserListSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import RxSwift struct BlockUserListSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSectionCell.swift index dc08a239..947a3d99 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserListSection/BlockUserListSectionCell.swift @@ -1,12 +1,7 @@ -// -// BlockUserListSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserManageView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserManageView.swift index 4fb424f1..97277402 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserManageView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Block/View/BlockUserManageView.swift @@ -1,12 +1,7 @@ -// -// BlockUserManageView.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import SnapKit final class BlockUserManageView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkController.swift index 55e98c2b..03425945 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkController.swift @@ -1,12 +1,7 @@ -// -// MyPageBookmarkController.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkReactor.swift index fd82c499..6a89a5ee 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkView.swift index 1bf108c0..e6d6d13b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/MyPageBookmarkView.swift @@ -1,12 +1,7 @@ -// -// MyPageBookmarkView.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyPageBookmarkView: UIView { @@ -42,7 +37,7 @@ final class MyPageBookmarkView: UIView { let buttonTitle = NSAttributedString( string: "추천 팝업 보러가기", attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, + .font: UIFont.korFont(style: .regular, size: 13), .underlineStyle: NSUnderlineStyle.single.rawValue, .foregroundColor: UIColor.g1000 ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/CountButtonView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/CountButtonView.swift index 7d2168e8..b566d1f0 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/CountButtonView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/CountButtonView.swift @@ -1,12 +1,7 @@ -// -// CountButtonView.swift -// Poppool -// -// Created by SeoJunYoung on 1/16/25. -// - import UIKit +import DesignSystem + import SnapKit final class CountButtonView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSection.swift index bb6347c8..77da9b6e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSection.swift @@ -1,12 +1,7 @@ -// -// PopUpCardSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import RxSwift struct PopUpCardSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSectionCell.swift index 33ac884c..7409806f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardSectionCell.swift @@ -1,12 +1,7 @@ -// -// PopUpCardSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardView.swift index c24d05f2..4fad8477 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/Main/View/PopUpCardSection/PopUpCardView.swift @@ -1,12 +1,7 @@ -// -// PopUpCardView.swift -// Poppool -// -// Created by SeoJunYoung on 1/22/25. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalController.swift index 67a61a01..73cf0f6f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalController.swift @@ -1,12 +1,7 @@ -// -// BookMarkPopUpViewTypeModalController.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalReactor.swift index 8d879bdd..e2298095 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalReactor.swift @@ -1,9 +1,4 @@ -// -// BookMarkPopUpViewTypeModalReactor.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalView.swift index f57b0988..f2542b86 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Bookmark/ViewTypeModal/BookMarkPopUpViewTypeModalView.swift @@ -1,12 +1,7 @@ -// -// BookMarkPopUpViewTypeModalView.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import SnapKit final class BookMarkPopUpViewTypeModalView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQController.swift index 3057e6d8..8a9620f8 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQController.swift @@ -1,12 +1,7 @@ -// -// FAQController.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQReactor.swift index ba9947a4..f1d6158f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/FAQReactor.swift @@ -1,12 +1,7 @@ -// -// FAQReactor.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSection.swift index 2ba04ea5..8e160d4e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSection.swift @@ -1,12 +1,7 @@ -// -// FAQDropdownSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import RxSwift struct FAQDropdownSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSectionCell.swift index 36493d0c..06543581 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQDropdownSection/FAQDropdownSectionCell.swift @@ -1,12 +1,7 @@ -// -// FAQDropdownSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQView.swift index 77680e11..bec56ebf 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/FAQ/View/FAQView.swift @@ -1,12 +1,7 @@ -// -// FAQView.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import SnapKit final class FAQView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageController.swift index e699c2d3..a555a37c 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageController.swift @@ -1,12 +1,7 @@ -// -// MyPageController.swift -// Poppool -// -// Created by SeoJunYoung on 12/30/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageReactor.swift index 26fe5b7b..70fa8dbb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/MyPageReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSection.swift index f92f51fc..8a85d6c5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSection.swift @@ -1,12 +1,7 @@ -// -// MyPageCommentSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift struct MyPageCommentSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSectionCell.swift index 1415b4f1..f97564cb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageCommentSection/MyPageCommentSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyPageCommentSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSection.swift index 441344c6..12063019 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSection.swift @@ -1,12 +1,7 @@ -// -// MyPageListSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift struct MyPageListSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSectionCell.swift index 0cd90311..f04cd680 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageListSection/MyPageListSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyPageListSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSection.swift index 89795be7..39ca5dfb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSection.swift @@ -1,12 +1,7 @@ -// -// MyPageLogoutSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/4/25. -// - import UIKit +import DesignSystem + import RxSwift struct MyPageLogoutSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSectionCell.swift index 3c737be7..ffffb3fc 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageLogoutSection/MyPageLogoutSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyPageLogoutSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/4/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSection.swift index 20d2a2b2..8d198680 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSection.swift @@ -1,12 +1,7 @@ -// -// MyPageMyCommentTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift struct MyPageMyCommentTitleSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSectionCell.swift index db582281..e2c3bb94 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageMyCommentTitleSection/MyPageMyCommentTitleSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyPageMyCommentTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/2/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit @@ -67,7 +62,7 @@ extension MyPageMyCommentTitleSectionCell: Inputable { let buttonTitle = NSAttributedString( string: input.buttonTitle ?? "", attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, + .font: UIFont.korFont(style: .regular, size: 13), .underlineStyle: NSUnderlineStyle.single.rawValue, .foregroundColor: UIColor.g600 ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSection.swift index 430fae01..36598dff 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSection.swift @@ -1,12 +1,7 @@ -// -// MyPageProfileSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/31/24. -// - import UIKit +import DesignSystem + import RxSwift struct MyPageProfileSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSectionCell.swift index 639252c2..33b14aa4 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageProfileSection/MyPageProfileSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyPageProfileSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/31/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageView.swift index 832979d9..88645b9a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Main/View/MyPageView.swift @@ -1,12 +1,7 @@ -// -// MyPageView.swift -// Poppool -// -// Created by SeoJunYoung on 12/30/24. -// - import UIKit +import DesignSystem + import SnapKit final class MyPageView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentController.swift index 1673c99e..2dd1b715 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentController.swift @@ -1,12 +1,7 @@ -// -// MyCommentController.swift -// Poppool -// -// Created by SeoJunYoung on 1/8/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentReactor.swift index 2b4911db..b036fcdf 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/MyCommentReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSection.swift index bbe9f9af..1972644e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSection.swift @@ -1,12 +1,7 @@ -// -// ListCountButtonSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import RxSwift struct ListCountButtonSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSectionCell.swift index 35d9658e..2f31bed1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/ListCountButtonSection/ListCountButtonSectionCell.swift @@ -1,12 +1,7 @@ -// -// ListCountButtonSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentView.swift index f1cf8955..31a5aec7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentView.swift @@ -1,12 +1,7 @@ -// -// MyCommentView.swift -// Poppool -// -// Created by SeoJunYoung on 1/8/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyCommentView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSection.swift index 96612580..4e811a51 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSection.swift @@ -1,12 +1,7 @@ -// -// MyCommentedPopUpGridSection.swift -// Poppool -// -// Created by SeoJunYoung on 2/6/25. -// - import UIKit +import DesignSystem + import RxSwift struct MyCommentedPopUpGridSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSectionCell.swift index f8dfa86a..19cd3a8f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/Main/View/MyCommentedPopUpGridSection/MyCommentedPopUpGridSectionCell.swift @@ -1,12 +1,7 @@ -// -// MyCommentedPopUpGridSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 2/6/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalController.swift index 04030d12..02455b41 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalController.swift @@ -1,12 +1,7 @@ -// -// MyCommentSortedModalController.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalReactor.swift index 60106273..9e71d6b0 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalReactor.swift @@ -1,9 +1,4 @@ -// -// MyCommentSortedModalReactor.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalView.swift index f5bf99ee..d3e2af1d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/MyComment/SortedModal/MyCommentSortedModalView.swift @@ -1,12 +1,7 @@ -// -// MyCommentSortedModalView.swift -// Poppool -// -// Created by SeoJunYoung on 1/12/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyCommentSortedModalView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailController.swift index 678153d9..b2324a50 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailController.swift @@ -1,12 +1,7 @@ -// -// MyPageNoticeDetailController.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailReactor.swift index cb16df03..aa430f77 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailReactor.swift @@ -1,3 +1,4 @@ +import DesignSystem import DomainInterface import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailView.swift index 64125f43..145a3cf0 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/Detail/MyPageNoticeDetailView.swift @@ -1,12 +1,7 @@ -// -// MyPageNoticeDetailView.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyPageNoticeDetailView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeController.swift index 10a2ffd7..0fcce206 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeController.swift @@ -1,12 +1,7 @@ -// -// MyPageNoticeController.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeReactor.swift index 8af96c6a..7a920ceb 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/MyPageNoticeReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/MyPageNoticeView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/MyPageNoticeView.swift index 874e228c..0880ac21 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/MyPageNoticeView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/MyPageNoticeView.swift @@ -1,12 +1,7 @@ -// -// MyPageNoticeView.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyPageNoticeView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSection.swift index c1c6f4a9..e29ef831 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSection.swift @@ -1,12 +1,7 @@ -// -// NoticeListSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import RxSwift struct NoticeListSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSectionCell.swift index 6708b6a8..134965d9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Notice/List/View/NoticeListSection/NoticeListSectionCell.swift @@ -1,12 +1,7 @@ -// -// NoticeListSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/13/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalController.swift index 1ecd1e02..f0f36fb3 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalController.swift @@ -1,12 +1,7 @@ -// -// CategoryEditModalController.swift -// Poppool -// -// Created by SeoJunYoung on 1/10/25. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalReactor.swift index e6ae9422..e2bb0ff5 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalReactor.swift @@ -1,12 +1,6 @@ -// -// CategoryEditModalReactor.swift -// Poppool -// -// Created by SeoJunYoung on 1/10/25. -// - import UIKit +import DesignSystem import DomainInterface import ReactorKit @@ -30,7 +24,7 @@ final class CategoryEditModalReactor: Reactor { struct State { var sections: [any Sectionable] = [] - var originSelectedID: [Int64] + var originSelectedID: [Int] var saveButtonIsEnable: Bool = false } @@ -38,7 +32,7 @@ final class CategoryEditModalReactor: Reactor { var initialState: State var disposeBag = DisposeBag() - private let originSelectedID: [Int64] + private let originSelectedID: [Int] lazy var compositionalLayout: UICollectionViewCompositionalLayout = { UICollectionViewCompositionalLayout { [weak self] section, env in @@ -60,7 +54,7 @@ final class CategoryEditModalReactor: Reactor { // MARK: - init init( - selectedID: [Int64], + selectedID: [Int], userAPIUseCase: UserAPIUseCase, signUpAPIUseCase: SignUpAPIUseCase ) { @@ -94,9 +88,9 @@ final class CategoryEditModalReactor: Reactor { } return Observable.just(.loadView) case .saveButtonTapped(let controller): - var addList: [Int64] = [] - var keepList: [Int64] = [] - var deleteList: [Int64] = [] + var addList: [Int] = [] + var keepList: [Int] = [] + var deleteList: [Int] = [] let currentArray = tagSection.inputDataList.filter { $0.isSelected == true }.compactMap { $0.id } for index in currentArray { if originSelectedID.contains(index) { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalView.swift index 537ab835..6e7bf640 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/CategoryEditModal/CategoryEditModalView.swift @@ -1,12 +1,7 @@ -// -// CategoryEditModalView.swift -// Poppool -// -// Created by SeoJunYoung on 1/10/25. -// - import UIKit +import DesignSystem + import SnapKit final class CategoryEditModalView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalController.swift index 92b2c880..b2a5a0a9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalController.swift @@ -1,12 +1,7 @@ -// -// InfoEditModalController.swift -// Poppool -// -// Created by SeoJunYoung on 1/10/25. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalReactor.swift index 61d22876..fc3b890d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalView.swift index 71d05ee9..99298377 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/InfoEditModal/InfoEditModalView.swift @@ -1,12 +1,7 @@ -// -// InfoEditModalView.swift -// Poppool -// -// Created by SeoJunYoung on 1/10/25. -// - import UIKit +import DesignSystem + import SnapKit final class InfoEditModalView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditController.swift index 988ef8e7..4fddc408 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditController.swift @@ -1,6 +1,7 @@ import PhotosUI import UIKit +import DesignSystem import Infrastructure import ReactorKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditReactor.swift index 42702d27..5dbfcba9 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/ProfileEditReactor.swift @@ -1,6 +1,7 @@ import PhotosUI import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/View/ProfileEditView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/View/ProfileEditView.swift index ea14a361..320ed56f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/View/ProfileEditView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/ProfileEdit/Main/View/ProfileEditView.swift @@ -1,12 +1,7 @@ -// -// ProfileEditView.swift -// Poppool -// -// Created by SeoJunYoung on 1/4/25. -// - import UIKit +import DesignSystem + import SnapKit final class ProfileEditView: UIView { @@ -74,7 +69,7 @@ final class ProfileEditView: UIView { }() let nickNameClearButton: UIButton = { let button = UIButton() - button.setImage(UIImage(named: "icon_clearButton"), for: .normal) + button.setImage(UIImage(named: "icon_clear_button"), for: .normal) button.isHidden = true return button }() @@ -96,7 +91,7 @@ final class ProfileEditView: UIView { let attributedTitle = NSAttributedString( string: title, attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 폰트 + .font: UIFont.korFont(style: .regular, size: 13), // 폰트 .underlineStyle: NSUnderlineStyle.single.rawValue, // 밑줄 스타일 .foregroundColor: UIColor.g1000 // 텍스트 색상 ] @@ -104,7 +99,7 @@ final class ProfileEditView: UIView { let disabledAttributedTitle = NSAttributedString( string: title, attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 폰트 + .font: UIFont.korFont(style: .regular, size: 13), // 폰트 .underlineStyle: NSUnderlineStyle.single.rawValue, // 밑줄 스타일 .foregroundColor: UIColor.g300 // 텍스트 색상 ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentController.swift index 12bb9237..561ece27 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentController.swift @@ -1,12 +1,7 @@ -// -// MyPageRecentController.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentReactor.swift index 94b3f651..021747b7 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/MyPageRecentReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/MyPageRecentView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/MyPageRecentView.swift index d9f8fe3b..52d15d11 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/MyPageRecentView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/MyPageRecentView.swift @@ -1,12 +1,7 @@ -// -// MyPageRecentView.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import SnapKit final class MyPageRecentView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/RecentPopUpSection/RecentPopUpSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/RecentPopUpSection/RecentPopUpSection.swift index a744e56e..23f0db9e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/RecentPopUpSection/RecentPopUpSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Recent/View/RecentPopUpSection/RecentPopUpSection.swift @@ -1,12 +1,7 @@ -// -// RecentPopUpSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/14/25. -// - import UIKit +import DesignSystem + import RxSwift struct RecentPopUpSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsController.swift index 2cd74d2e..4667c827 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsController.swift @@ -1,12 +1,7 @@ -// -// MyPageTermsController.swift -// Poppool -// -// Created by SeoJunYoung on 2/4/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsReactor.swift index 18bdf23e..a0230242 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Terms/MyPageTermsReactor.swift @@ -1,11 +1,7 @@ -// -// MyPageTermsReactor.swift -// Poppool -// -// Created by SeoJunYoung on 2/4/25. -// - import Foundation + +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalController.swift index c0d6bdd2..b08b5514 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalController.swift @@ -1,11 +1,7 @@ -// -// WithdrawlCheckModalController.swift -// Poppool -// -// Created by SeoJunYoung on 1/6/25. -// import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalView.swift index bf7e88f2..a073fca3 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/CheckModal/WithdrawlCheckModalView.swift @@ -1,12 +1,7 @@ -// -// WithdrawlCheckModalView.swift -// Poppool -// -// Created by SeoJunYoung on 1/6/25. -// - import UIKit +import DesignSystem + import SnapKit final class WithdrawlCheckModalView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteController.swift index 8bc6c8c8..8fc0cb03 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteController.swift @@ -1,12 +1,7 @@ -// -// WithdrawlCompleteController.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteView.swift index 0fd5844a..87ec7dbe 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/Complete/WithdrawlCompleteView.swift @@ -1,12 +1,7 @@ -// -// WithdrawlCompleteView.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import SnapKit final class WithdrawlCompleteView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSection.swift index de4f14c0..7b1f5672 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSection.swift @@ -1,12 +1,7 @@ -// -// WithdrawlCheckSection.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import RxSwift struct WithdrawlCheckSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSectionCell.swift index 8ef20cb3..6438f709 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlCheckSectionCell.swift @@ -1,12 +1,7 @@ -// -// WithdrawlCheckSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlReasonView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlReasonView.swift index 250a933b..1f830fb4 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlReasonView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/View/WithdrawlReasonView.swift @@ -1,12 +1,7 @@ -// -// WithdrawlReasonView.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import SnapKit final class WithdrawlReasonView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonController.swift index c3ecb0f2..e469604a 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonController.swift @@ -1,12 +1,7 @@ -// -// WithdrawlReasonController.swift -// Poppool -// -// Created by SeoJunYoung on 1/7/25. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxGesture diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonReactor.swift index 8cb10ad6..a27dc32c 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/MyPage/Withdrawl/SelectedReason/WithdrawlReasonReactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultController.swift deleted file mode 100644 index 92b01182..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultController.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// SearchResultController.swift -// Poppool -// -// Created by SeoJunYoung on 12/7/24. -// - -import UIKit - -import ReactorKit -import RxCocoa -import RxSwift -import SnapKit - -final class SearchResultController: BaseViewController, View { - - typealias Reactor = SearchResultReactor - - // MARK: - Properties - var disposeBag = DisposeBag() - - private var mainView = SearchResultView() - private var sections: [any Sectionable] = [] - private let cellTapped: PublishSubject = .init() -} - -// MARK: - Life Cycle -extension SearchResultController { - override func viewDidLoad() { - super.viewDidLoad() - setUp() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tabBarController?.tabBar.isHidden = true - } -} - -// MARK: - SetUp -private extension SearchResultController { - func setUp() { - if let layout = reactor?.compositionalLayout { - mainView.contentCollectionView.collectionViewLayout = layout - } - mainView.contentCollectionView.delegate = self - mainView.contentCollectionView.dataSource = self - - mainView.contentCollectionView.register( - SearchTitleSectionCell.self, - forCellWithReuseIdentifier: SearchTitleSectionCell.identifiers - ) - mainView.contentCollectionView.register( - SpacingSectionCell.self, - forCellWithReuseIdentifier: SpacingSectionCell.identifiers - ) - mainView.contentCollectionView.register( - SearchResultCountSectionCell.self, - forCellWithReuseIdentifier: SearchResultCountSectionCell.identifiers - ) - mainView.contentCollectionView.register( - HomeCardSectionCell.self, - forCellWithReuseIdentifier: HomeCardSectionCell.identifiers - ) - view.addSubview(mainView) - mainView.snp.makeConstraints { make in - make.edges.equalTo(view.safeAreaLayoutGuide) - } - } -} - -// MARK: - Methods -extension SearchResultController { - func bind(reactor: Reactor) { - - cellTapped - .withUnretained(self) - .map({ (owner, indexPath) in - Reactor.Action.cellTapped(controller: owner, indexPath: indexPath) - }) - .bind(to: reactor.action) - .disposed(by: disposeBag) - - reactor.state - .withUnretained(self) - .subscribe { (owner, state) in - if state.isEmptyResult { - owner.mainView.emptyLabel.isHidden = false - owner.mainView.contentCollectionView.isHidden = true - } else { - owner.mainView.emptyLabel.isHidden = true - owner.mainView.contentCollectionView.isHidden = false - owner.sections = state.sections - owner.mainView.contentCollectionView.reloadData() - } - } - .disposed(by: disposeBag) - } -} - -// MARK: - UICollectionViewDelegate, UICollectionViewDataSource -extension SearchResultController: UICollectionViewDelegate, UICollectionViewDataSource { - func numberOfSections(in collectionView: UICollectionView) -> Int { - return sections.count - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return sections[section].dataCount - } - - func collectionView( - _ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath - ) -> UICollectionViewCell { - let cell = sections[indexPath.section].getCell(collectionView: collectionView, indexPath: indexPath) - guard let reactor = reactor else { return cell } - if let cell = cell as? HomeCardSectionCell { - cell.bookmarkButton.rx.tap - .map { Reactor.Action.bookmarkButtonTapped(indexPath: indexPath)} - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } - return cell - } - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - cellTapped.onNext(indexPath) - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultReactor.swift deleted file mode 100644 index cb8c25b1..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/SearchResultReactor.swift +++ /dev/null @@ -1,163 +0,0 @@ -import UIKit - -import DomainInterface -import Infrastructure - -import ReactorKit -import RxCocoa -import RxSwift - -final class SearchResultReactor: Reactor { - - // MARK: - Reactor - enum Action { - case returnSearch(text: String) - case bookmarkButtonTapped(indexPath: IndexPath) - case cellTapped(controller: BaseViewController, indexPath: IndexPath) - } - - enum Mutation { - case loadView - case emptyView - case moveToDetailScene(controller: BaseViewController, indexPath: IndexPath) - } - - struct State { - var sections: [any Sectionable] = [] - var isEmptyResult: Bool = false - } - - // MARK: - properties - - var initialState: State - var disposeBag = DisposeBag() - private var popUpAPIUseCase: PopUpAPIUseCase - private let userAPIUseCase: UserAPIUseCase - lazy var compositionalLayout: UICollectionViewCompositionalLayout = { - UICollectionViewCompositionalLayout { [weak self] section, env in - guard let self = self else { - return NSCollectionLayoutSection(group: NSCollectionLayoutGroup( - layoutSize: .init( - widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1) - )) - ) - } - return getSection()[section].getSection(section: section, env: env) - } - }() - - private var titleSection = SearchTitleSection(inputDataList: [.init(title: "포함된 팝업", buttonTitle: nil)]) - private var searchCountSection = SearchResultCountSection(inputDataList: [.init(count: 65)]) - private var searchListSection = HomeCardGridSection(inputDataList: []) - private let spacing24Section = SpacingSection(inputDataList: [.init(spacing: 24)]) - private let spacing16Section = SpacingSection(inputDataList: [.init(spacing: 16)]) - private let spacing64Section = SpacingSection(inputDataList: [.init(spacing: 64)]) - - // MARK: - init - init( - userAPIUseCase: UserAPIUseCase, - popUpAPIUseCase: PopUpAPIUseCase - ) { - self.userAPIUseCase = userAPIUseCase - self.popUpAPIUseCase = popUpAPIUseCase - self.initialState = State() - } - - // MARK: - Reactor Methods - func mutate(action: Action) -> Observable { - switch action { - case .cellTapped(let controller, let indexPath): - return Observable.just(.moveToDetailScene(controller: controller, indexPath: indexPath)) - case .returnSearch(let text): - if hasFinalConsonant(text) { - titleSection.inputDataList = [.init(title: "\(text)이 포함된 팝업")] - } else { - titleSection.inputDataList = [.init(title: "\(text)가 포함된 팝업")] - } - return popUpAPIUseCase.getSearchPopUpList(query: text) - .withUnretained(self) - .map { (owner, response) in - owner.searchCountSection.inputDataList = [.init(count: response.popUpStoreList.count)] - let isLogin = response.loginYn - owner.searchListSection.inputDataList = response.popUpStoreList.map({ response in - return .init( - imagePath: response.mainImageUrl, - id: response.id, - category: response.category, - title: response.name, - address: response.address, - startDate: response.startDate, - endDate: response.endDate, - isBookmark: response.bookmarkYn, - isLogin: isLogin - ) - }) - return .loadView - } - .catch { _ in - return Observable.just(.emptyView) - } - case .bookmarkButtonTapped(let indexPath): - let data = searchListSection.inputDataList[indexPath.row] - let isBookmark = data.isBookmark - let id = data.id - searchListSection.inputDataList[indexPath.row].isBookmark.toggle() - ToastMaker.createBookMarkToast(isBookMark: !isBookmark) - if isBookmark { - return userAPIUseCase.deleteBookmarkPopUp(popUpID: id) - .andThen(Observable.just(.loadView)) - } else { - return userAPIUseCase.postBookmarkPopUp(popUpID: id) - .andThen(Observable.just(.loadView)) - } - } - } - - func reduce(state: State, mutation: Mutation) -> State { - var newState = state - switch mutation { - case .loadView: - newState.isEmptyResult = searchListSection.isEmpty - newState.sections = getSection() - case .emptyView: - newState.isEmptyResult = true - case .moveToDetailScene(let controller, let indexPath): - let nextController = DetailController() - nextController.reactor = DetailReactor( - popUpID: searchListSection.inputDataList[indexPath.row].id, - userAPIUseCase: userAPIUseCase, - popUpAPIUseCase: popUpAPIUseCase, - commentAPIUseCase: DIContainer.resolve(CommentAPIUseCase.self), - preSignedUseCase: DIContainer.resolve(PreSignedUseCase.self) - ) - controller.navigationController?.pushViewController(nextController, animated: true) - } - return newState - } - - func getSection() -> [any Sectionable] { - return [ - spacing24Section, - titleSection, - searchCountSection, - spacing16Section, - searchListSection, - spacing64Section - ] - } - func hasFinalConsonant(_ text: String) -> Bool { - guard let lastCharacter = text.last else { return false } - - let unicodeValue = Int(lastCharacter.unicodeScalars.first!.value) - - // 한글 유니코드 범위 체크 - let base = 0xAC00 - let last = 0xD7A3 - guard base...last ~= unicodeValue else { return false } - - // 종성 인덱스 계산 (받침이 있으면 1 이상) - let finalConsonantIndex = (unicodeValue - base) % 28 - return finalConsonantIndex != 0 - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSection.swift deleted file mode 100644 index e3555ab5..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSection.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// SearchResultCountSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/7/24. -// - -import UIKit - -import RxSwift - -struct SearchResultCountSection: Sectionable { - - var currentPage: PublishSubject = .init() - - typealias CellType = SearchResultCountSectionCell - - var inputDataList: [CellType.Input] - - var supplementaryItems: [any SectionSupplementaryItemable]? - - var decorationItems: [any SectionDecorationItemable]? - - func setSection(section: Int, env: any NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { - let itemSize = NSCollectionLayoutSize( - widthDimension: .fractionalWidth(1), - heightDimension: .absolute(20) - ) - let item = NSCollectionLayoutItem(layoutSize: itemSize) -// item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10) - - let groupSize = NSCollectionLayoutSize( - widthDimension: .fractionalWidth(1.0), - heightDimension: .absolute(20) - ) - let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) - - // 섹션 생성 - let section = NSCollectionLayoutSection(group: group) - section.contentInsets = .init(top: 5, leading: 20, bottom: 0, trailing: 20) - - return section - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSectionCell.swift deleted file mode 100644 index d7c5d211..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultCountSection/SearchResultCountSectionCell.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// SearchResultCountSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/7/24. -// - -import UIKit - -import RxSwift -import SnapKit - -final class SearchResultCountSectionCell: UICollectionViewCell { - - // MARK: - Components - - var disposeBag = DisposeBag() - - private let countLabel: PPLabel = { - let label = PPLabel(style: .regular, fontSize: 13) - label.textColor = .g600 - return label - }() - - // MARK: - init - - override init(frame: CGRect) { - super.init(frame: frame) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError() - } - - override func prepareForReuse() { - super.prepareForReuse() - disposeBag = DisposeBag() - } -} - -// MARK: - SetUp -private extension SearchResultCountSectionCell { - func setUpConstraints() { - contentView.addSubview(countLabel) - countLabel.snp.makeConstraints { make in - make.leading.equalToSuperview() - make.centerY.equalToSuperview() - } - } -} - -extension SearchResultCountSectionCell: Inputable { - struct Input { - var count: Int - } - - func injection(with input: Input) { - countLabel.text = "총 \(input.count)개를 찾았어요." - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultView.swift deleted file mode 100644 index 43bbd685..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/AfterSearch/View/SearchResultView.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// SearchResultView.swift -// Poppool -// -// Created by SeoJunYoung on 12/7/24. -// - -import UIKit - -import SnapKit - -final class SearchResultView: UIView { - - // MARK: - Components - let contentCollectionView: UICollectionView = { - return UICollectionView(frame: .zero, collectionViewLayout: .init()) - }() - - let emptyLabel: PPLabel = { - let label = PPLabel(style: .medium, fontSize: 14, text: "검색 결과가 없어요:(\n다른 키워드로 검색해주세요") - label.textAlignment = .center - label.numberOfLines = 2 - label.textColor = .g400 - return label - }() - - // MARK: - init - init() { - super.init(frame: .zero) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -// MARK: - SetUp -private extension SearchResultView { - - func setUpConstraints() { - self.addSubview(contentCollectionView) - contentCollectionView.snp.makeConstraints { make in - make.top.equalToSuperview().offset(56) - make.leading.trailing.bottom.equalToSuperview() - } - - self.addSubview(emptyLabel) - emptyLabel.snp.makeConstraints { make in - make.top.equalTo(contentCollectionView.snp.top).inset(193) - make.leading.trailing.equalToSuperview() - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchController.swift deleted file mode 100644 index cc473a5c..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchController.swift +++ /dev/null @@ -1,232 +0,0 @@ -// -// SearchController.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - -import UIKit - -import ReactorKit -import RxCocoa -import RxGesture -import RxSwift -import SnapKit - -final class SearchController: BaseViewController, View { - - typealias Reactor = SearchReactor - - // MARK: - Properties - var disposeBag = DisposeBag() - - private var mainView = SearchView() - private var sections: [any Sectionable] = [] - private let cellTapped: PublishSubject = .init() - private let loadNextPage = PublishSubject() -} - -// MARK: - Life Cycle -extension SearchController { - override func viewDidLoad() { - super.viewDidLoad() - - self.addViews() - self.setupContstraints() - self.configureUI() - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tabBarController?.tabBar.isHidden = true - } -} - -// MARK: - SetUp -private extension SearchController { - func addViews() { - [mainView].forEach { - self.view.addSubview($0) - } - } - - func setupContstraints() { - mainView.snp.makeConstraints { make in - make.edges.equalTo(view.safeAreaLayoutGuide) - } - } - - func configureUI() { - if let layout = reactor?.compositionalLayout { - mainView.contentCollectionView.collectionViewLayout = layout - } - - mainView.contentCollectionView.delegate = self - mainView.contentCollectionView.dataSource = self - - mainView.contentCollectionView.register( - SearchTitleSectionCell.self, - forCellWithReuseIdentifier: SearchTitleSectionCell.identifiers - ) - - mainView.contentCollectionView.register( - SpacingSectionCell.self, - forCellWithReuseIdentifier: SpacingSectionCell.identifiers - ) - - mainView.contentCollectionView.register( - CancelableTagSectionCell.self, - forCellWithReuseIdentifier: CancelableTagSectionCell.identifiers - ) - - mainView.contentCollectionView.register( - SearchCountTitleSectionCell.self, - forCellWithReuseIdentifier: SearchCountTitleSectionCell.identifiers - ) - - mainView.contentCollectionView.register( - HomeCardSectionCell.self, - forCellWithReuseIdentifier: HomeCardSectionCell.identifiers - ) - } -} - -// MARK: - Methods -extension SearchController { - func bind(reactor: Reactor) { - rx.viewWillAppear - .map { Reactor.Action.viewWillAppear } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - cellTapped - .withUnretained(self) - .map({ (owner, indexPath) in - Reactor.Action.cellTapped(indexPath: indexPath, controller: owner) - }) - .bind(to: reactor.action) - .disposed(by: disposeBag) - - loadNextPage - .throttle(.seconds(1), latest: false, scheduler: MainScheduler.asyncInstance) - .map { Reactor.Action.loadNextPage } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - reactor.state - .filter { $0.newBottomSearchList.isEmpty && $0.bottomSearchListLastIndexPath == nil } - .withUnretained(self) - .subscribe { owner, state in - owner.sections = state.sections - owner.mainView.contentCollectionView.reloadData() - } - .disposed(by: disposeBag) - - reactor.state - .map { (sections: $0.sections, - newItems: $0.newBottomSearchList, - indexPath: $0.bottomSearchListLastIndexPath) } - .filter { !$0.newItems.isEmpty && $0.indexPath != nil } - .withUnretained(self) - .subscribe { (owner, subscribeResponse) in - let (updatedSections, newPopUpItems, popUpGridindexPath) = subscribeResponse - guard let popUpGridindexPath = popUpGridindexPath else { return } - - let start = popUpGridindexPath.item - let count = newPopUpItems.count - let section = popUpGridindexPath.section - let indexPaths = (start.. Int { - return sections.count - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return sections[section].dataCount - } - - func collectionView( - _ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath - ) -> UICollectionViewCell { - let cell = sections[indexPath.section].getCell(collectionView: collectionView, indexPath: indexPath) - guard let userDefaultService = reactor?.userDefaultService else { return cell } - let searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - guard let reactor = reactor else { return cell } - - if let cell = cell as? SearchTitleSectionCell { - cell.titleButton.rx.tap - .map { Reactor.Action.recentSearchListAllDeleteButtonTapped } - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } - - if let cell = cell as? CancelableTagSectionCell { - if searchList.isEmpty { - cell.cancelButton.rx.tap - .map { Reactor.Action.categoryDelteButtonTapped(indexPath: indexPath)} - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } else { - if indexPath.section == 3 { - cell.cancelButton.rx.tap - .map { Reactor.Action.recentSearchListDeleteButtonTapped(indexPath: indexPath)} - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } else { - cell.cancelButton.rx.tap - .map { Reactor.Action.categoryDelteButtonTapped(indexPath: indexPath)} - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } - } - } - - if let cell = cell as? SearchCountTitleSectionCell { - cell.sortedButton.rx.tap - .withUnretained(self) - .map({ (owner, _) in - Reactor.Action.sortedButtonTapped(controller: owner) - }) - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } - - if let cell = cell as? HomeCardSectionCell { - cell.bookmarkButton.rx.tap - .map { Reactor.Action.bookmarkButtonTapped(indexPath: indexPath)} - .bind(to: reactor.action) - .disposed(by: cell.disposeBag) - } - - return cell - } - - func scrollViewDidScroll(_ scrollView: UIScrollView) { - mainView.endEditing(true) - let contentHeight = scrollView.contentSize.height - let scrollViewHeight = scrollView.frame.size.height - let contentOffsetY = scrollView.contentOffset.y - if contentOffsetY + scrollViewHeight >= contentHeight { - loadNextPage.onNext(()) - } - } - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - cellTapped.onNext(indexPath) - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchReactor.swift deleted file mode 100644 index 63c8179b..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/SearchReactor.swift +++ /dev/null @@ -1,391 +0,0 @@ -import UIKit - -import DomainInterface -import Infrastructure - -import ReactorKit -import RxCocoa -import RxSwift - -final class SearchReactor: Reactor { - - // MARK: - Reactor - enum Action { - case viewWillAppear - case returnSearchKeyword(text: String?) - case recentSearchListDeleteButtonTapped(indexPath: IndexPath) - case recentSearchListAllDeleteButtonTapped - case cellTapped(indexPath: IndexPath, controller: BaseViewController) - case sortedButtonTapped(controller: BaseViewController) - case changeSortedFilterIndex(filterIndex: Int, sortedIndex: Int) - case changeCategory(categoryList: [Int64], categoryTitleList: [String?]) - case categoryDelteButtonTapped(indexPath: IndexPath) - case resetCategory - case loadNextPage - case bookmarkButtonTapped(indexPath: IndexPath) - case resetSearchKeyWord - } - - enum Mutation { - case loadView - case moveToCategoryScene(controller: BaseViewController) - case moveToSortedScene(controller: BaseViewController) - case moveToDetailScene(controller: BaseViewController, indexPath: IndexPath) - case setSearchKeyWord(text: String?) - case resetSearchKeyWord - case updateBottomSearchList(newItems: [HomeCardSectionCell.Input], IndexPath: IndexPath) - } - - struct State { - var sections: [any Sectionable] = [] - var searchKeyWord: String? - var newBottomSearchList: [HomeCardSectionCell.Input] = [] - var bottomSearchListLastIndexPath: IndexPath? - - mutating func resetPaginationState() { - self.newBottomSearchList = [] - self.bottomSearchListLastIndexPath = nil - } - - mutating func updateBottomGridSection(by newItems: [HomeCardSectionCell.Input]) { - sections = sections.map { section in - if var grid = section as? HomeCardGridSection { - grid.inputDataList.append(contentsOf: newItems) - return grid - } - return section - } - } - } - - // MARK: - properties - - var initialState: State - var disposeBag = DisposeBag() - - private var sortedIndex: Int = 1 - private var filterIndex: Int = 0 - - private var currentPage: Int32 = 0 - private var lastAppendPage: Int32 = 0 - private var lastPage: Int32 = 0 - private var isLoading: Bool = false - - let userDefaultService = UserDefaultService() - private let popUpAPIUseCase: PopUpAPIUseCase - private let userAPIUseCase: UserAPIUseCase - - lazy var compositionalLayout: UICollectionViewCompositionalLayout = { - UICollectionViewCompositionalLayout { [weak self] section, env in - guard let self = self else { - return NSCollectionLayoutSection(group: NSCollectionLayoutGroup( - layoutSize: .init( - widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1) - )) - ) - } - return getSection()[section].getSection(section: section, env: env) - } - }() - - private let recentKeywordTitleSection = SearchTitleSection(inputDataList: [.init(title: "최근 검색어", buttonTitle: "모두삭제")]) - private var recentKeywordSection = CancelableTagSection(inputDataList: []) - - private let searchTitleSection = SearchTitleSection(inputDataList: [.init(title: "팝업스토어 찾기")]) - private var searchCategorySection = CancelableTagSection(inputDataList: [ - .init(title: "카테고리", isSelected: false, isCancelAble: false) - ]) - private var searchListSection = HomeCardGridSection(inputDataList: []) - private var searchSortedSection = SearchCountTitleSection(inputDataList: []) - private let spacing24Section = SpacingSection(inputDataList: [.init(spacing: 24)]) - private let spacing16Section = SpacingSection(inputDataList: [.init(spacing: 16)]) - private let spacing18Section = SpacingSection(inputDataList: [.init(spacing: 18)]) - private let spacing48Section = SpacingSection(inputDataList: [.init(spacing: 48)]) - private let spacing64Section = SpacingSection(inputDataList: [.init(spacing: 64)]) - - // MARK: - init - init( - userAPIUseCase: UserAPIUseCase, - popUpAPIUseCase: PopUpAPIUseCase - ) { - self.userAPIUseCase = userAPIUseCase - self.popUpAPIUseCase = popUpAPIUseCase - self.initialState = State() - } - - // MARK: - Reactor Methods - func mutate(action: Action) -> Observable { - let sort = sortedIndex == 0 ? "NEWEST" : "MOST_VIEWED,MOST_COMMENTED,MOST_BOOKMARKED" - switch action { - case .resetSearchKeyWord: - return Observable.just(.resetSearchKeyWord) - case .loadNextPage: - guard !isLoading, currentPage < lastPage else { return Observable.empty() } - isLoading = true - currentPage += 1 - return setBottomSearchList(sort: sort) - case .viewWillAppear: - setSearchList() - return setBottomSearchList(sort: sort) - case .returnSearchKeyword(let text): - appendSearchList(text: text) - return Observable.just(.loadView) - case .recentSearchListDeleteButtonTapped(let indexPath): - removeSearchList(indexPath: indexPath) - return Observable.just(.loadView) - case .recentSearchListAllDeleteButtonTapped: - resetSearchList() - return Observable.just(.loadView) - case .cellTapped(let indexPath, let controller): - let searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - let section = searchList.isEmpty ? indexPath.section + 4 : indexPath.section - switch section { - case 3: - let text = recentKeywordSection.inputDataList[indexPath.row].title - appendSearchList(text: text) - return Observable.just(.setSearchKeyWord(text: text)) - case 7: - return Observable.just(.moveToCategoryScene(controller: controller)) - case 11: - return Observable.just(.moveToDetailScene(controller: controller, indexPath: indexPath)) - default: - return Observable.just(.loadView) - } - case .sortedButtonTapped(let controller): - return Observable.just(.moveToSortedScene(controller: controller)) - case .changeSortedFilterIndex(let filterIndex, let sortedIndex): - self.sortedIndex = sortedIndex - self.filterIndex = filterIndex - self.currentPage = 0 - self.lastAppendPage = 0 - return Observable.just(.loadView) - case .changeCategory(let categoryList, let categoryTitleList): - self.currentPage = 0 - self.lastAppendPage = 0 - let datas = zip(categoryList, categoryTitleList) - searchCategorySection.inputDataList = datas.map { return .init(title: $0.1, id: $0.0, isSelected: true, isCancelAble: true)} - return Observable.just(.loadView) - case .resetCategory: - self.currentPage = 0 - self.lastAppendPage = 0 - searchCategorySection.inputDataList = [.init(title: "카테고리", isSelected: false, isCancelAble: false)] - return Observable.just(.loadView) - case .categoryDelteButtonTapped(let indexPath): - self.currentPage = 0 - self.lastAppendPage = 0 - searchCategorySection.inputDataList.remove(at: indexPath.row) - if searchCategorySection.inputDataList.isEmpty { searchCategorySection.inputDataList = [.init(title: "카테고리", isSelected: false, isCancelAble: false)] } - return setBottomSearchList(sort: sort) - case .bookmarkButtonTapped(let indexPath): - let data = searchListSection.inputDataList[indexPath.row] - let isBookmark = data.isBookmark - let id = data.id - searchListSection.inputDataList[indexPath.row].isBookmark.toggle() - if isBookmark { - return userAPIUseCase.deleteBookmarkPopUp(popUpID: id) - .andThen(Observable.just(.loadView)) - } else { - return userAPIUseCase.postBookmarkPopUp(popUpID: id) - .andThen(Observable.just(.loadView)) - } - } - } - - func reduce(state: State, mutation: Mutation) -> State { - var newState = state - switch mutation { - case .loadView: - newState.sections = getSection() - newState.resetPaginationState() - case .moveToCategoryScene(let controller): - let categoryIDList = searchCategorySection.inputDataList.compactMap { $0.id } - let nextController = SearchCategoryController() - nextController.reactor = SearchCategoryReactor( - originCategoryList: categoryIDList, - signUpAPIUseCase: DIContainer.resolve(SignUpAPIUseCase.self) - ) - controller.presentPanModal(nextController) - nextController.reactor?.state - .withUnretained(self) - .subscribe(onNext: { (owner, state) in - if state.isSave { - if state.categoryTitleList.isEmpty { - owner.searchCategorySection.inputDataList = [.init(title: "카테고리", isSelected: false, isCancelAble: false)] - } else { - owner.action.onNext(.changeCategory(categoryList: state.categoryIDList, categoryTitleList: state.categoryTitleList)) - } - - } - if state.isReset { owner.action.onNext(.resetCategory)} - }) - .disposed(by: nextController.disposeBag) - case .moveToSortedScene(let controller): - let nextController = SearchSortedController() - nextController.reactor = SearchSortedReactor(filterIndex: filterIndex, sortedIndex: sortedIndex) - controller.presentPanModal(nextController) - nextController.reactor?.state - .withUnretained(self) - .subscribe(onNext: { (owner, state) in - if state.isSave { - ToastMaker.createToast(message: "선택하신 옵션을 저장했어요") - owner.action.onNext(.changeSortedFilterIndex(filterIndex: state.filterIndex, sortedIndex: state.sortedIndex)) - } - }) - .disposed(by: nextController.disposeBag) - case .moveToDetailScene(let controller, let indexPath): - let nextController = DetailController() - nextController.reactor = DetailReactor( - popUpID: searchListSection.inputDataList[indexPath.row].id, - userAPIUseCase: userAPIUseCase, - popUpAPIUseCase: popUpAPIUseCase, - commentAPIUseCase: DIContainer.resolve(CommentAPIUseCase.self), - preSignedUseCase: DIContainer.resolve(PreSignedUseCase.self) - ) - controller.navigationController?.pushViewController(nextController, animated: true) - case .setSearchKeyWord(let text): - newState.searchKeyWord = text - case .resetSearchKeyWord: - newState.searchKeyWord = nil - newState.sections = getSection() - - case .updateBottomSearchList(let newItems, let indexPath): - newState.updateBottomGridSection(by: newItems) - newState.newBottomSearchList = newItems - newState.bottomSearchListLastIndexPath = indexPath - } - return newState - } - - func getSection() -> [any Sectionable] { - let searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - if searchList.isEmpty { - return [ - spacing24Section, - searchTitleSection, - spacing16Section, - searchCategorySection, - spacing18Section, - searchSortedSection, - spacing16Section, - searchListSection, - spacing64Section - ] - } else { - return [ - spacing24Section, - recentKeywordTitleSection, - spacing16Section, - recentKeywordSection, - spacing48Section, - searchTitleSection, - spacing16Section, - searchCategorySection, - spacing18Section, - searchSortedSection, - spacing16Section, - searchListSection, - spacing64Section - ] - } - } - - func setSearchList() { - let searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - recentKeywordSection.inputDataList = searchList.map { return .init(title: $0) } - } - - func appendSearchList(text: String?) { - if let text = text { - if !text.isEmpty { - var searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - if searchList.contains(text) { - let targetIndex = searchList.firstIndex(of: text)! - searchList.remove(at: targetIndex) - } - searchList = [text] + searchList - userDefaultService.save(key: "searchList", value: searchList) - recentKeywordSection.inputDataList = searchList.map { return .init(title: $0) } - } - } - } - - func removeSearchList(indexPath: IndexPath) { - var searchList = userDefaultService.fetchArray(key: "searchList") ?? [] - searchList.remove(at: indexPath.row) - userDefaultService.save(key: "searchList", value: searchList) - recentKeywordSection.inputDataList = searchList.map { return .init(title: $0) } - } - - func resetSearchList() { - userDefaultService.save(key: "searchList", value: []) - recentKeywordSection.inputDataList = [] - } - - func setBottomSearchList(sort: String?) -> Observable { - let isOpen = filterIndex == 0 - let categories = searchCategorySection.inputDataList.compactMap { $0.id } - - return popUpAPIUseCase.getSearchBottomPopUpList( - isOpen: isOpen, - categories: categories, - page: currentPage, - size: 10, - sort: sort - ) - .withUnretained(self) - .map { (owner, response) in - // 1) 새로 받아오기 전의 기존 아이템 개수 저장 - let previousCount = owner.searchListSection.inputDataList.count - - // 2) API 결과 매핑 - let newItems = response.popUpStoreList.map { - HomeCardSectionCell.Input( - imagePath: $0.mainImageUrl, - id: $0.id, - category: $0.category, - title: $0.name, - address: $0.address, - startDate: $0.startDate, - endDate: $0.endDate, - isBookmark: $0.bookmarkYn, - isLogin: response.loginYn - ) - } - - // 3) 첫 페이지 vs 이후 페이지 분기 - if owner.currentPage == 0 { - // 첫 페이지는 전체 reload - // SearchCountTitleSection 설정 - let isOpenString = isOpen ? "오픈・" : "종료・" - let sortedString = owner.sortedIndex == 0 ? "신규순" : "인기순" - let sortedTitle = isOpenString + sortedString - owner.searchSortedSection.inputDataList = [ - SearchCountTitleSectionCell.Input( - count: response.totalElements, - sortedTitle: sortedTitle - ) - ] - owner.searchListSection.inputDataList = newItems - owner.lastAppendPage = owner.currentPage - owner.lastPage = response.totalPages - owner.isLoading = false - return .loadView - } else { - // 다음 페이지는 append 후 부분 업데이트 - owner.lastAppendPage = owner.currentPage - owner.searchListSection.inputDataList.append(contentsOf: newItems) - owner.lastPage = response.totalPages - owner.isLoading = false - - // HomeCardGridSection이 컬렉션뷰에서 몇 번째 섹션인지 계산 - let sectionIndex = owner.getSection().enumerated() - .first { _, section in section is HomeCardGridSection }!.offset - - // append된 첫 아이템의 IndexPath - let firstIndexPath = IndexPath(item: previousCount, section: sectionIndex) - return .updateBottomSearchList(newItems: newItems, IndexPath: firstIndexPath) - } - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSection.swift deleted file mode 100644 index 7a26b80f..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSection.swift +++ /dev/null @@ -1,43 +0,0 @@ -// -// CancelableTagSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - -import UIKit - -import RxSwift - -struct CancelableTagSection: Sectionable { - - var currentPage: PublishSubject = .init() - - typealias CellType = CancelableTagSectionCell - - var inputDataList: [CellType.Input] - - var supplementaryItems: [any SectionSupplementaryItemable]? - - var decorationItems: [any SectionDecorationItemable]? - - func setSection(section: Int, env: any NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { - let itemSize = NSCollectionLayoutSize( - widthDimension: .estimated(100), - heightDimension: .absolute(31) - ) - let item = NSCollectionLayoutItem(layoutSize: itemSize) - - let groupSize = NSCollectionLayoutSize( - widthDimension: .estimated(100), - heightDimension: .absolute(31) - ) - let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) - // 섹션 생성 - let section = NSCollectionLayoutSection(group: group) - section.contentInsets = .init(top: 0, leading: 20, bottom: 0, trailing: 0) - section.interGroupSpacing = 6 - section.orthogonalScrollingBehavior = .continuous - return section - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSectionCell.swift deleted file mode 100644 index c7773c88..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/CancelableTagSection/CancelableTagSectionCell.swift +++ /dev/null @@ -1,110 +0,0 @@ -// -// CancelableTagSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - -import UIKit - -import RxSwift -import SnapKit - -final class CancelableTagSectionCell: UICollectionViewCell { - - // MARK: - Components - - var disposeBag = DisposeBag() - - private let titleLabel: PPLabel = { - return PPLabel(style: .medium, fontSize: 11) - }() - - let cancelButton: UIButton = { - return UIButton() - }() - - private let contentStackView: UIStackView = { - let view = UIStackView() - view.alignment = .center - view.spacing = 2 - return view - }() - - // MARK: - init - - override init(frame: CGRect) { - super.init(frame: frame) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError() - } - - override func prepareForReuse() { - super.prepareForReuse() - disposeBag = DisposeBag() - } -} - -// MARK: - SetUp -private extension CancelableTagSectionCell { - func setUpConstraints() { - contentView.layer.cornerRadius = 15.5 - contentView.clipsToBounds = true - contentView.layer.borderWidth = 1 - - contentView.addSubview(contentStackView) - contentStackView.snp.makeConstraints { make in - make.top.bottom.equalToSuperview() - make.leading.equalToSuperview().inset(12) - make.trailing.equalToSuperview().inset(8) - } - contentStackView.addArrangedSubview(titleLabel) - contentStackView.addArrangedSubview(cancelButton) - - titleLabel.snp.makeConstraints { make in - make.height.equalTo(18) - } - cancelButton.snp.makeConstraints { make in - make.size.equalTo(16) - } - } -} - -extension CancelableTagSectionCell: Inputable { - struct Input { - var title: String? - var id: Int64? = nil - var isSelected: Bool = false - var isCancelAble: Bool = true - } - - func injection(with input: Input) { - let xmarkImage = input.isSelected ? UIImage(named: "icon_xmark_white") : UIImage(named: "icon_xmark_gray") - cancelButton.setImage(xmarkImage, for: .normal) - if input.isSelected { - contentView.backgroundColor = .blu500 - titleLabel.setLineHeightText(text: input.title, font: .korFont(style: .bold, size: 11), lineHeight: 1.15) - titleLabel.textColor = .w100 - contentView.layer.borderColor = UIColor.blu500.cgColor - } else { - contentView.backgroundColor = .clear - titleLabel.setLineHeightText(text: input.title, font: .korFont(style: .medium, size: 11), lineHeight: 1.15) - titleLabel.textColor = .g400 - contentView.layer.borderColor = UIColor.g200.cgColor - } - cancelButton.isHidden = !input.isCancelAble - - if input.isCancelAble { - contentStackView.snp.updateConstraints { make in - make.trailing.equalToSuperview().inset(8) - } - } else { - contentStackView.snp.updateConstraints { make in - make.trailing.equalToSuperview().inset(12) - } - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSection.swift deleted file mode 100644 index 41617011..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSection.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// SearchCountTitleSection.swift -// Poppool -// -// Created by SeoJunYoung on 12/5/24. -// - -import UIKit - -import RxSwift - -struct SearchCountTitleSection: Sectionable { - - var currentPage: PublishSubject = .init() - - typealias CellType = SearchCountTitleSectionCell - - var inputDataList: [CellType.Input] - - var supplementaryItems: [any SectionSupplementaryItemable]? - - var decorationItems: [any SectionDecorationItemable]? - - func setSection(section: Int, env: any NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection { - let itemSize = NSCollectionLayoutSize( - widthDimension: .fractionalWidth(1), - heightDimension: .absolute(22) - ) - let item = NSCollectionLayoutItem(layoutSize: itemSize) -// item.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10) - - let groupSize = NSCollectionLayoutSize( - widthDimension: .fractionalWidth(1.0), - heightDimension: .absolute(22) - ) - let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) - - // 섹션 생성 - let section = NSCollectionLayoutSection(group: group) - section.contentInsets = .init(top: 0, leading: 20, bottom: 0, trailing: 20) - - return section - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSectionCell.swift deleted file mode 100644 index bc765fe4..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchCountTitleSection/SearchCountTitleSectionCell.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// SearchCountTitleSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 12/5/24. -// - -import UIKit - -import RxSwift -import SnapKit - -final class SearchCountTitleSectionCell: UICollectionViewCell { - - // MARK: - Components - - var disposeBag = DisposeBag() - - private let countLabel: PPLabel = { - let label = PPLabel(style: .regular, fontSize: 13) - label.textColor = .g400 - return label - }() - - private let sortedTitleLabel: PPLabel = { - return PPLabel(style: .regular, fontSize: 13) - }() - - private let downImageView: UIImageView = { - let view = UIImageView() - view.image = UIImage(named: "icon_dropdown") - view.isUserInteractionEnabled = false - return view - }() - - let sortedButton: UIButton = { - return UIButton() - }() - - // MARK: - init - - override init(frame: CGRect) { - super.init(frame: frame) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError() - } - - override func prepareForReuse() { - super.prepareForReuse() - disposeBag = DisposeBag() - } -} - -// MARK: - SetUp -private extension SearchCountTitleSectionCell { - func setUpConstraints() { - contentView.addSubview(countLabel) - countLabel.snp.makeConstraints { make in - make.leading.equalToSuperview() - make.centerY.equalToSuperview() - } - - contentView.addSubview(sortedButton) - sortedButton.snp.makeConstraints { make in - make.trailing.equalToSuperview() - make.centerY.equalToSuperview() - } - - sortedButton.addSubview(sortedTitleLabel) - sortedTitleLabel.snp.makeConstraints { make in - make.leading.equalToSuperview() - make.centerY.equalToSuperview() - } - - sortedButton.addSubview(downImageView) - downImageView.snp.makeConstraints { make in - make.size.equalTo(22) - make.centerY.equalToSuperview() - make.leading.equalTo(sortedTitleLabel.snp.trailing).offset(6) - make.trailing.equalToSuperview() - } - } -} - -extension SearchCountTitleSectionCell: Inputable { - struct Input { - var count: Int64 - var sortedTitle: String? - } - - func injection(with input: Input) { - sortedTitleLabel.text = input.sortedTitle - countLabel.text = "총 \(input.count)개" - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchView.swift deleted file mode 100644 index 8ffc6413..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/BeforeSearch/View/SearchView.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// SearchView.swift -// Poppool -// -// Created by SeoJunYoung on 12/4/24. -// - -import UIKit - -import SnapKit - -final class SearchView: UIView { - - // MARK: - Components - let contentCollectionView = UICollectionView(frame: .zero, collectionViewLayout: .init()) - - // MARK: - init - init() { - super.init(frame: .zero) - - self.addSubviews() - self.setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError("\(#file), \(#function) Error") - } -} - -// MARK: - SetUp -private extension SearchView { - - func addSubviews() { - [contentCollectionView].forEach { - self.addSubview($0) - } - } - - func setUpConstraints() { - contentCollectionView.snp.makeConstraints { make in - make.top.equalToSuperview().offset(56) - make.leading.trailing.bottom.equalToSuperview() - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryController.swift deleted file mode 100644 index c7ab66a9..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryController.swift +++ /dev/null @@ -1,143 +0,0 @@ -// -// SearchCategoryController.swift -// Poppool -// -// Created by SeoJunYoung on 12/6/24. -// - -import UIKit - -import PanModal -import ReactorKit -import RxCocoa -import RxSwift -import SnapKit - -final class SearchCategoryController: BaseViewController, View { - - typealias Reactor = SearchCategoryReactor - - // MARK: - Properties - var disposeBag = DisposeBag() - - private var mainView = SearchCategoryView() - private var sections: [any Sectionable] = [] - private let cellTapped: PublishSubject = .init() -} - -// MARK: - Life Cycle -extension SearchCategoryController { - override func viewDidLoad() { - super.viewDidLoad() - setUp() - } -} - -// MARK: - SetUp -private extension SearchCategoryController { - func setUp() { - if let layout = reactor?.compositionalLayout { - mainView.contentCollectionView.collectionViewLayout = layout - } - mainView.contentCollectionView.delegate = self - mainView.contentCollectionView.dataSource = self - mainView.contentCollectionView.register( - TagSectionCell.self, - forCellWithReuseIdentifier: TagSectionCell.identifiers - ) - view.addSubview(mainView) - mainView.snp.makeConstraints { make in - make.edges.equalTo(view.safeAreaLayoutGuide) - } - } -} - -// MARK: - Methods -extension SearchCategoryController { - func bind(reactor: Reactor) { - rx.viewWillAppear - .map { Reactor.Action.viewWillAppear } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - cellTapped - .map { Reactor.Action.cellTapped(indexPath: $0)} - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.resetButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - Reactor.Action.resetButtonTapped(controller: owner) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.closeButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - Reactor.Action.closeButtonTapped(controller: owner) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.saveButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - Reactor.Action.saveButtonTapped(controller: owner) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - reactor.state - .withUnretained(self) - .subscribe { (owner, state) in - owner.sections = state.sections - owner.mainView.saveButton.isEnabled = state.saveButtonIsEnable - owner.mainView.contentCollectionView.reloadData() - } - .disposed(by: disposeBag) - } -} - -// MARK: - UICollectionViewDelegate, UICollectionViewDataSource -extension SearchCategoryController: UICollectionViewDelegate, UICollectionViewDataSource { - func numberOfSections(in collectionView: UICollectionView) -> Int { - return sections.count - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return sections[section].dataCount - } - - func collectionView( - _ collectionView: UICollectionView, - cellForItemAt indexPath: IndexPath - ) -> UICollectionViewCell { - let cell = sections[indexPath.section].getCell(collectionView: collectionView, indexPath: indexPath) - guard let reactor = reactor else { return cell } - return cell - } - - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - cellTapped.onNext(indexPath) - } -} -// MARK: - PanModalPresentable -extension SearchCategoryController: PanModalPresentable { - var panScrollable: UIScrollView? { - return nil - } - var longFormHeight: PanModalHeight { - return .intrinsicHeight - } - var shortFormHeight: PanModalHeight { - return .intrinsicHeight - } - var showDragIndicator: Bool { - return false - } - var cornerRadius: CGFloat { - return 20 - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryReactor.swift deleted file mode 100644 index 267f5dcb..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryReactor.swift +++ /dev/null @@ -1,119 +0,0 @@ -import UIKit - -import DomainInterface - -import ReactorKit -import RxCocoa -import RxSwift - -final class SearchCategoryReactor: Reactor { - - // MARK: - Reactor - enum Action { - case viewWillAppear - case closeButtonTapped(controller: BaseViewController) - case saveButtonTapped(controller: BaseViewController) - case resetButtonTapped(controller: BaseViewController) - case cellTapped(indexPath: IndexPath) - } - - enum Mutation { - case moveToRecentScene(controller: BaseViewController) - case loadView - case save(controller: BaseViewController) - case reset(controller: BaseViewController) - } - - struct State { - var sections: [any Sectionable] = [] - var categoryIDList: [Int64] = [] - var categoryTitleList: [String?] = [] - var saveButtonIsEnable: Bool = false - var isSave: Bool = false - var isReset: Bool = false - } - - // MARK: - properties - - var initialState: State - var disposeBag = DisposeBag() - var originCategoryList: [Int64] - private let signUpAPIUseCase: SignUpAPIUseCase - private var tagSection = TagSection(inputDataList: []) - lazy var compositionalLayout: UICollectionViewCompositionalLayout = { - UICollectionViewCompositionalLayout { [weak self] section, env in - guard let self = self else { - return NSCollectionLayoutSection(group: NSCollectionLayoutGroup( - layoutSize: .init( - widthDimension: .fractionalWidth(1), - heightDimension: .fractionalHeight(1) - )) - ) - } - return getSection()[section].getSection(section: section, env: env) - } - }() - - // MARK: - init - init( - originCategoryList: [Int64], - signUpAPIUseCase: SignUpAPIUseCase - ) { - self.initialState = State() - self.originCategoryList = originCategoryList - self.signUpAPIUseCase = signUpAPIUseCase - } - - // MARK: - Reactor Methods - func mutate(action: Action) -> Observable { - switch action { - case .viewWillAppear: - return signUpAPIUseCase.fetchCategoryList() - .withUnretained(self) - .map { (owner, response) in - owner.tagSection.inputDataList = response.map { - let isSelected = owner.originCategoryList.contains($0.categoryId) - return .init(title: $0.category, isSelected: isSelected, id: $0.categoryId) - } - return .loadView - } - case .closeButtonTapped(let controller): - return Observable.just(.moveToRecentScene(controller: controller)) - case .saveButtonTapped(let controller): - return Observable.just(.save(controller: controller)) - case .cellTapped(let indexPath): - tagSection.inputDataList[indexPath.row].isSelected.toggle() - return Observable.just(.loadView) - case .resetButtonTapped(let controller): - return Observable.just(.reset(controller: controller)) - } - } - - func reduce(state: State, mutation: Mutation) -> State { - var newState = state - switch mutation { - case .moveToRecentScene(let controller): - controller.dismiss(animated: true) - case .loadView: - newState.sections = getSection() - let selectedList = tagSection.inputDataList.filter { $0.isSelected }.compactMap { $0.id }.sorted(by: <) - let originList = originCategoryList.sorted(by: <) - newState.saveButtonIsEnable = selectedList != originList - newState.categoryIDList = selectedList - newState.categoryTitleList = tagSection.inputDataList.filter { $0.isSelected }.map { $0.title } - case .save(let controller): - newState.isSave = true - controller.dismiss(animated: true) - case .reset(let controller): - newState.isReset = true - controller.dismiss(animated: true) - } - return newState - } - - func getSection() -> [any Sectionable] { - return [ - tagSection - ] - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryView.swift deleted file mode 100644 index f8a452ca..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/CategoryController/SearchCategoryView.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// SearchCategoryView.swift -// Poppool -// -// Created by SeoJunYoung on 12/6/24. -// - -import UIKit - -import SnapKit - -final class SearchCategoryView: UIView { - - // MARK: - Components - private let titleLabel: PPLabel = { - return PPLabel(style: .bold, fontSize: 18, text: "카테고리를 선택해주세요") - }() - - let closeButton: UIButton = { - let button = UIButton() - button.setImage(UIImage(named: "icon_xmark"), for: .normal) - return button - }() - - let contentCollectionView: UICollectionView = { - let view = UICollectionView(frame: .zero, collectionViewLayout: .init()) - view.isScrollEnabled = false - return view - }() - - let buttonStackView: UIStackView = { - let view = UIStackView() - view.distribution = .fillEqually - view.spacing = 12 - return view - }() - - let resetButton: PPButton = { - return PPButton(style: .secondary, text: "초기화") - }() - - let saveButton: PPButton = { - return PPButton(style: .primary, text: "옵션저장", disabledText: "옵션저장") - }() - - // MARK: - init - init() { - super.init(frame: .zero) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -// MARK: - SetUp -private extension SearchCategoryView { - - func setUpConstraints() { - self.addSubview(titleLabel) - titleLabel.snp.makeConstraints { make in - make.leading.equalToSuperview().inset(20) - make.top.equalToSuperview().inset(12) - } - - self.addSubview(closeButton) - closeButton.snp.makeConstraints { make in - make.size.equalTo(24) - make.trailing.equalToSuperview().inset(20) - make.centerY.equalTo(titleLabel) - } - self.addSubview(contentCollectionView) - contentCollectionView.snp.makeConstraints { make in - make.leading.trailing.equalToSuperview() - make.top.equalTo(titleLabel.snp.bottom).offset(10) - make.height.equalTo(195) - } - self.addSubview(buttonStackView) - buttonStackView.addArrangedSubview(resetButton) - buttonStackView.addArrangedSubview(saveButton) - buttonStackView.snp.makeConstraints { make in - make.top.equalTo(contentCollectionView.snp.bottom).offset(32) - make.leading.trailing.equalToSuperview().inset(20) - make.height.equalTo(50) - make.bottom.equalToSuperview() - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainController.swift deleted file mode 100644 index 33d083b1..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainController.swift +++ /dev/null @@ -1,187 +0,0 @@ -import UIKit - -import DomainInterface -import Infrastructure - -import Pageboy -import ReactorKit -import RxCocoa -import RxSwift -import SnapKit -import Tabman -import Then - -final class SearchMainController: BaseTabmanController, View { - - typealias Reactor = SearchMainReactor - - // MARK: - Properties - var disposeBag = DisposeBag() - - private var mainView = SearchMainView() - - var beforeController = SearchController().then { - $0.reactor = SearchReactor( - userAPIUseCase: DIContainer.resolve(UserAPIUseCase.self), - popUpAPIUseCase: DIContainer.resolve(PopUpAPIUseCase.self) - ) - } - - var afterController = SearchResultController().then { - $0.reactor = SearchResultReactor( - userAPIUseCase: DIContainer.resolve(UserAPIUseCase.self), - popUpAPIUseCase: DIContainer.resolve(PopUpAPIUseCase.self) - ) - } - - lazy var controllers = [ - beforeController, - afterController - ] - - var isResponseTextField: Bool = false -} - -// MARK: - Life Cycle -extension SearchMainController { - override func viewDidLoad() { - super.viewDidLoad() - - self.addViews() - self.setupConstraints() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - if !isResponseTextField { - mainView.searchTextField.becomeFirstResponder() - isResponseTextField = true - } - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - tabBarController?.tabBar.isHidden = true - } -} - -// MARK: - SetUp -private extension SearchMainController { - func addViews() { - [mainView] - .forEach { self.view.addSubview($0) } - } - - func setupConstraints() { - self.dataSource = self - self.isScrollEnabled = false - - mainView.snp.makeConstraints { make in - make.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) - make.height.equalTo(56) - } - } -} - -// MARK: - Methods -extension SearchMainController { - func bind(reactor: Reactor) { - beforeController.reactor?.state - .withUnretained(self) - .subscribe(onNext: { (owner, state) in - owner.view.endEditing(true) - if let text = state.searchKeyWord { - if let index = owner.currentIndex { - if index == 0 { - owner.scrollToPage(.at(index: 1), animated: false) - reactor.action.onNext(.returnSearchKeyWord(text: text)) - owner.mainView.searchTextField.text = state.searchKeyWord - } - } - } - }) - .disposed(by: disposeBag) - - mainView.searchTextField.rx.controlEvent(.editingDidEndOnExit) - .withLatestFrom(mainView.searchTextField.rx.text.orEmpty) - .withUnretained(self) - .subscribe(onNext: { (owner, query) in - owner.view.endEditing(true) - // 텍스트가 비어있지 않으면 페이지 전환 - if !query.isEmpty { - owner.scrollToPage(.at(index: 1), animated: false) - } - owner.reactor?.action.onNext(.returnSearchKeyWord(text: query)) - owner.beforeController.reactor?.action.onNext(.returnSearchKeyword(text: query)) - }) - .disposed(by: disposeBag) - - mainView.searchTextField.rx.text - .withUnretained(self) - .subscribe(onNext: { (owner, text) in - if let text = text { - owner.mainView.clearButton.isHidden = text.isEmpty - } else { - owner.mainView.clearButton.isHidden = true - } - }) - .disposed(by: disposeBag) - - mainView.cancelButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - owner.view.endEditing(true) - if owner.currentIndex == 1 { - owner.mainView.searchTextField.text = nil - owner.beforeController.reactor?.action.onNext(.resetSearchKeyWord) - owner.scrollToPage(.at(index: 0), animated: false) - } else { - owner.navigationController?.popViewController(animated: true) - } - return Reactor.Action.returnSearchKeyWord(text: nil) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.clearButton.rx.tap - .withUnretained(self) - .subscribe { (owner, _) in - owner.mainView.searchTextField.text = nil - owner.mainView.clearButton.isHidden = true - } - .disposed(by: disposeBag) - - reactor.state - .withUnretained(self) - .subscribe { (owner, state) in - if let text = state.searchKeyword { - owner.afterController.reactor?.action.onNext(.returnSearch(text: text)) - } - } - .disposed(by: disposeBag) - } -} - -extension SearchMainController: PageboyViewControllerDataSource, TMBarDataSource { - func barItem(for bar: any Tabman.TMBar, at index: Int) -> any Tabman.TMBarItemable { - return TMBarItem(title: "") - } - - func numberOfViewControllers(in pageboyViewController: Pageboy.PageboyViewController) -> Int { - return controllers.count - } - - func viewController( - for pageboyViewController: Pageboy.PageboyViewController, - at index: Pageboy.PageboyViewController.PageIndex - ) -> UIViewController? { - return controllers[index] - } - - func defaultPage( - for pageboyViewController: Pageboy.PageboyViewController - ) -> Pageboy.PageboyViewController.Page? { - if let currentIndex = currentIndex { return .at(index: currentIndex) } - return .at(index: 0) - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainReactor.swift deleted file mode 100644 index 25c83527..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainReactor.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// SearchMainReactor.swift -// Poppool -// -// Created by SeoJunYoung on 12/7/24. -// - -import ReactorKit -import RxCocoa -import RxSwift - -final class SearchMainReactor: Reactor { - - // MARK: - Reactor - enum Action { - case returnSearchKeyWord(text: String?) - } - - enum Mutation { - case setSearchKeyWord(text: String?) - } - - struct State { - var searchKeyword: String? - } - - // MARK: - properties - - var initialState: State - var disposeBag = DisposeBag() - // MARK: - init - init() { - self.initialState = State() - } - - // MARK: - Reactor Methods - func mutate(action: Action) -> Observable { - switch action { - case .returnSearchKeyWord(let text): - return Observable.just(.setSearchKeyWord(text: text)) - } - } - - func reduce(state: State, mutation: Mutation) -> State { - var newState = state - switch mutation { - case .setSearchKeyWord(let text): - newState.searchKeyword = text - } - return newState - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainView.swift deleted file mode 100644 index 8798ec65..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/Main/SearchMainView.swift +++ /dev/null @@ -1,107 +0,0 @@ -import UIKit - -import SnapKit -import Then - -final class SearchMainView: UIView { - - // MARK: - Components - private let searchTrailingView = UIView().then { - $0.backgroundColor = .g50 - $0.layer.cornerRadius = 4 - $0.clipsToBounds = true - } - - private let searchIconImageView = UIImageView().then { - $0.image = UIImage(named: "icon_search_gray") - } - - private let searchStackView = UIStackView().then { - $0.spacing = 4 - $0.alignment = .center - } - - let cancelButton = UIButton(type: .system).then { - $0.setTitle("취소", for: .normal) - $0.setTitleColor(.g1000, for: .normal) - $0.titleLabel?.font = .korFont(style: .regular, size: 14) - $0.imageView?.contentMode = .scaleAspectFit - } - - let searchTextField = UITextField().then { - $0.font = .korFont(style: .regular, size: 14) - $0.setPlaceholder( - text: "팝업스토어명을 입력해보세요", - color: .g400, - font: .korFont(style: .regular, size: 14)! - ) - } - - let clearButton = UIButton().then { - $0.setImage(UIImage(named: "icon_clearButton"), for: .normal) - } - - private var headerStackView = UIStackView().then { - $0.alignment = .center - $0.spacing = 16 - } - - // MARK: - init - init() { - super.init(frame: .zero) - - self.addViews() - self.setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError("\(#file), \(#function) Error") - } -} - -// MARK: - SetUp -private extension SearchMainView { - - func addViews() { - [headerStackView] - .forEach { self.addSubview($0) } - - [searchTrailingView, cancelButton] - .forEach { headerStackView.addArrangedSubview($0) } - - [searchStackView] - .forEach { searchTrailingView.addSubview($0) } - - [searchIconImageView, searchTextField, clearButton] - .forEach { searchStackView.addArrangedSubview($0) } - } - - func setUpConstraints() { - searchTrailingView.snp.makeConstraints { make in - make.height.equalTo(37) - } - - headerStackView.snp.makeConstraints { make in - make.top.equalToSuperview().inset(7) - make.leading.equalToSuperview().inset(20) - make.trailing.equalToSuperview().inset(16) - } - - searchStackView.snp.makeConstraints { make in - make.top.bottom.equalToSuperview() - make.leading.trailing.equalToSuperview().inset(12) - } - - searchIconImageView.snp.makeConstraints { make in - make.size.equalTo(20) - } - - searchTextField.snp.makeConstraints { make in - make.height.equalTo(21) - } - - clearButton.snp.makeConstraints { make in - make.size.equalTo(16) - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedController.swift deleted file mode 100644 index 4fb31f8a..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedController.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// SearchSortedController.swift -// Poppool -// -// Created by SeoJunYoung on 12/6/24. -// - -import UIKit - -import PanModal -import ReactorKit -import RxCocoa -import RxSwift -import SnapKit - -final class SearchSortedController: BaseViewController, View { - - typealias Reactor = SearchSortedReactor - - // MARK: - Properties - var disposeBag = DisposeBag() - - private var mainView = SearchSortedView() -} - -// MARK: - Life Cycle -extension SearchSortedController { - override func viewDidLoad() { - super.viewDidLoad() - setUp() - } -} - -// MARK: - SetUp -private extension SearchSortedController { - func setUp() { - view.addSubview(mainView) - mainView.snp.makeConstraints { make in - make.edges.equalTo(view.safeAreaLayoutGuide) - } - } -} - -// MARK: - Methods -extension SearchSortedController { - func bind(reactor: Reactor) { - mainView.closeButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - Reactor.Action.closeButtonTapped(controller: owner) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.filterSegmentControl.rx.controlEvent(.valueChanged) - .withUnretained(self) - .map({ (owner, _) in - Reactor.Action.changeFilterIndex(index: owner.mainView.filterSegmentControl.selectedSegmentIndex) - }) - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.sortedSegmentControl.rx.controlEvent(.valueChanged) - .withUnretained(self) - .map({ (owner, _) in - Reactor.Action.changeSortedIndex(index: owner.mainView.sortedSegmentControl.selectedSegmentIndex) - }) - .bind(to: reactor.action) - .disposed(by: disposeBag) - - mainView.saveButton.rx.tap - .withUnretained(self) - .map { (owner, _) in - Reactor.Action.saveButtonTapped(controller: owner) - } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - reactor.state - .withUnretained(self) - .subscribe { (owner, state) in - owner.mainView.filterSegmentControl.selectedSegmentIndex = state.filterIndex - owner.mainView.sortedSegmentControl.selectedSegmentIndex = state.sortedIndex - owner.mainView.saveButton.isEnabled = state.saveButtonIsEnable - } - .disposed(by: disposeBag) - } -} - -// MARK: - PanModalPresentable -extension SearchSortedController: PanModalPresentable { - var panScrollable: UIScrollView? { - return nil - } - var longFormHeight: PanModalHeight { - return .intrinsicHeight - } - var shortFormHeight: PanModalHeight { - return .intrinsicHeight - } - var showDragIndicator: Bool { - return false - } - var cornerRadius: CGFloat { - return 20 - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedReactor.swift deleted file mode 100644 index 12dfc2d5..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedReactor.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// SearchSortedReactor.swift -// Poppool -// -// Created by SeoJunYoung on 12/6/24. -// - -import ReactorKit -import RxCocoa -import RxSwift - -final class SearchSortedReactor: Reactor { - - // MARK: - Reactor - enum Action { - case closeButtonTapped(controller: BaseViewController) - case changeFilterIndex(index: Int) - case changeSortedIndex(index: Int) - case saveButtonTapped(controller: BaseViewController) - } - - enum Mutation { - case moveToRecentScene(controller: BaseViewController) - case loadView - case save(controller: BaseViewController) - } - - struct State { - var filterIndex: Int - var sortedIndex: Int - var saveButtonIsEnable: Bool = false - var isSave: Bool = false - } - - // MARK: - properties - - var initialState: State - var disposeBag = DisposeBag() - var originFilterIndex: Int - var originSortedIndex: Int - private var selectedFilterIndex: Int - private var selectedSortedIndex: Int - - // MARK: - init - init(filterIndex: Int, sortedIndex: Int) { - self.initialState = State(filterIndex: filterIndex, sortedIndex: sortedIndex) - self.originFilterIndex = filterIndex - self.originSortedIndex = sortedIndex - self.selectedFilterIndex = filterIndex - self.selectedSortedIndex = sortedIndex - } - - // MARK: - Reactor Methods - func mutate(action: Action) -> Observable { - switch action { - case .closeButtonTapped(let controller): - return Observable.just(.moveToRecentScene(controller: controller)) - case .changeFilterIndex(let index): - selectedFilterIndex = index - return Observable.just(.loadView) - case .changeSortedIndex(let index): - selectedSortedIndex = index - return Observable.just(.loadView) - case .saveButtonTapped(let controller): - return Observable.just(.save(controller: controller)) - } - } - - func reduce(state: State, mutation: Mutation) -> State { - var newState = state - switch mutation { - case .moveToRecentScene(let controller): - controller.dismiss(animated: true) - case .loadView: - newState.filterIndex = selectedFilterIndex - newState.sortedIndex = selectedSortedIndex - - if selectedFilterIndex != originFilterIndex || selectedSortedIndex != originSortedIndex { - newState.saveButtonIsEnable = true - } else { - newState.saveButtonIsEnable = false - } - case .save(let controller): - newState.isSave = true - controller.dismiss(animated: true) - } - return newState - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedView.swift deleted file mode 100644 index 243560f1..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Search/SortedController/SearchSortedView.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// SearchSortedView.swift -// Poppool -// -// Created by SeoJunYoung on 12/6/24. -// - -import UIKit - -import SnapKit - -final class SearchSortedView: UIView { - - // MARK: - Components - private let titleLabel: PPLabel = { - return PPLabel(style: .bold, fontSize: 18, text: "노출 순서를 선택해주세요") - }() - - let closeButton: UIButton = { - let button = UIButton() - button.setImage(UIImage(named: "icon_xmark"), for: .normal) - return button - }() - - private let filterTitleLabel: PPLabel = { - return PPLabel(style: .regular, fontSize: 13, text: "노출 조건") - }() - - let filterSegmentControl: PPSegmentedControl = { - return PPSegmentedControl(type: .base, segments: ["오픈", "종료"], selectedSegmentIndex: 0) - }() - - private let sortedTitleLabel: PPLabel = { - return PPLabel(style: .regular, fontSize: 13, text: "팝업순서") - }() - - let sortedSegmentControl: PPSegmentedControl = { - return PPSegmentedControl(type: .base, segments: ["신규순", "인기순"], selectedSegmentIndex: 0) - }() - - let saveButton: PPButton = { - return PPButton(style: .primary, text: "저장", disabledText: "저장") - }() - - // MARK: - init - init() { - super.init(frame: .zero) - setUpConstraints() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } -} - -// MARK: - SetUp -private extension SearchSortedView { - - func setUpConstraints() { - self.addSubview(titleLabel) - titleLabel.snp.makeConstraints { make in - make.leading.equalToSuperview().inset(20) - make.top.equalToSuperview().inset(32) - } - - self.addSubview(closeButton) - closeButton.snp.makeConstraints { make in - make.size.equalTo(24) - make.trailing.equalToSuperview().inset(20) - make.centerY.equalTo(titleLabel) - } - - self.addSubview(filterTitleLabel) - filterTitleLabel.snp.makeConstraints { make in - make.top.equalTo(titleLabel.snp.bottom).offset(36) - make.leading.equalToSuperview().inset(20) - } - - self.addSubview(filterSegmentControl) - filterSegmentControl.snp.makeConstraints { make in - make.top.equalTo(filterTitleLabel.snp.bottom).offset(8) - make.leading.trailing.equalToSuperview().inset(20) - } - - self.addSubview(sortedTitleLabel) - sortedTitleLabel.snp.makeConstraints { make in - make.top.equalTo(filterSegmentControl.snp.bottom).offset(20) - make.leading.equalToSuperview().inset(20) - } - - self.addSubview(sortedSegmentControl) - sortedSegmentControl.snp.makeConstraints { make in - make.top.equalTo(sortedTitleLabel.snp.bottom).offset(8) - make.leading.trailing.equalToSuperview().inset(20) - } - - self.addSubview(saveButton) - saveButton.snp.makeConstraints { make in - make.top.equalTo(sortedSegmentControl.snp.bottom).offset(32) - make.leading.trailing.equalToSuperview().inset(20) - make.bottom.equalToSuperview() - } - } -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainController.swift index e72b9a4c..3086975f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainController.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainReactor.swift index c4f3db3a..3c5bafe2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/SignUpMainReactor.swift @@ -1,3 +1,4 @@ +import DesignSystem import DomainInterface import Infrastructure @@ -19,7 +20,7 @@ final class SignUpMainReactor: Reactor { case step4SkipButtonTapped(controller: BaseTabmanController) case changeTerms(isMarketingAgree: Bool) case changeNickName(nickName: String?) - case changeCategory(categorys: [Int64], categoryTitles: [String], categoryIDList: [Int64]) + case changeCategory(categorys: [Int], categoryTitles: [String], categoryIDList: [Int]) case changeGender(gender: String?) case changeAge(age: Int?) } @@ -33,7 +34,7 @@ final class SignUpMainReactor: Reactor { case moveToCompleteScene(controller: BaseTabmanController) case setTerms(isMarketingAgree: Bool) case setNickName(nickName: String?) - case setCategory(categorys: [Int64], categoryTitles: [String], categoryIDList: [Int64]) + case setCategory(categorys: [Int], categoryTitles: [String], categoryIDList: [Int]) case setGender(gender: String?) case setAge(age: Int?) } @@ -42,10 +43,10 @@ final class SignUpMainReactor: Reactor { var currentIndex: Int = 0 var isMarketingAgree: Bool = false var nickName: String? - var categorys: [Int64] = [] + var categorys: [Int] = [] var categoryTitles: [String] = [] var gender: String? = "선택안함" - var categoryIDList: [Int64] = [] + var categoryIDList: [Int] = [] var age: Int? } diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/View/SignUpMainView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/View/SignUpMainView.swift index a4928637..ffe88df1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/View/SignUpMainView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Main/View/SignUpMainView.swift @@ -1,12 +1,7 @@ -// -// SignUpMainView.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpMainView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteController.swift index 7556c572..c76da8a8 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteController.swift @@ -1,12 +1,7 @@ -// -// SignUpCompleteController.swift -// Poppool -// -// Created by SeoJunYoung on 11/27/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift @@ -69,13 +64,13 @@ extension SignUpCompleteController { let attributedText = NSMutableAttributedString( string: categoryString, attributes: [ - .font: UIFont.korFont(style: .bold, size: 15)!, + .font: UIFont.korFont(style: .bold, size: 15), .foregroundColor: UIColor.g600, NSAttributedString.Key.paragraphStyle: paragraphStyle ] ) attributedText.append(NSAttributedString(string: "와 연관된 팝업스토어 정보를 안내해드릴게요.", attributes: [ - .font: UIFont.korFont(style: .regular, size: 15)!, + .font: UIFont.korFont(style: .regular, size: 15), .foregroundColor: UIColor.g600, NSAttributedString.Key.paragraphStyle: paragraphStyle ])) diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteReactor.swift index 9269d52a..d26997ba 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteReactor.swift @@ -1,9 +1,4 @@ -// -// SignUpCompleteReactor.swift -// Poppool -// -// Created by SeoJunYoung on 11/27/24. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteView.swift index b0ee7a2a..b89f2ffa 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/SignUpComplete/SignUpCompleteView.swift @@ -1,12 +1,7 @@ -// -// SignUpCompleteView.swift -// Poppool -// -// Created by SeoJunYoung on 11/27/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpCompleteView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Controller.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Controller.swift index 1fd6c671..ad6ab703 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Controller.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Controller.swift @@ -1,12 +1,7 @@ -// -// SignUpStep1Controller.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Reactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Reactor.swift index b4f838db..788b5e0b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Reactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/SignUpStep1Reactor.swift @@ -1,11 +1,7 @@ -// -// SignUpStep1Reactor.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import Foundation + +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpCheckBoxButton.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpCheckBoxButton.swift index 3a5e5a4b..064b423f 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpCheckBoxButton.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpCheckBoxButton.swift @@ -1,12 +1,7 @@ -// -// SignUpCheckBoxButton.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpStep1View.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpStep1View.swift index 5bbab051..c7b46b7e 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpStep1View.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpStep1View.swift @@ -1,12 +1,7 @@ -// -// SignUpStep1View.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpStep1View: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpTermsView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpTermsView.swift index cdfd3a56..03a16047 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpTermsView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step1/View/SignUpTermsView.swift @@ -1,12 +1,7 @@ -// -// SignUpTermsView.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2Controller.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2Controller.swift index 42293868..8aefa684 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2Controller.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2Controller.swift @@ -1,12 +1,7 @@ -// -// SignUpStep2Controller.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxGesture diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2View.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2View.swift index 984e0d56..9626eac2 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2View.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step2/SignUpStep2View.swift @@ -1,12 +1,7 @@ -// -// SignUpStep2View.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpStep2View: UIView { @@ -51,7 +46,7 @@ final class SignUpStep2View: UIView { let clearButton: UIButton = { let button = UIButton() - button.setImage(UIImage(named: "icon_clearButton"), for: .normal) + button.setImage(UIImage(named: "icon_clear_button"), for: .normal) return button }() @@ -75,7 +70,7 @@ final class SignUpStep2View: UIView { let attributedTitle = NSAttributedString( string: title, attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 폰트 + .font: UIFont.korFont(style: .regular, size: 13), // 폰트 .underlineStyle: NSUnderlineStyle.single.rawValue, // 밑줄 스타일 .foregroundColor: UIColor.g1000 // 텍스트 색상 ] @@ -83,7 +78,7 @@ final class SignUpStep2View: UIView { let disabledAttributedTitle = NSAttributedString( string: title, attributes: [ - .font: UIFont.korFont(style: .regular, size: 13)!, // 폰트 + .font: UIFont.korFont(style: .regular, size: 13), // 폰트 .underlineStyle: NSUnderlineStyle.single.rawValue, // 밑줄 스타일 .foregroundColor: UIColor.g300 // 텍스트 색상 ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Controller.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Controller.swift index 4b85d7c3..246c49f3 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Controller.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Controller.swift @@ -1,12 +1,7 @@ -// -// SignUpStep3Controller.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxGesture diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Reactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Reactor.swift index 078e6d52..43ddd997 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Reactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/SignUpStep3Reactor.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import ReactorKit @@ -20,9 +21,9 @@ final class SignUpStep3Reactor: Reactor { struct State { var sections: [any Sectionable] = [] - var selectedCategory: [Int64] = [] + var selectedCategory: [Int] = [] var selectedCategoryTitle: [String] = [] - var categoryIDList: [Int64] = [] + var categoryIDList: [Int] = [] } // MARK: - properties @@ -30,7 +31,7 @@ final class SignUpStep3Reactor: Reactor { var initialState: State var disposeBag = DisposeBag() private let signUpAPIUseCase: SignUpAPIUseCase - private var cetegoryIDList: [Int64] = [] + private var cetegoryIDList: [Int] = [] lazy var compositionalLayout: UICollectionViewCompositionalLayout = { UICollectionViewCompositionalLayout { [weak self] section, env in diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/SignUpStep3View.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/SignUpStep3View.swift index 04c18968..5388a368 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/SignUpStep3View.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/SignUpStep3View.swift @@ -1,12 +1,7 @@ -// -// SignUpStep3View.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpStep3View: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSection.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSection.swift index 2f508831..59afe696 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSection.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSection.swift @@ -1,12 +1,7 @@ -// -// TagSection.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import RxSwift struct TagSection: Sectionable { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSectionCell.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSectionCell.swift index 28e1b592..e4c1f754 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSectionCell.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step3/View/TagSection/TagSectionCell.swift @@ -1,12 +1,7 @@ -// -// TagSectionCell.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import RxSwift import SnapKit @@ -49,7 +44,7 @@ extension TagSectionCell: Inputable { struct Input { var title: String? var isSelected: Bool - var id: Int64? + var id: Int? } func injection(with input: Input) { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedController.swift index 2a2d3d8b..4024ecea 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedController.swift @@ -1,12 +1,7 @@ -// -// AgeSelectedController.swift -// Poppool -// -// Created by SeoJunYoung on 11/26/24. -// - import UIKit +import DesignSystem + import PanModal import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedReactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedReactor.swift index 08a1c326..907e51d1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedReactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedReactor.swift @@ -1,9 +1,4 @@ -// -// AgeSelectedReactor.swift -// Poppool -// -// Created by SeoJunYoung on 11/26/24. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedView.swift index 6322c58c..fbb5cabe 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/AgeSelectedModal/AgeSelectedView.swift @@ -1,12 +1,7 @@ -// -// AgeSelectedView.swift -// Poppool -// -// Created by SeoJunYoung on 11/26/24. -// - import UIKit +import DesignSystem + import SnapKit final class AgeSelectedView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Controller.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Controller.swift index 772bf195..9294c172 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Controller.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Controller.swift @@ -1,12 +1,7 @@ -// -// SignUpStep4Controller.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import ReactorKit import RxCocoa import RxSwift diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Reactor.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Reactor.swift index 02d72a7f..8f848425 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Reactor.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/SignUpStep4Reactor.swift @@ -1,9 +1,4 @@ -// -// SignUpStep4Reactor.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// +import DesignSystem import ReactorKit import RxCocoa diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/AgeSelectedButton.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/AgeSelectedButton.swift index 43774bdf..ac5bf151 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/AgeSelectedButton.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/AgeSelectedButton.swift @@ -1,12 +1,7 @@ -// -// AgeSelectedButton.swift -// Poppool -// -// Created by SeoJunYoung on 11/26/24. -// - import UIKit +import DesignSystem + import SnapKit final class AgeSelectedButton: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/SignUpStep4View.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/SignUpStep4View.swift index 52453a36..a7d8df1d 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/SignUpStep4View.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/Step4/Main/View/SignUpStep4View.swift @@ -1,12 +1,7 @@ -// -// SignUpStep4View.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class SignUpStep4View: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailController.swift index 79f1c5f2..818b7eea 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailController.swift @@ -1,12 +1,7 @@ -// -// TermsDetailController.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import RxCocoa import RxSwift import SnapKit diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailView.swift index 6c5b7d7c..75772762 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/SignUp/TermsDetail/TermsDetailView.swift @@ -1,12 +1,7 @@ -// -// TermsDetailView.swift -// Poppool -// -// Created by SeoJunYoung on 11/25/24. -// - import UIKit +import DesignSystem + import SnapKit final class TermsDetailView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Splash/SplashController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Splash/SplashController.swift index 4d688b1a..006b1446 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/Splash/SplashController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/Splash/SplashController.swift @@ -1,5 +1,6 @@ import UIKit +import DesignSystem import DomainInterface import Infrastructure diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Scene/TabbarController/TabbarController.swift b/Poppool/PresentationLayer/Presentation/Presentation/Scene/TabbarController/TabbarController.swift index 8bee4e8b..69d4639b 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Scene/TabbarController/TabbarController.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Scene/TabbarController/TabbarController.swift @@ -236,11 +236,11 @@ class WaveTabBarController: UITabBarController, UITabBarControllerDelegate { // 폰트 설정 let appearance = UITabBarAppearance() appearance.stackedLayoutAppearance.normal.titleTextAttributes = [ - .font: UIFont.korFont(style: .medium, size: 11)!, + .font: UIFont.korFont(style: .medium, size: 11), .paragraphStyle: paragraphStyle ] appearance.stackedLayoutAppearance.selected.titleTextAttributes = [ - .font: UIFont.korFont(style: .bold, size: 11)!, + .font: UIFont.korFont(style: .bold, size: 11), .paragraphStyle: paragraphStyle ] diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/InOutputable.swift b/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/InOutputable.swift deleted file mode 100644 index 4bfbc829..00000000 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/Interfaces/InOutputable.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// InOutputable.swift -// MomsVillage -// -// Created by SeoJunYoung on 8/29/24. -// - -import UIKit - -protocol InOutputable: Inputable, Outputable { } - -protocol Inputable { - associatedtype Input - func injection(with input: Input) -} - -protocol Outputable { - associatedtype Output -} diff --git a/Poppool/PresentationLayer/Presentation/Presentation/Utills/ToastMaker/BookMarkToastView.swift b/Poppool/PresentationLayer/Presentation/Presentation/Utills/ToastMaker/BookMarkToastView.swift index 27f6d3df..114aa5a1 100644 --- a/Poppool/PresentationLayer/Presentation/Presentation/Utills/ToastMaker/BookMarkToastView.swift +++ b/Poppool/PresentationLayer/Presentation/Presentation/Utills/ToastMaker/BookMarkToastView.swift @@ -1,12 +1,7 @@ -// -// BookMarkToastView.swift -// Poppool -// -// Created by SeoJunYoung on 1/21/25. -// - import UIKit +import DesignSystem + import SnapKit final class BookMarkToastView: UIView { diff --git a/Poppool/PresentationLayer/Presentation/PresentationInterface/Factory/DetailFactory.swift b/Poppool/PresentationLayer/Presentation/PresentationInterface/Factory/DetailFactory.swift new file mode 100644 index 00000000..c21eea95 --- /dev/null +++ b/Poppool/PresentationLayer/Presentation/PresentationInterface/Factory/DetailFactory.swift @@ -0,0 +1,5 @@ +import DesignSystem + +public protocol DetailFactory { + func make(popupID: Int) -> BaseViewController +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/project.pbxproj b/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/project.pbxproj new file mode 100644 index 00000000..339781c4 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/project.pbxproj @@ -0,0 +1,1009 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 052413092DCF7DA100C42E2D /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 052413082DCF7DA100C42E2D /* DesignSystem.framework */; }; + 0524130A2DCF7DA100C42E2D /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 052413082DCF7DA100C42E2D /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 054A96202DCE38B500C0DD58 /* SearchFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */; }; + 054A96212DCE38B500C0DD58 /* SearchFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 054A96262DCE38E900C0DD58 /* Tabman in Frameworks */ = {isa = PBXBuildFile; productRef = 054A96252DCE38E900C0DD58 /* Tabman */; }; + 054A96282DCE390A00C0DD58 /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = 054A96272DCE390A00C0DD58 /* ReactorKit */; }; + 054A962B2DCE3A0300C0DD58 /* NMapsMap in Frameworks */ = {isa = PBXBuildFile; productRef = 054A962A2DCE3A0300C0DD58 /* NMapsMap */; }; + 05734C082DCDA7D20093825D /* SearchFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */; }; + 05734C092DCDA7D20093825D /* SearchFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C2B2DCDD6380093825D /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C2A2DCDD6380093825D /* Infrastructure.framework */; }; + 05734C2C2DCDD6380093825D /* Infrastructure.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C2A2DCDD6380093825D /* Infrastructure.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C442DCDF7240093825D /* PresentationInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C432DCDF7240093825D /* PresentationInterface.framework */; }; + 05734C452DCDF7240093825D /* PresentationInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C432DCDF7240093825D /* PresentationInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C502DCDF8B40093825D /* PresentationInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C4F2DCDF8B40093825D /* PresentationInterface.framework */; }; + 05734C512DCDF8B40093825D /* PresentationInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C4F2DCDF8B40093825D /* PresentationInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05734C532DCDF8B80093825D /* Presentation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C522DCDF8B80093825D /* Presentation.framework */; }; + 05734C542DCDF8B80093825D /* Presentation.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05734C522DCDF8B80093825D /* Presentation.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 058AE08D2DCCC27F009119B2 /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 058AE08C2DCCC27F009119B2 /* Then */; }; + 05CFFBE52DCB8F6C0051129F /* SearchFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0516336D2DC457A900A6C0D1 /* SearchFeature.framework */; }; + 05CFFBE62DCB8F6C0051129F /* SearchFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0516336D2DC457A900A6C0D1 /* SearchFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBE92DCB90070051129F /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 05CFFBE82DCB90070051129F /* RxSwift */; }; + 05CFFBEA2DCB90210051129F /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC286A2DC5FE5B00C761A5 /* Data.framework */; }; + 05CFFBEB2DCB90210051129F /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC286A2DC5FE5B00C761A5 /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBEC2DCB90440051129F /* Domain.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC28642DC5FDF800C761A5 /* Domain.framework */; }; + 05CFFBED2DCB90440051129F /* Domain.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC28642DC5FDF800C761A5 /* Domain.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBEE2DCB90460051129F /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC28652DC5FDF800C761A5 /* DomainInterface.framework */; }; + 05CFFBEF2DCB90460051129F /* DomainInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC28652DC5FDF800C761A5 /* DomainInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBF02DCB90580051129F /* Infrastructure.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC286D2DC5FE6000C761A5 /* Infrastructure.framework */; }; + 05CFFBF12DCB90580051129F /* Infrastructure.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC286D2DC5FE6000C761A5 /* Infrastructure.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBF32DCB906F0051129F /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 05CFFBF22DCB906F0051129F /* RxCocoa */; }; + 05CFFBF42DCB908B0051129F /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC23422DC49AA200C761A5 /* DesignSystem.framework */; }; + 05CFFBF52DCB908B0051129F /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC23422DC49AA200C761A5 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 05CFFBF72DCB90A10051129F /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05CFFBF62DCB90A10051129F /* SnapKit */; }; + 05EC233C2DC49A7600C761A5 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC233B2DC49A7600C761A5 /* RxCocoa */; }; + 05EC233E2DC49A7600C761A5 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC233D2DC49A7600C761A5 /* RxSwift */; }; + 05EC23412DC49A8B00C761A5 /* ReactorKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC23402DC49A8B00C761A5 /* ReactorKit */; }; + 05EC23472DC49AA800C761A5 /* DomainInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC23462DC49AA800C761A5 /* DomainInterface.framework */; }; + 05EC234B2DC49AB400C761A5 /* Then in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC234A2DC49AB400C761A5 /* Then */; }; + 05EC234E2DC49AC100C761A5 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC234D2DC49AC100C761A5 /* SnapKit */; }; + 05EC285F2DC5C1CF00C761A5 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05EC23422DC49AA200C761A5 /* DesignSystem.framework */; }; + 05EC2AE92DC7C07400C761A5 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = 05EC2AE82DC7C07400C761A5 /* RxRelay */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0516364D2DC45E6300A6C0D1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 051633642DC457A900A6C0D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0516336C2DC457A900A6C0D1; + remoteInfo = SearchFeature; + }; + 054A96222DCE38B500C0DD58 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 051633642DC457A900A6C0D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 05734BF42DCDA6B90093825D; + remoteInfo = SearchFeatureInterface; + }; + 05734C0A2DCDA7D20093825D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 051633642DC457A900A6C0D1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 05734BF42DCDA6B90093825D; + remoteInfo = SearchFeatureInterface; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 05734C0C2DCDA7D20093825D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 05734C452DCDF7240093825D /* PresentationInterface.framework in Embed Frameworks */, + 05734C092DCDA7D20093825D /* SearchFeatureInterface.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 05734C2D2DCDD6390093825D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 05734C2C2DCDD6380093825D /* Infrastructure.framework in Embed Frameworks */, + 0524130A2DCF7DA100C42E2D /* DesignSystem.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; + 05CFFBE72DCB8F6C0051129F /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 05CFFBED2DCB90440051129F /* Domain.framework in Embed Frameworks */, + 05CFFBEB2DCB90210051129F /* Data.framework in Embed Frameworks */, + 05734C512DCDF8B40093825D /* PresentationInterface.framework in Embed Frameworks */, + 054A96212DCE38B500C0DD58 /* SearchFeatureInterface.framework in Embed Frameworks */, + 05CFFBF12DCB90580051129F /* Infrastructure.framework in Embed Frameworks */, + 05CFFBF52DCB908B0051129F /* DesignSystem.framework in Embed Frameworks */, + 05CFFBEF2DCB90460051129F /* DomainInterface.framework in Embed Frameworks */, + 05734C542DCDF8B80093825D /* Presentation.framework in Embed Frameworks */, + 05CFFBE62DCB8F6C0051129F /* SearchFeature.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0516336D2DC457A900A6C0D1 /* SearchFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0516362F2DC457DE00A6C0D1 /* SearchFeatureDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SearchFeatureDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 052413082DCF7DA100C42E2D /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SearchFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C232DCDD4CF0093825D /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C2A2DCDD6380093825D /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C432DCDF7240093825D /* PresentationInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PresentationInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C4F2DCDF8B40093825D /* PresentationInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PresentationInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05734C522DCDF8B80093825D /* Presentation.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Presentation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 058AE0AD2DCCE3E1009119B2 /* CoordinatorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoordinatorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 058AE0B12DCCE3E9009119B2 /* CoordinatorKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CoordinatorKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC23422DC49AA200C761A5 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC23462DC49AA800C761A5 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC28642DC5FDF800C761A5 /* Domain.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Domain.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC28652DC5FDF800C761A5 /* DomainInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DomainInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC286A2DC5FE5B00C761A5 /* Data.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Data.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 05EC286D2DC5FE6000C761A5 /* Infrastructure.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Infrastructure.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 051636402DC457DF00A6C0D1 /* Exceptions for "SearchFeatureDemo" folder in "SearchFeatureDemo" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + Resource/Info.plist, + ); + target = 0516362E2DC457DE00A6C0D1 /* SearchFeatureDemo */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 0516336F2DC457A900A6C0D1 /* SearchFeature */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = SearchFeature; + sourceTree = ""; + }; + 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 051636402DC457DF00A6C0D1 /* Exceptions for "SearchFeatureDemo" folder in "SearchFeatureDemo" target */, + ); + path = SearchFeatureDemo; + sourceTree = ""; + }; + 05734BF62DCDA6B90093825D /* SearchFeatureInterface */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = SearchFeatureInterface; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0516336A2DC457A900A6C0D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 05734C442DCDF7240093825D /* PresentationInterface.framework in Frameworks */, + 05EC2AE92DC7C07400C761A5 /* RxRelay in Frameworks */, + 05EC285F2DC5C1CF00C761A5 /* DesignSystem.framework in Frameworks */, + 05EC23472DC49AA800C761A5 /* DomainInterface.framework in Frameworks */, + 05EC234B2DC49AB400C761A5 /* Then in Frameworks */, + 05EC233E2DC49A7600C761A5 /* RxSwift in Frameworks */, + 05EC234E2DC49AC100C761A5 /* SnapKit in Frameworks */, + 05734C082DCDA7D20093825D /* SearchFeatureInterface.framework in Frameworks */, + 05EC23412DC49A8B00C761A5 /* ReactorKit in Frameworks */, + 05EC233C2DC49A7600C761A5 /* RxCocoa in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0516362C2DC457DE00A6C0D1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 05CFFBEE2DCB90460051129F /* DomainInterface.framework in Frameworks */, + 05CFFBF42DCB908B0051129F /* DesignSystem.framework in Frameworks */, + 05734C532DCDF8B80093825D /* Presentation.framework in Frameworks */, + 05CFFBEC2DCB90440051129F /* Domain.framework in Frameworks */, + 05CFFBEA2DCB90210051129F /* Data.framework in Frameworks */, + 054A962B2DCE3A0300C0DD58 /* NMapsMap in Frameworks */, + 05CFFBF32DCB906F0051129F /* RxCocoa in Frameworks */, + 058AE08D2DCCC27F009119B2 /* Then in Frameworks */, + 05CFFBF02DCB90580051129F /* Infrastructure.framework in Frameworks */, + 054A96202DCE38B500C0DD58 /* SearchFeatureInterface.framework in Frameworks */, + 054A96262DCE38E900C0DD58 /* Tabman in Frameworks */, + 05CFFBF72DCB90A10051129F /* SnapKit in Frameworks */, + 05CFFBE92DCB90070051129F /* RxSwift in Frameworks */, + 05734C502DCDF8B40093825D /* PresentationInterface.framework in Frameworks */, + 054A96282DCE390A00C0DD58 /* ReactorKit in Frameworks */, + 05CFFBE52DCB8F6C0051129F /* SearchFeature.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 05734BF22DCDA6B90093825D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 05734C2B2DCDD6380093825D /* Infrastructure.framework in Frameworks */, + 052413092DCF7DA100C42E2D /* DesignSystem.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 051633632DC457A900A6C0D1 = { + isa = PBXGroup; + children = ( + 0516336F2DC457A900A6C0D1 /* SearchFeature */, + 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */, + 05734BF62DCDA6B90093825D /* SearchFeatureInterface */, + 0516364A2DC45E6300A6C0D1 /* Frameworks */, + 0516336E2DC457A900A6C0D1 /* Products */, + ); + sourceTree = ""; + }; + 0516336E2DC457A900A6C0D1 /* Products */ = { + isa = PBXGroup; + children = ( + 0516336D2DC457A900A6C0D1 /* SearchFeature.framework */, + 0516362F2DC457DE00A6C0D1 /* SearchFeatureDemo.app */, + 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */, + ); + name = Products; + sourceTree = ""; + }; + 0516364A2DC45E6300A6C0D1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 052413082DCF7DA100C42E2D /* DesignSystem.framework */, + 05734C522DCDF8B80093825D /* Presentation.framework */, + 05734C4F2DCDF8B40093825D /* PresentationInterface.framework */, + 05734C432DCDF7240093825D /* PresentationInterface.framework */, + 05734C2A2DCDD6380093825D /* Infrastructure.framework */, + 05734C232DCDD4CF0093825D /* DesignSystem.framework */, + 058AE0B12DCCE3E9009119B2 /* CoordinatorKit.framework */, + 058AE0AD2DCCE3E1009119B2 /* CoordinatorKit.framework */, + 05EC286D2DC5FE6000C761A5 /* Infrastructure.framework */, + 05EC286A2DC5FE5B00C761A5 /* Data.framework */, + 05EC28642DC5FDF800C761A5 /* Domain.framework */, + 05EC28652DC5FDF800C761A5 /* DomainInterface.framework */, + 05EC23462DC49AA800C761A5 /* DomainInterface.framework */, + 05EC23422DC49AA200C761A5 /* DesignSystem.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 051633682DC457A900A6C0D1 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 05734BF02DCDA6B90093825D /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0516336C2DC457A900A6C0D1 /* SearchFeature */ = { + isa = PBXNativeTarget; + buildConfigurationList = 051633742DC457A900A6C0D1 /* Build configuration list for PBXNativeTarget "SearchFeature" */; + buildPhases = ( + 051633682DC457A900A6C0D1 /* Headers */, + 051633692DC457A900A6C0D1 /* Sources */, + 0516336A2DC457A900A6C0D1 /* Frameworks */, + 0516336B2DC457A900A6C0D1 /* Resources */, + 05734C0C2DCDA7D20093825D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 05734C0B2DCDA7D20093825D /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 0516336F2DC457A900A6C0D1 /* SearchFeature */, + ); + name = SearchFeature; + packageProductDependencies = ( + 05EC233B2DC49A7600C761A5 /* RxCocoa */, + 05EC233D2DC49A7600C761A5 /* RxSwift */, + 05EC23402DC49A8B00C761A5 /* ReactorKit */, + 05EC234A2DC49AB400C761A5 /* Then */, + 05EC234D2DC49AC100C761A5 /* SnapKit */, + 05EC2AE82DC7C07400C761A5 /* RxRelay */, + ); + productName = SearchFeature; + productReference = 0516336D2DC457A900A6C0D1 /* SearchFeature.framework */; + productType = "com.apple.product-type.framework"; + }; + 0516362E2DC457DE00A6C0D1 /* SearchFeatureDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 051636412DC457DF00A6C0D1 /* Build configuration list for PBXNativeTarget "SearchFeatureDemo" */; + buildPhases = ( + 0516362B2DC457DE00A6C0D1 /* Sources */, + 0516362C2DC457DE00A6C0D1 /* Frameworks */, + 0516362D2DC457DE00A6C0D1 /* Resources */, + 05CFFBE72DCB8F6C0051129F /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 0516364E2DC45E6300A6C0D1 /* PBXTargetDependency */, + 054A96232DCE38B500C0DD58 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */, + ); + name = SearchFeatureDemo; + packageProductDependencies = ( + 05CFFBE82DCB90070051129F /* RxSwift */, + 05CFFBF22DCB906F0051129F /* RxCocoa */, + 05CFFBF62DCB90A10051129F /* SnapKit */, + 058AE08C2DCCC27F009119B2 /* Then */, + 054A96252DCE38E900C0DD58 /* Tabman */, + 054A96272DCE390A00C0DD58 /* ReactorKit */, + 054A962A2DCE3A0300C0DD58 /* NMapsMap */, + ); + productName = SearchFeatureDemo; + productReference = 0516362F2DC457DE00A6C0D1 /* SearchFeatureDemo.app */; + productType = "com.apple.product-type.application"; + }; + 05734BF42DCDA6B90093825D /* SearchFeatureInterface */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05734BF92DCDA6B90093825D /* Build configuration list for PBXNativeTarget "SearchFeatureInterface" */; + buildPhases = ( + 05734BF02DCDA6B90093825D /* Headers */, + 05734BF12DCDA6B90093825D /* Sources */, + 05734BF22DCDA6B90093825D /* Frameworks */, + 05734BF32DCDA6B90093825D /* Resources */, + 05734C2D2DCDD6390093825D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 05734BF62DCDA6B90093825D /* SearchFeatureInterface */, + ); + name = SearchFeatureInterface; + packageProductDependencies = ( + ); + productName = SearchFeatureInterface; + productReference = 05734BF52DCDA6B90093825D /* SearchFeatureInterface.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 051633642DC457A900A6C0D1 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1630; + LastUpgradeCheck = 1630; + TargetAttributes = { + 0516336C2DC457A900A6C0D1 = { + CreatedOnToolsVersion = 16.3; + LastSwiftMigration = 1630; + }; + 0516362E2DC457DE00A6C0D1 = { + CreatedOnToolsVersion = 16.3; + }; + 05734BF42DCDA6B90093825D = { + CreatedOnToolsVersion = 16.3; + }; + }; + }; + buildConfigurationList = 051633672DC457A900A6C0D1 /* Build configuration list for PBXProject "SearchFeature" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 051633632DC457A900A6C0D1; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */, + 05EC233F2DC49A8B00C761A5 /* XCRemoteSwiftPackageReference "ReactorKit" */, + 05EC23492DC49AB400C761A5 /* XCRemoteSwiftPackageReference "Then" */, + 05EC234C2DC49AC100C761A5 /* XCRemoteSwiftPackageReference "SnapKit" */, + 054A96242DCE38E900C0DD58 /* XCRemoteSwiftPackageReference "Tabman" */, + 054A96292DCE3A0300C0DD58 /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 0516336E2DC457A900A6C0D1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0516336C2DC457A900A6C0D1 /* SearchFeature */, + 05734BF42DCDA6B90093825D /* SearchFeatureInterface */, + 0516362E2DC457DE00A6C0D1 /* SearchFeatureDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0516336B2DC457A900A6C0D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0516362D2DC457DE00A6C0D1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 05734BF32DCDA6B90093825D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 051633692DC457A900A6C0D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0516362B2DC457DE00A6C0D1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 05734BF12DCDA6B90093825D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0516364E2DC45E6300A6C0D1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0516336C2DC457A900A6C0D1 /* SearchFeature */; + targetProxy = 0516364D2DC45E6300A6C0D1 /* PBXContainerItemProxy */; + }; + 054A96232DCE38B500C0DD58 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 05734BF42DCDA6B90093825D /* SearchFeatureInterface */; + targetProxy = 054A96222DCE38B500C0DD58 /* PBXContainerItemProxy */; + }; + 05734C0B2DCDA7D20093825D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 05734BF42DCDA6B90093825D /* SearchFeatureInterface */; + targetProxy = 05734C0A2DCDA7D20093825D /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 051633722DC457A900A6C0D1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReferenceAnchor = 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */; + baseConfigurationReferenceRelativePath = Resource/Debug.xcconfig; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 051633732DC457A900A6C0D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.4; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 051633752DC457A900A6C0D1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReferenceAnchor = 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */; + baseConfigurationReferenceRelativePath = Resource/Debug.xcconfig; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeature; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 051633762DC457A900A6C0D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeature; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 051636422DC457DF00A6C0D1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReferenceAnchor = 051636302DC457DE00A6C0D1 /* SearchFeatureDemo */; + baseConfigurationReferenceRelativePath = Resource/Debug.xcconfig; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = W5QTRMS954; + GENERATE_INFOPLIST_FILE = YES; + IBSC_COMPILER_AUTO_ACTIVATE_CUSTOM_FONTS = YES; + INFOPLIST_FILE = SearchFeatureDemo/Resource/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeatureDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = poppoolSearchFeatureDemoProvisioning; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 051636432DC457DF00A6C0D1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + IBSC_COMPILER_AUTO_ACTIVATE_CUSTOM_FONTS = YES; + INFOPLIST_FILE = SearchFeatureDemo/Resource/Info.plist; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; + INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeatureDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; + 05734BFA2DCDA6B90093825D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + 05734BFB2DCDA6B90093825D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = NO; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = com.poppoolIOS.poppool.SearchFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_MODULE = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 051633672DC457A900A6C0D1 /* Build configuration list for PBXProject "SearchFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 051633722DC457A900A6C0D1 /* Debug */, + 051633732DC457A900A6C0D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 051633742DC457A900A6C0D1 /* Build configuration list for PBXNativeTarget "SearchFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 051633752DC457A900A6C0D1 /* Debug */, + 051633762DC457A900A6C0D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 051636412DC457DF00A6C0D1 /* Build configuration list for PBXNativeTarget "SearchFeatureDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 051636422DC457DF00A6C0D1 /* Debug */, + 051636432DC457DF00A6C0D1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 05734BF92DCDA6B90093825D /* Build configuration list for PBXNativeTarget "SearchFeatureInterface" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 05734BFA2DCDA6B90093825D /* Debug */, + 05734BFB2DCDA6B90093825D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 054A96242DCE38E900C0DD58 /* XCRemoteSwiftPackageReference "Tabman" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/uias/Tabman"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.2.0; + }; + }; + 054A96292DCE3A0300C0DD58 /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/navermaps/SPM-NMapsMap"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.21.0; + }; + }; + 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactiveX/RxSwift"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.9.0; + }; + }; + 05EC233F2DC49A8B00C761A5 /* XCRemoteSwiftPackageReference "ReactorKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/ReactorKit/ReactorKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.2.0; + }; + }; + 05EC23492DC49AB400C761A5 /* XCRemoteSwiftPackageReference "Then" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/devxoul/Then"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.0.0; + }; + }; + 05EC234C2DC49AC100C761A5 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.7.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 054A96252DCE38E900C0DD58 /* Tabman */ = { + isa = XCSwiftPackageProductDependency; + package = 054A96242DCE38E900C0DD58 /* XCRemoteSwiftPackageReference "Tabman" */; + productName = Tabman; + }; + 054A96272DCE390A00C0DD58 /* ReactorKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233F2DC49A8B00C761A5 /* XCRemoteSwiftPackageReference "ReactorKit" */; + productName = ReactorKit; + }; + 054A962A2DCE3A0300C0DD58 /* NMapsMap */ = { + isa = XCSwiftPackageProductDependency; + package = 054A96292DCE3A0300C0DD58 /* XCRemoteSwiftPackageReference "SPM-NMapsMap" */; + productName = NMapsMap; + }; + 058AE08C2DCCC27F009119B2 /* Then */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC23492DC49AB400C761A5 /* XCRemoteSwiftPackageReference "Then" */; + productName = Then; + }; + 05CFFBE82DCB90070051129F /* RxSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxSwift; + }; + 05CFFBF22DCB906F0051129F /* RxCocoa */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxCocoa; + }; + 05CFFBF62DCB90A10051129F /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC234C2DC49AC100C761A5 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; + 05EC233B2DC49A7600C761A5 /* RxCocoa */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxCocoa; + }; + 05EC233D2DC49A7600C761A5 /* RxSwift */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxSwift; + }; + 05EC23402DC49A8B00C761A5 /* ReactorKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233F2DC49A8B00C761A5 /* XCRemoteSwiftPackageReference "ReactorKit" */; + productName = ReactorKit; + }; + 05EC234A2DC49AB400C761A5 /* Then */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC23492DC49AB400C761A5 /* XCRemoteSwiftPackageReference "Then" */; + productName = Then; + }; + 05EC234D2DC49AC100C761A5 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC234C2DC49AC100C761A5 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; + 05EC2AE82DC7C07400C761A5 /* RxRelay */ = { + isa = XCSwiftPackageProductDependency; + package = 05EC233A2DC49A7600C761A5 /* XCRemoteSwiftPackageReference "RxSwift" */; + productName = RxRelay; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 051633642DC457A900A6C0D1 /* Project object */; +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/xcshareddata/xcschemes/SearchFeatureDemo.xcscheme b/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/xcshareddata/xcschemes/SearchFeatureDemo.xcscheme new file mode 100644 index 00000000..66400cdd --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature.xcodeproj/xcshareddata/xcschemes/SearchFeatureDemo.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Factory/CategorySelectorFactoryImpl.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Factory/CategorySelectorFactoryImpl.swift new file mode 100644 index 00000000..a1645730 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Factory/CategorySelectorFactoryImpl.swift @@ -0,0 +1,19 @@ +import DesignSystem +import DomainInterface +import Infrastructure +import SearchFeatureInterface + +public final class CategorySelectorFactoryImpl: CategorySelectorFactory { + public init() { } + + public func make() -> BaseViewController & PPModalPresentable { + let reactor = CategorySelectReactor( + fetchCategoryListUseCase: DIContainer.resolve(FetchCategoryListUseCase.self) + ) + let viewController = CategorySelectViewController() + + viewController.reactor = reactor + + return viewController + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Reactor/CategorySelectReactor.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Reactor/CategorySelectReactor.swift new file mode 100644 index 00000000..1682dbdf --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/Reactor/CategorySelectReactor.swift @@ -0,0 +1,129 @@ +import Foundation + +import DomainInterface + +import ReactorKit +import RxCocoa +import RxSwift + +final class CategorySelectReactor: Reactor { + + // MARK: - Reactor + enum Action { + case viewWillAppear + case closeButtonTapped + case resetButtonTapped + case saveButtonTapped + case categoryTagButtonTapped(indexPath: IndexPath) + } + + enum Mutation { + case setupCategotyTag(items: [TagModel]) + case dismiss + case resetCategory + case saveCategory + case updateCategoryTagSelection(categoryID: Int) + case updateSaveButtonEnable + case updateSelectedCategory + } + + struct State { + var categoryItems: [TagModel] = [] + var saveButtonIsEnable: Bool = false + var selectedCategoryChanged: Bool? + + @Pulse var categoryChanged: Void? + @Pulse var dismiss: Void? + } + + // MARK: - properties + var initialState: State + var disposeBag = DisposeBag() + + private var originCategoryItems: [TagModel] = [] + private let fetchCategoryListUseCase: FetchCategoryListUseCase + + // MARK: - init + init( + fetchCategoryListUseCase: FetchCategoryListUseCase + ) { + self.initialState = State() + self.fetchCategoryListUseCase = fetchCategoryListUseCase + } + + // MARK: - Reactor Methods + func mutate(action: Action) -> Observable { + switch action { + case .viewWillAppear: + return fetchCategoryListUseCase.execute() + .withUnretained(self) + .map { (_, response) in + let items = response.map { + return TagModel(title: $0.category, id: $0.categoryId, isCancelable: false) + } + return .setupCategotyTag(items: items) + } + + case .closeButtonTapped: + return .just(.dismiss) + + case .resetButtonTapped: + return Observable.concat([ + .just(.resetCategory), + .just(.dismiss), + .just(.updateSelectedCategory) + ]) + + case .saveButtonTapped: + return Observable.concat([ + .just(.saveCategory), + .just(.dismiss), + .just(.updateSelectedCategory) + ]) + + case .categoryTagButtonTapped(let indexPath): + guard let categoryID = currentState.categoryItems[indexPath.row].id else { return .empty() } + return Observable.concat([ + .just(.updateCategoryTagSelection(categoryID: categoryID)), + .just(.updateSaveButtonEnable) + ]) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case .setupCategotyTag(let items): + let fetchedItems = items.map { + if let id = $0.id, Category.shared.contains(id: id) { return $0.selectionToggledItem() } else { return $0 } + } + originCategoryItems = fetchedItems + newState.categoryItems = fetchedItems + + case .dismiss: + newState.dismiss = () + + case .resetCategory: + Category.shared.resetItems() + newState.categoryChanged = () + + case .saveCategory: + Category.shared.items = newState.categoryItems.filter { $0.isSelected == true } + newState.categoryChanged = () + + case .updateCategoryTagSelection(let categoryID): + newState.categoryItems = state.categoryItems.map { + if $0.id == categoryID { return $0.selectionToggledItem() } else { return $0 } + } + + case .updateSaveButtonEnable: + newState.saveButtonIsEnable = (originCategoryItems != newState.categoryItems) + + case .updateSelectedCategory: + newState.selectedCategoryChanged = (originCategoryItems != newState.categoryItems) + } + + return newState + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectView.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectView.swift new file mode 100644 index 00000000..0dcdd526 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectView.swift @@ -0,0 +1,114 @@ +import UIKit + +import DesignSystem + +import SnapKit +import Then + +final class CategorySelectView: UIView { + + // MARK: - Components + private let titleLabel: PPLabel = { + return PPLabel(style: .bold, fontSize: 18, text: "카테고리를 선택해주세요") + }() + + let closeButton = UIButton().then { + $0.setImage(UIImage(named: "icon_xmark"), for: .normal) + } + + lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: .init()).then { + $0.setCollectionViewLayout(makeLayout(), animated: false) + $0.isScrollEnabled = false + + $0.register( + PPTagCollectionViewCell.self, + forCellWithReuseIdentifier: PPTagCollectionViewCell.identifiers + ) + } + + let buttonStackView = UIStackView().then { + $0.distribution = .fillEqually + $0.spacing = 12 + } + + let resetButton = PPButton(style: .secondary, text: "초기화") + + let saveButton = PPButton(style: .primary, text: "옵션저장", disabledText: "옵션저장") + + // MARK: - init + init() { + super.init(frame: .zero) + + self.addViews() + self.setupConstraints() + } + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } +} + +// MARK: - SetUp +private extension CategorySelectView { + + func addViews() { + [titleLabel, closeButton, collectionView, buttonStackView].forEach { + self.addSubview($0) + } + + [resetButton, saveButton].forEach { + buttonStackView.addArrangedSubview($0) + } + } + + // FIXME: 레이아웃 에러로 인한 Modal이 살짝 내려가지는 문제 발생중 + func setupConstraints() { + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(32) + make.leading.equalTo(safeAreaLayoutGuide).inset(20) + } + + closeButton.snp.makeConstraints { make in + make.size.equalTo(24) + make.trailing.equalTo(safeAreaLayoutGuide).inset(20) + make.centerY.equalTo(titleLabel) + } + + collectionView.snp.makeConstraints { make in + make.horizontalEdges.equalTo(safeAreaLayoutGuide) + make.top.equalTo(titleLabel.snp.bottom).offset(24) + make.bottom.equalTo(buttonStackView.snp.top).offset(24) + } + + buttonStackView.snp.makeConstraints { make in + make.leading.trailing.equalTo(safeAreaLayoutGuide).inset(20) + make.height.equalTo(52) + make.bottom.equalTo(safeAreaLayoutGuide) + } + } +} + +private extension CategorySelectView { + + func makeLayout() -> UICollectionViewLayout { + return UICollectionViewCompositionalLayout { _, _ in + let itemSize = NSCollectionLayoutSize( + widthDimension: .estimated(26), + heightDimension: .absolute(36) + ) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .estimated(200) + ) + let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item]) + group.interItemSpacing = .fixed(12) + + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = .init(top: 0, leading: 20, bottom: 0, trailing: 20) + section.interGroupSpacing = 16 + + return section + } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectViewController.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectViewController.swift new file mode 100644 index 00000000..4d6a233a --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/CatagorySelect/View/CategorySelectViewController.swift @@ -0,0 +1,96 @@ +import UIKit + +import DesignSystem +import Infrastructure + +import ReactorKit +import RxCocoa +import RxSwift +import SnapKit + +final class CategorySelectViewController: BaseViewController, View { + + typealias Reactor = CategorySelectReactor + + // MARK: - Properties + var disposeBag = DisposeBag() + + private var mainView = CategorySelectView() +} + +// MARK: - Life Cycle +extension CategorySelectViewController { + override func loadView() { + self.view = mainView + } +} + +// MARK: - Methods +extension CategorySelectViewController { + func bind(reactor: Reactor) { + self.bindAction(reactor: reactor) + self.bindState(reactor: reactor) + } + + private func bindAction(reactor: Reactor) { + rx.viewWillAppear + .map { Reactor.Action.viewWillAppear } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.closeButton.rx.tap + .map { Reactor.Action.closeButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.resetButton.rx.tap + .map { Reactor.Action.resetButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.saveButton.rx.tap + .map { Reactor.Action.saveButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.collectionView.rx.itemSelected + .map(Reactor.Action.categoryTagButtonTapped) + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + private func bindState(reactor: Reactor) { + reactor.pulse(\.$dismiss) + .withUnretained(self) + .subscribe { (owner, _) in owner.dismissModal() } + .disposed(by: disposeBag) + + reactor.state.distinctUntilChanged(\.categoryItems) + .map(\.categoryItems) + .bind(to: mainView.collectionView.rx.items( + cellIdentifier: PPTagCollectionViewCell.identifiers, + cellType: PPTagCollectionViewCell.self + )) { _, item, cell in + cell.configureCell(title: item.title, id: item.id, isSelected: item.isSelected, isCancelable: item.isCancelable, fontSize: 13, cornerRadius: 18) + } + .disposed(by: disposeBag) + + reactor.state.distinctUntilChanged(\.saveButtonIsEnable) + .withUnretained(self) + .subscribe { (owner, state) in owner.mainView.saveButton.isEnabled = state.saveButtonIsEnable } + .disposed(by: disposeBag) + + reactor.pulse(\.$categoryChanged) + .skip(1) + .subscribe { _ in Category.valueChanged.onNext(()) } + .disposed(by: disposeBag) + } +} + +extension CategorySelectViewController: PPModalPresentable { + var modalHeight: CGFloat? { return 384 } + + var backgroundColor: UIColor { return .pb60 } + + var cornerRadius: CGFloat { return 20 } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Category.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Category.swift new file mode 100644 index 00000000..ff2fe9c4 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Category.swift @@ -0,0 +1,60 @@ +import Foundation + +import RxSwift + +final class Category: NSCopying, Equatable { + func copy(with zone: NSZone? = nil) -> Any { + return Category(items: self.items) + } + + static func == (lhs: Category, rhs: Category) -> Bool { return lhs === rhs } + + static let shared = Category() + static let valueChanged = PublishSubject() + + /// 선택된 아이템들만 들어가는 인스턴스 + private var _items: [TagModel] + var items: [TagModel] { + get { _items } + set { _items = newValue.isEmpty ? [Category.defaultItem] : newValue } + } + + private static let defaultItem = TagModel(title: "카테고리", isSelected: false, isCancelable: false) + + private init(items: [TagModel] = [Category.defaultItem]) { + self._items = items.isEmpty ? [Category.defaultItem] : items + } +} + +// MARK: - Functions +extension Category { + + func contains(id: Int) -> Bool { + items.contains { $0.id == id } + } + + func toggleItemSelection(by categoryID: Int) { + guard let index = items.firstIndex(where: { $0.id == categoryID }) else { return } + items[index].isSelected.toggle() + } + + func turnOffAllItemSelection() { + for index in items.indices { items[index].isSelected = false } + } + + func resetItems() { + items = [Category.defaultItem] + } + + func getSelectedCategoryIDs() -> [Int] { + return items.filter { $0.isSelected == true }.compactMap { $0.id } + } + + func getCancelableCategoryItems() -> [TagModel] { + if items == [Category.defaultItem] { return items } else { return items.filter { $0.isSelected == true }.map { $0.cancelableItem() } } + } + + func removeItem(by categoryID: Int) { + items.removeAll { $0.id == categoryID } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Filter.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Filter.swift new file mode 100644 index 00000000..a24591c1 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/Filter.swift @@ -0,0 +1,82 @@ +import Foundation + +import RxSwift + +/// 필터 옵션 상태를 공유하기 위한 싱글톤 객체 +final class Filter: NSCopying, Equatable { + func copy(with zone: NSZone? = nil) -> Any { + return Filter( + status: self.status, + sort: self.sort + ) + } + + static func == (lhs: Filter, rhs: Filter) -> Bool { return (lhs.status == rhs.status) && (lhs.sort == rhs.sort) } + + static let shared = Filter(status: .open, sort: .newest) + static let valueChanged = PublishSubject() + + var status: PopupStatus = .open + var sort: PopupSort = .newest + + private init(status: PopupStatus, sort: PopupSort) { + self.status = status + self.sort = sort + } + + var title: String { [status.title, sort.title].joined(separator: "・") } +} + +/// 팝업 상점이 현재 열려 있는지 또는 닫혀 있는지 여부를 나타냅니다 +enum PopupStatus: CaseIterable { + case open + case closed + + /// UI 용 문자열 표시 (예 : 세그먼트 제목) + var title: String { + switch self { + case .open: return "오픈" + case .closed: return "종료" + } + } + + /// API 요청에 포함 할 값 + var requestValue: Bool { + switch self { + case .open: return true + case .closed: return false + } + } + + /// UISegmentedControl과 같은 UI 구성 요소의 색인 + var index: Int { + return Self.allCases.firstIndex(of: self)! + } +} + +/// 팝업 검색 결과를위한 정렬 옵션을 나타냅니다 +enum PopupSort: CaseIterable { + case newest + case popularity + + /// UI 용 문자열 표시 (예 : 세그먼트 제목) + var title: String { + switch self { + case .newest: return "신규순" + case .popularity: return "인기순" + } + } + + /// API 요청에 포함 할 값 + var requestValue: String { + switch self { + case .newest: return "NEWEST" + case .popularity: return "MOST_VIEWED,MOST_COMMENTED,MOST_BOOKMARKED" + } + } + + /// UISegmentedControl과 같은 UI 구성 요소의 색인 + var index: Int { + return Self.allCases.firstIndex(of: self)! + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultHeaderModel.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultHeaderModel.swift new file mode 100644 index 00000000..1a68a0ba --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultHeaderModel.swift @@ -0,0 +1,13 @@ +import Foundation + +public struct SearchResultHeaderModel: Hashable { + public init(title: String? = nil, count: Int? = 0, filterText: String?) { + self.title = title + self.count = count + self.filterText = filterText + } + + var title: String? = nil + var count: Int? = 0 + var filterText: String? = Filter.shared.title +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultModel.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultModel.swift new file mode 100644 index 00000000..c52314a0 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/SearchResultModel.swift @@ -0,0 +1,20 @@ +import Foundation + +public struct SearchResultModel: Hashable { + var imagePath: String? + var id: Int64 + var category: String? + var title: String? + var address: String? + var startDate: String? + var endDate: String? + var isBookmark: Bool + var isLogin: Bool + var isPopular: Bool = false + var row: Int? + + enum EmptyCase { + case option + case keyword + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/TagModel.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/TagModel.swift new file mode 100644 index 00000000..98e30f69 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/Model/TagModel.swift @@ -0,0 +1,17 @@ +import Foundation + +public struct TagModel: Hashable { + var title: String? + var id: Int? = nil + var isSelected: Bool = false + var isCancelable: Bool = true + + func selectionToggledItem() -> TagModel { + let toggledSelection = !isSelected + return TagModel(title: self.title, id: self.id, isSelected: toggledSelection, isCancelable: self.isCancelable) + } + + func cancelableItem() -> TagModel { + return TagModel(title: self.title, id: self.id, isSelected: self.isSelected, isCancelable: true) + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/View/Component/TagCollectionHeaderView.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/View/Component/TagCollectionHeaderView.swift new file mode 100644 index 00000000..99425b24 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/Common/View/Component/TagCollectionHeaderView.swift @@ -0,0 +1,76 @@ +import UIKit + +import DesignSystem + +import RxSwift +import SnapKit + +final class TagCollectionHeaderView: UICollectionReusableView { + + // MARK: - Components + var disposeBag = DisposeBag() + + private let sectionTitleLabel = UILabel().then { + $0.font = .korFont(style: .bold, size: 16) + } + + let removeAllButton = UIButton().then { + $0.isHidden = true + + } + // MARK: - init + + override init(frame: CGRect) { + super.init(frame: frame) + + self.addViews() + self.setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } + + override func prepareForReuse() { + super.prepareForReuse() + disposeBag = DisposeBag() + } +} + +// MARK: - SetUp +private extension TagCollectionHeaderView { + func addViews() { + [sectionTitleLabel, removeAllButton].forEach { + self.addSubview($0) + } + } + + func setupConstraints() { + sectionTitleLabel.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.centerY.equalToSuperview() + make.height.equalTo(22) + } + + removeAllButton.snp.makeConstraints { make in + make.trailing.equalToSuperview() + make.centerY.equalTo(sectionTitleLabel) + make.height.equalTo(20) + } + } +} + +extension TagCollectionHeaderView { + func configureHeader(title: String, buttonTitle: String? = nil) { + sectionTitleLabel.text = title + if let buttonTitle = buttonTitle { + removeAllButton.isHidden = false + let attributes: [NSAttributedString.Key: Any] = [ + .underlineStyle: NSUnderlineStyle.single.rawValue, + .font: UIFont.korFont(style: .regular, size: 13) + ] + let attributedTitle = NSAttributedString(string: buttonTitle, attributes: attributes) + removeAllButton.setAttributedTitle(attributedTitle, for: .normal) + } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Factory/FilterSelectorFactoryImpl.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Factory/FilterSelectorFactoryImpl.swift new file mode 100644 index 00000000..95e8d2f2 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Factory/FilterSelectorFactoryImpl.swift @@ -0,0 +1,15 @@ +import DesignSystem +import Infrastructure +import SearchFeatureInterface + +public final class FilterSelectorFactoryImpl: FilterSelectorFactory { + public init() { } + + public func make() -> BaseViewController & PPModalPresentable { + let reactor = FilterSelectReactor() + let viewController = FilterSelectViewController() + viewController.reactor = reactor + + return viewController + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Reactor/FilterSelectReactor.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Reactor/FilterSelectReactor.swift new file mode 100644 index 00000000..b0deb372 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/Reactor/FilterSelectReactor.swift @@ -0,0 +1,109 @@ +import Foundation + +import ReactorKit +import RxCocoa +import RxSwift + +final class FilterSelectReactor: Reactor { + + // MARK: - Reactor + enum Action { + case closeButtonTapped + case statusSegmentChanged(index: Int) + case sortSegmentChanged(index: Int) + case saveButtonTapped + } + + enum Mutation { + case dismiss + case changeStatus(status: PopupStatus) + case changeSort(sort: PopupSort) + case updateSaveButtonEnable + case saveCurrentFilter + } + + struct State { + var selectedFilter: Filter + var saveButtonIsEnable: Bool = false + + @Pulse var filterChanged: Void? + @Pulse var dismiss: Void? + } + + // MARK: - properties + + var initialState: State + var disposeBag = DisposeBag() + + // MARK: - init + init() { + self.initialState = State(selectedFilter: Filter.shared.copy() as! Filter) + } + + // MARK: - Reactor Methods + func mutate(action: Action) -> Observable { + switch action { + case .closeButtonTapped: + return .just(.dismiss) + + case .statusSegmentChanged(let index): + switch index == 0 { + case true: + return .concat([ + .just(.changeStatus(status: .open)), + .just(.updateSaveButtonEnable) + ]) + case false: + return .concat([ + .just(.changeStatus(status: .closed)), + .just(.updateSaveButtonEnable) + ]) + } + + case .sortSegmentChanged(let index): + switch index == 0 { + case true: + return .concat([ + .just(.changeSort(sort: .newest)), + .just(.updateSaveButtonEnable) + ]) + case false: + return .concat([ + .just(.changeSort(sort: .popularity)), + .just(.updateSaveButtonEnable) + ]) + } + + case .saveButtonTapped: + return .concat([ + .just(.saveCurrentFilter), + .just(.dismiss) + ]) + } + } + + func reduce(state: State, mutation: Mutation) -> State { + var newState = state + + switch mutation { + case .dismiss: + newState.dismiss = () + + case .changeStatus(let status): + newState.selectedFilter.status = status + + case .changeSort(let sort): + newState.selectedFilter.sort = sort + + case .updateSaveButtonEnable: + newState.saveButtonIsEnable = (newState.selectedFilter != Filter.shared) + + case .saveCurrentFilter: + Filter.shared.status = newState.selectedFilter.status + Filter.shared.sort = newState.selectedFilter.sort + newState.filterChanged = () + } + + return newState + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectView.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectView.swift new file mode 100644 index 00000000..efbbb69a --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectView.swift @@ -0,0 +1,89 @@ +import UIKit + +import DesignSystem + +import SnapKit + +final class FilterSelectView: UIView { + + // MARK: - Components + private let titleLabel = PPLabel(style: .bold, fontSize: 18, text: "노출 순서를 선택해주세요") + + let closeButton = UIButton().then { + $0.setImage(UIImage(named: "icon_xmark"), for: .normal) + } + + private let statusLabel = PPLabel(style: .regular, fontSize: 13, text: "노출 조건") + + let statusSegmentControl = PPSegmentedControl(type: .base, segments: ["오픈", "종료"], selectedSegmentIndex: 0) + + private let sortLabel = PPLabel(style: .regular, fontSize: 13, text: "팝업순서") + + let sortSegmentControl = PPSegmentedControl(type: .base, segments: ["신규순", "인기순"], selectedSegmentIndex: 0) + + let saveButton = PPButton(style: .primary, text: "저장", disabledText: "저장") + + // MARK: - init + init() { + super.init(frame: .zero) + + self.addViews() + self.setupConstraints() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } +} + +// MARK: - SetUp +private extension FilterSelectView { + func addViews() { + [titleLabel, closeButton, statusLabel, statusSegmentControl, + sortLabel, sortSegmentControl, saveButton].forEach { + self.addSubview($0) + } + } + + // FIXME: 레이아웃 에러로 인한 Modal이 살짝 내려가지는 문제 발생중 + func setupConstraints() { + titleLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(32) + make.leading.equalTo(safeAreaLayoutGuide).inset(20) + } + + closeButton.snp.makeConstraints { make in + make.size.equalTo(24) + make.trailing.equalTo(safeAreaLayoutGuide).inset(20) + make.centerY.equalTo(titleLabel) + } + + statusLabel.snp.makeConstraints { make in + make.top.equalTo(titleLabel.snp.bottom).offset(36) + make.leading.equalTo(safeAreaLayoutGuide).inset(20) + } + + statusSegmentControl.snp.makeConstraints { make in + make.top.equalTo(statusLabel.snp.bottom).offset(8) + make.leading.trailing.equalTo(safeAreaLayoutGuide).inset(20) + } + + sortLabel.snp.makeConstraints { make in + make.top.equalTo(statusSegmentControl.snp.bottom).offset(20) + make.leading.equalTo(safeAreaLayoutGuide).inset(20) + } + + sortSegmentControl.snp.makeConstraints { make in + make.top.equalTo(sortLabel.snp.bottom).offset(8) + make.horizontalEdges.equalTo(safeAreaLayoutGuide).inset(20) + } + + saveButton.snp.makeConstraints { make in + make.top.equalTo(sortSegmentControl.snp.bottom).offset(32) + make.height.equalTo(50) + make.horizontalEdges.equalTo(safeAreaLayoutGuide.snp.horizontalEdges).inset(20) + make.bottom.equalTo(safeAreaLayoutGuide.snp.bottom) + } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectViewController.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectViewController.swift new file mode 100644 index 00000000..5a50254b --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/FilterSelector/View/FilterSelectViewController.swift @@ -0,0 +1,92 @@ +import UIKit + +import DesignSystem +import Infrastructure + +import ReactorKit +import RxCocoa +import RxSwift +import SnapKit + +final class FilterSelectViewController: BaseViewController, View { + + typealias Reactor = FilterSelectReactor + + // MARK: - Properties + var disposeBag = DisposeBag() + + private var mainView = FilterSelectView() +} + +// MARK: - Life Cycle +extension FilterSelectViewController { + override func loadView() { + self.view = mainView + } +} + +// MARK: - Methods +extension FilterSelectViewController { + func bind(reactor: Reactor) { + self.bindAction(reactor: reactor) + self.bindState(reactor: reactor) + } + + private func bindAction(reactor: Reactor) { + mainView.closeButton.rx.tap + .map { _ in Reactor.Action.closeButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.statusSegmentControl.rx.controlEvent(.valueChanged) + .withUnretained(self) + .map { (owner, _) in Reactor.Action.statusSegmentChanged(index: owner.mainView.statusSegmentControl.selectedSegmentIndex) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.sortSegmentControl.rx.controlEvent(.valueChanged) + .withUnretained(self) + .map { (owner, _) in Reactor.Action.sortSegmentChanged(index: owner.mainView.sortSegmentControl.selectedSegmentIndex) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.saveButton.rx.tap + .withUnretained(self) + .map { (_, _) in Reactor.Action.saveButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + private func bindState(reactor: Reactor) { + reactor.state.distinctUntilChanged(\.selectedFilter) + .withUnretained(self) + .subscribe { (owner, state) in + owner.mainView.statusSegmentControl.selectedSegmentIndex = state.selectedFilter.status.index + owner.mainView.sortSegmentControl.selectedSegmentIndex = state.selectedFilter.sort.index + } + .disposed(by: disposeBag) + + reactor.state.distinctUntilChanged(\.saveButtonIsEnable) + .withUnretained(self) + .subscribe { (owner, state) in owner.mainView.saveButton.isEnabled = state.saveButtonIsEnable } + .disposed(by: disposeBag) + + reactor.pulse(\.$dismiss) + .withUnretained(self) + .subscribe { (owner, _) in owner.dismissModal() } + .disposed(by: disposeBag) + + reactor.pulse(\.$filterChanged) + .skip(1) + .subscribe { _ in Filter.valueChanged.onNext(()) } + .disposed(by: disposeBag) + } +} + +extension FilterSelectViewController: PPModalPresentable { + var modalHeight: CGFloat? { return 379 } + + var backgroundColor: UIColor { return .pb60 } + + var cornerRadius: CGFloat { return 20 } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchFactoryImpl.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchFactoryImpl.swift new file mode 100644 index 00000000..a352ad86 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchFactoryImpl.swift @@ -0,0 +1,20 @@ +import DesignSystem +import DomainInterface +import Infrastructure +import SearchFeatureInterface + +public final class PopupSearchFactoryImpl: PopupSearchFactory { + public init() { } + + public func make() -> BaseViewController { + let viewController = PopupSearchViewController() + + viewController.reactor = PopupSearchReactor( + popupAPIUseCase: DIContainer.resolve(PopUpAPIUseCase.self), + userAPIUseCase: DIContainer.resolve(UserAPIUseCase.self), + fetchKeywordBasePopupListUseCase: DIContainer.resolve(FetchKeywordBasePopupListUseCase.self) + ) + + return viewController + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchLayoutFactory.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchLayoutFactory.swift new file mode 100644 index 00000000..77e6d8e7 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Factory/PopupSearchLayoutFactory.swift @@ -0,0 +1,139 @@ +import UIKit + +// MARK: - Layout +final class PopupSearchLayoutFactory { + + func makeCollectionViewLayout( + dataSourceProvider: @escaping () -> UICollectionViewDiffableDataSource? + ) -> UICollectionViewLayout { + return UICollectionViewCompositionalLayout(sectionProvider: { [weak self] sectionIndex, _ -> NSCollectionLayoutSection? in + guard let self = self, + let dataSource = dataSourceProvider() else { return nil } + + // sectionIndex를 사용하여 현재 dataSource에서 Section 타입을 가져옴 + guard sectionIndex < dataSource.snapshot().numberOfSections, + let sectionType = dataSource.sectionIdentifier(for: sectionIndex) else { return nil } + + switch sectionType { + case .recentSearch: + return makeTagSectionLayout(PopupSearchView.SectionHeaderKind.recentSearch.rawValue) + + case .category: + return makeTagSectionLayout(PopupSearchView.SectionHeaderKind.category.rawValue) + + case .searchResultHeader: + return makeSearchResultHeaderSectionLayout() + + case .searchResult: + let sectionSnapshot = dataSource.snapshot(for: sectionType) + let hasEmptyItem = sectionSnapshot.items.contains { item in + if case .searchResultEmptyTitle = item { return true } + return false + } + return makeSearchResultSectionLayout(hasEmptyItem: hasEmptyItem) + } + }) + } + + func makeTagSectionLayout(_ headerKind: String) -> NSCollectionLayoutSection { + // Item + let itemSize = NSCollectionLayoutSize( + widthDimension: .estimated(100), + heightDimension: .absolute(31) + ) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + // Group + let groupSize = NSCollectionLayoutSize( + widthDimension: .estimated(100), + heightDimension: .estimated(31) + ) + let group = NSCollectionLayoutGroup.horizontal( + layoutSize: groupSize, + subitems: [item] + ) + + // Section + let section = NSCollectionLayoutSection(group: group) + section.orthogonalScrollingBehavior = .continuous + + if headerKind == PopupSearchView.SectionHeaderKind.recentSearch.rawValue { + section.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 20, bottom: 48, trailing: 20) + } else { + section.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 20, bottom: 16, trailing: 20) + } + + section.interGroupSpacing = 6 + + section.boundarySupplementaryItems = [makeTagCollectionHeaderLayout(headerKind)] + + return section + } + + func makeSearchResultHeaderSectionLayout() -> NSCollectionLayoutSection { + // Item + let itemSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .estimated(22) + ) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + // Group + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .estimated(22) + ) + let group = NSCollectionLayoutGroup.horizontal( + layoutSize: groupSize, + subitems: [item] + ) + + // Section + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20) + + return section + } + + func makeSearchResultSectionLayout(hasEmptyItem: Bool) -> NSCollectionLayoutSection { + let itemWidth: NSCollectionLayoutDimension = hasEmptyItem ? .fractionalWidth(1.0) : .fractionalWidth(0.5) + + // Item + let itemSize = NSCollectionLayoutSize( + widthDimension: itemWidth, + heightDimension: .absolute(249) + ) + let item = NSCollectionLayoutItem(layoutSize: itemSize) + + // Group + let groupSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .absolute(249) + ) + let group = NSCollectionLayoutGroup.horizontal( + layoutSize: groupSize, + subitems: [item, item] + ) + group.interItemSpacing = .fixed(16) + + // Section + let section = NSCollectionLayoutSection(group: group) + section.contentInsets = NSDirectionalEdgeInsets(top: 16, leading: 20, bottom: 0, trailing: 20) + section.interGroupSpacing = 24 + + return section + } + + func makeTagCollectionHeaderLayout(_ elementKind: String) -> NSCollectionLayoutBoundarySupplementaryItem { + // Header + let headerSize = NSCollectionLayoutSize( + widthDimension: .fractionalWidth(1.0), + heightDimension: .absolute(24) + ) + return NSCollectionLayoutBoundarySupplementaryItem( + layoutSize: headerSize, + elementKind: elementKind, + alignment: .top + ) + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Reactor/PopupSearchReactor.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Reactor/PopupSearchReactor.swift new file mode 100644 index 00000000..646443d1 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/Reactor/PopupSearchReactor.swift @@ -0,0 +1,488 @@ +import Foundation + +import DomainInterface +import Infrastructure + +import ReactorKit +import RxCocoa +import RxSwift + +public final class PopupSearchReactor: Reactor { + + // MARK: - Reactor + public enum Action { + case viewDidLoad + + case searchBarEditing(text: String) + case searchBarExitEditing(text: String) + case searchBarEndEditing + case searchBarClearButtonTapped + case searchBarCancelButtonTapped + + case recentSearchTagButtonTapped(indexPath: IndexPath) + case recentSearchTagRemoveButtonTapped(text: String) + case recentSearchTagRemoveAllButtonTapped + + case categoryTagRemoveButtonTapped(categoryID: Int) + case categoryTagButtonTapped + case categoryChangedBySelector + + case searchResultFilterButtonTapped + case searchResultFilterChangedBySelector + case searchResultItemTapped(indexPath: IndexPath) + case searchResultBookmarkButtonTapped(indexPath: IndexPath) + case searchResultPrefetchItems(indexPathList: [IndexPath]) + } + + public enum Mutation { + case setupRecentSearch(items: [TagModel]) + case setupCategory(items: [TagModel]) + case setupSearchResult(items: [SearchResultModel]) + case setupSearchResultHeader(item: SearchResultHeaderModel) + case setupSearchResultTotalPageCount(count: Int32) + + case appendSearchResult(items: [SearchResultModel]) + + case updateEditingState + case updateSearchBar(to: String?) + case updateClearButtonIsHidden(to: Bool) + case updateCurrentPage(to: Int32) + case updateSearchingState(to: Bool) + case updateSearchResultEmptyTitle + case updateSearchResultBookmark(indexPath: IndexPath) + case updateSearchResultDataSource + + case present(target: PresentTarget) + } + + @frozen + public enum PresentTarget { + case categorySelector + case filterSelector + case popupDetail(popupID: Int) + case before + } + + public struct State { + var recentSearchItems: [TagModel] = [] + var categoryItems: [TagModel] = [] + var searchResultItems: [SearchResultModel] = [] + var searchResultHeader: SearchResultHeaderModel = SearchResultHeaderModel(filterText: Filter.shared.title) + var searchResultEmptyTitle: String? + + @Pulse var searchBarText: String? = nil + @Pulse var present: PresentTarget? + @Pulse var clearButtonIsHidden: Bool? + @Pulse var endEditing: Void? + @Pulse var updateSearchResultDataSource: Void? + @Pulse var dismiss: Void? + + fileprivate var isSearching: Bool = false + fileprivate var currentPage: Int32 = 0 + fileprivate let paginationSize: Int32 = 10 + fileprivate var totalPagesCount: Int32 = 0 + } + + // MARK: - properties + public var initialState: State + + var disposeBag = DisposeBag() + + private let userDefaultService = UserDefaultService() + private let popupAPIUseCase: PopUpAPIUseCase + private let userAPIUseCase: UserAPIUseCase + private let fetchKeywordBasePopupListUseCase: FetchKeywordBasePopupListUseCase + + // MARK: - init + public init( + popupAPIUseCase: PopUpAPIUseCase, + userAPIUseCase: UserAPIUseCase, + fetchKeywordBasePopupListUseCase: FetchKeywordBasePopupListUseCase + ) { + self.popupAPIUseCase = popupAPIUseCase + self.userAPIUseCase = userAPIUseCase + self.fetchKeywordBasePopupListUseCase = fetchKeywordBasePopupListUseCase + self.initialState = State() + } + + // MARK: - Reactor Methods + public func mutate(action: Action) -> Observable { + switch action { + case .viewDidLoad: + return fetchSearchResult() + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return Observable.concat([ + .just(.setupRecentSearch(items: owner.makeRecentSearchItems())), + .just(.setupCategory(items: owner.makeCategoryItems())), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput(count: response.totalElements))), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.setupSearchResultTotalPageCount(count: response.totalPages)), + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchResultEmptyTitle), + .just(.updateSearchResultDataSource) + ]) + } + + case .searchBarEditing(let text): + return .just(.updateClearButtonIsHidden(to: text.isEmpty ? true : false)) + + case .searchBarExitEditing(let text): + return fetchSearchResult(keyword: text) + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return Observable.concat([ + .just(.setupRecentSearch(items: [])), + .just(.setupCategory(items: [])), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popupStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput( + keyword: owner.makePostPositionedText(text), + count: Int64(response.popupStoreList.count) + ))), // FIXME: API에 해당 결과값이 아직 없음 + .just(.setupSearchResultTotalPageCount(count: 0)), // FIXME: API에 해당 결과값이 아직 없음 + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchingState(to: true)), + .just(.updateSearchResultEmptyTitle), + .just(.updateClearButtonIsHidden(to: true)), + .just(.updateEditingState), + .just(.updateSearchResultDataSource) + ]) + } + + case .searchBarEndEditing: + return .concat([ + .just(.updateClearButtonIsHidden(to: true)), + .just(.updateEditingState) + ]) + + case .searchBarClearButtonTapped: + return Observable.concat([ + .just(.updateClearButtonIsHidden(to: true)), + .just(.updateSearchBar(to: nil)) + ]) + + case .searchBarCancelButtonTapped: + if currentState.isSearching { + return fetchSearchResult() + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return Observable.concat([ + .just(.setupRecentSearch(items: owner.makeRecentSearchItems())), + .just(.setupCategory(items: owner.makeCategoryItems())), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput(count: response.totalElements))), + .just(.setupSearchResultTotalPageCount(count: response.totalPages)), + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchingState(to: false)), + .just(.updateSearchResultEmptyTitle), + .just(.updateSearchBar(to: nil)), + .just(.updateEditingState), + .just(.updateSearchResultDataSource) + ]) + } + } else { return .just(.present(target: .before)) } + + case .recentSearchTagButtonTapped(let indexPath): + let keyword = self.findRecentSearchKeyword(at: indexPath) + return fetchSearchResult(keyword: keyword) + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return Observable.concat([ + .just(.setupRecentSearch(items: [])), + .just(.setupCategory(items: [])), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popupStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput( + keyword: owner.makePostPositionedText(keyword), + count: Int64(response.popupStoreList.count) + ))), + .just(.setupSearchResultTotalPageCount(count: 0)), // FIXME: API에 해당 결과값이 아직 없음 + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchBar(to: keyword)), + .just(.updateSearchingState(to: true)), + .just(.updateSearchResultEmptyTitle), + .just(.updateClearButtonIsHidden(to: true)), + .just(.updateEditingState), + .just(.updateSearchResultDataSource) + ]) + } + + case .recentSearchTagRemoveButtonTapped(let text): + self.removeRecentSearchItem(text: text) + return Observable.concat([ + .just(.setupRecentSearch(items: self.makeRecentSearchItems())), + .just(.updateSearchResultDataSource) + ]) + + case .recentSearchTagRemoveAllButtonTapped: + self.removeAllRecentSearchItems() + return .concat([ + .just(.setupRecentSearch(items: self.makeRecentSearchItems())), + .just(.updateSearchResultDataSource) + ]) + + case .categoryTagRemoveButtonTapped(let categoryID): + self.removeCategoryItem(by: categoryID) + return fetchSearchResult() + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return Observable.concat([ + .just(.setupCategory(items: owner.makeCategoryItems())), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput(count: response.totalElements))), + .just(.setupSearchResultTotalPageCount(count: response.totalPages)), + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchResultEmptyTitle), + .just(.updateSearchResultDataSource) + ]) + } + + case .categoryTagButtonTapped: + return .just(.present(target: .categorySelector)) + + case .categoryChangedBySelector: + return fetchSearchResult() + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return .concat([ + .just(.setupRecentSearch(items: owner.makeRecentSearchItems())), + .just(.setupCategory(items: owner.makeCategoryItems())), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput(count: response.totalElements))), + .just(.setupSearchResultTotalPageCount(count: response.totalPages)), + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchResultEmptyTitle), + .just(.updateSearchResultDataSource) + ]) + } + + case .searchResultFilterButtonTapped: + return .just(.present(target: .filterSelector)) + + case .searchResultFilterChangedBySelector: + return fetchSearchResult() + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return .concat([ + .just(.setupRecentSearch(items: owner.makeRecentSearchItems())), + .just(.setupCategory(items: owner.makeCategoryItems())), + .just(.setupSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.setupSearchResultHeader(item: owner.makeSearchResultHeaderInput(count: response.totalElements))), + .just(.setupSearchResultTotalPageCount(count: response.totalPages)), + .just(.updateCurrentPage(to: 0)), + .just(.updateSearchResultEmptyTitle), + .just(.updateSearchResultDataSource) + ]) + } + + case .searchResultItemTapped(let indexPath): + guard let popupID = self.findPopupStoreID(at: indexPath) else { return .empty() } + return .just(.present(target: .popupDetail(popupID: popupID))) + + case .searchResultBookmarkButtonTapped(let indexPath): + return fetchSearchResultBookmark(at: indexPath) + .andThen(.concat([ + .just(.updateSearchResultBookmark(indexPath: indexPath)), + .just(.updateSearchResultDataSource) + ])) + + case .searchResultPrefetchItems(let indexPathList): + guard isPrefetchable(indexPathList: indexPathList) else { return .empty() } + return fetchSearchResult(page: currentState.currentPage + 1) + .withUnretained(self) + .flatMap { (owner, response) -> Observable in + return .concat([ + .just(.appendSearchResult(items: owner.makeSearchResultItems(response.popUpStoreList, response.loginYn))), + .just(.updateCurrentPage(to: owner.currentState.currentPage + 1)), + .just(.updateSearchResultDataSource) + ]) + } + } + } + + public func reduce(state: State, mutation: Mutation) -> State { + var newState = state + switch mutation { + case .setupRecentSearch(let items): + newState.recentSearchItems = items + + case .setupCategory(let items): + newState.categoryItems = items + + case .setupSearchResult(let items): + newState.searchResultItems = items + + case .setupSearchResultHeader(let input): + newState.searchResultHeader = input + + case .setupSearchResultTotalPageCount(let count): + newState.totalPagesCount = count + + case .appendSearchResult(let items): + newState.searchResultItems += items + + case .updateEditingState: + newState.endEditing = () + + case .updateSearchBar(let text): + newState.searchBarText = text + + case .updateClearButtonIsHidden(let state): + newState.clearButtonIsHidden = state + + case .updateCurrentPage(let currentPage): + newState.currentPage = currentPage + + case .updateSearchingState(let isSearching): + newState.isSearching = isSearching + + case .updateSearchResultEmptyTitle: + newState.searchResultEmptyTitle = makeSearchResultEmptyTitle(state: newState) + + case .updateSearchResultBookmark(let indexPath): + newState.searchResultItems[indexPath.item].isBookmark.toggle() + + case .updateSearchResultDataSource: + newState.updateSearchResultDataSource = () + + case .present(let target): + newState.present = target + } + + return newState + } +} + +// MARK: Captulation Mutate +private extension PopupSearchReactor { + + func fetchSearchResult( + isOpen: Bool = Filter.shared.status.requestValue, + categories: [Int] = Category.shared.getSelectedCategoryIDs(), + page: Int32 = 0, + size: Int32 = 10, + sort: String = Filter.shared.sort.requestValue + ) -> Observable { + return popupAPIUseCase.getSearchBottomPopUpList( + isOpen: isOpen, + categories: categories, + page: page, + size: size, + sort: sort + ) + } + + func fetchSearchResult(keyword: String?) -> Observable { + guard let keyword else { return .empty() } + return fetchKeywordBasePopupListUseCase.execute(keyword: keyword) + } + + func fetchSearchResultBookmark(at indexPath: IndexPath) -> Completable { + let popupID = currentState.searchResultItems[indexPath.item].id + if currentState.searchResultItems[indexPath.item].isBookmark { + return userAPIUseCase.deleteBookmarkPopUp(popUpID: popupID) + } else { + return userAPIUseCase.postBookmarkPopUp(popUpID: popupID) + } + } +} + +// MARK: - Make Functions +private extension PopupSearchReactor { + func findRecentSearchKeyword(at indexPath: IndexPath) -> String? { + guard currentState.recentSearchItems.indices.contains(indexPath.item) + else { return nil } + + return currentState.recentSearchItems[indexPath.item].title + } + + func makeRecentSearchItems() -> [TagModel] { + let searchKeywords = userDefaultService.fetchArray(keyType: .searchKeyword) ?? [] + return searchKeywords.prefix(10).map { TagModel(title: $0) } + } + + func makeCategoryItems() -> [TagModel] { + return Category.shared.getCancelableCategoryItems() + } + + func makeSearchResultItems(_ popupStoreList: [PopUpStoreResponse], _ loginYn: Bool) -> [SearchResultModel] { + return popupStoreList.map { + SearchResultModel( + imagePath: $0.mainImageUrl, + id: $0.id, + category: $0.category, + title: $0.name, + address: $0.address, + startDate: $0.startDate, + endDate: $0.endDate, + isBookmark: $0.bookmarkYn, + isLogin: loginYn + ) + } + } + + // 빈 화면에서 탭할때 문제 + func findPopupStoreID(at indexPath: IndexPath) -> Int? { + guard currentState.searchResultItems.indices.contains(indexPath.item) else { return nil } + return Int(currentState.searchResultItems[indexPath.item].id) + } + + func makeSearchResultHeaderInput( + keyword afterTitle: String? = nil, + count: Int64, + filter filterTitle: String? = Filter.shared.title) -> SearchResultHeaderModel { + return SearchResultHeaderModel( + title: afterTitle, + count: Int(count), + filterText: filterTitle + ) + } + + func makeSearchResultEmptyTitle(state: State) -> String? { + if !currentState.searchResultItems.isEmpty { return nil } else if currentState.isSearching { return "검색 결과가 없어요 :(\n다른 키워드로 검색해주세요" } else { return "검색 결과가 없어요 :(\n다른 옵션을 선택해주세요" } + } + + /// 받침에 따라 이/가 를 판단해서 붙여준다. + func makePostPositionedText(_ text: String?) -> String { + + guard let text, let lastCharacter = text.last else { return "" } + + let unicodeValue = Int(lastCharacter.unicodeScalars.first!.value) + + // 한글 유니코드 범위 체크 + let base = 0xAC00 + let last = 0xD7A3 + guard base...last ~= unicodeValue else { return text + "가" } + + // 종성 인덱스 계산 (받침이 있으면 1 이상) + let finalConsonantIndex = (unicodeValue - base) % 28 + return (finalConsonantIndex != 0) ? text + "이" : text + "가" + } +} + +// MARK: - Remove Funtions +private extension PopupSearchReactor { + func removeRecentSearchItem(text: String) { + guard let searchKeywords = userDefaultService.fetchArray(keyType: .searchKeyword) else { return } + userDefaultService.save(keyType: .searchKeyword, value: searchKeywords.filter { $0 != text }) + } + + func removeAllRecentSearchItems() { + userDefaultService.delete(keyType: .searchKeyword) + } + + func removeCategoryItem(by categoryID: Int) { + Category.shared.removeItem(by: categoryID) + } +} + +// MARK: - Checking Method +private extension PopupSearchReactor { + func isPrefetchable(prefetchCount: Int = 4, indexPathList: [IndexPath]) -> Bool { + guard let lastItemIndex = indexPathList.last?.last else { return false } + + let isScrollToEnd = lastItemIndex > Int(currentState.paginationSize) * Int(currentState.currentPage + 1) - prefetchCount + let hasNextPage = currentState.currentPage < (currentState.totalPagesCount - 1) + + return isScrollToEnd && hasNextPage + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultEmptyTitleCollectionViewCell.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultEmptyTitleCollectionViewCell.swift new file mode 100644 index 00000000..7d3786fa --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultEmptyTitleCollectionViewCell.swift @@ -0,0 +1,59 @@ +import UIKit + +import DesignSystem +import Infrastructure + +import SnapKit +import Then + +final class SearchResultEmptyTitleCollectionViewCell: UICollectionViewCell { + + // MARK: - Properties + private let emptyLabel = PPLabel( + style: .medium, + fontSize: 14, + lineHeight: 1.5 + ).then { + $0.textAlignment = .center + $0.numberOfLines = 2 + $0.textColor = .g400 + } + + // MARK: - init + override init(frame: CGRect) { + super.init(frame: frame) + + self.addViews() + self.setupConstraints() + self.configureUI() + } + + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } +} + +// MARK: - SetUp +private extension SearchResultEmptyTitleCollectionViewCell { + func addViews() { + [emptyLabel].forEach { + self.addSubview($0) + } + } + + func setupConstraints() { + emptyLabel.snp.makeConstraints { make in + make.top.equalToSuperview().inset(145) + make.horizontalEdges.equalToSuperview() + make.height.equalTo(42) + } + } + + func configureUI() { } +} + +extension SearchResultEmptyTitleCollectionViewCell { + func configureCell(title: String) { + self.emptyLabel.text = title + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultHeaderCollectionViewCell.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultHeaderCollectionViewCell.swift new file mode 100644 index 00000000..518bac1a --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/Component/Cell/SearchResultHeaderCollectionViewCell.swift @@ -0,0 +1,125 @@ +import UIKit + +import DesignSystem + +import RxSwift +import SnapKit +import Then + +public final class SearchResultHeaderCollectionViewCell: UICollectionViewCell { + + // MARK: - Properties + + var disposeBag = DisposeBag() + + private let afterSearchTitleLabel = PPLabel(style: .bold, fontSize: 16).then { + $0.isHidden = true + } + + private let cellCountLabel = PPLabel(style: .regular, fontSize: 13).then { + $0.textColor = .g400 + } + + private let filterStatusLabel = PPLabel(style: .regular, fontSize: 13) + + private let dropDownImageView = UIImageView().then { + $0.image = UIImage(named: "icon_dropdown") + $0.isUserInteractionEnabled = false + } + + let filterStatusButton = UIButton() + + // MARK: - init + override init(frame: CGRect) { + super.init(frame: .zero) + + self.addViews() + self.setupConstraints() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } + + public override func prepareForReuse() { + super.prepareForReuse() + disposeBag = DisposeBag() + } +} + +// MARK: - SetUp +private extension SearchResultHeaderCollectionViewCell { + func addViews() { + [afterSearchTitleLabel, cellCountLabel, filterStatusButton].forEach { + addSubview($0) + } + + [filterStatusLabel, dropDownImageView].forEach { + filterStatusButton.addSubview($0) + } + } + + func setupConstraints() { + afterSearchTitleLabel.snp.makeConstraints { make in + make.height.equalTo(0) + make.horizontalEdges.equalToSuperview() + make.top.equalToSuperview() + make.bottom.equalTo(cellCountLabel.snp.top).offset(-4) + } + + cellCountLabel.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.height.equalTo(20) + make.bottom.equalToSuperview() + } + + filterStatusButton.snp.makeConstraints { make in + make.trailing.equalToSuperview() + make.height.equalTo(22) + make.bottom.equalToSuperview() + } + + filterStatusLabel.snp.makeConstraints { make in + make.leading.equalToSuperview() + make.centerY.equalToSuperview() + } + + dropDownImageView.snp.makeConstraints { make in + make.verticalEdges.equalToSuperview() + make.width.equalTo(dropDownImageView.snp.height) + make.leading.equalTo(filterStatusLabel.snp.trailing).offset(6) + make.trailing.equalToSuperview() + } + } +} + +extension SearchResultHeaderCollectionViewCell { + func configureCell(title: String?, count: Int?, filterText: String?) { + if let afterSearchTitle = title, + let count = count { + filterStatusButton.isHidden = true + afterSearchTitleLabel.isHidden = false + afterSearchTitleLabel.text = afterSearchTitle + " 포함된 팝업" + cellCountLabel.text = "총 \(count)개를 찾았어요." + + if count == 0 { self.isHidden = true } else { + self.isHidden = false + afterSearchTitleLabel.snp.updateConstraints { make in + make.height.equalTo(24) + } + } + + } else if let count, let filterText { + filterStatusButton.isHidden = false + afterSearchTitleLabel.isHidden = true + cellCountLabel.text = "총 \(count)개" + filterStatusLabel.text = filterText + + self.isHidden = false + afterSearchTitleLabel.snp.updateConstraints { make in + make.height.equalTo(0) + } + } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchView.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchView.swift new file mode 100644 index 00000000..2c1421be --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchView.swift @@ -0,0 +1,325 @@ +import UIKit + +import DesignSystem + +import RxCocoa +import RxRelay +import RxSwift +import SnapKit +import Then + +final class PopupSearchView: UIView { + + // MARK: - Properties + private var dataSource: UICollectionViewDiffableDataSource? + private let layoutFactory: PopupSearchLayoutFactory = PopupSearchLayoutFactory() + + let recentSearchTagRemoveButtonTapped = PublishRelay() + let recentSearchTagRemoveAllButtonTapped = PublishRelay() + let categoryTagRemoveButtonTapped = PublishRelay() + let filterStatusButtonTapped = PublishRelay() + let bookmarkButtonTapped = PublishRelay() + + let tapGestureRecognizer = UITapGestureRecognizer().then { + $0.cancelsTouchesInView = false + } + + public let searchBar = PPSearchBarView() + + lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: .init()).then { + let layout = layoutFactory.makeCollectionViewLayout { [weak self] in self?.dataSource } + + $0.setCollectionViewLayout(layout, animated: false) + + $0.register( + TagCollectionHeaderView.self, + forSupplementaryViewOfKind: SectionHeaderKind.recentSearch.rawValue, + withReuseIdentifier: TagCollectionHeaderView.identifiers + ) + + $0.register( + TagCollectionHeaderView.self, + forSupplementaryViewOfKind: SectionHeaderKind.category.rawValue, + withReuseIdentifier: TagCollectionHeaderView.identifiers + ) + + $0.register( + PPTagCollectionViewCell.self, + forCellWithReuseIdentifier: PPTagCollectionViewCell.identifiers + ) + + $0.register( + SearchResultHeaderCollectionViewCell.self, + forCellWithReuseIdentifier: SearchResultHeaderCollectionViewCell.identifiers + ) + + $0.register( + PPPopupGridCollectionViewCell.self, + forCellWithReuseIdentifier: PPPopupGridCollectionViewCell.identifiers + ) + + $0.register( + SearchResultEmptyTitleCollectionViewCell.self, + forCellWithReuseIdentifier: SearchResultEmptyTitleCollectionViewCell.identifiers + ) + + // UICollectionView 최 상/하단 빈 영역 + $0.contentInset = UIEdgeInsets(top: 24, left: 0, bottom: 48, right: 0) + $0.contentInsetAdjustmentBehavior = .never + } + + // MARK: - init + init() { + super.init(frame: .zero) + + self.addViews() + self.setupConstraints() + self.configureUI() + } + + required init?(coder: NSCoder) { + fatalError("\(#file), \(#function) Error") + } +} + +// MARK: - SetUp +private extension PopupSearchView { + func addViews() { + [searchBar, collectionView].forEach { + self.addSubview($0) + } + + [tapGestureRecognizer].forEach { + self.addGestureRecognizer($0) + } + } + + func setupConstraints() { + searchBar.snp.makeConstraints { make in + make.top.equalTo(self.safeAreaLayoutGuide) + make.horizontalEdges.equalToSuperview() + make.height.equalTo(56) + } + + collectionView.snp.makeConstraints { make in + make.top.equalTo(searchBar.snp.bottom) + make.horizontalEdges.equalToSuperview() + make.bottom.equalToSuperview() + } + } + + func configureUI() { + self.configurationDataSourceItem() + self.configureDataSourceHeader() + } +} + +// MARK: - DataSource +extension PopupSearchView { + private func configurationDataSourceItem() { + self.dataSource = UICollectionViewDiffableDataSource< + PopupSearchView.Section, + PopupSearchView.SectionItem + >( + collectionView: collectionView + ) { (collectionView, indexPath, item) -> UICollectionViewCell? in + + switch item { + case .recentSearchItem(let item): + let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: PPTagCollectionViewCell.identifiers, + for: indexPath + ) as! PPTagCollectionViewCell + + cell.configureCell( + title: item.title, + id: item.id, + isSelected: item.isSelected, + isCancelable: item.isCancelable + ) + + cell.cancelButton.rx.tap + .compactMap { cell.titleLabel.text } + .bind(to: self.recentSearchTagRemoveButtonTapped) + .disposed(by: cell.disposeBag) + + return cell + + case .categoryItem(let item): + let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: PPTagCollectionViewCell.identifiers, + for: indexPath + ) as! PPTagCollectionViewCell + + cell.configureCell( + title: item.title, + id: item.id, + isSelected: item.isSelected, + isCancelable: item.isCancelable + ) + + cell.cancelButton.rx.tap + .compactMap { item.id } + .bind(to: self.categoryTagRemoveButtonTapped) + .disposed(by: cell.disposeBag) + + return cell + + case .searchResultHeaderItem(let item): + let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: SearchResultHeaderCollectionViewCell.identifiers, + for: indexPath + ) as! SearchResultHeaderCollectionViewCell + + cell.configureCell(title: item.title, count: item.count, filterText: item.filterText) + + cell.filterStatusButton.rx.tap + .bind(to: self.filterStatusButtonTapped) + .disposed(by: cell.disposeBag) + + return cell + + case .searchResultItem(let item): + let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: PPPopupGridCollectionViewCell.identifiers, + for: indexPath + ) as! PPPopupGridCollectionViewCell + + cell.configureCell( + imagePath: item.imagePath, + id: item.id, + category: item.category, + title: item.title, + address: item.address, + startDate: item.startDate, + endDate: item.endDate, + isBookmark: item.isBookmark, + isLogin: item.isLogin, + isPopular: item.isPopular, + row: item.row + ) + + cell.bookmarkButton.rx.tap + .map { indexPath } + .bind(to: self.bookmarkButtonTapped) + .disposed(by: cell.disposeBag) + + return cell + + case .searchResultEmptyTitle(let title): + let cell = collectionView.dequeueReusableCell( + withReuseIdentifier: SearchResultEmptyTitleCollectionViewCell.identifiers, + for: indexPath + ) as! SearchResultEmptyTitleCollectionViewCell + + cell.configureCell(title: title) + + return cell + } + } + + self.collectionView.dataSource = self.dataSource + } + + private func configureDataSourceHeader() { + dataSource?.supplementaryViewProvider = { [weak self] (collectionView, elementKind, indexPath) -> UICollectionReusableView? in + guard let self else { return nil } + switch SectionHeaderKind(rawValue: elementKind)! { + case .recentSearch: + guard let header = collectionView.dequeueReusableSupplementaryView( + ofKind: elementKind, + withReuseIdentifier: TagCollectionHeaderView.identifiers, + for: indexPath + ) as? TagCollectionHeaderView else { fatalError("\(#file), \(#function) Error") } + header.configureHeader(title: "최근 검색어", buttonTitle: "모두삭제") + + header.removeAllButton.rx.tap + .bind(to: self.recentSearchTagRemoveAllButtonTapped) + .disposed(by: header.disposeBag) + + return header + + case .category: + guard let header = collectionView.dequeueReusableSupplementaryView( + ofKind: elementKind, + withReuseIdentifier: TagCollectionHeaderView.identifiers, + for: indexPath + ) as? TagCollectionHeaderView else { fatalError("\(#file), \(#function) Error") } + header.configureHeader(title: "팝업스토어 찾기") + + return header + } + } + } + + func updateSectionSnapshot(at section: Section, with items: [SectionItem]) { + if items.isEmpty { + guard var snapshot = dataSource?.snapshot() else { return } + snapshot.deleteSections([section]) + dataSource?.apply(snapshot, animatingDifferences: false) + return + } else { + if var snapshot = dataSource?.snapshot(for: section) { + snapshot.deleteAll() + snapshot.append(items) + dataSource?.apply(snapshot, to: section) + } else { + guard var snapshot = dataSource?.snapshot() else { return } + snapshot.appendSections([section]) + snapshot.appendItems(items, toSection: section) + dataSource?.apply(snapshot) + } + } + } + + func updateSearchResultSectionSnapshot( + with items: [SectionItem], + header: SectionItem, + empty: SectionItem? = nil + ) { + guard var snapshot = dataSource?.snapshot() else { return } + + snapshot.deleteSections([.searchResultHeader, .searchResult]) + + snapshot.appendSections( [.searchResultHeader, .searchResult]) + snapshot.appendItems([header], toSection: .searchResultHeader) + + if let empty { + snapshot.appendItems([empty], toSection: .searchResult) + } else { + snapshot.appendItems(items, toSection: .searchResult) + } + + dataSource?.apply(snapshot, animatingDifferences: false) + } + + func getSectionsFromDataSource() -> [Section] { + return dataSource?.snapshot().sectionIdentifiers ?? [] + } +} + +// MARK: - Section information +extension PopupSearchView { + /// View를 구성하는 section을 정의 + enum Section: CaseIterable, Hashable { + case recentSearch + case category + case searchResultHeader + case searchResult + } + + /// Section에 들어갈 Item을 정의한 변수 + enum SectionItem: Hashable { + case recentSearchItem(TagModel) + case categoryItem(TagModel) + case searchResultHeaderItem(SearchResultHeaderModel) + case searchResultItem(SearchResultModel) + case searchResultEmptyTitle(String) + } + + /// Section의 헤더를 구분하기 위한 변수 + enum SectionHeaderKind: String { + case recentSearch = "recentSearchElementKind" + case category = "categoryElementKind" + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchViewController.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchViewController.swift new file mode 100644 index 00000000..45262a60 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeature/PopupSearch/View/PopupSearchViewController.swift @@ -0,0 +1,223 @@ +import UIKit + +import DesignSystem +import DomainInterface +import Infrastructure +import PresentationInterface +import SearchFeatureInterface + +import ReactorKit +import RxCocoa +import RxSwift +import Then + +public final class PopupSearchViewController: BaseViewController, View { + + public typealias Reactor = PopupSearchReactor + + // MARK: - Properties + public var disposeBag = DisposeBag() + + private let mainView = PopupSearchView() + +} + +// MARK: - Life Cycle +extension PopupSearchViewController { + public override func loadView() { + self.view = mainView + } + + public override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + tabBarController?.tabBar.isHidden = true + } +} + +// MARK: - Bind +extension PopupSearchViewController { + public func bind(reactor: Reactor) { + self.bindAction(reactor: reactor) + self.bindState(reactor: reactor) + } + + private func bindAction(reactor: Reactor) { + rx.viewDidLoad + .map { Reactor.Action.viewDidLoad } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.tapGestureRecognizer.rx.event + .map { _ in Reactor.Action.searchBarEndEditing } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.searchBar.searchBar.searchTextField.rx.controlEvent([.editingDidBegin, .editingChanged]) + .withLatestFrom(mainView.searchBar.searchBar.searchTextField.rx.text.orEmpty) + .map(Reactor.Action.searchBarEditing) + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.searchBar.searchBar.searchTextField.rx.controlEvent(.editingDidEndOnExit) + .withLatestFrom(mainView.searchBar.searchBar.searchTextField.rx.text.orEmpty) + .map(Reactor.Action.searchBarExitEditing) + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.searchBar.clearButton.rx.tap + .map { Reactor.Action.searchBarClearButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.searchBar.cancelButton.rx.tap + .map { _ in Reactor.Action.searchBarCancelButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.recentSearchTagRemoveButtonTapped + .map(Reactor.Action.recentSearchTagRemoveButtonTapped) + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.recentSearchTagRemoveAllButtonTapped + .map { Reactor.Action.recentSearchTagRemoveAllButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.collectionView.rx.itemSelected + .compactMap { indexPath in + let sections = self.mainView.getSectionsFromDataSource() + guard indexPath.section < sections.count else { return nil } + + switch sections[indexPath.section] { + case .recentSearch: + return Reactor.Action.recentSearchTagButtonTapped(indexPath: indexPath) + case .category: + return Reactor.Action.categoryTagButtonTapped + + case .searchResultHeader: return nil + case .searchResult: + return Reactor.Action.searchResultItemTapped(indexPath: indexPath) + } + } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.categoryTagRemoveButtonTapped + .map { Reactor.Action.categoryTagRemoveButtonTapped(categoryID: $0) } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + Category.valueChanged + .map { _ in Reactor.Action.categoryChangedBySelector } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.filterStatusButtonTapped + .map { Reactor.Action.searchResultFilterButtonTapped } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + Filter.valueChanged + .map { _ in Reactor.Action.searchResultFilterChangedBySelector } + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.bookmarkButtonTapped + .map(Reactor.Action.searchResultBookmarkButtonTapped) + .bind(to: reactor.action) + .disposed(by: disposeBag) + + mainView.collectionView.rx.prefetchItems + .throttle(.milliseconds(100), latest: false, scheduler: MainScheduler.asyncInstance) + .map(Reactor.Action.searchResultPrefetchItems) + .bind(to: reactor.action) + .disposed(by: disposeBag) + } + + private func bindState(reactor: Reactor) { + reactor.pulse(\.$endEditing) + .withUnretained(self) + .subscribe { (owner, _) in owner.mainView.endEditing(true) } + .disposed(by: disposeBag) + + reactor.pulse(\.$clearButtonIsHidden) + .compactMap { $0 } + .withUnretained(self) + .subscribe { (owner, state) in owner.mainView.searchBar.clearButton.isHidden = state } + .disposed(by: disposeBag) + + reactor.pulse(\.$present) + .withUnretained(self) + .skip(1) + .subscribe { owner, target in + switch target! { + case .categorySelector: + @Dependency var factory: CategorySelectorFactory + owner.PPPresent(factory.make()) + + case .filterSelector: + @Dependency var factory: FilterSelectorFactory + owner.PPPresent(factory.make()) + + case .popupDetail(let popupID): + @Dependency var factory: DetailFactory + owner.navigationController?.pushViewController( + factory.make(popupID: popupID), + animated: true + ) + + case .before: + owner.navigationController?.popViewController(animated: true) + } + } + .disposed(by: disposeBag) + + reactor.pulse(\.$searchBarText) + .withUnretained(self) + .subscribe { (owner, text) in owner.mainView.searchBar.searchBar.text = text } + .disposed(by: disposeBag) + + reactor.state.distinctUntilChanged(\.recentSearchItems) + .compactMap { $0.recentSearchItems } + .withUnretained(self) + .subscribe { (owner, items) in + owner.mainView.updateSectionSnapshot( + at: .recentSearch, + with: items.map(PopupSearchView.SectionItem.recentSearchItem) + ) + } + .disposed(by: disposeBag) + + reactor.state.distinctUntilChanged(\.categoryItems) + .compactMap { $0.categoryItems } + .withUnretained(self) + .subscribe { (owner, items) in + owner.mainView.updateSectionSnapshot( + at: .category, + with: items.map(PopupSearchView.SectionItem.categoryItem) + ) + } + .disposed(by: disposeBag) + + reactor.pulse(\.$updateSearchResultDataSource) + .withLatestFrom(reactor.state) + .withUnretained(self) + .subscribe { (owner, state) in + if let emptyTitle = state.searchResultEmptyTitle { + owner.mainView.updateSearchResultSectionSnapshot( + with: state.searchResultItems.map(PopupSearchView.SectionItem.searchResultItem), + header: PopupSearchView.SectionItem.searchResultHeaderItem(state.searchResultHeader), + empty: PopupSearchView.SectionItem.searchResultEmptyTitle(emptyTitle) + ) + } else { + owner.mainView.updateSearchResultSectionSnapshot( + with: state.searchResultItems.map(PopupSearchView.SectionItem.searchResultItem), + header: PopupSearchView.SectionItem.searchResultHeaderItem(state.searchResultHeader) + ) + } + } + .disposed(by: disposeBag) + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/AppDelegate.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/AppDelegate.swift new file mode 100644 index 00000000..d26b08f7 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/AppDelegate.swift @@ -0,0 +1,74 @@ +import UIKit + +import Data +import Domain +import DomainInterface +import Infrastructure +import Presentation +import PresentationInterface +import SearchFeature +import SearchFeatureInterface + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + self.registerDependencies() + self.registerFactory() + + return true + } + + // MARK: UISceneSession Lifecycle + + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } +} + +// MARK: - Dependency +extension AppDelegate { + /// 의존성 등록을 위한 메서드 + private func registerDependencies() { + // MARK: Register Service + DIContainer.register(Provider.self) { return ProviderImpl() } + DIContainer.register(UserDefaultService.self) { return UserDefaultService() } + DIContainer.register(KeyChainService.self) { return KeyChainService() } + + // MARK: Resolve service + @Dependency var provider: Provider + @Dependency var userDefaultService: UserDefaultService + + // MARK: Register repository + DIContainer.register(UserAPIRepository.self) { return UserAPIRepositoryImpl(provider: provider) } + DIContainer.register(PopUpAPIRepository.self) { return PopUpAPIRepositoryImpl(provider: provider) } + DIContainer.register(CommentAPIRepository.self) { return CommentAPIRepositoryImpl(provider: provider) } + DIContainer.register(PreSignedRepository.self) { return PreSignedRepositoryImpl() } + DIContainer.register(CategoryRepository.self) { return CategoryRepositoryImpl(provider: provider) } + DIContainer.register(SearchAPIRepository.self) { return SearchAPIRepositoryImpl(provider: provider, userDefaultService: userDefaultService) } + + // MARK: Resolve repository + @Dependency var userAPIRepository: UserAPIRepository + @Dependency var popUpAPIRepository: PopUpAPIRepository + @Dependency var commentAPIRepository: CommentAPIRepository + @Dependency var preSignedRepository: PreSignedRepository + @Dependency var categoryRepository: CategoryRepository + @Dependency var searchAPIRepository: SearchAPIRepository + + // MARK: Register UseCase + DIContainer.register(UserAPIUseCase.self) { return UserAPIUseCaseImpl(repository: userAPIRepository) } + DIContainer.register(PopUpAPIUseCase.self) { return PopUpAPIUseCaseImpl(repository: popUpAPIRepository) } + DIContainer.register(CommentAPIUseCase.self) { return CommentAPIUseCaseImpl(repository: commentAPIRepository) } + DIContainer.register(PreSignedUseCase.self) { return PreSignedUseCaseImpl(repository: preSignedRepository) } + DIContainer.register(FetchCategoryListUseCase.self) { return FetchCategoryListUseCaseImpl(repository: categoryRepository) } + DIContainer.register(FetchKeywordBasePopupListUseCase.self) { return FetchKeywordBasePopupListUseCaseImpl(repository: searchAPIRepository) } + } + + private func registerFactory() { + DIContainer.register(PopupSearchFactory.self) { return PopupSearchFactoryImpl() } + DIContainer.register(CategorySelectorFactory.self) { return CategorySelectorFactoryImpl() } + DIContainer.register(FilterSelectorFactory.self) { return FilterSelectorFactoryImpl() } + DIContainer.register(DetailFactory.self) { return DetailFactoryImpl() } + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/SceneDelegate.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/SceneDelegate.swift new file mode 100644 index 00000000..ded75ea4 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/App/SceneDelegate.swift @@ -0,0 +1,28 @@ +import UIKit + +import Domain +import DomainInterface +import Infrastructure +import SearchFeatureInterface + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + + var window: UIWindow? + + func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { + guard let windowScene = (scene as? UIWindowScene) else { return } + + window = UIWindow(windowScene: windowScene) + + let navigationController = UINavigationController() + @Dependency var popupSearchFactory: PopupSearchFactory + + navigationController.pushViewController( + popupSearchFactory.make(), + animated: false + ) + + window?.rootViewController = navigationController + window?.makeKeyAndVisible() + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AccentColor.colorset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..23058801 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/Contents.json new file mode 100644 index 00000000..f64986bb --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "solid.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/solid.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/solid.svg new file mode 100644 index 00000000..71a10b2e --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_clear_button.imageset/solid.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/Contents.json new file mode 100644 index 00000000..d86eb988 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "line.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/line.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/line.svg new file mode 100644 index 00000000..6dd06be5 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/SearchBar/icon_search_gray.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/Contents.json new file mode 100644 index 00000000..f64986bb --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "solid.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/solid.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/solid.svg new file mode 100644 index 00000000..1ef76aed --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark.imageset/solid.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/Contents.json new file mode 100644 index 00000000..44808aa2 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "solid-1.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/solid-1.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/solid-1.svg new file mode 100644 index 00000000..6d836093 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_bookmark_fill.imageset/solid-1.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/Contents.json new file mode 100644 index 00000000..f64986bb --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "solid.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/solid.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/solid.svg new file mode 100644 index 00000000..ec4c794b --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_dropdown.imageset/solid.svg @@ -0,0 +1,3 @@ + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/Contents.json new file mode 100644 index 00000000..d86eb988 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "line.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/line.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/line.svg new file mode 100644 index 00000000..c95be2c3 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/Contents.json new file mode 100644 index 00000000..d86eb988 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "line.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/line.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/line.svg new file mode 100644 index 00000000..6a318745 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_gray.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/Contents.json b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/Contents.json new file mode 100644 index 00000000..d86eb988 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "line.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/line.svg b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/line.svg new file mode 100644 index 00000000..b55257a1 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Assets.xcassets/icon_xmark_white.imageset/line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Base.lproj/LaunchScreen.storyboard b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..865e9329 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Info.plist b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Info.plist new file mode 100644 index 00000000..a343d54d --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureDemo/Resource/Info.plist @@ -0,0 +1,46 @@ + + + + + UIUserInterfaceStyle + Light + UIAppFonts + + GothicA1-Bold.ttf + GothicA1-Light.ttf + GothicA1-Medium.ttf + GothicA1-Regular.ttf + Poppins-Bold.ttf + Poppins-Light.ttf + Poppins-Medium.ttf + Poppins-Regular.ttf + + NAVER_MAP_CLIENT_ID + ${NAVER_MAP_CLIENT_ID} + POPPOOL_S3_BASE_URL + ${POPPOOL_S3_BASE_URL} + POPPOOL_BASE_URL + ${POPPOOL_BASE_URL} + POPPOOL_API_KEY + ${POPPOOL_API_KEY} + KAKAO_AUTH_APP_KEY + ${KAKAO_AUTH_APP_KEY} + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + + + + + + diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/CategorySelectorFactory.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/CategorySelectorFactory.swift new file mode 100644 index 00000000..5e4a1a14 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/CategorySelectorFactory.swift @@ -0,0 +1,7 @@ +import UIKit + +import DesignSystem + +public protocol CategorySelectorFactory { + func make() -> BaseViewController & PPModalPresentable +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/FilterSelectorFactory.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/FilterSelectorFactory.swift new file mode 100644 index 00000000..415c8b00 --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/FilterSelectorFactory.swift @@ -0,0 +1,7 @@ +import UIKit + +import DesignSystem + +public protocol FilterSelectorFactory { + func make() -> BaseViewController & PPModalPresentable +} diff --git a/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/PopupSearchFactory.swift b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/PopupSearchFactory.swift new file mode 100644 index 00000000..0de8d2cf --- /dev/null +++ b/Poppool/PresentationLayer/SearchFeature/SearchFeatureInterface/Source/Factory/PopupSearchFactory.swift @@ -0,0 +1,7 @@ +import UIKit + +import DesignSystem + +public protocol PopupSearchFactory { + func make() -> BaseViewController +}