diff --git a/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.pbxproj b/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.pbxproj index e4bf52e..e9a992f 100644 --- a/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.pbxproj +++ b/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.pbxproj @@ -7,6 +7,13 @@ objects = { /* Begin PBXBuildFile section */ + 2C02354E2BE519C7001FA169 /* HomeDetailDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C02354D2BE519C7001FA169 /* HomeDetailDTO.swift */; }; + 2C0235512BE51ACD001FA169 /* HomeDetailService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C0235502BE51ACD001FA169 /* HomeDetailService.swift */; }; + 2C11B7742BE08E0500CCACED /* HomeDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C11B7732BE08E0500CCACED /* HomeDetailViewController.swift */; }; + 2C11B7762BE08E7600CCACED /* HomeDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C11B7752BE08E7600CCACED /* HomeDetailView.swift */; }; + 2C11B7782BE08F4E00CCACED /* HomeDetailHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C11B7772BE08F4E00CCACED /* HomeDetailHeaderView.swift */; }; + 2C11B77A2BE0911F00CCACED /* HomeDetailDescriptionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C11B7792BE0911F00CCACED /* HomeDetailDescriptionView.swift */; }; + 2C11B77C2BE0CAE700CCACED /* HomeDetailViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C11B77B2BE0CAE700CCACED /* HomeDetailViewModel.swift */; }; 2C1765002B71FB1D00CD789E /* KakaoSDKCommon in Frameworks */ = {isa = PBXBuildFile; productRef = 2C1764FF2B71FB1D00CD789E /* KakaoSDKCommon */; }; 2C1765082B7279A000CD789E /* StringLiterals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1765072B7279A000CD789E /* StringLiterals.swift */; }; 2C17650A2B7283A500CD789E /* UIViewController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1765092B7283A500CD789E /* UIViewController+.swift */; }; @@ -144,9 +151,16 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 2C02354D2BE519C7001FA169 /* HomeDetailDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailDTO.swift; sourceTree = ""; }; + 2C0235502BE51ACD001FA169 /* HomeDetailService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailService.swift; sourceTree = ""; }; + 2C0235552BE52837001FA169 /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; + 2C11B7732BE08E0500CCACED /* HomeDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailViewController.swift; sourceTree = ""; }; + 2C11B7752BE08E7600CCACED /* HomeDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailView.swift; sourceTree = ""; }; + 2C11B7772BE08F4E00CCACED /* HomeDetailHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailHeaderView.swift; sourceTree = ""; }; + 2C11B7792BE0911F00CCACED /* HomeDetailDescriptionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailDescriptionView.swift; sourceTree = ""; }; + 2C11B77B2BE0CAE700CCACED /* HomeDetailViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeDetailViewModel.swift; sourceTree = ""; }; 2C1765072B7279A000CD789E /* StringLiterals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringLiterals.swift; sourceTree = ""; }; 2C1765092B7283A500CD789E /* UIViewController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+.swift"; sourceTree = ""; }; - 2C33B1712B763CFB00A9476D /* Config.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config.xcconfig; sourceTree = ""; }; 2C33B1732B76404A00A9476D /* PuzzleMainButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PuzzleMainButton.swift; sourceTree = ""; }; 2C33B1772B764A7000A9476D /* OnboardingPlusViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingPlusViewController.swift; sourceTree = ""; }; 2C33B1792B764A8300A9476D /* OnboardingPlusView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingPlusView.swift; sourceTree = ""; }; @@ -294,6 +308,50 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 2C02354F2BE51ABB001FA169 /* HomeDetailService */ = { + isa = PBXGroup; + children = ( + 2C0235502BE51ACD001FA169 /* HomeDetailService.swift */, + ); + path = HomeDetailService; + sourceTree = ""; + }; + 2C11B76F2BE08DC900CCACED /* HomeDetail */ = { + isa = PBXGroup; + children = ( + 2C11B7722BE08DE100CCACED /* ViewModel */, + 2C11B7712BE08DDA00CCACED /* View */, + 2C11B7702BE08DD200CCACED /* ViewController */, + ); + path = HomeDetail; + sourceTree = ""; + }; + 2C11B7702BE08DD200CCACED /* ViewController */ = { + isa = PBXGroup; + children = ( + 2C11B7732BE08E0500CCACED /* HomeDetailViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 2C11B7712BE08DDA00CCACED /* View */ = { + isa = PBXGroup; + children = ( + 2C11B7752BE08E7600CCACED /* HomeDetailView.swift */, + 2C11B7772BE08F4E00CCACED /* HomeDetailHeaderView.swift */, + 2C11B7792BE0911F00CCACED /* HomeDetailDescriptionView.swift */, + ); + path = View; + sourceTree = ""; + }; + 2C11B7722BE08DE100CCACED /* ViewModel */ = { + isa = PBXGroup; + children = ( + 2C11B77B2BE0CAE700CCACED /* HomeDetailViewModel.swift */, + ); + path = ViewModel; + sourceTree = ""; + }; 2C1765062B72799400CD789E /* Literals */ = { isa = PBXGroup; children = ( @@ -341,6 +399,7 @@ 2C372A412B6B8C29009B7BF6 /* Service */ = { isa = PBXGroup; children = ( + 2C02354F2BE51ABB001FA169 /* HomeDetailService */, 2CA684472BA807A80034C3E7 /* SplashService */, 2C372A3A2B6B7A60009B7BF6 /* AuthService */, ); @@ -352,6 +411,7 @@ children = ( 2C372A432B6B8C44009B7BF6 /* AuthDTO.swift */, 2CA6843A2BA806E10034C3E7 /* SpalshDTO.swift */, + 2C02354D2BE519C7001FA169 /* HomeDetailDTO.swift */, ); path = DTO; sourceTree = ""; @@ -425,7 +485,7 @@ isa = PBXGroup; children = ( 2C55EEBF2B711BB5001AD42E /* Config.swift */, - 2C33B1712B763CFB00A9476D /* Config.xcconfig */, + 2C0235552BE52837001FA169 /* Config.xcconfig */, ); path = Config; sourceTree = ""; @@ -703,6 +763,7 @@ 718150462B62953F005E4451 /* Presentation */ = { isa = PBXGroup; children = ( + 2C11B76F2BE08DC900CCACED /* HomeDetail */, 71F4F6BC2BB53DAF006C799B /* Splash */, 710309902B93139B0077EE17 /* Home */, 71A5BB0B2B9B2AE300655835 /* My */, @@ -1048,6 +1109,7 @@ buildActionMask = 2147483647; files = ( 718D09352B80A3BF0021AD40 /* OnboardingCollectionView.swift in Sources */, + 2C11B77A2BE0911F00CCACED /* HomeDetailDescriptionView.swift in Sources */, 7103099F2B9315CA0077EE17 /* MainView.swift in Sources */, 7122CCFD2BA815CF00CA56AC /* SettingHeaderView.swift in Sources */, 718D09192B7A94930021AD40 /* OnboardingBaseView.swift in Sources */, @@ -1068,6 +1130,7 @@ 7127DA502B81C9C000B262DA /* InterestViewModel.swift in Sources */, 71A5BB102B9B2CE300655835 /* MyProfileViewController.swift in Sources */, 2CA684402BA807290034C3E7 /* HTTPMethod.swift in Sources */, + 2C02354E2BE519C7001FA169 /* HomeDetailDTO.swift in Sources */, 710309A12B931F1C0077EE17 /* LabelFactory.swift in Sources */, 71F4F6BE2BB53DCE006C799B /* SplashViewController.swift in Sources */, 2C372A3E2B6B7ACD009B7BF6 /* AuthAppleService.swift in Sources */, @@ -1078,6 +1141,7 @@ 2C17650A2B7283A500CD789E /* UIViewController+.swift in Sources */, 2C9813BB2B7CED2000C56D0B /* PuzzleDropdownView.swift in Sources */, 2C1765082B7279A000CD789E /* StringLiterals.swift in Sources */, + 2C11B7782BE08F4E00CCACED /* HomeDetailHeaderView.swift in Sources */, 718150132B6291D7005E4451 /* ViewController.swift in Sources */, 71EB2E9A2BA4694900EB64B2 /* SettingView.swift in Sources */, 7118EAF32B9DBAEA00012D94 /* EmptyCell.swift in Sources */, @@ -1085,8 +1149,10 @@ 2CA684422BA807480034C3E7 /* NetworkError.swift in Sources */, 7127DA542B82071700B262DA /* LeftAlignedFlowLayout.swift in Sources */, 2CA684442BA8075E0034C3E7 /* NetworkLogger.swift in Sources */, + 2C11B7762BE08E7600CCACED /* HomeDetailView.swift in Sources */, 718D09162B7A947F0021AD40 /* OnboardingViewController.swift in Sources */, 2CA6844B2BA807FD0034C3E7 /* SplashRepository.swift in Sources */, + 2C11B7742BE08E0500CCACED /* HomeDetailViewController.swift in Sources */, 7127DA522B81EF6100B262DA /* InterestSelectionCollectionView.swift in Sources */, 71773C5F2B64BEFB0041605E /* PuzzleTabBarController.swift in Sources */, 2C5310F02B6E8CA000704371 /* CancelBag+.swift in Sources */, @@ -1097,6 +1163,7 @@ 2CA684462BA807840034C3E7 /* Networking.swift in Sources */, 718D093B2B80DC8E0021AD40 /* OnboardingSelectPositionViewController.swift in Sources */, 7118EAF12B9DB0D400012D94 /* MyProfileCell.swift in Sources */, + 2C0235512BE51ACD001FA169 /* HomeDetailService.swift in Sources */, 710309952B9314530077EE17 /* HomeViewController.swift in Sources */, 710309812B8E47AE0077EE17 /* InputIdViewModel.swift in Sources */, 7118EAF82B9DC48F00012D94 /* DashedLineCollectionViewCell.swift in Sources */, @@ -1144,6 +1211,7 @@ 71355AEC2B80ECC1007E1822 /* InterestSelectionViewCell.swift in Sources */, 710309A32B932EA50077EE17 /* KeywordCell.swift in Sources */, 71814A872B76568B00B23378 /* UIView+.swift in Sources */, + 2C11B77C2BE0CAE700CCACED /* HomeDetailViewModel.swift in Sources */, 7127DA592B82435500B262DA /* AreaViewModel.swift in Sources */, 2C33B17E2B76537300A9476D /* PuzzleBottomSheetViewController.swift in Sources */, ); @@ -1203,7 +1271,7 @@ /* Begin XCBuildConfiguration section */ 718150332B6291D8005E4451 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C33B1712B763CFB00A9476D /* Config.xcconfig */; + baseConfigurationReference = 2C0235552BE52837001FA169 /* Config.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1267,7 +1335,7 @@ }; 718150342B6291D8005E4451 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C33B1712B763CFB00A9476D /* Config.xcconfig */; + baseConfigurationReference = 2C0235552BE52837001FA169 /* Config.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; @@ -1324,7 +1392,6 @@ }; 718150362B6291D8005E4451 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C33B1712B763CFB00A9476D /* Config.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; @@ -1360,7 +1427,6 @@ }; 718150372B6291D8005E4451 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2C33B1712B763CFB00A9476D /* Config.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; diff --git a/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..6e15147 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,131 @@ +{ + "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "f455c2975872ccd2d9c81594c658af65716e9b9a", + "version" : "5.9.1" + } + }, + { + "identity" : "collectionconcurrencykit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/JohnSundell/CollectionConcurrencyKit.git", + "state" : { + "revision" : "b4f23e24b5a1bff301efc5e70871083ca029ff95", + "version" : "0.2.0" + } + }, + { + "identity" : "cryptoswift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/krzyzanowskim/CryptoSwift.git", + "state" : { + "revision" : "c9c3df6ab812de32bae61fc0cd1bf6d45170ebf0", + "version" : "1.8.2" + } + }, + { + "identity" : "kakao-ios-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kakao/kakao-ios-sdk.git", + "state" : { + "revision" : "ab226a7a3625d64e73a52aa3800595dab810156b", + "version" : "2.22.1" + } + }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher", + "state" : { + "revision" : "5b92f029fab2cce44386d28588098b5be0824ef5", + "version" : "7.11.0" + } + }, + { + "identity" : "snapkit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SnapKit/SnapKit", + "state" : { + "revision" : "2842e6e84e82eb9a8dac0100ca90d9444b0307f4", + "version" : "5.7.1" + } + }, + { + "identity" : "sourcekitten", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/SourceKitten.git", + "state" : { + "revision" : "b6dc09ee51dfb0c66e042d2328c017483a1a5d56", + "version" : "0.34.1" + } + }, + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser.git", + "state" : { + "revision" : "8f4d2753f0e4778c76d5f05ad16c74f707390531", + "version" : "1.2.3" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "6ad4ea24b01559dde0773e3d091f1b9e36175036", + "version" : "509.0.2" + } + }, + { + "identity" : "swiftlint", + "kind" : "remoteSourceControl", + "location" : "https://github.com/realm/SwiftLint", + "state" : { + "revision" : "f17a4f9dfb6a6afb0408426354e4180daaf49cee", + "version" : "0.54.0" + } + }, + { + "identity" : "swiftytexttable", + "kind" : "remoteSourceControl", + "location" : "https://github.com/scottrhoyt/SwiftyTextTable.git", + "state" : { + "revision" : "c6df6cf533d120716bff38f8ff9885e1ce2a4ac3", + "version" : "0.9.0" + } + }, + { + "identity" : "swxmlhash", + "kind" : "remoteSourceControl", + "location" : "https://github.com/drmohundro/SWXMLHash.git", + "state" : { + "revision" : "a853604c9e9a83ad9954c7e3d2a565273982471f", + "version" : "7.0.2" + } + }, + { + "identity" : "then", + "kind" : "remoteSourceControl", + "location" : "https://github.com/devxoul/Then", + "state" : { + "revision" : "d41ef523faef0f911369f79c0b96815d9dbb6d7a", + "version" : "3.0.0" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams.git", + "state" : { + "revision" : "9234124cff5e22e178988c18d8b95a8ae8007f76", + "version" : "5.1.2" + } + } + ], + "version" : 2 +} diff --git a/Puzzle-iOS/Puzzle-iOS/Application/SceneDelegate.swift b/Puzzle-iOS/Puzzle-iOS/Application/SceneDelegate.swift index 2c3a801..cccfc5b 100644 --- a/Puzzle-iOS/Puzzle-iOS/Application/SceneDelegate.swift +++ b/Puzzle-iOS/Puzzle-iOS/Application/SceneDelegate.swift @@ -18,7 +18,11 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let windowScene = (scene as? UIWindowScene) else { return } let window = UIWindow(windowScene: windowScene) - let navigationViewController = UINavigationController(rootViewController: ViewController()) + let navigationViewController = UINavigationController( + rootViewController: HomeDetailViewController( + viewModel: HomeDetailViewModel( + homeDetailService: HomeDetailDefalutService() + ),competitionId: 12)) window.rootViewController = navigationViewController self.window = window window.makeKeyAndVisible() diff --git a/Puzzle-iOS/Puzzle-iOS/Network/DTO/HomeDetailDTO.swift b/Puzzle-iOS/Puzzle-iOS/Network/DTO/HomeDetailDTO.swift new file mode 100644 index 0000000..762ba3f --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Network/DTO/HomeDetailDTO.swift @@ -0,0 +1,32 @@ +// +// HomeDetailDTO.swift +// Puzzle-iOS +// +// Created by 신지원 on 5/3/24. +// + +import Foundation + +struct HomeDetailDTO: Codable { + let success: Bool + let response: CompetitionDetail? + let error: String? + let jwt: String? +} + +struct CompetitionDetail: Codable { + let competitionId: Int + let competitionName: String + let competitionUrl: String + let competitionHost: String + let competitionPoster: String + let competitionAwards: String + let competitionStart: String + let competitionEnd: String + let competitionContent: String + let competitionVisit: Int + let competitionLike: Int + let competitionMatching: Int + let competitionDDay: Int + let competitionTypes: [String] +} diff --git a/Puzzle-iOS/Puzzle-iOS/Network/Service/HomeDetailService/HomeDetailService.swift b/Puzzle-iOS/Puzzle-iOS/Network/Service/HomeDetailService/HomeDetailService.swift new file mode 100644 index 0000000..5c3f2f9 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Network/Service/HomeDetailService/HomeDetailService.swift @@ -0,0 +1,37 @@ +// +// HomeDetailService.swift +// Puzzle-iOS +// +// Created by 신지원 on 5/3/24. +// + +import Foundation +import Combine + +protocol HomeDetailService { + func getCompetitionDetailData(competitionID: Int) -> AnyPublisher +} + +final class HomeDetailDefalutService: NSObject, Networking, HomeDetailService { + func getCompetitionDetailData(competitionID: Int) -> AnyPublisher { + do { + let competitionQueryItems: [URLQueryItem] = + [URLQueryItem(name: "competitionId", value: String(describing: competitionID))] + let request = try makeHTTPRequest(path: URLs.Home.detail, + method: .get, + queryItems: competitionQueryItems, + headers: APIConstants.noTokenHeader, + body: nil) + NetworkLogger.log(request: request) + + return URLSession.shared.dataTaskPublisher(for: request) + .map(\.data) + .decode(type: HomeDetailDTO.self, decoder: JSONDecoder()) + .mapError { $0 as Error } + .eraseToAnyPublisher() + + } catch { + return Fail(error: error).eraseToAnyPublisher() + } + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailDescriptionView.swift b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailDescriptionView.swift new file mode 100644 index 0000000..9bdfd4d --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailDescriptionView.swift @@ -0,0 +1,259 @@ +// +// HomeDetailDescriptionView.swift +// Puzzle-iOS +// +// Created by 신지원 on 4/30/24. +// + +import UIKit + +import SnapKit +import Then + +final class HomeDetailDescriptionView: UIView { + + // MARK: - UIComponents + + private let competitionTitleLabel = UILabel().then { + $0.text = "제21회 KPR 대학생PR 아이디어 공모전" + $0.font = .subTitle1 + $0.textColor = .puzzleBlack + $0.numberOfLines = 2 + } + private let competitionHostLabel = UILabel().then { + $0.text = "주)케이피알앤드어소시에이츠(KPR)" + $0.font = .subTitle3 + $0.textColor = .puzzleBlack + $0.numberOfLines = 1 + } + + private let checkImage = UIImageView().then { + $0.image = UIImage(resource: .icCheck) + $0.contentMode = .scaleAspectFit + } + private var checkLabel = UILabel().then { + $0.text = "조회" + $0.font = .subTitle4 + $0.textColor = .puzzleBlack + $0.numberOfLines = 1 + } + + private let teamImage = UIImageView().then { + $0.image = UIImage(resource: .icTeam) + $0.contentMode = .scaleAspectFit + } + private var teamLabel = UILabel().then { + $0.text = "빌딩 중인 팀" + $0.font = .subTitle4 + $0.textColor = .puzzleBlack + $0.numberOfLines = 1 + } + + private let heartImage = UIImageView().then { + $0.image = UIImage(resource: .icBlackHeart) + $0.contentMode = .scaleAspectFit + } + private var heartLabel = UILabel().then { + $0.text = "관심" + $0.font = .subTitle4 + $0.textColor = .puzzleBlack + $0.numberOfLines = 1 + } + + private let fieldLabel = UILabel().then { + $0.text = "공모분야" + $0.font = .body1 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 1 + } + private let prizeLabel = UILabel().then { + $0.text = "시상내역" + $0.font = .body1 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 1 + } + private let hostLabel = UILabel().then { + $0.text = "주최/주관" + $0.font = .body1 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 1 + } + private let periodLabel = UILabel().then { + $0.text = "접수기간" + $0.font = .body1 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 1 + } + private let descriptionLabel = UILabel().then { + $0.text = "상세내용" + $0.font = .body1 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 1 + } + + private var fieldInfoLabel = UILabel().then { + $0.text = "기획, 아이디어" + $0.font = .body2 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 0 + } + private var prizeInfoLabel = UILabel().then { + $0.text = "상금, 1등 (500만원)" + $0.font = .body2 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 0 + } + private var hostInfoLabel = UILabel().then { + $0.text = "케이피알앤드어소시에이츠 (KPR)" + $0.font = .body2 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 0 + } + private var periodInfoLabel = UILabel().then { + $0.text = "2023-11-17 00:00 ~ \n2024-01-15 18:00" + $0.font = .body2 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 0 + } + private var descriptionInfoLabel = UILabel().then { + $0.text = "[행사취지 및 목적] - 국내 PR산업의 발전 도모 - 대학생들의 PR에 대한 관심 제고 및 창의적인 PR 아이디어 발굴 - 빠르게 변화하는 콘텐츠 분야의 우수한 인재 발굴 [주 최]: (주)케이피알앤드어소시에이츠(KPR) [협 찬]: 한국레노버 [후 원]: 한국PR협회(KPRA), 한국PR기업협회(KPRCA) [참여기업]: 한국레노버, 빛의 시어터, 생명보험사회공헌재단, 신용카드사회공헌재​단, 하나카드, 돌비, 어플라이드 머티어리얼즈, 한국제지연합회, 한국PR 협회, 리버마켓, 위니디, 아쿠라플라넷 여수 [공모 주제] - PR 기획 부문: 기업PR, 디지털PR, 마케팅PR, 브랜드PR, 공공PR, CSR(사회공헌활동), IMC 등을 주제로 한 PR 기획서 - 영상콘텐츠 제작부문: 기업PR영상, 광고PR영상, 바이럴 영상, SNS콘텐츠(숏폼 등) [공모 분량] - PR 기획 부문: PR기획서(국문 또는 영문) 50장 내외 (PPT 200MB 이내) - 영상콘텐츠 제작부문: 기획의도 및 컨셉(크리에이티브 기획안(1~2장 이내) + 제작물 500 MB 이내 (해상도1920*1080 / 유튜브 업로드 후 해당 URL 입력) [참가 자격]: 대학(전문대 포함) 및 대학원(석,박사 과정) 재학생 및 휴학생 (공고일 현재 기준) (팀 당 참가인원은 최대 4명까지로 제한) [참가 방법]: 응모신청 및 PR기획서, 영상(링크) 접수는 홈페이지 통해 온라인 접수 [공모 일정] - 응모신청 및 응모작품 접수: 2023년 11월 20일(월) ~ 2024년 1월 15일(월) (홈페이지접수) - 공모 심사: 2024년 1월 15일(월) ~ 2024년 2월 15일(목) - 1차심사: 서류심사 - 2차심사: 1차 프리젠테이션 심사 (대면 심사 예정) - 3차심사: 최종 프리젠테이션 심사 (대면 심사 예정) - 시상식: 2024년 2월 27일(수) (예정) [심사 기준] - PR부문: 상황(시장)분석, 논리적 구성, 제안 아이디어의 현실성 및 효율성, 비주얼 제안서 구성, 커뮤니케이션능력 등 - 영상부문: 주제 부합성(주제적합도/이해도), 표현력(연출방향/차별성/독창성), 대중성, 활용성(홍보활용성) [심사위원]: 학계, 고객사 및 주관사 등의 해당 분야 전문가 [심사절차]: 전체 응모작품에 대한 1차 서류심사를 진행하고, 1차 서류심사를 통과한 작품을 대상으로 2,3차 심사(프리젠테이션- 대면심사 예정)를 진행 [시상 내용] - 대 상(1) : 상장/상패 & 상금 500만원 - 최우수상(2) : 상장/상패 & 상금 200만원 (부문별 시상) - 우수상(2) : 상장/상패 & 상금 100만원 (부문별 시상) - 장려상(6) : 상장/상패 & 상금 50만원 (부문별 시상) - 특별상(1) : 미정 - 입 선(미정) : 상장 & 소정의 기념품 - 특전 : 대상 수상팀 팀원 중 1명에게 6개월간 KPR 인턴 자격 부여 [유의사항] - 응모작품은 반환하지 않습니다. - 다른 공모전에 기 제출 또는 수상한 적이 있는 작품이거나, 순수창작물이 아닌 것으로 판명될 시에는 수상 후에도 입상이 취소될 수 있습니다. [문의 및 제출처] - 제출방법: 홈페이지를 통해 온라인 접수 - 주 소: 서울특별시 중구 퇴계로 173 (충무로 3가) 남산스퀘어 14층 KPR 대학생 PR 아이디어 공모전 담당자 (우편번호: 04554) - 문 의: 전화 (02) 3406-2158 이메일: praward@kpr.co.kr 
대학생 대외활동 공모전 채용 사이트 링커리어 https://linkareer.com/" + $0.font = .body3 + $0.textColor = .puzzleGray800 + $0.numberOfLines = 0 + } + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + self.backgroundColor = .puzzleGray100 + + setHierarchy() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UI & Layout + + private func setHierarchy() { + addSubviews(competitionTitleLabel, + competitionHostLabel, + teamImage, + teamLabel, + checkImage, + checkLabel, + heartImage, + heartLabel, + + fieldLabel, + prizeLabel, + hostLabel, + periodLabel, + descriptionLabel, + + fieldInfoLabel, + prizeInfoLabel, + hostInfoLabel, + periodInfoLabel, + descriptionInfoLabel) + } + + private func setLayout() { + + //TODO: - 정보 부분 글자 수 최대에 대한 leading, trailing 제약 설정 + + // 정보 + competitionTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(24) + $0.centerX.equalToSuperview() + } + competitionHostLabel.snp.makeConstraints { + $0.top.equalTo(competitionTitleLabel.snp.bottom).offset(13) + $0.centerX.equalToSuperview() + } + + // 아이콘 + teamImage.snp.makeConstraints { + $0.top.equalTo(competitionHostLabel.snp.bottom).offset(24) + $0.centerX.equalToSuperview() + $0.size.equalTo(18) + } + teamLabel.snp.makeConstraints { + $0.top.equalTo(teamImage.snp.bottom).offset(4) + $0.centerX.equalTo(teamImage.snp.centerX) + } + + checkImage.snp.makeConstraints { + $0.trailing.equalTo(teamImage.snp.leading).offset(-65) + $0.top.equalTo(teamImage.snp.top) + $0.size.equalTo(18) + } + checkLabel.snp.makeConstraints { + $0.top.equalTo(checkImage.snp.bottom).offset(4) + $0.centerX.equalTo(checkImage.snp.centerX) + } + + heartImage.snp.makeConstraints { + $0.leading.equalTo(teamImage.snp.trailing).offset(65) + $0.top.equalTo(teamImage.snp.top) + $0.size.equalTo(18) + } + heartLabel.snp.makeConstraints { + $0.top.equalTo(heartImage.snp.bottom).offset(4) + $0.centerX.equalTo(heartImage.snp.centerX) + } + + // 상세 정보 + fieldLabel.snp.makeConstraints { + $0.top.equalTo(teamLabel.snp.bottom).offset(42) + $0.leading.equalToSuperview().inset(40) + } + prizeLabel.snp.makeConstraints { + $0.top.equalTo(fieldInfoLabel.snp.bottom).offset(24) + $0.leading.equalToSuperview().inset(40) + } + hostLabel.snp.makeConstraints { + $0.top.equalTo(prizeInfoLabel.snp.bottom).offset(24) + $0.leading.equalToSuperview().inset(40) + } + periodLabel.snp.makeConstraints { + $0.top.equalTo(hostInfoLabel.snp.bottom).offset(24) + $0.leading.equalToSuperview().inset(40) + } + descriptionLabel.snp.makeConstraints { + $0.top.equalTo(periodInfoLabel.snp.bottom).offset(24) + $0.leading.equalToSuperview().inset(40) + } + + fieldInfoLabel.snp.makeConstraints { + $0.top.equalTo(fieldLabel.snp.top) + $0.leading.equalTo(fieldLabel.snp.trailing).offset(49) + $0.trailing.lessThanOrEqualToSuperview().inset(40).priority(.high) + } + prizeInfoLabel.snp.makeConstraints { + $0.top.equalTo(prizeLabel.snp.top) + $0.leading.equalTo(fieldInfoLabel.snp.leading) + $0.trailing.lessThanOrEqualToSuperview().inset(40).priority(.high) + } + hostInfoLabel.snp.makeConstraints { + $0.top.equalTo(hostLabel.snp.top) + $0.leading.equalTo(prizeInfoLabel.snp.leading) + $0.trailing.lessThanOrEqualToSuperview().inset(40).priority(.high) + } + periodInfoLabel.snp.makeConstraints { + $0.top.equalTo(periodLabel.snp.top) + $0.leading.equalTo(prizeInfoLabel.snp.leading) + $0.trailing.lessThanOrEqualToSuperview().inset(40).priority(.high) + } + descriptionInfoLabel.snp.makeConstraints { + $0.top.equalTo(descriptionLabel.snp.bottom).offset(16) + $0.bottom.equalToSuperview() + $0.leading.equalTo(descriptionLabel.snp.leading) + $0.trailing.lessThanOrEqualToSuperview().inset(40).priority(.high) + } + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailHeaderView.swift b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailHeaderView.swift new file mode 100644 index 0000000..0cf3ffe --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailHeaderView.swift @@ -0,0 +1,133 @@ +// +// HomeDetailHeaderView.swift +// Puzzle-iOS +// +// Created by 신지원 on 4/30/24. +// + +import UIKit + +import SnapKit +import Then + +final class HomeDetailHeaderView: UIView { + + // MARK: - UIComponents + + private let competitionImageView = UIImageView().then { + $0.image = UIImage(resource: .testPost) + $0.contentMode = .scaleAspectFill + $0.isUserInteractionEnabled = true + } + + lazy var homeDetailHeartButton = UIButton().then { + $0.setImage(UIImage(resource: .icWhiteHeart), for: .normal) + $0.layer.cornerRadius = 5 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + lazy var homeDetailReadingglassesButton = UIButton().then { + $0.setImage(UIImage(resource: .icReadingGlasses), for: .normal) + $0.layer.cornerRadius = 5 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + lazy var homeDetailBackButton = UIButton().then { + $0.setImage(UIImage(resource: .icBack), for: .normal) + $0.layer.cornerRadius = 16 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + lazy var homeDetailWebsiteButton = UIButton().then { + $0.setTitle("홈페이지", for: .normal) + $0.titleLabel?.font = .subTitle3 + $0.titleLabel?.textColor = .puzzleWhite + $0.setImage(UIImage(resource: .icArrow), for: .normal) + $0.contentHorizontalAlignment = .center + $0.semanticContentAttribute = .forceRightToLeft + $0.layer.cornerRadius = 16 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + lazy var homeDetailShareButton = UIButton().then { + $0.setImage(UIImage(resource: .icShare), for: .normal) + $0.layer.cornerRadius = 16 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + lazy var homeDetailDeleteButton = UIButton().then { + $0.setImage(UIImage(resource: .icDelete), for: .normal) + $0.layer.cornerRadius = 16 + $0.layer.backgroundColor = UIColor.puzzleBlack.cgColor + } + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + self.backgroundColor = .puzzleGreen + + setHierarchy() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UI & Layout + + private func setHierarchy() { + addSubviews(competitionImageView, + homeDetailBackButton, + homeDetailDeleteButton, + homeDetailWebsiteButton, + homeDetailShareButton, + homeDetailShareButton) + competitionImageView.addSubviews(homeDetailHeartButton, + homeDetailReadingglassesButton) + } + + private func setLayout() { + competitionImageView.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalToSuperview().inset(60) + $0.size.equalTo(250) + + homeDetailHeartButton.snp.makeConstraints { + $0.top.trailing.equalToSuperview().inset(8) + $0.size.equalTo(40) + } + homeDetailReadingglassesButton.snp.makeConstraints { + $0.bottom.trailing.equalToSuperview().inset(8) + $0.size.equalTo(40) + } + } + + homeDetailBackButton.snp.makeConstraints { + $0.top.equalToSuperview().inset(13) + $0.leading.equalToSuperview().inset(21) + $0.size.equalTo(32) + } + + homeDetailDeleteButton.snp.makeConstraints { + $0.top.equalTo(homeDetailBackButton.snp.top) + $0.trailing.equalToSuperview().inset(21) + $0.size.equalTo(32) + } + + homeDetailShareButton.snp.makeConstraints { + $0.top.equalTo(homeDetailBackButton.snp.top) + $0.trailing.equalTo(homeDetailDeleteButton.snp.leading).offset(-8) + $0.size.equalTo(32) + } + + homeDetailWebsiteButton.snp.makeConstraints { + $0.top.equalTo(homeDetailBackButton.snp.top) + $0.trailing.equalTo(homeDetailShareButton.snp.leading).offset(-8) + $0.height.equalTo(32) + $0.width.equalTo(82) + } + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailView.swift b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailView.swift new file mode 100644 index 0000000..541c83f --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/View/HomeDetailView.swift @@ -0,0 +1,67 @@ +// +// HomeDetailView.swift +// Puzzle-iOS +// +// Created by 신지원 on 4/30/24. +// + +import UIKit +import Combine + +final class HomeDetailView: UIView { + + // MARK: - Properties + + + // MARK: - UIComponents + + private let scrollView = UIScrollView().then { + $0.isScrollEnabled = true + $0.showsVerticalScrollIndicator = false + } + + let homeDetailHeaderView = HomeDetailHeaderView() + let homeDetailDescriptionView = HomeDetailDescriptionView() + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + self.backgroundColor = .puzzleGray100 + + setHierarchy() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UI & Layout + + private func setHierarchy() { + addSubview(scrollView) + scrollView.addSubviews(homeDetailHeaderView, + homeDetailDescriptionView) + } + + private func setLayout() { + scrollView.snp.makeConstraints { + $0.edges.equalTo(safeAreaLayoutGuide.snp.edges) + $0.bottom.equalTo(safeAreaLayoutGuide.snp.bottom) + } + + homeDetailHeaderView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.width.equalToSuperview() + $0.height.equalTo(371) + } + + homeDetailDescriptionView.snp.makeConstraints { + $0.width.equalToSuperview() + $0.top.equalTo(homeDetailHeaderView.snp.bottom) + $0.bottom.equalToSuperview() + } + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewController/HomeDetailViewController.swift b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewController/HomeDetailViewController.swift new file mode 100644 index 0000000..95308a7 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewController/HomeDetailViewController.swift @@ -0,0 +1,71 @@ +// +// HomeDetailViewController.swift +// Puzzle-iOS +// +// Created by 신지원 on 4/30/24. +// +import UIKit +import Combine + +final class HomeDetailViewController: UIViewController { + + // MARK: - UI Component + + private let rootView = HomeDetailView() + private let viewModel: HomeDetailViewModel + private let competitionId: Int + private var cancelBag = CancelBag() + + private let viewWillAppearEvent = CurrentValueSubject(12) + + // MARK: - Life Cycles + + init(viewModel: HomeDetailViewModel, competitionId: Int) { + self.viewModel = viewModel + self.competitionId = competitionId + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func loadView() { + self.view = rootView + } + + override func viewDidLoad() { + super.viewDidLoad() + self.navigationController?.navigationBar.isHidden = true + + bindViewModel() + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + viewWillAppearEvent.send(self.competitionId) + } + + private func bindViewModel() { + let input = HomeDetailViewModel.Input( + viewWillAppear: viewWillAppearEvent.eraseToAnyPublisher(), + backButtonTapped: rootView.homeDetailHeaderView.homeDetailBackButton.tapPublisher, + websiteButtonTapped: rootView.homeDetailHeaderView.homeDetailWebsiteButton.tapPublisher, + shareButtonTapped: rootView.homeDetailHeaderView.homeDetailShareButton.tapPublisher, + deleteButtonTapped: rootView.homeDetailHeaderView.homeDetailDeleteButton.tapPublisher, + heartButtonTapped: rootView.homeDetailHeaderView.homeDetailHeartButton.tapPublisher, + readingglassesButtonTapped: rootView.homeDetailHeaderView.homeDetailReadingglassesButton.tapPublisher + ) + + let output = self.viewModel.transform(from: input, cancelBag: cancelBag) + + output.backButtonAction + .receive(on: RunLoop.main) + .sink(receiveValue: { [weak self] _ in + //dismiss + }) + .store(in: cancelBag) + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewModel/HomeDetailViewModel.swift b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewModel/HomeDetailViewModel.swift new file mode 100644 index 0000000..aee8d55 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Presentation/HomeDetail/ViewModel/HomeDetailViewModel.swift @@ -0,0 +1,112 @@ +// +// File.swift +// Puzzle-iOS +// +// Created by 신지원 on 4/30/24. +// + + +import Foundation +import UIKit +import Combine + +final class HomeDetailViewModel: ViewModelType { + + // MARK: - Properties + + private let homeDetailService: HomeDetailService + var cancelBag = CancelBag() + + struct Input { + let viewWillAppear: AnyPublisher + let backButtonTapped : AnyPublisher + let websiteButtonTapped: AnyPublisher + let shareButtonTapped: AnyPublisher + let deleteButtonTapped: AnyPublisher + let heartButtonTapped: AnyPublisher + let readingglassesButtonTapped: AnyPublisher + } + + struct Output { + var backButtonAction = CurrentValueSubject(false) + var shareButtonAction = CurrentValueSubject(false) + var deleteButtonAction = CurrentValueSubject(false) + var heartButtonAction = CurrentValueSubject(false) + let readingglassesButtonAction = CurrentValueSubject(false) + } + + // MARK: - init + + init(homeDetailService: HomeDetailService) { + self.homeDetailService = homeDetailService + } + + func transform(from input: Input, cancelBag: CancelBag) -> Output { + + var output = Output() + + input.viewWillAppear + .flatMap { competitionId -> AnyPublisher in + self.getCompetitionDetail(competitionId: competitionId) + } + .catch { error -> AnyPublisher in + print("Error sending user info: \(error)") + return Fail(error: error).eraseToAnyPublisher() + } + .sink(receiveCompletion: { completion in + switch completion { + case .finished: + print("Competition detail received successfully.") + case .failure(let error): + print("Error receiving competition detail: \(error)") + } + }, receiveValue: { homeDetailDTO in + print("Received HomeDetailDTO: \(homeDetailDTO)") + }) + .store(in: &cancelBag.subscriptions) + + input.backButtonTapped + .map { true } + .subscribe(output.backButtonAction) + .store(in: &cancelBag.subscriptions) + + input.websiteButtonTapped + .receive(on: RunLoop.main) + .sink { [weak self] _ in + if let url = URL(string: "https://www.naver.com") { + UIApplication.shared.open(url, options: [:]) + } + } + .store(in: &cancelBag.subscriptions) + + input.shareButtonTapped + .map { true } + .subscribe(output.shareButtonAction) + .store(in: &cancelBag.subscriptions) + + input.deleteButtonTapped + .map { true } + .subscribe(output.deleteButtonAction) + .store(in: &cancelBag.subscriptions) + + input.heartButtonTapped + .map { true } + .subscribe(output.heartButtonAction) + .store(in: &cancelBag.subscriptions) + + input.readingglassesButtonTapped + .map { true } + .subscribe(output.readingglassesButtonAction) + .store(in: &cancelBag.subscriptions) + + return output + } + + private func getCompetitionDetail(competitionId: Int) -> AnyPublisher { + homeDetailService.getCompetitionDetailData(competitionID: competitionId) + .map { $0 } + .receive(on: RunLoop.main) + .eraseToAnyPublisher() + } +} + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/Contents.json new file mode 100644 index 0000000..f438d7a --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "arrow-up-1--arrow-up-keyboard.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/arrow-up-1--arrow-up-keyboard.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/arrow-up-1--arrow-up-keyboard.svg new file mode 100644 index 0000000..cde0473 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icArrow.imageset/arrow-up-1--arrow-up-keyboard.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Contents.json new file mode 100644 index 0000000..cc8dbe0 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Group 37222.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Group 37222.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Group 37222.svg new file mode 100644 index 0000000..2c50adf --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBack.imageset/Group 37222.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Contents.json new file mode 100644 index 0000000..446d6be --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Vector.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Vector.png b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Vector.png new file mode 100644 index 0000000..696f099 Binary files /dev/null and b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icBlackHeart.imageset/Vector.png differ diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/Contents.json new file mode 100644 index 0000000..8541af7 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "visible--eye-eyeball-open-view.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/visible--eye-eyeball-open-view.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/visible--eye-eyeball-open-view.svg new file mode 100644 index 0000000..f747151 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icCheck.imageset/visible--eye-eyeball-open-view.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Contents.json new file mode 100644 index 0000000..0a69ccb --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Group 37029.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Group 37029.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Group 37029.svg new file mode 100644 index 0000000..533dea7 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icDelete.imageset/Group 37029.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/Contents.json new file mode 100644 index 0000000..8f1f666 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "details.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/details.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/details.svg new file mode 100644 index 0000000..28b8fcf --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icReadingGlasses.imageset/details.svg @@ -0,0 +1,4 @@ + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Contents.json new file mode 100644 index 0000000..ab1619e --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Group 406.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Group 406.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Group 406.svg new file mode 100644 index 0000000..3042e35 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icShare.imageset/Group 406.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/Contents.json new file mode 100644 index 0000000..b9b15fb --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "user-multiple-group--close-geometric-human-multiple-person-up-user.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/user-multiple-group--close-geometric-human-multiple-person-up-user.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/user-multiple-group--close-geometric-human-multiple-person-up-user.svg new file mode 100644 index 0000000..6fcccbf --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icTeam.imageset/user-multiple-group--close-geometric-human-multiple-person-up-user.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Contents.json new file mode 100644 index 0000000..fdf1b91 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Vector.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Vector.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Vector.svg new file mode 100644 index 0000000..07aaf5c --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/icon/icWhiteHeart.imageset/Vector.svg @@ -0,0 +1,3 @@ + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Contents.json b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Contents.json new file mode 100644 index 0000000..33005bc --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Group 37520.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Group 37520.svg b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Group 37520.svg new file mode 100644 index 0000000..fcd4546 --- /dev/null +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Assets.xcassets/HomeDetail/testPostImage.imageset/Group 37520.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Puzzle-iOS/Puzzle-iOS/Resource/Constant/URLs.swift b/Puzzle-iOS/Puzzle-iOS/Resource/Constant/URLs.swift index 92a6b6d..2aa0858 100644 --- a/Puzzle-iOS/Puzzle-iOS/Resource/Constant/URLs.swift +++ b/Puzzle-iOS/Puzzle-iOS/Resource/Constant/URLs.swift @@ -12,4 +12,8 @@ enum URLs { static let splash = "/splash" static let essential = "/user/essential" } + + enum Home { + static let detail = "/competition/homepage/" + } }