diff --git a/YELLO-iOS/.swiftlint.yml b/YELLO-iOS/.swiftlint.yml index aab56d2e..22074f0a 100644 --- a/YELLO-iOS/.swiftlint.yml +++ b/YELLO-iOS/.swiftlint.yml @@ -19,3 +19,4 @@ opt_in_rules: excluded: - YELLO-iOS/Application +- YELLO-iOS/Global diff --git a/YELLO-iOS/YELLO-iOS.xcodeproj/project.pbxproj b/YELLO-iOS/YELLO-iOS.xcodeproj/project.pbxproj index 4c19a212..bd20ceaa 100644 --- a/YELLO-iOS/YELLO-iOS.xcodeproj/project.pbxproj +++ b/YELLO-iOS/YELLO-iOS.xcodeproj/project.pbxproj @@ -27,8 +27,22 @@ 2A3705EE2A62E3DF001AAC93 /* ProfileService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A3705ED2A62E3DF001AAC93 /* ProfileService.swift */; }; 2A423DF12A8F6F4E00F56C06 /* MyYelloDetailFullNameResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A423DF02A8F6F4E00F56C06 /* MyYelloDetailFullNameResponseDTO.swift */; }; 2A4C549D2A8622B200FFDF80 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 2A4C549C2A8622B200FFDF80 /* Kingfisher */; }; + 2A55DDA52B669BCC00290FE8 /* NotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A55DDA42B669BCC00290FE8 /* NotificationView.swift */; }; + 2A5E08FA2B6692DD00CDB3DF /* NotificationResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5E08F92B6692DD00CDB3DF /* NotificationResponseDTO.swift */; }; + 2A5E08FC2B66935B00CDB3DF /* NotificationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5E08FB2B66935B00CDB3DF /* NotificationTarget.swift */; }; + 2A5E08FE2B6693FD00CDB3DF /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5E08FD2B6693FD00CDB3DF /* NotificationService.swift */; }; 2A5FE1AE2A657AA6008F636C /* VotingData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5FE1AD2A657AA6008F636C /* VotingData.swift */; }; 2A5FE1B62A66FA07008F636C /* VoteAnswerList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5FE1B52A66FA07008F636C /* VoteAnswerList.swift */; }; + 2A8172812B71CCD5004C0B9C /* LunchEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172802B71CCD5004C0B9C /* LunchEventView.swift */; }; + 2A8172832B71D279004C0B9C /* LunchEventViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172822B71D279004C0B9C /* LunchEventViewController.swift */; }; + 2A8172892B71D9DF004C0B9C /* EventPointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172882B71D9DE004C0B9C /* EventPointView.swift */; }; + 2A81728F2B726ADB004C0B9C /* EventResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A81728E2B726ADB004C0B9C /* EventResponseDTO.swift */; }; + 2A8172942B726B79004C0B9C /* EventTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172932B726B79004C0B9C /* EventTarget.swift */; }; + 2A8172962B726BC8004C0B9C /* EventService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172952B726BC8004C0B9C /* EventService.swift */; }; + 2A81729C2B727A93004C0B9C /* eventbox_open-4.json in Resources */ = {isa = PBXBuildFile; fileRef = 2A81729B2B727A93004C0B9C /* eventbox_open-4.json */; }; + 2A81729E2B727A99004C0B9C /* eventbox_default-4.json in Resources */ = {isa = PBXBuildFile; fileRef = 2A81729D2B727A99004C0B9C /* eventbox_default-4.json */; }; + 2A8172A12B72A1B3004C0B9C /* EventRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172A02B72A1B3004C0B9C /* EventRequestDTO.swift */; }; + 2A8172A32B72AE3F004C0B9C /* EventRewardRsponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8172A22B72AE3F004C0B9C /* EventRewardRsponseDTO.swift */; }; 2A8AA7012A64A333005A664D /* VotingSuffleResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8AA7002A64A333005A664D /* VotingSuffleResponseDTO.swift */; }; 2A8AA7032A64AA6B005A664D /* VotingListResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8AA7022A64AA6B005A664D /* VotingListResponseDTO.swift */; }; 2A8AA7052A6514F2005A664D /* VotingAnswerListRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A8AA7042A6514F2005A664D /* VotingAnswerListRequestDTO.swift */; }; @@ -67,6 +81,7 @@ 2AFB01682A8D2EAC001BB2C7 /* pagenation_8.json in Resources */ = {isa = PBXBuildFile; fileRef = 2AFB01602A8D2EAC001BB2C7 /* pagenation_8.json */; }; 2AFB01692A8D2EAC001BB2C7 /* pagenation_6.json in Resources */ = {isa = PBXBuildFile; fileRef = 2AFB01612A8D2EAC001BB2C7 /* pagenation_6.json */; }; 2AFB016A2A8D2EAC001BB2C7 /* pagenation_1.json in Resources */ = {isa = PBXBuildFile; fileRef = 2AFB01622A8D2EAC001BB2C7 /* pagenation_1.json */; }; + 3609E96D2B87B600004B68AB /* AppTrackingTransparency.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3609E96C2B87B600004B68AB /* AppTrackingTransparency.framework */; }; 3628EAE82A608F0200D5FA40 /* SplashViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3628EAE72A608F0200D5FA40 /* SplashViewController.swift */; }; 3628EAEA2A60903A00D5FA40 /* splash.json in Resources */ = {isa = PBXBuildFile; fileRef = 3628EAE92A60903A00D5FA40 /* splash.json */; }; 3628EAEC2A609E1D00D5FA40 /* SplashTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3628EAEB2A609E1D00D5FA40 /* SplashTitleView.swift */; }; @@ -79,6 +94,10 @@ 363D81642B262A460095F6CC /* NameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363D81622B262A450095F6CC /* NameViewController.swift */; }; 363D81652B262A460095F6CC /* NameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363D81632B262A460095F6CC /* NameView.swift */; }; 365AC9EE2A858CAA00FC4772 /* UIWindow+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 365AC9ED2A858CAA00FC4772 /* UIWindow+.swift */; }; + 365CD6AF2B7DEFDD00245CDD /* GoogleMobileAds in Frameworks */ = {isa = PBXBuildFile; productRef = 365CD6AE2B7DEFDD00245CDD /* GoogleMobileAds */; }; + 365CD6F62B7E918F00245CDD /* PointButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 365CD6F52B7E918F00245CDD /* PointButton.swift */; }; + 365CD6F82B7EA13800245CDD /* NavigationBarCountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 365CD6F72B7EA13800245CDD /* NavigationBarCountView.swift */; }; + 365CD6FA2B81D86600245CDD /* AppTracking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 365CD6F92B81D86600245CDD /* AppTracking.swift */; }; 36621BCD2A690B2400010D84 /* BaseBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36621BCC2A690B2400010D84 /* BaseBottomSheetViewController.swift */; }; 36621BCF2A692A7700010D84 /* StudentIdView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36621BCE2A692A7700010D84 /* StudentIdView.swift */; }; 36621BD12A69318200010D84 /* StudentIdViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36621BD02A69318200010D84 /* StudentIdViewController.swift */; }; @@ -94,6 +113,8 @@ 3662A0F62A654B8D00F482EF /* JoinedFriendsRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3662A0F52A654B8D00F482EF /* JoinedFriendsRequestDTO.swift */; }; 3662A0F82A6577E000F482EF /* IdValidRequestQueryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3662A0F72A6577E000F482EF /* IdValidRequestQueryDTO.swift */; }; 3662A0FC2A65795200F482EF /* IdValidResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3662A0FB2A65795200F482EF /* IdValidResponseDTO.swift */; }; + 366423CA2B8349A700038F05 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366423C92B8349A700038F05 /* Timer.swift */; }; + 366885AC2B775FA9009AFB0C /* Array+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366885AB2B775FA9009AFB0C /* Array+.swift */; }; 366CE5EC2A819CA600BE5F66 /* PushSettingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366CE5EB2A819CA600BE5F66 /* PushSettingView.swift */; }; 366CE5F02A819DA800BE5F66 /* PushSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366CE5EF2A819DA800BE5F66 /* PushSettingViewController.swift */; }; 367113642A7D082C0037E0D2 /* ProgressBarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 367113632A7D082C0037E0D2 /* ProgressBarManager.swift */; }; @@ -110,6 +131,7 @@ 36871C7D2A664CD8001CA514 /* JoinedFriendsRequestQueryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36871C7C2A664CD8001CA514 /* JoinedFriendsRequestQueryDTO.swift */; }; 369BF9682A6AFC640091CB85 /* TokenRefreshResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 369BF9672A6AFC640091CB85 /* TokenRefreshResponseDTO.swift */; }; 36A3B26F2A8D233600BA7CE0 /* Amplitude in Frameworks */ = {isa = PBXBuildFile; productRef = 36A3B26E2A8D233600BA7CE0 /* Amplitude */; }; + 36AD1FB22B85D35F004E2083 /* YelloLoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36AD1FB12B85D35F004E2083 /* YelloLoadingView.swift */; }; 36AD441A2A6812420087D7E0 /* YelloRequestInterceptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36AD44192A6812420087D7E0 /* YelloRequestInterceptor.swift */; }; 36B234962A61466A007933E4 /* YelloHelperLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B234952A61466A007933E4 /* YelloHelperLabel.swift */; }; 36B234982A619853007933E4 /* onboarding_end.json in Resources */ = {isa = PBXBuildFile; fileRef = 36B234972A619853007933E4 /* onboarding_end.json */; }; @@ -118,6 +140,9 @@ 36B2349E2A61A6A8007933E4 /* KakaoConnectViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B2349D2A61A6A8007933E4 /* KakaoConnectViewController.swift */; }; 36B234A02A61A6BC007933E4 /* KakaoConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B2349F2A61A6BC007933E4 /* KakaoConnectView.swift */; }; 36B234A22A61B447007933E4 /* UINavigationController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B234A12A61B447007933E4 /* UINavigationController+.swift */; }; + 36B7CAAF2B6BD822003C57FF /* ProfileUpadateDateResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B7CAAE2B6BD822003C57FF /* ProfileUpadateDateResponseDTO.swift */; }; + 36B7CAB32B6BE721003C57FF /* EditProfileRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B7CAB22B6BE718003C57FF /* EditProfileRequestDTO.swift */; }; + 36B7CAB52B6BECF2003C57FF /* DateConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B7CAB42B6BECF2003C57FF /* DateConverter.swift */; }; 36BE79BE2AC081A000F4AB83 /* HighSchoolClassRequestQueryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BE79BD2AC081A000F4AB83 /* HighSchoolClassRequestQueryDTO.swift */; }; 36BE79C02AC0820100F4AB83 /* HighSchoolClassResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BE79BF2AC0820100F4AB83 /* HighSchoolClassResponseDTO.swift */; }; 36BF1DE42A7A30CF00C58E74 /* SchoolSelectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36BF1DE32A7A30CF00C58E74 /* SchoolSelectView.swift */; }; @@ -128,6 +153,19 @@ 36C4C4A62AB8C29400F968B7 /* HighSchoolSearchRequestQueryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C4C4A52AB8C29400F968B7 /* HighSchoolSearchRequestQueryDTO.swift */; }; 36C4C4A82AB8C2F700F968B7 /* HighSchoolSearchResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C4C4A72AB8C2F700F968B7 /* HighSchoolSearchResponseDTO.swift */; }; 36C5E1CD2A91273400184AAE /* TokenRefreshRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36C5E1CC2A91273400184AAE /* TokenRefreshRequestDTO.swift */; }; + 36CDA9082B82078000AC248E /* RewardPossibleRequestQueryDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA9072B82078000AC248E /* RewardPossibleRequestQueryDTO.swift */; }; + 36CDA90A2B8207B900AC248E /* RewardPossibleResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA9092B8207B900AC248E /* RewardPossibleResponseDTO.swift */; }; + 36CDA90E2B82084000AC248E /* RewardRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA90D2B82084000AC248E /* RewardRequestDTO.swift */; }; + 36CDA9102B82084D00AC248E /* RewardResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA90F2B82084D00AC248E /* RewardResponseDTO.swift */; }; + 36CDA9122B8208B700AC248E /* RewardTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA9112B8208B700AC248E /* RewardTarget.swift */; }; + 36CDA9142B8208C400AC248E /* RewardServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CDA9132B8208C400AC248E /* RewardServices.swift */; }; + 36CDA9172B823CE900AC248E /* lottie_spinner_loading_profile.json in Resources */ = {isa = PBXBuildFile; fileRef = 36CDA9162B823CE900AC248E /* lottie_spinner_loading_profile.json */; }; + 36CFF9A82B67F5FB008DDB9D /* EditProfileHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36CFF9A72B67F5FB008DDB9D /* EditProfileHeaderView.swift */; }; + 36D98F352B5FB2B7003B2B11 /* MainProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D98F342B5FB2B7003B2B11 /* MainProfileView.swift */; }; + 36D98F372B602442003B2B11 /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D98F362B602442003B2B11 /* InfoView.swift */; }; + 36D98F392B617B5D003B2B11 /* EditProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D98F382B617B5D003B2B11 /* EditProfileViewController.swift */; }; + 36D98F3B2B617BBD003B2B11 /* EditProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D98F3A2B617BBD003B2B11 /* EditProfileView.swift */; }; + 36D98F3D2B617DD7003B2B11 /* EditProfileTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36D98F3C2B617DD7003B2B11 /* EditProfileTableViewCell.swift */; }; 36E2181E2A5D17D000FB3C9C /* SearchBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2181D2A5D17D000FB3C9C /* SearchBaseViewController.swift */; }; 36E218202A5D2E3B00FB3C9C /* SearchResultTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2181F2A5D2E3B00FB3C9C /* SearchResultTableViewCell.swift */; }; 36E427692A5BCE860050B34E /* FriendsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E427582A5BCE860050B34E /* FriendsTableViewCell.swift */; }; @@ -178,6 +216,13 @@ 36E60EC32AE6DFC4005035D3 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 36E60EC22AE6DFC4005035D3 /* FirebaseStorage */; }; 36E60EC52AE6DFC4005035D3 /* FirebaseStorageCombine-Community in Frameworks */ = {isa = PBXBuildFile; productRef = 36E60EC42AE6DFC4005035D3 /* FirebaseStorageCombine-Community */; }; 36EA2AB72A66FC0B003603C7 /* UserManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36EA2AB62A66FC0B003603C7 /* UserManager.swift */; }; + 36ECE0E82B68B2EE000FCCBF /* EditSchoolInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36ECE0E72B68B2EE000FCCBF /* EditSchoolInfoViewController.swift */; }; + 36ECE0EA2B68B4EC000FCCBF /* EditSchoolInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36ECE0E92B68B4EC000FCCBF /* EditSchoolInfoView.swift */; }; + 36ECE0EF2B68BC8D000FCCBF /* EditSchoolInfoTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36ECE0EE2B68BC8D000FCCBF /* EditSchoolInfoTableViewCell.swift */; }; + C303C8202B5FC3730077C423 /* RecommendProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C303C81F2B5FC3730077C423 /* RecommendProfileViewController.swift */; }; + C303C8222B6005500077C423 /* WithdrawalReasonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C303C8212B6005500077C423 /* WithdrawalReasonViewController.swift */; }; + C303C8242B6005980077C423 /* WithdrawalReasonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C303C8232B6005980077C423 /* WithdrawalReasonView.swift */; }; + C303C8262B6009C70077C423 /* ReasonCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C303C8252B6009C70077C423 /* ReasonCollectionViewCell.swift */; }; C305A5B22A85F997007C4A69 /* PaymentConfirmView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C305A5B12A85F997007C4A69 /* PaymentConfirmView.swift */; }; C306E7272A630BB70031514C /* KeychainHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C306E7262A630BB70031514C /* KeychainHandler.swift */; }; C306E72A2A630BD10031514C /* SwiftKeychainWrapper in Frameworks */ = {isa = PBXBuildFile; productRef = C306E7292A630BD10031514C /* SwiftKeychainWrapper */; }; @@ -194,6 +239,8 @@ C307ECBA2A612831000F5BA9 /* MyProfileFriendModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C307ECB92A612831000F5BA9 /* MyProfileFriendModel.swift */; }; C3081E492A82451D0088CA44 /* AroundSkeletonTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3081E482A82451D0088CA44 /* AroundSkeletonTableViewCell.swift */; }; C3081E4B2A82B06B0088CA44 /* MyFriendSkeletonTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3081E4A2A82B06B0088CA44 /* MyFriendSkeletonTableViewCell.swift */; }; + C30F45242B775DCF00803BE5 /* BaseIconButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30F45232B775DCF00803BE5 /* BaseIconButton.swift */; }; + C30F45262B77649700803BE5 /* CloseButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30F45252B77649700803BE5 /* CloseButton.swift */; }; C30F81032A7F51E6009DBB8D /* UseTicketView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30F81022A7F51E6009DBB8D /* UseTicketView.swift */; }; C30F81052A7F51F3009DBB8D /* GetFullNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30F81042A7F51F3009DBB8D /* GetFullNameView.swift */; }; C30F81072A7F6A63009DBB8D /* MyYelloOnlyNameTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C30F81062A7F6A63009DBB8D /* MyYelloOnlyNameTableViewCell.swift */; }; @@ -207,6 +254,7 @@ C32322F52A619E92006DA50B /* PaymentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32322F42A619E92006DA50B /* PaymentView.swift */; }; C32322F92A61ABF2006DA50B /* PaymentCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32322F82A61ABF2006DA50B /* PaymentCollectionViewCell.swift */; }; C3291A082A920D84007F2CF5 /* AppStoreCheck.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3291A072A920D84007F2CF5 /* AppStoreCheck.swift */; }; + C32CEABA2B760DED00692982 /* DeleteRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = C32CEAB92B760DED00692982 /* DeleteRequestDTO.swift */; }; C348B6D72A8FBBD600674371 /* PurchaseInfoResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = C348B6D62A8FBBD600674371 /* PurchaseInfoResponseDTO.swift */; }; C363D46D2A78050600FD583D /* AroundTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C363D46C2A78050600FD583D /* AroundTableViewCell.swift */; }; C363D4722A780F0D00FD583D /* AroundEmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C363D4712A780F0D00FD583D /* AroundEmptyView.swift */; }; @@ -271,6 +319,7 @@ C3B83E642A8E04C800A39CAC /* PurchaseRequestDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B83E632A8E04C800A39CAC /* PurchaseRequestDTO.swift */; }; C3B83E662A8E051800A39CAC /* PurchaseResponseDTO.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B83E652A8E051800A39CAC /* PurchaseResponseDTO.swift */; }; C3B83E682A8E08D500A39CAC /* PurchaseService.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3B83E672A8E08D500A39CAC /* PurchaseService.swift */; }; + C3BAECD02B40184800F8FD74 /* RecommendFriendProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BAECCF2B40184800F8FD74 /* RecommendFriendProfileView.swift */; }; C3BF63022AF7DE09000C7900 /* InstagramButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BF63012AF7DE09000C7900 /* InstagramButton.swift */; }; C3BF63042AF7E1EA000C7900 /* TimeLineTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BF63032AF7E1EA000C7900 /* TimeLineTableViewCell.swift */; }; C3C560C02A8A6ED50074E988 /* SearchTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C560BF2A8A6ED50074E988 /* SearchTarget.swift */; }; @@ -290,6 +339,7 @@ C3C57BF52A5C093D00B84CAA /* FriendModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C57BF42A5C093D00B84CAA /* FriendModel.swift */; }; C3C57BF72A5C0BD700B84CAA /* EmptyFriendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C57BF62A5C0BD700B84CAA /* EmptyFriendView.swift */; }; C3C57BF92A5C181A00B84CAA /* SchoolFriendView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C57BF82A5C181A00B84CAA /* SchoolFriendView.swift */; }; + C3C5D8232B628AC500C8D27C /* ReasonHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3C5D8222B628AC500C8D27C /* ReasonHeaderView.swift */; }; C3D266392A5C710D0041C7C7 /* NavigationBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D266382A5C710D0041C7C7 /* NavigationBarView.swift */; }; C3D2663B2A5C720F0041C7C7 /* CountCustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D2663A2A5C720F0041C7C7 /* CountCustomView.swift */; }; C3D2663D2A5C73360041C7C7 /* MyProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3D2663C2A5C73360041C7C7 /* MyProfileView.swift */; }; @@ -355,8 +405,22 @@ 2A3705EB2A62E3D4001AAC93 /* ProfileTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileTarget.swift; sourceTree = ""; }; 2A3705ED2A62E3DF001AAC93 /* ProfileService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileService.swift; sourceTree = ""; }; 2A423DF02A8F6F4E00F56C06 /* MyYelloDetailFullNameResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyYelloDetailFullNameResponseDTO.swift; sourceTree = ""; }; + 2A55DDA42B669BCC00290FE8 /* NotificationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationView.swift; sourceTree = ""; }; + 2A5E08F92B6692DD00CDB3DF /* NotificationResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationResponseDTO.swift; sourceTree = ""; }; + 2A5E08FB2B66935B00CDB3DF /* NotificationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationTarget.swift; sourceTree = ""; }; + 2A5E08FD2B6693FD00CDB3DF /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; 2A5FE1AD2A657AA6008F636C /* VotingData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingData.swift; sourceTree = ""; }; 2A5FE1B52A66FA07008F636C /* VoteAnswerList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoteAnswerList.swift; sourceTree = ""; }; + 2A8172802B71CCD5004C0B9C /* LunchEventView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LunchEventView.swift; sourceTree = ""; }; + 2A8172822B71D279004C0B9C /* LunchEventViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LunchEventViewController.swift; sourceTree = ""; }; + 2A8172882B71D9DE004C0B9C /* EventPointView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventPointView.swift; sourceTree = ""; }; + 2A81728E2B726ADB004C0B9C /* EventResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventResponseDTO.swift; sourceTree = ""; }; + 2A8172932B726B79004C0B9C /* EventTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventTarget.swift; sourceTree = ""; }; + 2A8172952B726BC8004C0B9C /* EventService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventService.swift; sourceTree = ""; }; + 2A81729B2B727A93004C0B9C /* eventbox_open-4.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "eventbox_open-4.json"; sourceTree = ""; }; + 2A81729D2B727A99004C0B9C /* eventbox_default-4.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "eventbox_default-4.json"; sourceTree = ""; }; + 2A8172A02B72A1B3004C0B9C /* EventRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventRequestDTO.swift; sourceTree = ""; }; + 2A8172A22B72AE3F004C0B9C /* EventRewardRsponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventRewardRsponseDTO.swift; sourceTree = ""; }; 2A8AA7002A64A333005A664D /* VotingSuffleResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingSuffleResponseDTO.swift; sourceTree = ""; }; 2A8AA7022A64AA6B005A664D /* VotingListResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingListResponseDTO.swift; sourceTree = ""; }; 2A8AA7042A6514F2005A664D /* VotingAnswerListRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VotingAnswerListRequestDTO.swift; sourceTree = ""; }; @@ -394,7 +458,22 @@ 2AFB01602A8D2EAC001BB2C7 /* pagenation_8.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = pagenation_8.json; sourceTree = ""; }; 2AFB01612A8D2EAC001BB2C7 /* pagenation_6.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = pagenation_6.json; sourceTree = ""; }; 2AFB01622A8D2EAC001BB2C7 /* pagenation_1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = pagenation_1.json; sourceTree = ""; }; + 36013A6A2B8CDFCA000557F4 /* nanopb.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = nanopb.xcframework; sourceTree = ""; }; + 36013A6C2B8CDFCA000557F4 /* Promises-LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Promises-LICENSE"; sourceTree = ""; }; + 36013A6D2B8CDFCA000557F4 /* NanoPB-LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NanoPB-LICENSE"; sourceTree = ""; }; + 36013A6E2B8CDFCA000557F4 /* OpenMeasurement-LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = "OpenMeasurement-LICENSE"; sourceTree = ""; }; + 36013A6F2B8CDFCA000557F4 /* GoogleUtilities-LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = "GoogleUtilities-LICENSE"; sourceTree = ""; }; + 36013A702B8CDFCA000557F4 /* GoogleAppMeasurementIdentitySupport.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleAppMeasurementIdentitySupport.xcframework; sourceTree = ""; }; + 36013A712B8CDFCA000557F4 /* UserMessagingPlatform.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = UserMessagingPlatform.xcframework; sourceTree = ""; }; + 36013A722B8CDFCA000557F4 /* GoogleMobileAds.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleMobileAds.xcframework; sourceTree = ""; }; + 36013A732B8CDFCA000557F4 /* FBLPromises.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = FBLPromises.xcframework; sourceTree = ""; }; + 36013A742B8CDFCA000557F4 /* GoogleAppMeasurement.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleAppMeasurement.xcframework; sourceTree = ""; }; + 36013A752B8CDFCA000557F4 /* GoogleUtilities.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = GoogleUtilities.xcframework; sourceTree = ""; }; + 36013AA92B8D0346000557F4 /* IronSourceAdapter.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IronSourceAdapter.xcframework; path = "../../../../../Downloads/IronSourceAdapter-7.7.0.0.0/IronSourceAdapter.xcframework"; sourceTree = ""; }; + 36013AAD2B8D0358000557F4 /* IronSource.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IronSource.xcframework; path = ../../../../../Downloads/IronSource/IronSource.xcframework; sourceTree = ""; }; + 36013AB92B8D081A000557F4 /* IronSourceAdQualitySDK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IronSourceAdQualitySDK.xcframework; path = ../../../../../Downloads/IronSourceAdQualitySDK.xcframework; sourceTree = ""; }; 3608F9052A80E25600B09D82 /* YELLO-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "YELLO-iOS.entitlements"; sourceTree = ""; }; + 3609E96C2B87B600004B68AB /* AppTrackingTransparency.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppTrackingTransparency.framework; path = System/Library/Frameworks/AppTrackingTransparency.framework; sourceTree = SDKROOT; }; 3628EAE72A608F0200D5FA40 /* SplashViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashViewController.swift; sourceTree = ""; }; 3628EAE92A60903A00D5FA40 /* splash.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = splash.json; sourceTree = ""; }; 3628EAEB2A609E1D00D5FA40 /* SplashTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashTitleView.swift; sourceTree = ""; }; @@ -407,6 +486,9 @@ 363D81622B262A450095F6CC /* NameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NameViewController.swift; sourceTree = ""; }; 363D81632B262A460095F6CC /* NameView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NameView.swift; sourceTree = ""; }; 365AC9ED2A858CAA00FC4772 /* UIWindow+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIWindow+.swift"; sourceTree = ""; }; + 365CD6F52B7E918F00245CDD /* PointButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PointButton.swift; sourceTree = ""; }; + 365CD6F72B7EA13800245CDD /* NavigationBarCountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarCountView.swift; sourceTree = ""; }; + 365CD6F92B81D86600245CDD /* AppTracking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppTracking.swift; sourceTree = ""; }; 36621BCC2A690B2400010D84 /* BaseBottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseBottomSheetViewController.swift; sourceTree = ""; }; 36621BCE2A692A7700010D84 /* StudentIdView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudentIdView.swift; sourceTree = ""; }; 36621BD02A69318200010D84 /* StudentIdViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StudentIdViewController.swift; sourceTree = ""; }; @@ -423,6 +505,8 @@ 3662A0F52A654B8D00F482EF /* JoinedFriendsRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinedFriendsRequestDTO.swift; sourceTree = ""; }; 3662A0F72A6577E000F482EF /* IdValidRequestQueryDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdValidRequestQueryDTO.swift; sourceTree = ""; }; 3662A0FB2A65795200F482EF /* IdValidResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IdValidResponseDTO.swift; sourceTree = ""; }; + 366423C92B8349A700038F05 /* Timer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; + 366885AB2B775FA9009AFB0C /* Array+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+.swift"; sourceTree = ""; }; 366CE5EB2A819CA600BE5F66 /* PushSettingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushSettingView.swift; sourceTree = ""; }; 366CE5EF2A819DA800BE5F66 /* PushSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushSettingViewController.swift; sourceTree = ""; }; 367113632A7D082C0037E0D2 /* ProgressBarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProgressBarManager.swift; sourceTree = ""; }; @@ -433,11 +517,14 @@ 367113722A7D6CED0037E0D2 /* UniversityViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UniversityViewController.swift; sourceTree = ""; }; 367229D02A991BC700724494 /* DeviceTokenRefreshRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceTokenRefreshRequestDTO.swift; sourceTree = ""; }; 367DA01A2A863CE60043D23C /* HighSchoolViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighSchoolViewController.swift; sourceTree = ""; }; + 367DD7DE2B8CD42400E0E7EF /* ISAdMobAdapter.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = ISAdMobAdapter.xcframework; sourceTree = ""; }; + 367DD7DF2B8CDCEF00E0E7EF /* ISAdMobResources.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = ISAdMobResources.bundle; path = ../../../../../Downloads/ISAdMobResources.bundle; sourceTree = ""; }; 367F1CD12A5408E100CDF47B /* Unbounded-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Unbounded-Bold.ttf"; sourceTree = ""; }; 367F1CD32A54193700CDF47B /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; 36871C7A2A664C69001CA514 /* JoinedFriendsResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinedFriendsResponseDTO.swift; sourceTree = ""; }; 36871C7C2A664CD8001CA514 /* JoinedFriendsRequestQueryDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinedFriendsRequestQueryDTO.swift; sourceTree = ""; }; 369BF9672A6AFC640091CB85 /* TokenRefreshResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenRefreshResponseDTO.swift; sourceTree = ""; }; + 36AD1FB12B85D35F004E2083 /* YelloLoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YelloLoadingView.swift; sourceTree = ""; }; 36AD44192A6812420087D7E0 /* YelloRequestInterceptor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YelloRequestInterceptor.swift; sourceTree = ""; }; 36B234952A61466A007933E4 /* YelloHelperLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YelloHelperLabel.swift; sourceTree = ""; }; 36B234972A619853007933E4 /* onboarding_end.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = onboarding_end.json; sourceTree = ""; }; @@ -446,6 +533,9 @@ 36B2349D2A61A6A8007933E4 /* KakaoConnectViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoConnectViewController.swift; sourceTree = ""; }; 36B2349F2A61A6BC007933E4 /* KakaoConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KakaoConnectView.swift; sourceTree = ""; }; 36B234A12A61B447007933E4 /* UINavigationController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationController+.swift"; sourceTree = ""; }; + 36B7CAAE2B6BD822003C57FF /* ProfileUpadateDateResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileUpadateDateResponseDTO.swift; sourceTree = ""; }; + 36B7CAB22B6BE718003C57FF /* EditProfileRequestDTO.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditProfileRequestDTO.swift; sourceTree = ""; }; + 36B7CAB42B6BECF2003C57FF /* DateConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateConverter.swift; sourceTree = ""; }; 36BE79BD2AC081A000F4AB83 /* HighSchoolClassRequestQueryDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighSchoolClassRequestQueryDTO.swift; sourceTree = ""; }; 36BE79BF2AC0820100F4AB83 /* HighSchoolClassResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighSchoolClassResponseDTO.swift; sourceTree = ""; }; 36BF1DE32A7A30CF00C58E74 /* SchoolSelectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchoolSelectView.swift; sourceTree = ""; }; @@ -457,6 +547,19 @@ 36C4C4A72AB8C2F700F968B7 /* HighSchoolSearchResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HighSchoolSearchResponseDTO.swift; sourceTree = ""; }; 36C5E1CB2A8FCBAC00184AAE /* Config_dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Config_dev.xcconfig; sourceTree = ""; }; 36C5E1CC2A91273400184AAE /* TokenRefreshRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenRefreshRequestDTO.swift; sourceTree = ""; }; + 36CDA9072B82078000AC248E /* RewardPossibleRequestQueryDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardPossibleRequestQueryDTO.swift; sourceTree = ""; }; + 36CDA9092B8207B900AC248E /* RewardPossibleResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardPossibleResponseDTO.swift; sourceTree = ""; }; + 36CDA90D2B82084000AC248E /* RewardRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardRequestDTO.swift; sourceTree = ""; }; + 36CDA90F2B82084D00AC248E /* RewardResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardResponseDTO.swift; sourceTree = ""; }; + 36CDA9112B8208B700AC248E /* RewardTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardTarget.swift; sourceTree = ""; }; + 36CDA9132B8208C400AC248E /* RewardServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RewardServices.swift; sourceTree = ""; }; + 36CDA9162B823CE900AC248E /* lottie_spinner_loading_profile.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = lottie_spinner_loading_profile.json; sourceTree = ""; }; + 36CFF9A72B67F5FB008DDB9D /* EditProfileHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileHeaderView.swift; sourceTree = ""; }; + 36D98F342B5FB2B7003B2B11 /* MainProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainProfileView.swift; sourceTree = ""; }; + 36D98F362B602442003B2B11 /* InfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoView.swift; sourceTree = ""; }; + 36D98F382B617B5D003B2B11 /* EditProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileViewController.swift; sourceTree = ""; }; + 36D98F3A2B617BBD003B2B11 /* EditProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileView.swift; sourceTree = ""; }; + 36D98F3C2B617DD7003B2B11 /* EditProfileTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditProfileTableViewCell.swift; sourceTree = ""; }; 36E2181D2A5D17D000FB3C9C /* SearchBaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBaseViewController.swift; sourceTree = ""; }; 36E2181F2A5D2E3B00FB3C9C /* SearchResultTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchResultTableViewCell.swift; sourceTree = ""; }; 36E427582A5BCE860050B34E /* FriendsTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendsTableViewCell.swift; sourceTree = ""; }; @@ -480,6 +583,13 @@ 36E427942A5CA59F0050B34E /* OnboardingEndViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingEndViewController.swift; sourceTree = ""; }; 36E427962A5CA5AF0050B34E /* OnboardingEndView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingEndView.swift; sourceTree = ""; }; 36EA2AB62A66FC0B003603C7 /* UserManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserManager.swift; sourceTree = ""; }; + 36ECE0E72B68B2EE000FCCBF /* EditSchoolInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSchoolInfoViewController.swift; sourceTree = ""; }; + 36ECE0E92B68B4EC000FCCBF /* EditSchoolInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSchoolInfoView.swift; sourceTree = ""; }; + 36ECE0EE2B68BC8D000FCCBF /* EditSchoolInfoTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditSchoolInfoTableViewCell.swift; sourceTree = ""; }; + C303C81F2B5FC3730077C423 /* RecommendProfileViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendProfileViewController.swift; sourceTree = ""; }; + C303C8212B6005500077C423 /* WithdrawalReasonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawalReasonViewController.swift; sourceTree = ""; }; + C303C8232B6005980077C423 /* WithdrawalReasonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawalReasonView.swift; sourceTree = ""; }; + C303C8252B6009C70077C423 /* ReasonCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReasonCollectionViewCell.swift; sourceTree = ""; }; C305A5B12A85F997007C4A69 /* PaymentConfirmView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentConfirmView.swift; sourceTree = ""; }; C306E7262A630BB70031514C /* KeychainHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainHandler.swift; sourceTree = ""; }; C306E73A2A64557D0031514C /* RecommendingFriendRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendingFriendRequestDTO.swift; sourceTree = ""; }; @@ -495,6 +605,8 @@ C307ECB92A612831000F5BA9 /* MyProfileFriendModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfileFriendModel.swift; sourceTree = ""; }; C3081E482A82451D0088CA44 /* AroundSkeletonTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AroundSkeletonTableViewCell.swift; sourceTree = ""; }; C3081E4A2A82B06B0088CA44 /* MyFriendSkeletonTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyFriendSkeletonTableViewCell.swift; sourceTree = ""; }; + C30F45232B775DCF00803BE5 /* BaseIconButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseIconButton.swift; sourceTree = ""; }; + C30F45252B77649700803BE5 /* CloseButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseButton.swift; sourceTree = ""; }; C30F81022A7F51E6009DBB8D /* UseTicketView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UseTicketView.swift; sourceTree = ""; }; C30F81042A7F51F3009DBB8D /* GetFullNameView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetFullNameView.swift; sourceTree = ""; }; C30F81062A7F6A63009DBB8D /* MyYelloOnlyNameTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyYelloOnlyNameTableViewCell.swift; sourceTree = ""; }; @@ -508,6 +620,7 @@ C32322F42A619E92006DA50B /* PaymentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentView.swift; sourceTree = ""; }; C32322F82A61ABF2006DA50B /* PaymentCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentCollectionViewCell.swift; sourceTree = ""; }; C3291A072A920D84007F2CF5 /* AppStoreCheck.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppStoreCheck.swift; sourceTree = ""; }; + C32CEAB92B760DED00692982 /* DeleteRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteRequestDTO.swift; sourceTree = ""; }; C348B6D62A8FBBD600674371 /* PurchaseInfoResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseInfoResponseDTO.swift; sourceTree = ""; }; C363D46C2A78050600FD583D /* AroundTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AroundTableViewCell.swift; sourceTree = ""; }; C363D4712A780F0D00FD583D /* AroundEmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AroundEmptyView.swift; sourceTree = ""; }; @@ -570,6 +683,7 @@ C3B83E632A8E04C800A39CAC /* PurchaseRequestDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseRequestDTO.swift; sourceTree = ""; }; C3B83E652A8E051800A39CAC /* PurchaseResponseDTO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseResponseDTO.swift; sourceTree = ""; }; C3B83E672A8E08D500A39CAC /* PurchaseService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PurchaseService.swift; sourceTree = ""; }; + C3BAECCF2B40184800F8FD74 /* RecommendFriendProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecommendFriendProfileView.swift; sourceTree = ""; }; C3BF63012AF7DE09000C7900 /* InstagramButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InstagramButton.swift; sourceTree = ""; }; C3BF63032AF7E1EA000C7900 /* TimeLineTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimeLineTableViewCell.swift; sourceTree = ""; }; C3C560BF2A8A6ED50074E988 /* SearchTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchTarget.swift; sourceTree = ""; }; @@ -589,6 +703,7 @@ C3C57BF42A5C093D00B84CAA /* FriendModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendModel.swift; sourceTree = ""; }; C3C57BF62A5C0BD700B84CAA /* EmptyFriendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyFriendView.swift; sourceTree = ""; }; C3C57BF82A5C181A00B84CAA /* SchoolFriendView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchoolFriendView.swift; sourceTree = ""; }; + C3C5D8222B628AC500C8D27C /* ReasonHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReasonHeaderView.swift; sourceTree = ""; }; C3D266382A5C710D0041C7C7 /* NavigationBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarView.swift; sourceTree = ""; }; C3D2663A2A5C720F0041C7C7 /* CountCustomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CountCustomView.swift; sourceTree = ""; }; C3D2663C2A5C73360041C7C7 /* MyProfileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyProfileView.swift; sourceTree = ""; }; @@ -658,6 +773,7 @@ 36E60EA92AE6DFC4005035D3 /* FirebaseFirestore in Frameworks */, 36E60E932AE6DFC4005035D3 /* FirebaseAnalyticsOnDeviceConversion in Frameworks */, 36E60EC32AE6DFC4005035D3 /* FirebaseStorage in Frameworks */, + 3609E96D2B87B600004B68AB /* AppTrackingTransparency.framework in Frameworks */, C3A799B22A4949A700D3EFD8 /* Alamofire in Frameworks */, C3A799AC2A49499500D3EFD8 /* Then in Frameworks */, C3A799AF2A49499F00D3EFD8 /* SnapKit in Frameworks */, @@ -665,6 +781,7 @@ C3C560C92A8BB7E50074E988 /* StoreKit.framework in Frameworks */, 2ADE23AA2A5EB7660088FCB3 /* Lottie in Frameworks */, 36E60EAF2AE6DFC4005035D3 /* FirebaseFunctions in Frameworks */, + 365CD6AF2B7DEFDD00245CDD /* GoogleMobileAds in Frameworks */, 36A3B26F2A8D233600BA7CE0 /* Amplitude in Frameworks */, 36E60E912AE6DFC4005035D3 /* FirebaseAnalytics in Frameworks */, 36E60EA12AE6DFC4005035D3 /* FirebaseCrashlytics in Frameworks */, @@ -973,6 +1090,7 @@ C306E7422A6520830031514C /* ProfileUserResponseDTO.swift */, C306E7442A656AC40031514C /* ProfileFriendResponseDTO.swift */, C348B6D62A8FBBD600674371 /* PurchaseInfoResponseDTO.swift */, + 36B7CAAE2B6BD822003C57FF /* ProfileUpadateDateResponseDTO.swift */, ); path = Response; sourceTree = ""; @@ -980,7 +1098,9 @@ 2A3705C62A62E248001AAC93 /* Request */ = { isa = PBXGroup; children = ( + 36B7CAB22B6BE718003C57FF /* EditProfileRequestDTO.swift */, C306E7462A656D170031514C /* ProfileFriendRequestQueryDTO.swift */, + C32CEAB92B760DED00692982 /* DeleteRequestDTO.swift */, ); path = Request; sourceTree = ""; @@ -1003,6 +1123,56 @@ path = NetworkEntity; sourceTree = ""; }; + 2A55DDA32B669AF900290FE8 /* Notification */ = { + isa = PBXGroup; + children = ( + 2A55DDA42B669BCC00290FE8 /* NotificationView.swift */, + ); + path = Notification; + sourceTree = ""; + }; + 2A5E08F42B66925C00CDB3DF /* Notification */ = { + isa = PBXGroup; + children = ( + 2A5E08F52B66926D00CDB3DF /* DTO */, + 2A5E08F62B66927900CDB3DF /* Router */, + 2A5E08F72B66928000CDB3DF /* Service */, + ); + path = Notification; + sourceTree = ""; + }; + 2A5E08F52B66926D00CDB3DF /* DTO */ = { + isa = PBXGroup; + children = ( + 2A5E08F82B6692C000CDB3DF /* Response */, + ); + path = DTO; + sourceTree = ""; + }; + 2A5E08F62B66927900CDB3DF /* Router */ = { + isa = PBXGroup; + children = ( + 2A5E08FB2B66935B00CDB3DF /* NotificationTarget.swift */, + ); + path = Router; + sourceTree = ""; + }; + 2A5E08F72B66928000CDB3DF /* Service */ = { + isa = PBXGroup; + children = ( + 2A5E08FD2B6693FD00CDB3DF /* NotificationService.swift */, + ); + path = Service; + sourceTree = ""; + }; + 2A5E08F82B6692C000CDB3DF /* Response */ = { + isa = PBXGroup; + children = ( + 2A5E08F92B6692DD00CDB3DF /* NotificationResponseDTO.swift */, + ); + path = Response; + sourceTree = ""; + }; 2A5FE1AF2A657B52008F636C /* Enum */ = { isa = PBXGroup; children = ( @@ -1019,6 +1189,86 @@ path = BaseVotingETCView; sourceTree = ""; }; + 2A81727F2B71CCC6004C0B9C /* Event */ = { + isa = PBXGroup; + children = ( + 2A81729B2B727A93004C0B9C /* eventbox_open-4.json */, + 2A81729D2B727A99004C0B9C /* eventbox_default-4.json */, + 2A81728B2B71D9F8004C0B9C /* ViewController */, + 2A81728A2B71D9E3004C0B9C /* View */, + ); + path = Event; + sourceTree = ""; + }; + 2A81728A2B71D9E3004C0B9C /* View */ = { + isa = PBXGroup; + children = ( + 2A8172802B71CCD5004C0B9C /* LunchEventView.swift */, + 2A8172882B71D9DE004C0B9C /* EventPointView.swift */, + ); + path = View; + sourceTree = ""; + }; + 2A81728B2B71D9F8004C0B9C /* ViewController */ = { + isa = PBXGroup; + children = ( + 2A8172822B71D279004C0B9C /* LunchEventViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 2A81728C2B726AB8004C0B9C /* Event */ = { + isa = PBXGroup; + children = ( + 2A81728D2B726ACD004C0B9C /* DTO */, + 2A8172912B726B4B004C0B9C /* Router */, + 2A8172922B726B5F004C0B9C /* Service */, + ); + path = Event; + sourceTree = ""; + }; + 2A81728D2B726ACD004C0B9C /* DTO */ = { + isa = PBXGroup; + children = ( + 2A81729F2B72A1A5004C0B9C /* Request */, + 2A8172902B726B43004C0B9C /* Response */, + ); + path = DTO; + sourceTree = ""; + }; + 2A8172902B726B43004C0B9C /* Response */ = { + isa = PBXGroup; + children = ( + 2A81728E2B726ADB004C0B9C /* EventResponseDTO.swift */, + 2A8172A22B72AE3F004C0B9C /* EventRewardRsponseDTO.swift */, + ); + path = Response; + sourceTree = ""; + }; + 2A8172912B726B4B004C0B9C /* Router */ = { + isa = PBXGroup; + children = ( + 2A8172932B726B79004C0B9C /* EventTarget.swift */, + ); + path = Router; + sourceTree = ""; + }; + 2A8172922B726B5F004C0B9C /* Service */ = { + isa = PBXGroup; + children = ( + 2A8172952B726BC8004C0B9C /* EventService.swift */, + ); + path = Service; + sourceTree = ""; + }; + 2A81729F2B72A1A5004C0B9C /* Request */ = { + isa = PBXGroup; + children = ( + 2A8172A02B72A1B3004C0B9C /* EventRequestDTO.swift */, + ); + path = Request; + sourceTree = ""; + }; 2A8D66D52A9A3512009DEC3F /* Subscription */ = { isa = PBXGroup; children = ( @@ -1090,8 +1340,10 @@ 2AA0DBAE2A546DBC002B1370 /* Profile */ = { isa = PBXGroup; children = ( + 36B7CAB72B6BF92F003C57FF /* Model */, + 36B7CAB62B6BED04003C57FF /* Helper */, + 36CFF9A32B67F53F008DDB9D /* Edit */, C3D2664A2A5D1F2D0041C7C7 /* Main */, - C307ECB92A612831000F5BA9 /* MyProfileFriendModel.swift */, C3D2664D2A5D1F4F0041C7C7 /* Setting */, ); path = Profile; @@ -1121,6 +1373,7 @@ isa = PBXGroup; children = ( 2AD1A1B32A5739B300CB988B /* InvitingView.swift */, + C30F45252B77649700803BE5 /* CloseButton.swift */, ); path = Inviting; sourceTree = ""; @@ -1137,6 +1390,7 @@ 2AD1A1B92A59557900CB988B /* VotingPoint */ = { isa = PBXGroup; children = ( + 36CDA9152B823CCB00AC248E /* Lottie */, 2AD1A1BA2A59559100CB988B /* VotingPointViewController.swift */, ); path = VotingPoint; @@ -1157,6 +1411,33 @@ path = Lottie; sourceTree = ""; }; + 36013A692B8CDFCA000557F4 /* GoogleMobileAdsSdkiOS-10.14.0 */ = { + isa = PBXGroup; + children = ( + 36013A6A2B8CDFCA000557F4 /* nanopb.xcframework */, + 36013A6B2B8CDFCA000557F4 /* Licenses */, + 36013A702B8CDFCA000557F4 /* GoogleAppMeasurementIdentitySupport.xcframework */, + 36013A712B8CDFCA000557F4 /* UserMessagingPlatform.xcframework */, + 36013A722B8CDFCA000557F4 /* GoogleMobileAds.xcframework */, + 36013A732B8CDFCA000557F4 /* FBLPromises.xcframework */, + 36013A742B8CDFCA000557F4 /* GoogleAppMeasurement.xcframework */, + 36013A752B8CDFCA000557F4 /* GoogleUtilities.xcframework */, + ); + name = "GoogleMobileAdsSdkiOS-10.14.0"; + path = "../../../../../Downloads/GoogleMobileAdsSdkiOS-10.14.0"; + sourceTree = ""; + }; + 36013A6B2B8CDFCA000557F4 /* Licenses */ = { + isa = PBXGroup; + children = ( + 36013A6C2B8CDFCA000557F4 /* Promises-LICENSE */, + 36013A6D2B8CDFCA000557F4 /* NanoPB-LICENSE */, + 36013A6E2B8CDFCA000557F4 /* OpenMeasurement-LICENSE */, + 36013A6F2B8CDFCA000557F4 /* GoogleUtilities-LICENSE */, + ); + path = Licenses; + sourceTree = ""; + }; 3608F9062A80EC2400B09D82 /* Shared */ = { isa = PBXGroup; children = ( @@ -1177,16 +1458,57 @@ path = Splash; sourceTree = ""; }; + 366423C82B83498700038F05 /* AdsTimer */ = { + isa = PBXGroup; + children = ( + 366423C92B8349A700038F05 /* Timer.swift */, + ); + path = AdsTimer; + sourceTree = ""; + }; 367113742A7D92B80037E0D2 /* Modal */ = { isa = PBXGroup; children = ( 36E427762A5BD5AA0050B34E /* FindSchoolViewController.swift */, - 36621BD02A69318200010D84 /* StudentIdViewController.swift */, 36E4278C2A5C92EC0050B34E /* FindMajorViewController.swift */, + 36621BD02A69318200010D84 /* StudentIdViewController.swift */, ); path = Modal; sourceTree = ""; }; + 367DD7DD2B8CD42400E0E7EF /* ISAdMobAdapter */ = { + isa = PBXGroup; + children = ( + 367DD7DE2B8CD42400E0E7EF /* ISAdMobAdapter.xcframework */, + ); + name = ISAdMobAdapter; + path = ../../../../../Downloads/ISAdMobAdapter; + sourceTree = ""; + }; + 36AD1FB02B85D1CD004E2083 /* Global */ = { + isa = PBXGroup; + children = ( + 36AD1FB12B85D35F004E2083 /* YelloLoadingView.swift */, + ); + path = Global; + sourceTree = ""; + }; + 36B7CAB62B6BED04003C57FF /* Helper */ = { + isa = PBXGroup; + children = ( + 36B7CAB42B6BECF2003C57FF /* DateConverter.swift */, + ); + path = Helper; + sourceTree = ""; + }; + 36B7CAB72B6BF92F003C57FF /* Model */ = { + isa = PBXGroup; + children = ( + C307ECB92A612831000F5BA9 /* MyProfileFriendModel.swift */, + ); + path = Model; + sourceTree = ""; + }; 36C209EC2A8B69D9001BF12C /* Tutorial */ = { isa = PBXGroup; children = ( @@ -1215,6 +1537,105 @@ path = ViewController; sourceTree = ""; }; + 36CDA9032B82072E00AC248E /* RewardAd */ = { + isa = PBXGroup; + children = ( + 36CDA9062B82075300AC248E /* DTO */, + 36CDA9052B82074800AC248E /* Service */, + 36CDA9042B82073B00AC248E /* Router */, + ); + path = RewardAd; + sourceTree = ""; + }; + 36CDA9042B82073B00AC248E /* Router */ = { + isa = PBXGroup; + children = ( + 36CDA9112B8208B700AC248E /* RewardTarget.swift */, + ); + path = Router; + sourceTree = ""; + }; + 36CDA9052B82074800AC248E /* Service */ = { + isa = PBXGroup; + children = ( + 36CDA9132B8208C400AC248E /* RewardServices.swift */, + ); + path = Service; + sourceTree = ""; + }; + 36CDA9062B82075300AC248E /* DTO */ = { + isa = PBXGroup; + children = ( + 36CDA90B2B82081C00AC248E /* Request */, + 36CDA90C2B82082300AC248E /* Response */, + ); + path = DTO; + sourceTree = ""; + }; + 36CDA90B2B82081C00AC248E /* Request */ = { + isa = PBXGroup; + children = ( + 36CDA9072B82078000AC248E /* RewardPossibleRequestQueryDTO.swift */, + 36CDA90D2B82084000AC248E /* RewardRequestDTO.swift */, + ); + path = Request; + sourceTree = ""; + }; + 36CDA90C2B82082300AC248E /* Response */ = { + isa = PBXGroup; + children = ( + 36CDA9092B8207B900AC248E /* RewardPossibleResponseDTO.swift */, + 36CDA90F2B82084D00AC248E /* RewardResponseDTO.swift */, + ); + path = Response; + sourceTree = ""; + }; + 36CDA9152B823CCB00AC248E /* Lottie */ = { + isa = PBXGroup; + children = ( + 36CDA9162B823CE900AC248E /* lottie_spinner_loading_profile.json */, + ); + path = Lottie; + sourceTree = ""; + }; + 36CFF9A32B67F53F008DDB9D /* Edit */ = { + isa = PBXGroup; + children = ( + 36CFF9A42B67F547008DDB9D /* ViewController */, + 36CFF9A52B67F54E008DDB9D /* View */, + 36CFF9A62B67F555008DDB9D /* Cell */, + ); + path = Edit; + sourceTree = ""; + }; + 36CFF9A42B67F547008DDB9D /* ViewController */ = { + isa = PBXGroup; + children = ( + 36D98F382B617B5D003B2B11 /* EditProfileViewController.swift */, + 36ECE0E72B68B2EE000FCCBF /* EditSchoolInfoViewController.swift */, + ); + path = ViewController; + sourceTree = ""; + }; + 36CFF9A52B67F54E008DDB9D /* View */ = { + isa = PBXGroup; + children = ( + 36D98F3A2B617BBD003B2B11 /* EditProfileView.swift */, + 36CFF9A72B67F5FB008DDB9D /* EditProfileHeaderView.swift */, + 36ECE0E92B68B4EC000FCCBF /* EditSchoolInfoView.swift */, + ); + path = View; + sourceTree = ""; + }; + 36CFF9A62B67F555008DDB9D /* Cell */ = { + isa = PBXGroup; + children = ( + 36D98F3C2B617DD7003B2B11 /* EditProfileTableViewCell.swift */, + 36ECE0EE2B68BC8D000FCCBF /* EditSchoolInfoTableViewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; 36E2181C2A5D158E00FB3C9C /* Base */ = { isa = PBXGroup; children = ( @@ -1313,11 +1734,20 @@ path = Helper; sourceTree = ""; }; + C303C8272B6009CE0077C423 /* Cell */ = { + isa = PBXGroup; + children = ( + C303C8252B6009C70077C423 /* ReasonCollectionViewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; C305A5B02A85F2CE007C4A69 /* Button */ = { isa = PBXGroup; children = ( C37DFC502A854FE700D3B685 /* PaymentNameKeyButton.swift */, C37DFC4E2A8515D500D3B685 /* PaymentYelloPlusButton.swift */, + 365CD6F52B7E918F00245CDD /* PointButton.swift */, ); path = Button; sourceTree = ""; @@ -1378,6 +1808,7 @@ C32322F32A619E4E006DA50B /* Payment */ = { isa = PBXGroup; children = ( + 366423C82B83498700038F05 /* AdsTimer */, C3DC4AD72A5FDF4B001DCE04 /* PaymentReadyViewController.swift */, C3DC4AD92A5FE713001DCE04 /* PaymentViewController.swift */, C37DFC4B2A85023000D3B685 /* ViewController */, @@ -1430,6 +1861,7 @@ C37DFC492A85022B00D3B685 /* PaymentNavigationBarView.swift */, C32322F42A619E92006DA50B /* PaymentView.swift */, C305A5B12A85F997007C4A69 /* PaymentConfirmView.swift */, + 365CD6F72B7EA13800245CDD /* NavigationBarCountView.swift */, ); path = View; sourceTree = ""; @@ -1541,6 +1973,7 @@ C3A799962A49490A00D3EFD8 /* AppDelegate.swift */, C3A799982A49490A00D3EFD8 /* SceneDelegate.swift */, 2A8D66D12A97C5AE009DEC3F /* NetworkCheck.swift */, + 365CD6F92B81D86600245CDD /* AppTracking.swift */, ); path = Application; sourceTree = ""; @@ -1579,6 +2012,7 @@ 365AC9ED2A858CAA00FC4772 /* UIWindow+.swift */, 362EC31C2A8BB5A400121BDD /* UIScreen+.swift */, 363D815C2B25E7B60095F6CC /* UIApplication.swift */, + 366885AB2B775FA9009AFB0C /* Array+.swift */, ); path = Extensions; sourceTree = ""; @@ -1623,6 +2057,7 @@ C3A799C82A494B8800D3EFD8 /* Network */ = { isa = PBXGroup; children = ( + 36CDA9032B82072E00AC248E /* RewardAd */, 2A37057B2A62AE80001AAC93 /* Base */, 2A37057C2A62AE8D001AAC93 /* Onboarding */, C390B80A2A8A1D0400EA5A23 /* Around */, @@ -1632,6 +2067,8 @@ 2A37057F2A62AECC001AAC93 /* MyYello */, 2A3705802A62AEEC001AAC93 /* Profile */, C3C560CA2A8BB9300074E988 /* Purchase */, + 2A5E08F42B66925C00CDB3DF /* Notification */, + 2A81728C2B726AB8004C0B9C /* Event */, ); path = Network; sourceTree = ""; @@ -1639,6 +2076,9 @@ C3A799C92A494B8E00D3EFD8 /* Presentation */ = { isa = PBXGroup; children = ( + 36AD1FB02B85D1CD004E2083 /* Global */, + 2A81727F2B71CCC6004C0B9C /* Event */, + 2A55DDA32B669AF900290FE8 /* Notification */, 2A8D66D52A9A3512009DEC3F /* Subscription */, 36C209EC2A8B69D9001BF12C /* Tutorial */, C3A799CE2A494C9200D3EFD8 /* Base */, @@ -1663,6 +2103,7 @@ C3FF24B22A5F4D1F00A97D40 /* BasePaddingLabel.swift */, C3A799CC2A494C8600D3EFD8 /* BaseView.swift */, 36621BCC2A690B2400010D84 /* BaseBottomSheetViewController.swift */, + C30F45232B775DCF00803BE5 /* BaseIconButton.swift */, ); path = Base; sourceTree = ""; @@ -1758,6 +2199,13 @@ C3C560C72A8BB7E50074E988 /* Frameworks */ = { isa = PBXGroup; children = ( + 36013AB92B8D081A000557F4 /* IronSourceAdQualitySDK.xcframework */, + 36013AAD2B8D0358000557F4 /* IronSource.xcframework */, + 36013AA92B8D0346000557F4 /* IronSourceAdapter.xcframework */, + 36013A692B8CDFCA000557F4 /* GoogleMobileAdsSdkiOS-10.14.0 */, + 367DD7DF2B8CDCEF00E0E7EF /* ISAdMobResources.bundle */, + 367DD7DD2B8CD42400E0E7EF /* ISAdMobAdapter */, + 3609E96C2B87B600004B68AB /* AppTrackingTransparency.framework */, C3C560C82A8BB7E50074E988 /* StoreKit.framework */, ); name = Frameworks; @@ -1810,6 +2258,7 @@ C3C57BF82A5C181A00B84CAA /* SchoolFriendView.swift */, C3C57BF62A5C0BD700B84CAA /* EmptyFriendView.swift */, C31315A32A7A5B8700FB8B43 /* RecommendingNavigationBarView.swift */, + C3BAECCF2B40184800F8FD74 /* RecommendFriendProfileView.swift */, ); path = View; sourceTree = ""; @@ -1820,6 +2269,7 @@ 2AA0DBAF2A546E1D002B1370 /* RecommendingViewController.swift */, C3C57BC62A57160000B84CAA /* SchoolFriendViewController.swift */, C3C57BC42A5715E600B84CAA /* KakaoFriendViewController.swift */, + C303C81F2B5FC3730077C423 /* RecommendProfileViewController.swift */, ); path = ViewController; sourceTree = ""; @@ -1838,12 +2288,14 @@ isa = PBXGroup; children = ( C3D266442A5C776F0041C7C7 /* ProfileView.swift */, - C3D266382A5C710D0041C7C7 /* NavigationBarView.swift */, C3D2663C2A5C73360041C7C7 /* MyProfileView.swift */, + 36D98F342B5FB2B7003B2B11 /* MainProfileView.swift */, + 36D98F362B602442003B2B11 /* InfoView.swift */, C307ECB52A607357000F5BA9 /* FriendCountView.swift */, C3D266422A5C771F0041C7C7 /* MyProfileHeaderView.swift */, C3D2663A2A5C720F0041C7C7 /* CountCustomView.swift */, C3FF24782A5D798700A97D40 /* FriendProfileView.swift */, + C3D266382A5C710D0041C7C7 /* NavigationBarView.swift */, ); path = View; sourceTree = ""; @@ -1901,6 +2353,7 @@ children = ( C3FF24A92A5F330700A97D40 /* ViewController */, C3FF24AA2A5F331000A97D40 /* View */, + C303C8272B6009CE0077C423 /* Cell */, ); path = Withdrawal; sourceTree = ""; @@ -1958,8 +2411,9 @@ C3FF24A92A5F330700A97D40 /* ViewController */ = { isa = PBXGroup; children = ( - C3FF24722A5D47EB00A97D40 /* WithdrawalCheckViewController.swift */, C3FF246B2A5D476D00A97D40 /* WithdrawalViewController.swift */, + C3FF24722A5D47EB00A97D40 /* WithdrawalCheckViewController.swift */, + C303C8212B6005500077C423 /* WithdrawalReasonViewController.swift */, ); path = ViewController; sourceTree = ""; @@ -1967,9 +2421,11 @@ C3FF24AA2A5F331000A97D40 /* View */ = { isa = PBXGroup; children = ( - C3FF24702A5D47DD00A97D40 /* WithdrawalCheckView.swift */, C3FF246E2A5D47D100A97D40 /* WithdrawalView.swift */, + C3FF24702A5D47DD00A97D40 /* WithdrawalCheckView.swift */, + C303C8232B6005980077C423 /* WithdrawalReasonView.swift */, C3FF24742A5D6E9500A97D40 /* WithdrawalAlertView.swift */, + C3C5D8222B628AC500C8D27C /* ReasonHeaderView.swift */, ); path = View; sourceTree = ""; @@ -2045,6 +2501,7 @@ 36E60EC02AE6DFC4005035D3 /* FirebaseRemoteConfigSwift */, 36E60EC22AE6DFC4005035D3 /* FirebaseStorage */, 36E60EC42AE6DFC4005035D3 /* FirebaseStorageCombine-Community */, + 365CD6AE2B7DEFDD00245CDD /* GoogleMobileAds */, ); productName = "YELLO-iOS"; productReference = C3A799932A49490A00D3EFD8 /* YELLO-iOS.app */; @@ -2084,6 +2541,7 @@ 2A4C549B2A8622B200FFDF80 /* XCRemoteSwiftPackageReference "Kingfisher" */, 36A3B26D2A8D233600BA7CE0 /* XCRemoteSwiftPackageReference "Amplitude-iOS" */, 36E60E8F2AE6DFC4005035D3 /* XCRemoteSwiftPackageReference "firebase-ios-sdk" */, + 365CD6AD2B7DEFDD00245CDD /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */, ); productRefGroup = C3A799942A49490A00D3EFD8 /* Products */; projectDirPath = ""; @@ -2117,9 +2575,11 @@ C3A79A082A49500000D3EFD8 /* Pretendard-Light.otf in Resources */, 2AFB01632A8D2EAC001BB2C7 /* pagenation_5.json in Resources */, 2AFB01672A8D2EAC001BB2C7 /* pagenation_7.json in Resources */, + 2A81729E2B727A99004C0B9C /* eventbox_default-4.json in Resources */, C3A79A052A49500000D3EFD8 /* Pretendard-Regular.otf in Resources */, 2AFB01662A8D2EAC001BB2C7 /* pagenation_4.json in Resources */, 2AFB01642A8D2EAC001BB2C7 /* pagenation_2.json in Resources */, + 2A81729C2B727A93004C0B9C /* eventbox_open-4.json in Resources */, C3A79A042A49500000D3EFD8 /* Pretendard-Black.otf in Resources */, C3A79A072A49500000D3EFD8 /* Pretendard-SemiBold.otf in Resources */, 2AFB01692A8D2EAC001BB2C7 /* pagenation_6.json in Resources */, @@ -2128,6 +2588,7 @@ 2A9808E92A81658500FBA5B3 /* GoogleService-Info.plist in Resources */, C3A79A062A49500000D3EFD8 /* Pretendard-Medium.otf in Resources */, 36B234982A619853007933E4 /* onboarding_end.json in Resources */, + 36CDA9172B823CE900AC248E /* lottie_spinner_loading_profile.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2182,18 +2643,22 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 36ECE0EA2B68B4EC000FCCBF /* EditSchoolInfoView.swift in Sources */, 36C209F62A8B8190001BF12C /* SecondTutorialView.swift in Sources */, + 365CD6F82B7EA13800245CDD /* NavigationBarCountView.swift in Sources */, C37DFC512A854FE700D3B685 /* PaymentNameKeyButton.swift in Sources */, C307ECB62A607357000F5BA9 /* FriendCountView.swift in Sources */, C3FF248A2A5E845A00A97D40 /* MyYelloEmptyView.swift in Sources */, 2AA0DBB02A546E1D002B1370 /* RecommendingViewController.swift in Sources */, 36621BD32A693D4C00010D84 /* BottomFriendProfileViewController.swift in Sources */, 36871C7D2A664CD8001CA514 /* JoinedFriendsRequestQueryDTO.swift in Sources */, + C30F45242B775DCF00803BE5 /* BaseIconButton.swift in Sources */, C3C560C62A8A6F350074E988 /* FriendSearchResponseDTO.swift in Sources */, 36621BCD2A690B2400010D84 /* BaseBottomSheetViewController.swift in Sources */, C3FF24902A5E8ED000A97D40 /* MyYelloListView.swift in Sources */, 36E427702A5BCE860050B34E /* YelloButton.swift in Sources */, C3B472102A65E0A200770530 /* MyYelloDetailKeywordResponseDTO.swift in Sources */, + 36B7CAB32B6BE721003C57FF /* EditProfileRequestDTO.swift in Sources */, 367113682A7D21330037E0D2 /* SchoolSelectViewController.swift in Sources */, C31315AD2A7B78EE00FB8B43 /* FriendSearchTableViewCell.swift in Sources */, 366CE5F02A819DA800BE5F66 /* PushSettingViewController.swift in Sources */, @@ -2203,18 +2668,23 @@ C3A799E22A494D6800D3EFD8 /* UIButton+.swift in Sources */, 36621BD12A69318200010D84 /* StudentIdViewController.swift in Sources */, C3FF24A22A5EEBD600A97D40 /* DetailKeywordView.swift in Sources */, + 36CDA9122B8208B700AC248E /* RewardTarget.swift in Sources */, 2AD1A1B42A5739B300CB988B /* InvitingView.swift in Sources */, C3DC4AD82A5FDF4B001DCE04 /* PaymentReadyViewController.swift in Sources */, C306E7272A630BB70031514C /* KeychainHandler.swift in Sources */, + 365CD6F62B7E918F00245CDD /* PointButton.swift in Sources */, 36E427692A5BCE860050B34E /* FriendsTableViewCell.swift in Sources */, 369BF9682A6AFC640091CB85 /* TokenRefreshResponseDTO.swift in Sources */, C3C560C02A8A6ED50074E988 /* SearchTarget.swift in Sources */, + 366423CA2B8349A700038F05 /* Timer.swift in Sources */, 3671136A2A7D2AC50037E0D2 /* YelloNavigationBarView.swift in Sources */, 2A5FE1AE2A657AA6008F636C /* VotingData.swift in Sources */, 362EC31D2A8BB5A400121BDD /* UIScreen+.swift in Sources */, C3FF248E2A5E8DB700A97D40 /* TabBarHeight.swift in Sources */, + 36CDA90E2B82084000AC248E /* RewardRequestDTO.swift in Sources */, 36E427932A5C9BE30050B34E /* RecommendIdView.swift in Sources */, 36E4278D2A5C92EC0050B34E /* FindMajorViewController.swift in Sources */, + 36D98F392B617B5D003B2B11 /* EditProfileViewController.swift in Sources */, 2AD1A1AE2A571ED500CB988B /* BaseVotingETCView.swift in Sources */, C348B6D72A8FBBD600674371 /* PurchaseInfoResponseDTO.swift in Sources */, 36C4C4A82AB8C2F700F968B7 /* HighSchoolSearchResponseDTO.swift in Sources */, @@ -2222,7 +2692,9 @@ C307ECB42A60657C000F5BA9 /* UITableView+.swift in Sources */, 36B234A22A61B447007933E4 /* UINavigationController+.swift in Sources */, C306E7472A656D170031514C /* ProfileFriendRequestQueryDTO.swift in Sources */, + 36ECE0EF2B68BC8D000FCCBF /* EditSchoolInfoTableViewCell.swift in Sources */, 2AD1A1AE2A571ED500CB988B /* BaseVotingETCView.swift in Sources */, + C303C8202B5FC3730077C423 /* RecommendProfileViewController.swift in Sources */, C3A799E82A494D6800D3EFD8 /* UILabel+.swift in Sources */, 367229D12A991BC700724494 /* DeviceTokenRefreshRequestDTO.swift in Sources */, C3B1D8BB2A81208E0050D737 /* FriendSkeletonTableViewCell.swift in Sources */, @@ -2238,10 +2710,12 @@ 3662A0E82A64414800F482EF /* OnboardingService.swift in Sources */, C37DFC4A2A85022B00D3B685 /* PaymentNavigationBarView.swift in Sources */, C3FF248C2A5E846D00A97D40 /* MyYelloNavigationBarView.swift in Sources */, + 36CFF9A82B67F5FB008DDB9D /* EditProfileHeaderView.swift in Sources */, 367113642A7D082C0037E0D2 /* ProgressBarManager.swift in Sources */, 3662A0F82A6577E000F482EF /* IdValidRequestQueryDTO.swift in Sources */, C3FF24992A5EAEA400A97D40 /* MyYelloModel.swift in Sources */, 3662A0EC2A64477300F482EF /* SignUpRequestDTO.swift in Sources */, + 2A5E08FC2B66935B00CDB3DF /* NotificationTarget.swift in Sources */, C30F81072A7F6A63009DBB8D /* MyYelloOnlyNameTableViewCell.swift in Sources */, C3A799E42A494D6800D3EFD8 /* UIImageView+.swift in Sources */, 36E4276D2A5BCE860050B34E /* AddFriendsViewController.swift in Sources */, @@ -2251,11 +2725,14 @@ 2A3705E62A62E3BC001AAC93 /* MyYelloService.swift in Sources */, 2A3705D62A62E346001AAC93 /* RecommendingService.swift in Sources */, C305A5B22A85F997007C4A69 /* PaymentConfirmView.swift in Sources */, + 36D98F3B2B617BBD003B2B11 /* EditProfileView.swift in Sources */, C31315B22A7CBA6F00FB8B43 /* MyYelloButton.swift in Sources */, C3C57BF72A5C0BD700B84CAA /* EmptyFriendView.swift in Sources */, 3662A0E42A63F6C300F482EF /* CheckDuplicateResponeDTO.swift in Sources */, + 36AD1FB22B85D35F004E2083 /* YelloLoadingView.swift in Sources */, C3C560CF2A8BB96B0074E988 /* IAPService.swift in Sources */, C3A799EC2A494D6800D3EFD8 /* UIStackView+.swift in Sources */, + 2A8172892B71D9DF004C0B9C /* EventPointView.swift in Sources */, C3A799E62A494D6800D3EFD8 /* Int+.swift in Sources */, 2AFB01482A8A79A5001BB2C7 /* VotingUnreadResponseDTO.swift in Sources */, 367113712A7D6C740037E0D2 /* UniversityView.swift in Sources */, @@ -2274,6 +2751,7 @@ 3662A0F42A654A6000F482EF /* MajorSearchResponseDTO.swift in Sources */, C3E4B7012A682A4C001A0355 /* FriendEmptyTableViewCell.swift in Sources */, C3A799D22A494CFF00D3EFD8 /* NetworkResult.swift in Sources */, + 2A55DDA52B669BCC00290FE8 /* NotificationView.swift in Sources */, C3D266472A5C77A20041C7C7 /* MyFriendTableViewCell.swift in Sources */, 36E427752A5BCE860050B34E /* YelloHelperButton.swift in Sources */, C3FF24752A5D6E9500A97D40 /* WithdrawalAlertView.swift in Sources */, @@ -2304,6 +2782,7 @@ C3FF24952A5E906B00A97D40 /* MyYelloKeywordTableViewCell.swift in Sources */, C307ECBA2A612831000F5BA9 /* MyProfileFriendModel.swift in Sources */, C3FF246C2A5D476D00A97D40 /* WithdrawalViewController.swift in Sources */, + 2A5E08FE2B6693FD00CDB3DF /* NotificationService.swift in Sources */, C32322F52A619E92006DA50B /* PaymentView.swift in Sources */, 36E427732A5BCE860050B34E /* YelloTextField.swift in Sources */, 2A3705CA2A62E2A2001AAC93 /* KakaoLoginResponseDTO.swift in Sources */, @@ -2311,20 +2790,29 @@ 2AD1A1D42A5C3FC200CB988B /* VotingDummy.swift in Sources */, C3B472122A65E17E00770530 /* MyYelloDetailNameResponseDTO.swift in Sources */, C39D3D842A8F511B00DE93EC /* PurchaseSubscibeNeedResponseDTO.swift in Sources */, + 36D98F352B5FB2B7003B2B11 /* MainProfileView.swift in Sources */, C3D2664C2A5D1F4C0041C7C7 /* ProfileSettingViewController.swift in Sources */, 363D815F2B2616040095F6CC /* NameCheckView.swift in Sources */, + 36ECE0E82B68B2EE000FCCBF /* EditSchoolInfoViewController.swift in Sources */, 367113732A7D6CED0037E0D2 /* UniversityViewController.swift in Sources */, C3291A082A920D84007F2CF5 /* AppStoreCheck.swift in Sources */, + 36D98F3D2B617DD7003B2B11 /* EditProfileTableViewCell.swift in Sources */, 3662A0F62A654B8D00F482EF /* JoinedFriendsRequestDTO.swift in Sources */, + 36B7CAB52B6BECF2003C57FF /* DateConverter.swift in Sources */, C3C57BC12A56FCA600B84CAA /* AroundView.swift in Sources */, C3C57BC52A5715E600B84CAA /* KakaoFriendViewController.swift in Sources */, 36E2181E2A5D17D000FB3C9C /* SearchBaseViewController.swift in Sources */, C3C57BF92A5C181A00B84CAA /* SchoolFriendView.swift in Sources */, C3C57BEC2A5C03BA00B84CAA /* InviteBannerView.swift in Sources */, + 2A8172942B726B79004C0B9C /* EventTarget.swift in Sources */, + 36CDA9142B8208C400AC248E /* RewardServices.swift in Sources */, C3A799E92A494D6800D3EFD8 /* UITextField+.swift in Sources */, + 2A5E08FA2B6692DD00CDB3DF /* NotificationResponseDTO.swift in Sources */, C390B8142A8A1DD800EA5A23 /* AroundResponseDTO.swift in Sources */, + C3C5D8232B628AC500C8D27C /* ReasonHeaderView.swift in Sources */, 2A3705DA2A62E35F001AAC93 /* VotingAvailableResponseDTO.swift in Sources */, 36BF1DE42A7A30CF00C58E74 /* SchoolSelectView.swift in Sources */, + 2A8172A12B72A1B3004C0B9C /* EventRequestDTO.swift in Sources */, C3D266392A5C710D0041C7C7 /* NavigationBarView.swift in Sources */, 36BE79C02AC0820100F4AB83 /* HighSchoolClassResponseDTO.swift in Sources */, 3628EAEC2A609E1D00D5FA40 /* SplashTitleView.swift in Sources */, @@ -2332,6 +2820,7 @@ C306E7432A6520830031514C /* ProfileUserResponseDTO.swift in Sources */, C3BF63022AF7DE09000C7900 /* InstagramButton.swift in Sources */, C363D4722A780F0D00FD583D /* AroundEmptyView.swift in Sources */, + 36B7CAAF2B6BD822003C57FF /* ProfileUpadateDateResponseDTO.swift in Sources */, C3C57BC32A5715C600B84CAA /* RecommendingSegmentedControl.swift in Sources */, 2A8D66D22A97C5AE009DEC3F /* NetworkCheck.swift in Sources */, 3628EAE82A608F0200D5FA40 /* SplashViewController.swift in Sources */, @@ -2347,10 +2836,12 @@ C390B8182A8A1DF600EA5A23 /* AroundService.swift in Sources */, C3B4720E2A65DEC700770530 /* MyYelloDetailResponseDTO.swift in Sources */, 363D81612B261ABF0095F6CC /* NameCheckViewController.swift in Sources */, + C30F45262B77649700803BE5 /* CloseButton.swift in Sources */, C30F81032A7F51E6009DBB8D /* UseTicketView.swift in Sources */, 2A3705AC2A62DCB2001AAC93 /* NetworkService.swift in Sources */, 3662A0F22A65498800F482EF /* MajorSearchRequestQueryDTO.swift in Sources */, C3C57BF02A5C06C600B84CAA /* KakaoFriendView.swift in Sources */, + C3BAECD02B40184800F8FD74 /* RecommendFriendProfileView.swift in Sources */, 36BE79BE2AC081A000F4AB83 /* HighSchoolClassRequestQueryDTO.swift in Sources */, 2AA0DBC12A552D63002B1370 /* YELLOTabBarItem.swift in Sources */, C3B4720A2A65B1CB00770530 /* MyYelloRequestQueryDTO.swift in Sources */, @@ -2363,8 +2854,11 @@ 2AD1A1B82A57476C00CB988B /* VotingStartViewController.swift in Sources */, 2A8D66D92A9A363A009DEC3F /* SubscriptionExtensionView.swift in Sources */, C3A4615B2A4FD44800734EF8 /* adjust+.swift in Sources */, + 2A8172812B71CCD5004C0B9C /* LunchEventView.swift in Sources */, 36B234962A61466A007933E4 /* YelloHelperLabel.swift in Sources */, C3BF63042AF7E1EA000C7900 /* TimeLineTableViewCell.swift in Sources */, + 365CD6FA2B81D86600245CDD /* AppTracking.swift in Sources */, + 36CDA9082B82078000AC248E /* RewardPossibleRequestQueryDTO.swift in Sources */, 366CE5EC2A819CA600BE5F66 /* PushSettingView.swift in Sources */, 2A3705A42A62DC5C001AAC93 /* TargetType.swift in Sources */, 2A8AA7012A64A333005A664D /* VotingSuffleResponseDTO.swift in Sources */, @@ -2383,20 +2877,27 @@ C3A799C22A494B0F00D3EFD8 /* Font.swift in Sources */, C363D46D2A78050600FD583D /* AroundTableViewCell.swift in Sources */, C3FF24B32A5F4D1F00A97D40 /* BasePaddingLabel.swift in Sources */, + C303C8262B6009C70077C423 /* ReasonCollectionViewCell.swift in Sources */, C3FF246F2A5D47D100A97D40 /* WithdrawalView.swift in Sources */, + 2A8172832B71D279004C0B9C /* LunchEventViewController.swift in Sources */, 362EC3192A8BAC8E00121BDD /* ThirdTutorialView.swift in Sources */, C3A799C02A494B0200D3EFD8 /* String.swift in Sources */, C306E73D2A6455CA0031514C /* RecommendingFriendResponseDTO.swift in Sources */, C3A799CB2A494C7500D3EFD8 /* BaseViewController.swift in Sources */, C30F81092A7F732B009DBB8D /* HintButton.swift in Sources */, + C303C8242B6005980077C423 /* WithdrawalReasonView.swift in Sources */, C3FF24A42A5EEBF100A97D40 /* DetailSenderView.swift in Sources */, C3B83E682A8E08D500A39CAC /* PurchaseService.swift in Sources */, 36C4C4A62AB8C29400F968B7 /* HighSchoolSearchRequestQueryDTO.swift in Sources */, + 2A81728F2B726ADB004C0B9C /* EventResponseDTO.swift in Sources */, C3B472142A65E24900770530 /* PayRequestBodyDTO.swift in Sources */, C3FF24732A5D47EB00A97D40 /* WithdrawalCheckViewController.swift in Sources */, 2A3705DC2A62E386001AAC93 /* VotingTarget.swift in Sources */, C3DC4ADA2A5FE713001DCE04 /* PaymentViewController.swift in Sources */, + 366885AC2B775FA9009AFB0C /* Array+.swift in Sources */, 367DA01B2A863CE60043D23C /* HighSchoolViewController.swift in Sources */, + C32CEABA2B760DED00692982 /* DeleteRequestDTO.swift in Sources */, + C303C8222B6005500077C423 /* WithdrawalReasonViewController.swift in Sources */, 2AD1A1D62A5C952000CB988B /* VotingFunction.swift in Sources */, C3D2664F2A5D1FA50041C7C7 /* SettingNavigationBarView.swift in Sources */, 2A3705C82A62E297001AAC93 /* SignUpResponseDTO.swift in Sources */, @@ -2409,10 +2910,12 @@ 36E218202A5D2E3B00FB3C9C /* SearchResultTableViewCell.swift in Sources */, 2A3705DE2A62E392001AAC93 /* VotingService.swift in Sources */, 36B2349C2A61A22F007933E4 /* KakaoLoginView.swift in Sources */, + 36CDA9102B82084D00AC248E /* RewardResponseDTO.swift in Sources */, 362EC31B2A8BAD1E00121BDD /* FourthTutorialView.swift in Sources */, 36E4276C2A5BCE860050B34E /* OnboardingViewController.swift in Sources */, 367F1CD42A54193700CDF47B /* UIColor+.swift in Sources */, C3A799E32A494D6800D3EFD8 /* NSObject+.swift in Sources */, + 36D98F372B602442003B2B11 /* InfoView.swift in Sources */, 3662A0EA2A64437900F482EF /* KakaoLoginRequestDTO.swift in Sources */, 36BF1DE82A7A5FCF00C58E74 /* YelloProgressBarView.swift in Sources */, C3A799CD2A494C8600D3EFD8 /* BaseView.swift in Sources */, @@ -2423,6 +2926,7 @@ C3A799D02A494CEC00D3EFD8 /* Config.swift in Sources */, C3FF24AF2A5F35FF00A97D40 /* UsePointView.swift in Sources */, 36E427742A5BCE860050B34E /* YelloTextFieldView.swift in Sources */, + 2A8172962B726BC8004C0B9C /* EventService.swift in Sources */, 2A423DF12A8F6F4E00F56C06 /* MyYelloDetailFullNameResponseDTO.swift in Sources */, 363D815D2B25E7B60095F6CC /* UIApplication.swift in Sources */, C31315A42A7A5B8700FB8B43 /* RecommendingNavigationBarView.swift in Sources */, @@ -2431,6 +2935,7 @@ 2AD1A1D22A5BD13700CB988B /* BaseVotingMainView.swift in Sources */, 2AD1A1BE2A595A2400CB988B /* VotingTimerViewController.swift in Sources */, C3D266432A5C771F0041C7C7 /* MyProfileHeaderView.swift in Sources */, + 2A8172A32B72AE3F004C0B9C /* EventRewardRsponseDTO.swift in Sources */, C3FF24792A5D798700A97D40 /* FriendProfileView.swift in Sources */, 3662A0FC2A65795200F482EF /* IdValidResponseDTO.swift in Sources */, C3A799992A49490A00D3EFD8 /* SceneDelegate.swift in Sources */, @@ -2438,6 +2943,7 @@ C31315A62A7A5E9400FB8B43 /* FriendSearchViewController.swift in Sources */, C3FF24932A5E903C00A97D40 /* MyYelloDefaultTableViewCell.swift in Sources */, 36E427952A5CA59F0050B34E /* OnboardingEndViewController.swift in Sources */, + 36CDA90A2B8207B900AC248E /* RewardPossibleResponseDTO.swift in Sources */, 2AA0DBB22A546E4B002B1370 /* AroundViewController.swift in Sources */, C307ECB82A60FE2D000F5BA9 /* NextButton.swift in Sources */, C3B472162A65EB0900770530 /* PaymenyResponseDTO.swift in Sources */, @@ -2541,18 +3047,19 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "YELLO-iOS/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "YELL:O"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "관심사에 맞는 콘텐츠와 광고를 제공하고 부적절한 광고를 제어하는 데에 사용합니다"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = ""; INFOPLIST_KEY_UIRequiresFullScreen = NO; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.16.1; - OTHER_LDFLAGS = "-ObjC"; + MARKETING_VERSION = 2.0.0; + OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = YELLO.iOS.dev; PRODUCT_NAME = "$(Yello_Bundle_Name)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2704,18 +3211,19 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "YELLO-iOS/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "YELL:O"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "관심사에 맞는 콘텐츠와 광고를 제공하고 부적절한 광고를 제어하는 데에 사용합니다"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = ""; INFOPLIST_KEY_UIRequiresFullScreen = NO; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.16.1; - OTHER_LDFLAGS = "-ObjC"; + MARKETING_VERSION = 2.0.0; + OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = YELLO.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2745,18 +3253,19 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "YELLO-iOS/Info.plist"; INFOPLIST_KEY_CFBundleDisplayName = "YELL:O"; + INFOPLIST_KEY_NSUserTrackingUsageDescription = "관심사에 맞는 콘텐츠와 광고를 제공하고 부적절한 광고를 제어하는 데에 사용합니다"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = ""; INFOPLIST_KEY_UIRequiresFullScreen = NO; INFOPLIST_KEY_UIStatusBarStyle = UIStatusBarStyleLightContent; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = UIInterfaceOrientationPortrait; - IPHONEOS_DEPLOYMENT_TARGET = 14.1; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.16.1; - OTHER_LDFLAGS = "-ObjC"; + MARKETING_VERSION = 2.0.0; + OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = YELLO.iOS; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2813,6 +3322,14 @@ minimumVersion = 4.0.0; }; }; + 365CD6AD2B7DEFDD00245CDD /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/googleads/swift-package-manager-google-mobile-ads.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 11.0.1; + }; + }; 36A3B26D2A8D233600BA7CE0 /* XCRemoteSwiftPackageReference "Amplitude-iOS" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/amplitude/Amplitude-iOS"; @@ -2882,6 +3399,11 @@ package = 2ADE23A82A5EB7660088FCB3 /* XCRemoteSwiftPackageReference "lottie-ios" */; productName = Lottie; }; + 365CD6AE2B7DEFDD00245CDD /* GoogleMobileAds */ = { + isa = XCSwiftPackageProductDependency; + package = 365CD6AD2B7DEFDD00245CDD /* XCRemoteSwiftPackageReference "swift-package-manager-google-mobile-ads" */; + productName = GoogleMobileAds; + }; 36A3B26E2A8D233600BA7CE0 /* Amplitude */ = { isa = XCSwiftPackageProductDependency; package = 36A3B26D2A8D233600BA7CE0 /* XCRemoteSwiftPackageReference "Amplitude-iOS" */; diff --git a/YELLO-iOS/YELLO-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/YELLO-iOS/YELLO-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 2f2ffe5b..5cbf645b 100644 --- a/YELLO-iOS/YELLO-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/YELLO-iOS/YELLO-iOS.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -162,6 +162,24 @@ "version" : "5.6.0" } }, + { + "identity" : "swift-package-manager-google-mobile-ads", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-mobile-ads.git", + "state" : { + "revision" : "4668daa078c7e104df9f5b8a80a7638cab19bb4e", + "version" : "11.0.1" + } + }, + { + "identity" : "swift-package-manager-google-user-messaging-platform", + "kind" : "remoteSourceControl", + "location" : "https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git", + "state" : { + "revision" : "129fa838520cd02174f890ae0cfe0242e60714ae", + "version" : "2.1.0" + } + }, { "identity" : "swift-protobuf", "kind" : "remoteSourceControl", diff --git a/YELLO-iOS/YELLO-iOS.xcodeproj/xcshareddata/xcschemes/YELLO_dev.xcscheme b/YELLO-iOS/YELLO-iOS.xcodeproj/xcshareddata/xcschemes/YELLO_dev.xcscheme index f4b62c99..12770778 100644 --- a/YELLO-iOS/YELLO-iOS.xcodeproj/xcshareddata/xcschemes/YELLO_dev.xcscheme +++ b/YELLO-iOS/YELLO-iOS.xcodeproj/xcshareddata/xcschemes/YELLO_dev.xcscheme @@ -49,6 +49,13 @@ ReferencedContainer = "container:YELLO-iOS.xcodeproj"> + + + + 0 && splitMarketingVersion.count > 0 { - if splitCurrentProjectVersion[0] < splitMarketingVersion[0] { - self.showUpdateAlert(version: marketingVersion) - } else if splitCurrentProjectVersion[1] < splitMarketingVersion[1] { + + if splitCurrentProjectVersion[0] > splitMarketingVersion[0] { + print("현재 최신 버전입니다.") + } else if splitCurrentProjectVersion[0] < splitMarketingVersion[0] || splitCurrentProjectVersion[1] < splitMarketingVersion[1] { self.showUpdateAlert(version: marketingVersion) } else { -// print(marketingVersion) -// print(currentProjectVersion) -// print(splitMarketingVersion) -// print(splitCurrentProjectVersion) print("현재 최신 버전입니다.") } } diff --git a/YELLO-iOS/YELLO-iOS/Global/Extensions/Array+.swift b/YELLO-iOS/YELLO-iOS/Global/Extensions/Array+.swift new file mode 100644 index 00000000..d429114b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Extensions/Array+.swift @@ -0,0 +1,20 @@ +// +// Array+.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/10/24. +// + +import Foundation + +extension Array { + subscript (safe index: Array.Index) -> Element? { + get { + return indices ~= index ? self[index] : nil + } + set { + guard let element = newValue else { return } + self[index] = element + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Literals/Image.swift b/YELLO-iOS/YELLO-iOS/Global/Literals/Image.swift index cbc54577..57986c25 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Literals/Image.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Literals/Image.swift @@ -124,6 +124,8 @@ enum ImageLiterals { enum Around { static var imgAround: UIImage { .load(named: "imgAround") } static var icPolygon: UIImage { .load(named: "icPolygon") } + static var icInformation: UIImage { .load(named: "icInformation") } + static var icChevronDownGray: UIImage { .load(named: "icChevronDownGray") } } enum MyYello { @@ -143,6 +145,7 @@ enum ImageLiterals { static var icKeyWhite: UIImage { .load(named: "icKeyWhite") } static var icShop: UIImage { .load(named: "icShop") } static var icSalePolygon: UIImage { .load(named: "icSalePolygon") } + static var icMegaphone: UIImage { .load(named: "icMegaphone") } } enum Profile { @@ -150,8 +153,13 @@ enum ImageLiterals { static var icPlus: UIImage { .load(named: "icPlus") } static var icArrowUp: UIImage { .load(named: "icArrowUp") } static var icArrowLeftWhite: UIImage { .load(named: "icArrowLeftWhite") } + static var icRight: UIImage { .load(named: "icRight")} + static var icRightSmall: UIImage { .load(named: "chevron-right-small")} static var btnDelete: UIImage { .load(named: "btnDelete") } static var icProfileStar: UIImage { .load(named: "icProfileStar") } + static var icEdit: UIImage { .load(named: "ic_Edit") } + static var icRotate: UIImage { .load(named: "rotate-ccw") } + static var icAlert: UIImage { .load(named: "alert-circle") } } enum Recommending { @@ -162,6 +170,7 @@ enum ImageLiterals { static var icSearchWhite: UIImage { .load(named: "icSearchWhite")} static var imgFriendSearch: UIImage { .load(named: "imgFriendSearch")} static var imgSearchNoResult: UIImage { .load(named: "imgSearchNoResult")} + static var btnAddFriend: UIImage { .load(named: "btnAddFriend")} } enum Payment { @@ -181,6 +190,7 @@ enum ImageLiterals { static var imgNameKeyOneCheck: UIImage { .load(named: "imgNameKeyOneCheck")} static var imgNameKeyTwoCheck: UIImage { .load(named: "imgNameKeyTwoCheck")} static var imgNameKeyFiveCheck: UIImage { .load(named: "imgNameKeyFiveCheck")} + static var imgCoin: UIImage { .load(named: "coin")} } enum Withdrawal { diff --git a/YELLO-iOS/YELLO-iOS/Global/Literals/String.swift b/YELLO-iOS/YELLO-iOS/Global/Literals/String.swift index c95eaf33..7cee67fa 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Literals/String.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Literals/String.swift @@ -37,12 +37,21 @@ enum StringLiterals { static let checkYesButton = "네, 맞아요" static let checkNoButton = "제 이름이 아니에요" static let checkTitle = "님이 맞으신가요?" + static let nextButtonText = "수정 완료" } enum SchoolSelect { static let selectHighText = "중/고등학생" static let selectUnivText = "대학생" } + + enum Search { + static let schoolSearchTitle = "우리 학교 검색하기" + static let schoolHelperText = "우리 학교가 없나요? 학교를 추가해보세요!" + static let majorSearchTitle = "학과 검색하기" + static let majorHelperText = "찾는 과가 없다면 클릭하세요!" + } + enum School { static let schoolSearchText = "학교가 어디인가요?" static let highSchoolSearchPlaceholder = "ex. 옐로중/고등학교" @@ -61,7 +70,7 @@ enum StringLiterals { static let title = "나의 이름은?" static let namePlaceHolder = "ex.김옐로" static let nameHelper = "이후에는 이름 수정이 어려우니 실제 이름을 적어주세요." - static let nameError = "특수문자, 한글 외 문자는 입력할 수 없어요." + static let nameError = "한글만 입력 가능해요." } enum Id { @@ -113,8 +122,10 @@ enum StringLiterals { enum Inviting { static let title = "친구 초대하기" - static let firstText = "친구가 내 추천인 코드로 가입하면" - static let secondText = "40분 대기 초기화 + 100포인트 지급!" + static let firstText = "친구가 내 추천인 코드로 가입하면," + static let secondText = "40분 대기 초기화 + 100포인트" + static let thirdText = "내 추천인 코드가 처음 쓰였다면?!" + static let fourthText = "열람권 1개 추가 지급!" static let toastMessage = "링크가 복사되었습니다." } @@ -123,12 +134,14 @@ enum StringLiterals { static let recommend = "추천친구" static let kakaoFriend = "카톡 친구들" static let schoolFriend = "학교 친구들" - static let defaultProfileImageLink = "https://k.kakaocdn.net/dn/dpk9l1/btqmGhA2lKL/Oz0wDuJn1YV2DIn92f6DVK/img_640x640.jpg" + static let defaultProfileImageLink = "https://k.kakaocdn.net/dn/1G9kp/btsAot8liOn/8CWudi3uy07rvFNUkk3ER0/img_640x640.jpg" } enum Empty { static let title = "찾는 친구가 없다면\n친구를 초대해볼까요?" - static let inviteButton = "친구 초대하고 100포인트받기" + static let timeLineAllTitle = "친구들이 받은 쪽지가 궁금하다면\n친구를 초대해볼까요?" + static let timeLineMyTitle = "쪽지를 보낼 친구가 없다면\n친구를 초대하세요!" + static let inviteButton = "친구 초대하고 리워드 받기" } enum Invite { @@ -138,7 +151,7 @@ enum StringLiterals { enum Search { static let title = "친구 검색" - static let placeholder = " 이름 또는 아이디를 입력해보세요!" + static let placeholder = " 이름/학교/아이디로 검색해보세요!" static let myFriend = "내 친구" static let loading = "친구를 찾는 중이에요..." static let searching = "찾는 친구의 결과가 없어요." @@ -152,13 +165,18 @@ enum StringLiterals { static let male = "남학생" static let receiveFemale = "여학생에게 받음" static let receiveMale = "남학생에게 받음" + static let info = "쪽지를 보낸 사람의 이름은 공개되지 않아요." + static let allYello = "모든 쪽지" + static let myYello = "내가 보낸 쪽지" + static let fromMe = "나에게 받음" } enum Voting { enum Locked { static let title = "옐로를 시작하고 싶다면?" - static let text = "친구가 4명 이상 모이면 투표할 수 있어요.\n친구들을 초대해볼까요?" + static let text = "친구가 1명 이상 있어야 투표할 수 있어요.\n친구들을 초대해볼까요?" + static let button = "친구 초대하고 옐로 시작하기" } enum Start { @@ -189,7 +207,11 @@ enum StringLiterals { } enum Point { + static let yelloButtonText = "확인" + static let cancelButtonText = "그냥 받기" + static let rewardAdButtonText = "광고보고 2배로 받기" static let title = "투표 포인트 적립!" + static let adTitle = "광고보고 2배로 받기" static let text = "투표로 포인트를 모아 쪽지를 열어보세요." } @@ -202,6 +224,7 @@ enum StringLiterals { enum MyYello { enum NavigationBar { static let myYello = "내 쪽지" + static let clickMe = "CLICK ME" static let yelloNumber = "받은 쪽지" static let shop = "상점" static let sale = "SALE" @@ -226,7 +249,7 @@ enum StringLiterals { static let send = "님이 보냄" static let female = "익명의 여학생" static let male = "익명의 남학생" - static let instagram = "스토리 공유하기" + static let instagram = "스토리 공유" static let keywordButton = "100포인트로 키워드 확인하기" static let sendButton = "300포인트로 초성 1개 확인하기" static let plusSendButton = "0포인트로 초성 1개 확인하기" @@ -264,10 +287,10 @@ enum StringLiterals { static let description = "결제 기능은 아직 구현되지 않았어요.\n곧 기능을 준비할게요!" static let back = "나가기" static let paymentTitle = "옐로플러스로\n친구들의 속마음을 열어보세요!" - static let paymentSender = "쪽지 보낸 사람을 알고 싶다면?" + static let paymentSender = "쪽지를 열고 싶다면?" static let yelloPlusTitle = "옐로플러스의 특별한 혜택은?" - static let subscribing = "옐로플러스 구독 중" + static let subscribing = "구독 중" static let yelloPlusSubscribe = "옐로플러스 구독하기" static let discount50Percent = "(63%할인)" static let yelloPlusPriceBefore = "7900원" @@ -275,14 +298,14 @@ enum StringLiterals { static let forWeek = "/주" static let sale = "SALE!" - static let nameKeyOne = "이름 열람권 1개" + static let nameKeyOne = "이름 열람권\n1개" static let nameKeyOnePrice = "1400원" static let nameKeyOneSalePrice = "990원" - static let nameKeyTwo = "이름 열람권 2개" + static let nameKeyTwo = "이름 열람권\n2개" static let nameKeyTwoPrice = "2800원" static let nameKeyTwoSalePrice = "1900원" - static let nameKeyFive = "이름 열람권 5개" - static let discount = " 할인!" + static let nameKeyFive = "이름 열람권\n5개" + static let discount = "할인!" static let nameKeyFivePriceBefore = "7000원" static let nameKeyFivePrice = "3900원" @@ -293,6 +316,13 @@ enum StringLiterals { static let paymentAlertKeyFiveTitle = "열람권 5개를 얻었어요!" static let paymentAlertKeyDescription = "열람권으로 누가 쪽지를 보냈는지 알아보세요." + static let votingPointTitle = "투표하고 포인트 얻기" + static let votingPoint = "최대 200p" + static let adPointTitle = "광고 보고 포인트 얻기" + static let adPointsubTitle = "1시간에 한 번" + static let adPoint = "10p" + static let adPointErrorToast = "1시간에 한 번 재생할 수 있어요." + static let descriptionLabel = "옐로플러스 구독안내\n- 구독은 매주 자동으로 갱신되며, Apple을 통해 해지하실 수 있습니다.\n- 결제를 진행하시면 관련 약관에 동의하는 것으로 간주됩니다." static let serviceButton = "서비스 이용 약관" static let privacyButton = "개인정보처리방침" @@ -302,7 +332,7 @@ enum StringLiterals { enum Profile { enum NavigationBar { static let profile = "프로필" - static let setting = "관리" + static let setting = "설정" } enum Count { @@ -330,8 +360,33 @@ enum StringLiterals { static let toastMessage = " 님과 친구 끊기를 완료했어요." } + enum EditProfile { + static let KakaoDefaultProfileURL = "https://k.kakaocdn.net/dn/1G9kp/btsAot8liOn/8CWudi3uy07rvFNUkk3ER0/img_640x640.jpg" + static let profileInfoTitle = "프로필 정보" + static let kakaoSync = "카카오톡 동기화" + static let name = "이름" + static let id = "아이디" + static let school = "학교" + static let major = "학과" + static let studentId = "학번" + static let grade = "학년" + static let schoolClass = "반" + static let defaultText = "-" + + static let profileEditTitle = "프로필 수정" + static let guideText = "1년에 한 번만 수정할 수 있어요.\n신중히 수정해 주세요!" + static let modifireDateText = "마지막 수정일 : " + static let majorErrorMessage = "학과를 입력해야 수정할 수 있어요." + static let editDateErrorMessage = "올해 안에 수정한 기록이 있어요." + static let notYetErrorMessage = "수정할 정보가 없어요" + + static let saveButton = "저장" + static let convertHighButton = "중/고등학생으로 전환" + static let convertUnivButton = "대학생으로 전환" + } + enum Setting { - static let setting = "프로필 관리" + static let setting = "설정" static let center = "고객센터" static let privacy = "개인정보 처리방침" static let service = "이용약관" @@ -366,6 +421,20 @@ enum StringLiterals { static let no = "아니요" static let yes = "네, 탈퇴합니다" } + + enum WithdrawalReason { + static let title = "탈퇴 사유를 적어주세요." + static let nobody = "앱에 아는 사람들이 없어서" + static let expensive = "구독권과 열람권의 가격이 비싸서" + static let error = "오류가 많아서" + static let notFunny = "재밌는 콘텐츠 또는 질문이 없어서" + static let lessPoint = "포인트를 너무 적게 줘서" + static let delete = "내 정보를 삭제하고 싶어서" + static let otherApp = "다른 앱이 더 재밌어서" + static let etc = "기타" + static let etcReason = "사유를 적어주세요.(최대 30자)" + static let complete = "완료" + } } enum PushAlarm { @@ -383,4 +452,26 @@ enum StringLiterals { static let unsubscribeLabel = "옐로플러스의 구독을 해지했어요." static let benefitLabel = "곧 위와 같은 혜택을 누릴 수 없게 돼요.\n\n옐로플러스의 특별한 서비스를\n계속 이용하시려면, 버튼을 눌러\n구독을 계속해 보세요!" } + + enum Notification { + static let doNotSeeAgainLabel = "다시 보지 않기" + static let close = "닫기" + } + + enum Event { + static let eventTime = "EVENT TIME" + static let present = "점심시간 깜짝 선물!" + static let time = "평일 12~14시 최대 1회까지 참여 가능" + static let touch = "어떤 게 나올까요? 아래 박스를 터치해보세요!" + static let point = "포인트를 얻었어요!" + static let nextTime = "다음 점심 시간에 또 만나요!" + static let ticket = "열람권 1개를 얻었어요!" + } + + enum Reward { + static let admobReward = "ADMOB_POINT" + static let admobMultipleReward = "ADMOB_MULTIPLE_POINT" + static let fix = "FIXED" + static let random = "ADMOB_RANDOM" + } } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/Contents.json index 489fd1e9..f5d34497 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_1-SE.png", + "filename" : "tutorial_1_short.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_1-SE@2x.png", + "filename" : "tutorial_1_short@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_1-SE@3x.png", + "filename" : "tutorial_1_short@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE.png deleted file mode 100644 index 59e3ebf3..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@2x.png deleted file mode 100644 index 894b6ee4..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@3x.png deleted file mode 100644 index e88df4c3..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1-SE@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short.png new file mode 100644 index 00000000..f052f0ed Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@2x.png new file mode 100644 index 00000000..144bd123 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@3x.png new file mode 100644 index 00000000..e25f9488 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial1.imageset/tutorial_1_short@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/Contents.json index e127b0c2..001c5dd2 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_2.png", + "filename" : "tutorial_2_short.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_2@2x.png", + "filename" : "tutorial_2_short@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_2@3x.png", + "filename" : "tutorial_2_short@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2.png deleted file mode 100644 index c30dcda6..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@2x.png deleted file mode 100644 index 0fcd1171..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@3x.png deleted file mode 100644 index 0028e389..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short.png new file mode 100644 index 00000000..89f6e321 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@2x.png new file mode 100644 index 00000000..a0714a8e Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@3x.png new file mode 100644 index 00000000..09db3621 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial2.imageset/tutorial_2_short@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/Contents.json index c3545889..d4a2fdd9 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_3.png", + "filename" : "tutorial_3_short.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_3@2x.png", + "filename" : "tutorial_3_short@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_3@3x.png", + "filename" : "tutorial_3_short@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3.png deleted file mode 100644 index 31f70034..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@2x.png deleted file mode 100644 index 48b16cd5..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@3x.png deleted file mode 100644 index 359b656d..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short.png new file mode 100644 index 00000000..b34233d3 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@2x.png new file mode 100644 index 00000000..cdb7ede8 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@3x.png new file mode 100644 index 00000000..2ce64199 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial3.imageset/tutorial_3_short@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/Contents.json index 9f1114fc..5c7b13d1 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_4.png", + "filename" : "tutorial_4_short.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_4@2x.png", + "filename" : "tutorial_4_short@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_4@3x.png", + "filename" : "tutorial_4_short@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4.png deleted file mode 100644 index cc20a17e..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@2x.png deleted file mode 100644 index 93bc7707..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@3x.png deleted file mode 100644 index f34203d0..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short.png new file mode 100644 index 00000000..5a36cbc0 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@2x.png new file mode 100644 index 00000000..cb3d87a9 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@3x.png new file mode 100644 index 00000000..161df463 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorial4.imageset/tutorial_4_short@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/Contents.json index 122bf4a7..8463f90a 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_1-mini.png", + "filename" : "tutorial_1.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_1-mini@2x.png", + "filename" : "tutorial_1@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_1-mini@3x.png", + "filename" : "tutorial_1@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini.png deleted file mode 100644 index 9994b633..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@2x.png deleted file mode 100644 index 7f6cae7a..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@3x.png deleted file mode 100644 index 1c2ab214..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1-mini@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1.png new file mode 100644 index 00000000..94ed69ed Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@2x.png new file mode 100644 index 00000000..686067fd Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@3x.png new file mode 100644 index 00000000..e4a68978 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong1.imageset/tutorial_1@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2.png index 71c21ae9..3213fbcc 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@2x.png index 1e204bf6..1268a729 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@3x.png index c14325e3..1a9f9b5b 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong2.imageset/tutorial_2@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3.png index 94fa1078..59c663dc 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@2x.png index 35efbc92..2896a614 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@3x.png index d966d2e3..6a05ee6f 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong3.imageset/tutorial_3@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4.png index 2a2d9034..99abf9e7 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@2x.png index 77fc372f..1188f48b 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@3x.png index fd1e994c..8551838f 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialLong4.imageset/tutorial_4@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/Contents.json index 6e993407..0a4e65fa 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_1-long.png", + "filename" : "tutorial_1_long.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_1-long@2x.png", + "filename" : "tutorial_1_long@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_1-long@3x.png", + "filename" : "tutorial_1_long@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long.png deleted file mode 100644 index 0058f08f..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@2x.png deleted file mode 100644 index 86d5c158..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@3x.png deleted file mode 100644 index 5531cce2..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1-long@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long.png new file mode 100644 index 00000000..3ca591bd Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@2x.png new file mode 100644 index 00000000..6b588e9c Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@3x.png new file mode 100644 index 00000000..04023860 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong1.imageset/tutorial_1_long@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/Contents.json index e127b0c2..ba05154c 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_2.png", + "filename" : "tutorial_2_long.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_2@2x.png", + "filename" : "tutorial_2_long@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_2@3x.png", + "filename" : "tutorial_2_long@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2.png deleted file mode 100644 index 8e0ef1f6..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@2x.png deleted file mode 100644 index 23ef622c..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@3x.png deleted file mode 100644 index e3782bce..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long.png new file mode 100644 index 00000000..9fef1cad Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@2x.png new file mode 100644 index 00000000..83ad0e30 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@3x.png new file mode 100644 index 00000000..6f350622 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong2.imageset/tutorial_2_long@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/Contents.json index c3545889..b3730110 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_3.png", + "filename" : "tutorial_3_long.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_3@2x.png", + "filename" : "tutorial_3_long@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_3@3x.png", + "filename" : "tutorial_3_long@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3.png deleted file mode 100644 index 1819fc91..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@2x.png deleted file mode 100644 index 9da0c511..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@3x.png deleted file mode 100644 index 5c95d49e..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long.png new file mode 100644 index 00000000..e5258a73 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@2x.png new file mode 100644 index 00000000..c05b3d35 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@3x.png new file mode 100644 index 00000000..a1313071 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong3.imageset/tutorial_3_long@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/Contents.json index 9f1114fc..0a5853ff 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "tutorial_4.png", + "filename" : "tutorial_4_long.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "tutorial_4@2x.png", + "filename" : "tutorial_4_long@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "tutorial_4@3x.png", + "filename" : "tutorial_4_long@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4.png deleted file mode 100644 index 1f45c801..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@2x.png deleted file mode 100644 index bb8efcf1..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@3x.png deleted file mode 100644 index 477f6005..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long.png new file mode 100644 index 00000000..e9bce8a3 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@2x.png new file mode 100644 index 00000000..545c62cf Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@3x.png new file mode 100644 index 00000000..a13f3d49 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/Tutorial/tutorialMaxLong4.imageset/tutorial_4_long@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/Contents.json new file mode 100644 index 00000000..53134cb0 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "alert-circle.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "alert-circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "alert-circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle.png new file mode 100644 index 00000000..8f57c107 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@2x.png new file mode 100644 index 00000000..721ba918 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@3x.png new file mode 100644 index 00000000..39a9d4df Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/alert-circle.imageset/alert-circle@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Contents.json new file mode 100644 index 00000000..4d9dc6c5 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame 1171275636.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 1171275636@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 1171275636@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636.png new file mode 100644 index 00000000..995d8ea0 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@2x.png new file mode 100644 index 00000000..8baeb62d Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@3x.png new file mode 100644 index 00000000..216a4ce0 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnAddFriend.imageset/Frame 1171275636@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/Contents.json new file mode 100644 index 00000000..627429d5 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "box.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "box@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "box@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box.png new file mode 100644 index 00000000..194dbd1b Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@2x.png new file mode 100644 index 00000000..d91dd1e5 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@3x.png new file mode 100644 index 00000000..e3d58edb Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnCheckBox.imageset/box@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/Contents.json new file mode 100644 index 00000000..627429d5 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "box.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "box@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "box@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box.png new file mode 100644 index 00000000..e1665c25 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@2x.png new file mode 100644 index 00000000..e03f580b Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@3x.png new file mode 100644 index 00000000..a6d8e985 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/btnNotCheckBox.imageset/box@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/Contents.json new file mode 100644 index 00000000..e6ee84f1 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "chevron-right-small.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chevron-right-small@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chevron-right-small@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small.png new file mode 100644 index 00000000..4c962fe6 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@2x.png new file mode 100644 index 00000000..a8fe625c Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@3x.png new file mode 100644 index 00000000..569e15b6 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/chevron-right-small.imageset/chevron-right-small@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/Contents.json new file mode 100644 index 00000000..7bb5497b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "coin.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "coin@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "coin@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin.png new file mode 100644 index 00000000..07777bad Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@2x.png new file mode 100644 index 00000000..a63787e6 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@3x.png new file mode 100644 index 00000000..c317d7fe Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/coin.imageset/coin@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/Contents.json new file mode 100644 index 00000000..2f84b23b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "chevron_down_solid.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "chevron_down_solid@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "chevron_down_solid@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid.png new file mode 100644 index 00000000..db80dbc2 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@2x.png new file mode 100644 index 00000000..2714daec Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@3x.png new file mode 100644 index 00000000..23f7167e Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icChevronDownGray.imageset/chevron_down_solid@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/Contents.json new file mode 100644 index 00000000..53134cb0 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "alert-circle.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "alert-circle@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "alert-circle@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle.png new file mode 100644 index 00000000..5b532096 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@2x.png new file mode 100644 index 00000000..bbc5f73b Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@3x.png new file mode 100644 index 00000000..e890afe9 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icInformation.imageset/alert-circle@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share.png index 5064cbc6..8afae2dc 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@2x.png index c95a9aa9..0abd2bdb 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@3x.png index d7369fa8..0f8a9685 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icKakaoShare.imageset/kakao_share@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy.png index 7045e655..f9799830 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@2x.png index c697f534..252ccbf6 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@3x.png index 7e2f6f23..e0a5111e 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icLinkCopy.imageset/link_copy@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Contents.json new file mode 100644 index 00000000..e938c72b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Megaphone.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Megaphone@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Megaphone@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone.png new file mode 100644 index 00000000..bd510453 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@2x.png new file mode 100644 index 00000000..4c58171c Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@3x.png new file mode 100644 index 00000000..94bc05b4 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/icMegaphone.imageset/Megaphone@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/Contents.json new file mode 100644 index 00000000..b0b774a6 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "ic_Edit.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "ic_Edit@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "ic_Edit@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit.png new file mode 100644 index 00000000..d4362aba Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@2x.png new file mode 100644 index 00000000..0b9103b1 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@3x.png new file mode 100644 index 00000000..4bf5c4b1 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/ic_Edit.imageset/ic_Edit@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/Contents.json new file mode 100644 index 00000000..62dcd20b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "item_list.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "item_list@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "item_list@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list.png new file mode 100644 index 00000000..5d62687e Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@2x.png new file mode 100644 index 00000000..17e9b507 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@3x.png new file mode 100644 index 00000000..3407ebda Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgItemList.imageset/item_list@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/Contents.json index 544543d3..add923b2 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "icon5.png", + "filename" : "icon.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "icon5@2x.png", + "filename" : "icon@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "icon5@3x.png", + "filename" : "icon@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon.png new file mode 100644 index 00000000..1993d670 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5.png deleted file mode 100644 index 7770ed90..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@2x.png deleted file mode 100644 index c9e53058..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@3x.png deleted file mode 100644 index 64de36f3..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon5@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@2x.png new file mode 100644 index 00000000..3885a3d6 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@3x.png new file mode 100644 index 00000000..d9622853 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyFive.imageset/icon@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Contents.json index 35d066a4..c51a0b07 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "key.png", + "filename" : "Frame 1171275672.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "key@2x.png", + "filename" : "Frame 1171275672@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "key@3x.png", + "filename" : "Frame 1171275672@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672.png new file mode 100644 index 00000000..ea98bec4 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@2x.png new file mode 100644 index 00000000..b3ad2a3c Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@3x.png new file mode 100644 index 00000000..03c76ac6 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/Frame 1171275672@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key.png deleted file mode 100644 index a1bb9d32..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@2x.png deleted file mode 100644 index 8f42c284..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@3x.png deleted file mode 100644 index f2c08256..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyOne.imageset/key@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon.png index a1fb105c..7ace692c 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@2x.png index 26befc86..2b7b29b8 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@2x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@3x.png index ddf08734..efd18f77 100644 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@3x.png and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgNameKeyTwo.imageset/icon@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Contents.json index 3195e832..cfdd5cb1 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "Frame 1171275656.png", + "filename" : "imgPaymentFirst.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "Frame 1171275656@2x.png", + "filename" : "imgPaymentFirst@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Frame 1171275656@3x.png", + "filename" : "imgPaymentFirst@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656.png deleted file mode 100644 index 9e043273..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@2x.png deleted file mode 100644 index ea1ab061..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@3x.png deleted file mode 100644 index 1c5c3bde..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/Frame 1171275656@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst.png new file mode 100644 index 00000000..4ac94746 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@2x.png new file mode 100644 index 00000000..bb9d4e23 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@3x.png new file mode 100644 index 00000000..63b99edb Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFirst.imageset/imgPaymentFirst@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/Contents.json new file mode 100644 index 00000000..d909ee2c --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "imgPaymentFourth.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "imgPaymentFourth@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "imgPaymentFourth@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth.png new file mode 100644 index 00000000..7ab5fccd Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@2x.png new file mode 100644 index 00000000..0c43bf24 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@3x.png new file mode 100644 index 00000000..6ffd5a31 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentFourth.imageset/imgPaymentFourth@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Contents.json index 3195e832..df58c907 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "Frame 1171275656.png", + "filename" : "imgPaymentSecond.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "Frame 1171275656@2x.png", + "filename" : "imgPaymentSecond@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Frame 1171275656@3x.png", + "filename" : "imgPaymentSecond@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656.png deleted file mode 100644 index 62d6528d..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@2x.png deleted file mode 100644 index 16b06d24..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@2x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@3x.png deleted file mode 100644 index 50cb7664..00000000 Binary files a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/Frame 1171275656@3x.png and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond.png new file mode 100644 index 00000000..696d2a94 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@2x.png new file mode 100644 index 00000000..5fd36235 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@3x.png new file mode 100644 index 00000000..e166e427 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentSecond.imageset/imgPaymentSecond@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Contents.json index ca6a88c1..23090af9 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Contents.json +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Contents.json @@ -1,17 +1,17 @@ { "images" : [ { - "filename" : "Frame 1171275656ㅇㄴ.png", + "filename" : "imgPaymentThird.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "Frame 1171275656ㅇㄴ@2x.png", + "filename" : "imgPaymentThird@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "Frame 1171275656ㅇㄴ@3x.png", + "filename" : "imgPaymentThird@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264.png" "b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264.png" deleted file mode 100644 index 2d5afd85..00000000 Binary files "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264.png" and /dev/null differ diff --git "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@2x.png" "b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@2x.png" deleted file mode 100644 index ad23e79e..00000000 Binary files "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@2x.png" and /dev/null differ diff --git "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@3x.png" "b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@3x.png" deleted file mode 100644 index 2c832520..00000000 Binary files "a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/Frame 1171275656\343\205\207\343\204\264@3x.png" and /dev/null differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird.png new file mode 100644 index 00000000..51a69bdc Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@2x.png new file mode 100644 index 00000000..89b94980 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@3x.png new file mode 100644 index 00000000..47c0bfed Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPaymentThird.imageset/imgPaymentThird@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/Contents.json new file mode 100644 index 00000000..d9287fdf --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "img.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "img@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "img@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img.png new file mode 100644 index 00000000..57a7e3f2 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@2x.png new file mode 100644 index 00000000..8395d562 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@3x.png new file mode 100644 index 00000000..20641ada Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgPoint.imageset/img@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Contents.json new file mode 100644 index 00000000..36b57747 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame 1171275818.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame 1171275818@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame 1171275818@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818.png new file mode 100644 index 00000000..ffdb70a7 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@2x.png new file mode 100644 index 00000000..1e23a8e2 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@3x.png new file mode 100644 index 00000000..564e1b06 Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/imgTicket.imageset/Frame 1171275818@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/Contents.json b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/Contents.json new file mode 100644 index 00000000..cb7463cf --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "rotate-ccw.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "rotate-ccw@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "rotate-ccw@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw.png new file mode 100644 index 00000000..7223cd8e Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@2x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@2x.png new file mode 100644 index 00000000..9fd0828c Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@2x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@3x.png b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@3x.png new file mode 100644 index 00000000..48ac989e Binary files /dev/null and b/YELLO-iOS/YELLO-iOS/Global/Resources/Assets.xcassets/rotate-ccw.imageset/rotate-ccw@3x.png differ diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Color.swift b/YELLO-iOS/YELLO-iOS/Global/Resources/Color.swift index 3af5e941..7358de32 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Color.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Color.swift @@ -8,225 +8,229 @@ import UIKit extension UIColor { - - @nonobjc class var white: UIColor { - return UIColor(white: 1.0, alpha: 1.0) - } - - @nonobjc class var black: UIColor { - return UIColor(white: 25.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales50: UIColor { - return UIColor(white: 251.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales100: UIColor { - return UIColor(red: 241.0 / 255.0, green: 243.0 / 255.0, blue: 245.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales200: UIColor { - return UIColor(red: 233.0 / 255.0, green: 236.0 / 255.0, blue: 239.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales300: UIColor { - return UIColor(red: 222.0 / 255.0, green: 226.0 / 255.0, blue: 230.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales400: UIColor { - return UIColor(red: 206.0 / 255.0, green: 212.0 / 255.0, blue: 218.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales500: UIColor { - return UIColor(red: 173.0 / 255.0, green: 181.0 / 255.0, blue: 189.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales600: UIColor { - return UIColor(red: 134.0 / 255.0, green: 142.0 / 255.0, blue: 150.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales700: UIColor { - return UIColor(red: 73.0 / 255.0, green: 80.0 / 255.0, blue: 87.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales800: UIColor { - return UIColor(red: 52.0 / 255.0, green: 58.0 / 255.0, blue: 64.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var grayscales900: UIColor { - return UIColor(red: 33.0 / 255.0, green: 37.0 / 255.0, blue: 41.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain500: UIColor { - return UIColor(red: 251.0 / 255.0, green: 1.0, blue: 62.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain100: UIColor { - return UIColor(red: 1.0, green: 1.0, blue: 244.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain200: UIColor { - return UIColor(red: 254.0 / 255.0, green: 1.0, blue: 222.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain300: UIColor { - return UIColor(red: 253.0 / 255.0, green: 1.0, blue: 168.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain400: UIColor { - return UIColor(red: 252.0 / 255.0, green: 1.0, blue: 126.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain600: UIColor { - return UIColor(red: 241.0 / 255.0, green: 245.0 / 255.0, blue: 19.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain700: UIColor { - return UIColor(red: 231.0 / 255.0, green: 235.0 / 255.0, blue: 26.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain800: UIColor { - return UIColor(red: 209.0 / 255.0, green: 212.0 / 255.0, blue: 18.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var yelloMain900: UIColor { - return UIColor(red: 184.0 / 255.0, green: 188.0 / 255.0, blue: 23.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var purpleSub500: UIColor { - return UIColor(red: 100.0 / 255.0, green: 55.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub50: UIColor { - return UIColor(red: 245.0 / 255.0, green: 243.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub100: UIColor { - return UIColor(red: 230.0 / 255.0, green: 226.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub200: UIColor { - return UIColor(red: 199.0 / 255.0, green: 194.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub300: UIColor { - return UIColor(red: 167.0 / 255.0, green: 153.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub400: UIColor { - return UIColor(red: 131.0 / 255.0, green: 100.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var purpleSub600: UIColor { - return UIColor(red: 88.0 / 255.0, green: 55.0 / 255.0, blue: 220.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var purpleSub700: UIColor { - return UIColor(red: 75.0 / 255.0, green: 37.0 / 255.0, blue: 184.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var purpleSub800: UIColor { - return UIColor(red: 64.0 / 255.0, green: 19.0 / 255.0, blue: 159.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var purpleSub900: UIColor { - return UIColor(red: 51.0 / 255.0, green: 17.0 / 255.0, blue: 124.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusRed100: UIColor { - return UIColor(red: 1.0, green: 241.0 / 255.0, blue: 241.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusRed500: UIColor { - return UIColor(red: 240.0 / 255.0, green: 70.0 / 255.0, blue: 70.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusYellow100: UIColor { - return UIColor(red: 254.0 / 255.0, green: 247.0 / 255.0, blue: 231.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusYellow500: UIColor { - return UIColor(red: 1.0, green: 216.0 / 255.0, blue: 77.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusGreen100: UIColor { - return UIColor(red: 246.0 / 255.0, green: 1.0, blue: 243.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var semanticStatusGreen500: UIColor { - return UIColor(red: 104.0 / 255.0, green: 212.0 / 255.0, blue: 76.0 / 255.0, alpha: 1.0) - } + + @nonobjc class var white: UIColor { + return UIColor(white: 1.0, alpha: 1.0) + } + + @nonobjc class var btnwhite: UIColor { + return UIColor(white: 1.0, alpha: 0.35) + } + + @nonobjc class var black: UIColor { + return UIColor(white: 25.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales50: UIColor { + return UIColor(white: 251.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales100: UIColor { + return UIColor(red: 241.0 / 255.0, green: 243.0 / 255.0, blue: 245.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales200: UIColor { + return UIColor(red: 233.0 / 255.0, green: 236.0 / 255.0, blue: 239.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales300: UIColor { + return UIColor(red: 222.0 / 255.0, green: 226.0 / 255.0, blue: 230.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales400: UIColor { + return UIColor(red: 206.0 / 255.0, green: 212.0 / 255.0, blue: 218.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales500: UIColor { + return UIColor(red: 173.0 / 255.0, green: 181.0 / 255.0, blue: 189.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales600: UIColor { + return UIColor(red: 134.0 / 255.0, green: 142.0 / 255.0, blue: 150.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales700: UIColor { + return UIColor(red: 73.0 / 255.0, green: 80.0 / 255.0, blue: 87.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales800: UIColor { + return UIColor(red: 52.0 / 255.0, green: 58.0 / 255.0, blue: 64.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var grayscales900: UIColor { + return UIColor(red: 33.0 / 255.0, green: 37.0 / 255.0, blue: 41.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain500: UIColor { + return UIColor(red: 251.0 / 255.0, green: 1.0, blue: 62.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain100: UIColor { + return UIColor(red: 1.0, green: 1.0, blue: 244.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain200: UIColor { + return UIColor(red: 254.0 / 255.0, green: 1.0, blue: 222.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain300: UIColor { + return UIColor(red: 253.0 / 255.0, green: 1.0, blue: 168.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain400: UIColor { + return UIColor(red: 252.0 / 255.0, green: 1.0, blue: 126.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain600: UIColor { + return UIColor(red: 241.0 / 255.0, green: 245.0 / 255.0, blue: 19.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain700: UIColor { + return UIColor(red: 231.0 / 255.0, green: 235.0 / 255.0, blue: 26.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain800: UIColor { + return UIColor(red: 209.0 / 255.0, green: 212.0 / 255.0, blue: 18.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var yelloMain900: UIColor { + return UIColor(red: 184.0 / 255.0, green: 188.0 / 255.0, blue: 23.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var purpleSub500: UIColor { + return UIColor(red: 100.0 / 255.0, green: 55.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub50: UIColor { + return UIColor(red: 245.0 / 255.0, green: 243.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub100: UIColor { + return UIColor(red: 230.0 / 255.0, green: 226.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub200: UIColor { + return UIColor(red: 199.0 / 255.0, green: 194.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub300: UIColor { + return UIColor(red: 167.0 / 255.0, green: 153.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub400: UIColor { + return UIColor(red: 131.0 / 255.0, green: 100.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var purpleSub600: UIColor { + return UIColor(red: 88.0 / 255.0, green: 55.0 / 255.0, blue: 220.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var purpleSub700: UIColor { + return UIColor(red: 75.0 / 255.0, green: 37.0 / 255.0, blue: 184.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var purpleSub800: UIColor { + return UIColor(red: 64.0 / 255.0, green: 19.0 / 255.0, blue: 159.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var purpleSub900: UIColor { + return UIColor(red: 51.0 / 255.0, green: 17.0 / 255.0, blue: 124.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusRed100: UIColor { + return UIColor(red: 1.0, green: 241.0 / 255.0, blue: 241.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusRed500: UIColor { + return UIColor(red: 240.0 / 255.0, green: 70.0 / 255.0, blue: 70.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusYellow100: UIColor { + return UIColor(red: 254.0 / 255.0, green: 247.0 / 255.0, blue: 231.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusYellow500: UIColor { + return UIColor(red: 1.0, green: 216.0 / 255.0, blue: 77.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusGreen100: UIColor { + return UIColor(red: 246.0 / 255.0, green: 1.0, blue: 243.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var semanticStatusGreen500: UIColor { + return UIColor(red: 104.0 / 255.0, green: 212.0 / 255.0, blue: 76.0 / 255.0, alpha: 1.0) + } @nonobjc class var semanticGenderF300: UIColor { - return UIColor(red: 1.0, green: 186.0 / 255.0, blue: 232.0 / 255.0, alpha: 1.0) + return UIColor(red: 1.0, green: 186.0 / 255.0, blue: 232.0 / 255.0, alpha: 1.0) } @nonobjc class var semanticGenderF500: UIColor { - return UIColor(red: 242.0 / 255.0, green: 98.0 / 255.0, blue: 193.0 / 255.0, alpha: 1.0) + return UIColor(red: 242.0 / 255.0, green: 98.0 / 255.0, blue: 193.0 / 255.0, alpha: 1.0) } @nonobjc class var semanticGenderM300: UIColor { - return UIColor(red: 172.0 / 255.0, green: 206.0 / 255.0, blue: 1.0, alpha: 1.0) + return UIColor(red: 172.0 / 255.0, green: 206.0 / 255.0, blue: 1.0, alpha: 1.0) } - + @nonobjc class var semanticGenderM500: UIColor { - return UIColor(red: 87.0 / 255.0, green: 154.0 / 255.0, blue: 1.0, alpha: 1.0) + return UIColor(red: 87.0 / 255.0, green: 154.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE01: UIColor { + return UIColor(red: 168.0 / 255.0, green: 146.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE02: UIColor { + return UIColor(red: 165.0 / 255.0, green: 254.0 / 255.0, blue: 194.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE03: UIColor { + return UIColor(red: 1.0, green: 135.0 / 255.0, blue: 179.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE04: UIColor { + return UIColor(red: 110.0 / 255.0, green: 229.0 / 255.0, blue: 246.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE05: UIColor { + return UIColor(red: 239.0 / 255.0, green: 142.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE06: UIColor { + return UIColor(red: 111.0 / 255.0, green: 195.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE07: UIColor { + return UIColor(red: 1.0, green: 149.0 / 255.0, blue: 146.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE08: UIColor { + return UIColor(red: 132.0 / 255.0, green: 248.0 / 255.0, blue: 229.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE09: UIColor { + return UIColor(red: 1.0, green: 114.0 / 255.0, blue: 142.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE10: UIColor { + return UIColor(red: 161.0 / 255.0, green: 155.0 / 255.0, blue: 252.0 / 255.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE11: UIColor { + return UIColor(red: 112.0 / 255.0, green: 182.0 / 255.0, blue: 1.0, alpha: 1.0) + } + + @nonobjc class var voteEllipseE12: UIColor { + return UIColor(red: 252.0 / 255.0, green: 114.0 / 255.0, blue: 179.0 / 255.0, alpha: 1.0) } - - @nonobjc class var voteEllipseE01: UIColor { - return UIColor(red: 168.0 / 255.0, green: 146.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE02: UIColor { - return UIColor(red: 165.0 / 255.0, green: 254.0 / 255.0, blue: 194.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE03: UIColor { - return UIColor(red: 1.0, green: 135.0 / 255.0, blue: 179.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE04: UIColor { - return UIColor(red: 110.0 / 255.0, green: 229.0 / 255.0, blue: 246.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE05: UIColor { - return UIColor(red: 239.0 / 255.0, green: 142.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE06: UIColor { - return UIColor(red: 111.0 / 255.0, green: 195.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE07: UIColor { - return UIColor(red: 1.0, green: 149.0 / 255.0, blue: 146.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE08: UIColor { - return UIColor(red: 132.0 / 255.0, green: 248.0 / 255.0, blue: 229.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE09: UIColor { - return UIColor(red: 1.0, green: 114.0 / 255.0, blue: 142.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE10: UIColor { - return UIColor(red: 161.0 / 255.0, green: 155.0 / 255.0, blue: 252.0 / 255.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE11: UIColor { - return UIColor(red: 112.0 / 255.0, green: 182.0 / 255.0, blue: 1.0, alpha: 1.0) - } - - @nonobjc class var voteEllipseE12: UIColor { - return UIColor(red: 252.0 / 255.0, green: 114.0 / 255.0, blue: 179.0 / 255.0, alpha: 1.0) - } @nonobjc class var semanticGenderF700: UIColor { - return UIColor(red: 123.0 / 255.0, green: 36.0 / 255.0, blue: 94.0 / 255.0, alpha: 1.0) + return UIColor(red: 123.0 / 255.0, green: 36.0 / 255.0, blue: 94.0 / 255.0, alpha: 1.0) } - + @nonobjc class var semanticGenderM700: UIColor { - return UIColor(red: 29.0 / 255.0, green: 73.0 / 255.0, blue: 142.0 / 255.0, alpha: 1.0) + return UIColor(red: 29.0 / 255.0, green: 73.0 / 255.0, blue: 142.0 / 255.0, alpha: 1.0) } - + } diff --git a/YELLO-iOS/YELLO-iOS/Global/Resources/Font.swift b/YELLO-iOS/YELLO-iOS/Global/Resources/Font.swift index 4fa4caab..e7832023 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Resources/Font.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Resources/Font.swift @@ -17,6 +17,10 @@ extension UIFont { return UIFont(name: "Pretendard-Bold", size: 24.0.adjusted)! } + class var uiLittleLage: UIFont { + return UIFont(name: "Pretendard-Bold", size: 23.0.adjusted)! + } + class var uiHeadline00: UIFont { return UIFont(name: "Pretendard-Bold", size: 26.0.adjusted)! } @@ -144,4 +148,8 @@ extension UIFont { class var uiPopUpTitle: UIFont { return UIFont(name: "Pretendard-ExtraBold", size: 16.0.adjusted)! } + + class var uiEventLabel: UIFont { + return UIFont(name: "Unbounded-Medium", size: 12.0.adjusted)! + } } diff --git a/YELLO-iOS/YELLO-iOS/Global/Shared/KeychainHandler.swift b/YELLO-iOS/YELLO-iOS/Global/Shared/KeychainHandler.swift index 1d8f8675..d5bb47dd 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Shared/KeychainHandler.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Shared/KeychainHandler.swift @@ -21,7 +21,6 @@ struct KeychainHandler { private let accessTokenKey = "accessToken" private let refreshTokenKey = "refreshToken" - var accessToken: String { get { return KeychainWrapper.standard.string(forKey: accessTokenKey) ?? "" diff --git a/YELLO-iOS/YELLO-iOS/Global/Shared/UserManager.swift b/YELLO-iOS/YELLO-iOS/Global/Shared/UserManager.swift index 4e1a94f6..fda42f1f 100644 --- a/YELLO-iOS/YELLO-iOS/Global/Shared/UserManager.swift +++ b/YELLO-iOS/YELLO-iOS/Global/Shared/UserManager.swift @@ -7,6 +7,14 @@ import Foundation +// MARK: - Enum +enum UserGroupType { + case univ + case high + case middle + case SOPT +} + struct UserManager { static var shared = UserManager() @@ -14,19 +22,26 @@ struct UserManager { var uuid: String = "" var email: String = "" var deviceToken: String = "" - var profileImage: String = "" + var profileImage: String = StringLiterals.Recommending.Title.defaultProfileImageLink var groupId: Int = 1 + var groupType: UserGroupType = .univ var groupAdmissionYear: Int = 0 + var groupName: String = "" + var subGroupName: String = "" var name: String = "" var yelloId: String = "" var gender: String = "" var friends: [Int] = [] var kakaoFriends: [String] = [] var recommendId: String = "" + var adUUID = "" + var userPoint: Int = UserDefaults.standard.integer(forKey: "UserPoint") + var userTicketCount: Int = 0 var isResigned: Bool = false var isFirstUser: Bool = false var isNeedModName: Bool = false + var isYelloPlus: Bool = false var countVotingSkip = 0 var countVoting = 0 @@ -34,3 +49,34 @@ struct UserManager { private init() {} } + +func updateUserInfo(_ data: ProfileUserResponseDTO) { + UserManager.shared.name = data.name + UserManager.shared.profileImage = data.profileImageURL + UserManager.shared.gender = data.gender + UserManager.shared.email = data.email + UserManager.shared.groupId = data.groupID + UserManager.shared.groupName = data.groupName + UserManager.shared.subGroupName = data.subGroupName + UserManager.shared.groupAdmissionYear = data.groupAdmissionYear + UserManager.shared.yelloId = data.yelloID + UserManager.shared.uuid = data.uuid + + UserManager.shared.userPoint = data.point + UserManager.shared.userTicketCount = data.ticketCount + + UserManager.shared.isYelloPlus = data.subscribe == "active" ? true : false + + switch data.groupType { + case "UNIVERSITY" : + UserManager.shared.groupType = .univ + case "HIGH_SCHOOL": + UserManager.shared.groupType = .high + case "MIDDLE_SCHOOL": + UserManager.shared.groupType = .middle + case "SOPT": + UserManager.shared.groupType = .SOPT + default: + UserManager.shared.groupType = .univ + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Request/AroundRequestDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Request/AroundRequestDTO.swift index bcee92b4..ed81ef92 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Request/AroundRequestDTO.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Request/AroundRequestDTO.swift @@ -9,4 +9,5 @@ import Foundation struct AroundRequestQueryDTO: Codable { let page: Int + let type: String? } diff --git a/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Response/AroundResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Response/AroundResponseDTO.swift index eeafbac5..37f45ccd 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Response/AroundResponseDTO.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Around/DTO/Response/AroundResponseDTO.swift @@ -20,4 +20,5 @@ struct FriendVote: Codable { let vote: Vote let isHintUsed: Bool let createdAt: String + let isUserSenderVote: Bool } diff --git a/YELLO-iOS/YELLO-iOS/Network/Around/Router/AroundTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Around/Router/AroundTarget.swift index ff0ad59b..46168b12 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Around/Router/AroundTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Around/Router/AroundTarget.swift @@ -16,14 +16,14 @@ enum AroundTarget { extension AroundTarget: TargetType { var authorization: Authorization { switch self { - case .around(_): + case .around: return .authorization } } var headerType: HTTPHeaderType { switch self { - case .around(_): + case .around: return .plain } } @@ -38,7 +38,7 @@ extension AroundTarget: TargetType { var path: String { switch self { case .around(_): - return "/vote/friend" + return "/v2/vote/friend" } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Base/APIRequestLoader.swift b/YELLO-iOS/YELLO-iOS/Network/Base/APIRequestLoader.swift index 6c65bb32..8ffdb5bb 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Base/APIRequestLoader.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Base/APIRequestLoader.swift @@ -36,7 +36,7 @@ class APIRequestLoader { var dataRequest = session.request(target) if target.authorization == .authorization { - dataRequest = interceptorSession.request(target).validate() + dataRequest = interceptorSession.request(target).validate(statusCode: 200...400) } dataRequest.responseData { response in diff --git a/YELLO-iOS/YELLO-iOS/Network/Base/Config.swift b/YELLO-iOS/YELLO-iOS/Network/Base/Config.swift index 96999b80..31d1fc38 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Base/Config.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Base/Config.swift @@ -16,6 +16,8 @@ enum Config { static let kakaoAppKey = "KAKAO_APP_KEY" static let amplitudeKey = "AMPLITUDE_KEY" static let kakaoTempleteId = "KAKAO_TEMPLATE_ID" + static let myYelloAd = "MY_YELLO_AD" + static let rewardAd = "REWARD_AD" } } @@ -63,4 +65,18 @@ extension Config { } return key }() + + static let myYelloAd: String = { + guard let key = Config.infoDictionary[Keys.Plist.myYelloAd] as? String else { + fatalError("myYelloAd is not set in plist for this configuration.") + } + return key + }() + + static let rewardAd: String = { + guard let key = Config.infoDictionary[Keys.Plist.rewardAd] as? String else { + fatalError("rewardAd is not set in plist for this configuration.") + } + return key + }() } diff --git a/YELLO-iOS/YELLO-iOS/Network/Base/HTTPHeaderFieldKey.swift b/YELLO-iOS/YELLO-iOS/Network/Base/HTTPHeaderFieldKey.swift index be73eb93..4e3b379b 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Base/HTTPHeaderFieldKey.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Base/HTTPHeaderFieldKey.swift @@ -15,6 +15,7 @@ enum HTTPHeaderFieldKey: String { case refreshtoken = "refreshtoken" case xAccessAuth = "X-ACCESS-AUTH" case xRefreshAuth = "X-REFRESH-AUTH" + case idempotencyKey = "IdempotencyKey" } enum HTTPHeaderFieldValue: String { @@ -26,6 +27,7 @@ enum HTTPHeaderType { case plain case hasToken case refreshToken + case idempotencyKey } @frozen diff --git a/YELLO-iOS/YELLO-iOS/Network/Base/NetworkService.swift b/YELLO-iOS/YELLO-iOS/Network/Base/NetworkService.swift index df804781..f1a17c5c 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Base/NetworkService.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Base/NetworkService.swift @@ -20,4 +20,7 @@ final class NetworkService { let myYelloService: MyYelloServiceProtocol = MyYelloService(apiLogger: APIEventLogger()) let profileService: ProfileServiceProtocol = ProfileService(apiLogger: APIEventLogger()) let purchaseService: PurchaseServiceProtocol = PurchaseService(apiLogger: APIEventLogger()) + let notificationService: NotificationServiceProtocol = NotificationService(apiLogger: APIEventLogger()) + let eventService: EventServiceProtocol = EventService(apiLogger: APIEventLogger()) + let rewardService: RewardServiceProtocol = RewardServices(apiLogger: APIEventLogger()) } diff --git a/YELLO-iOS/YELLO-iOS/Network/Base/TargetType.swift b/YELLO-iOS/YELLO-iOS/Network/Base/TargetType.swift index 9f844d14..f1b672b0 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Base/TargetType.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Base/TargetType.swift @@ -40,6 +40,11 @@ extension TargetType { HTTPHeaderFieldKey.xAccessAuth.rawValue: "Bearer \(KeychainHandler.shared.accessToken)", HTTPHeaderFieldKey.xRefreshAuth.rawValue: "Bearer \(KeychainHandler.shared.refreshToken)" ] + case .idempotencyKey: + return [ + HTTPHeaderFieldKey.contentType.rawValue: HTTPHeaderFieldValue.json.rawValue, + HTTPHeaderFieldKey.idempotencyKey.rawValue: generateUUID4() + ] } } } @@ -70,6 +75,9 @@ extension TargetType { urlRequest.setValue(HTTPHeaderFieldValue.json.rawValue, forHTTPHeaderField: HTTPHeaderFieldKey.contentType.rawValue) urlRequest.setValue("Bearer \(KeychainHandler.shared.accessToken)", forHTTPHeaderField: HTTPHeaderFieldKey.xAccessAuth.rawValue) urlRequest.setValue("Bearer \(KeychainHandler.shared.refreshToken)", forHTTPHeaderField: HTTPHeaderFieldKey.xRefreshAuth.rawValue) + case .idempotencyKey: + urlRequest.setValue(HTTPHeaderFieldValue.json.rawValue, forHTTPHeaderField: HTTPHeaderFieldKey.contentType.rawValue) + urlRequest.setValue(generateUUID4(), forHTTPHeaderField: HTTPHeaderFieldKey.idempotencyKey.rawValue) } switch parameters { @@ -104,6 +112,16 @@ extension TargetType { } return urlRequest } + + func generateUUID4() -> String { + if UserDefaults.standard.string(forKey: "uuid.uuidString") == nil { + let uuid = UUID() + UserDefaults.standard.set(uuid.uuidString, forKey: "uuid.uuidString") + return uuid.uuidString + } else { + return UserDefaults.standard.string(forKey: "uuid.uuidString") ?? "" + } + } } @frozen diff --git a/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Request/EventRequestDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Request/EventRequestDTO.swift new file mode 100644 index 00000000..0db79c60 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Request/EventRequestDTO.swift @@ -0,0 +1,12 @@ +// +// EventRequestDTO.swift +// YELLO-iOS +// +// Created by 변희주 on 2/7/24. +// + +import Foundation + +struct EventRequestDTO: Codable { + let tag: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventResponseDTO.swift new file mode 100644 index 00000000..03a8b525 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventResponseDTO.swift @@ -0,0 +1,32 @@ +// +// EventResponseDTO.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import Foundation + +// MARK: - EventResponseDTO +struct EventResponseDTO: Codable { + let tag: String + let startDate, endDate: String + let title, subTitle: String + let animationList: [String] + let eventReward: EventReward? +} + +// MARK: - EventReward +struct EventReward: Codable { + let startTime, endTime: String + let rewardCount: Int + let eventRewardItem: [EventRewardItem] +} + +// MARK: - EventRewardItem +struct EventRewardItem: Codable { + let tag, eventRewardTitle: String + let eventRewardImage: String + let maxRewardValue, minRewardValue, eventRewardProbability: Int + let randomTag: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventRewardRsponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventRewardRsponseDTO.swift new file mode 100644 index 00000000..6ff8f1ee --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Event/DTO/Response/EventRewardRsponseDTO.swift @@ -0,0 +1,16 @@ +// +// EventRewardRsponseDTO.swift +// YELLO-iOS +// +// Created by 변희주 on 2/7/24. +// + +import Foundation + +// MARK: - DataClass +struct EventRewardRsponseDTO: Codable { + let rewardTag: String + let rewardValue: Int + let rewardTitle: String + let rewardImage: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Event/Router/EventTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Event/Router/EventTarget.swift new file mode 100644 index 00000000..7b7b6ac7 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Event/Router/EventTarget.swift @@ -0,0 +1,73 @@ +// +// EventTarget.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import Foundation + +import Alamofire + +enum EventTarget { + case lunchEventCheck + case lunchEventStart(_ requestDTO: EventRequestDTO) + case eventReward +} + +extension EventTarget: TargetType { + var authorization: Authorization { + switch self { + case .lunchEventCheck: + return .authorization + case .lunchEventStart(_): + return .authorization + case .eventReward: + return .authorization + } + } + + var headerType: HTTPHeaderType { + switch self { + case .lunchEventCheck: + return .plain + case .lunchEventStart(_): + return .idempotencyKey + case .eventReward: + return .idempotencyKey + } + } + + var method: HTTPMethod { + switch self { + case .lunchEventCheck: + return .get + case .lunchEventStart(_): + return .post + case .eventReward: + return .post + } + } + + var path: String { + switch self { + case .lunchEventCheck: + return "/v1/event" + case .lunchEventStart(_): + return "/v1/event" + case .eventReward: + return "/v1/event/reward" + } + } + + var parameters: RequestParams { + switch self { + case .lunchEventCheck: + return .requestPlain + case let .lunchEventStart(requestDTO): + return .requestWithBody(requestDTO) + case .eventReward: + return .requestPlain + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Event/Service/EventService.swift b/YELLO-iOS/YELLO-iOS/Network/Event/Service/EventService.swift new file mode 100644 index 00000000..ed45ce34 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Event/Service/EventService.swift @@ -0,0 +1,33 @@ +// +// EventService.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import Foundation + +protocol EventServiceProtocol { + + func lunchEventCheck(completion: @escaping (NetworkResult>) -> Void) + func lunchEventStart(requestDTO: EventRequestDTO, completion: @escaping (NetworkResult>) -> Void) + func eventReward(completion: @escaping (NetworkResult>) -> Void) +} + +final class EventService: APIRequestLoader, EventServiceProtocol { + + func lunchEventCheck(completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .lunchEventCheck, responseData: BaseResponse<[EventResponseDTO]>.self, completion: completion) + } + + func lunchEventStart(requestDTO: EventRequestDTO, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .lunchEventStart(requestDTO), + responseData: BaseResponse.self, completion: completion) + } + + func eventReward(completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .eventReward, + responseData: BaseResponse.self, completion: completion) + } + +} diff --git a/YELLO-iOS/YELLO-iOS/Network/MyYello/Router/MyYelloTarget.swift b/YELLO-iOS/YELLO-iOS/Network/MyYello/Router/MyYelloTarget.swift index dddc646d..3846bff5 100644 --- a/YELLO-iOS/YELLO-iOS/Network/MyYello/Router/MyYelloTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/MyYello/Router/MyYelloTarget.swift @@ -73,17 +73,17 @@ extension MyYelloTarget: TargetType { var path: String { switch self { case .myYello(_): - return "/vote" + return "/v1/vote" case .myYelloDetail(let voteId): - return "/vote/\(voteId)" + return "/v1/vote/\(voteId)" case .myYelloDetailKeyword(let voteId): - return "/vote/\(voteId)/keyword" + return "/v1/vote/\(voteId)/keyword" case .myYelloDetailName(let voteId): - return "/vote/\(voteId)/name" + return "/v1/vote/\(voteId)/name" case .myYelloDetailFullName(let voteId): - return "/vote/\(voteId)/fullname" + return "/v1/vote/\(voteId)/fullname" case .payCheck(_): - return "/pay" + return "/v1/pay" } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Notification/DTO/Response/NotificationResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Notification/DTO/Response/NotificationResponseDTO.swift new file mode 100644 index 00000000..27cebeb6 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Notification/DTO/Response/NotificationResponseDTO.swift @@ -0,0 +1,18 @@ +// +// UserNotificationResponseDTO.swift +// YELLO-iOS +// +// Created by 변희주 on 1/28/24. +// + +import Foundation + +struct NotificationResponseDTO: Codable { + let imageUrl: String + let redirectUrl: String + let startDate: String + let endDate: String + let isAvailable: Bool + let type: String + let title: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Notification/Router/NotificationTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Notification/Router/NotificationTarget.swift new file mode 100644 index 00000000..2e97acb3 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Notification/Router/NotificationTarget.swift @@ -0,0 +1,51 @@ +// +// UserNotificationTarget.swift +// YELLO-iOS +// +// Created by 변희주 on 1/28/24. +// + +import Foundation + +import Alamofire + +enum NotificationTarget { + case userNotification(type: String) +} + +extension NotificationTarget: TargetType { + var authorization: Authorization { + switch self { + case .userNotification: + return .authorization + } + } + + var headerType: HTTPHeaderType { + switch self { + case .userNotification: + return .plain + } + } + + var method: HTTPMethod { + switch self { + case .userNotification: + return .get + } + } + + var path: String { + switch self { + case .userNotification(let type): + return "/v1/notice/\(type)" + } + } + + var parameters: RequestParams { + switch self { + case .userNotification: + return .requestPlain + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Notification/Service/NotificationService.swift b/YELLO-iOS/YELLO-iOS/Network/Notification/Service/NotificationService.swift new file mode 100644 index 00000000..9f66bc69 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Notification/Service/NotificationService.swift @@ -0,0 +1,21 @@ +// +// NotificationService.swift +// YELLO-iOS +// +// Created by 변희주 on 1/28/24. +// + +import Foundation + +protocol NotificationServiceProtocol { + + func userNotification(typeName: String, completion: @escaping (NetworkResult>) -> Void) + +} + +final class NotificationService: APIRequestLoader, NotificationServiceProtocol { + + func userNotification(typeName: String, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .userNotification(type: typeName), responseData: BaseResponse.self, completion: completion) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Onboarding/Router/OnboardingTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Onboarding/Router/OnboardingTarget.swift index cb3fab36..0cea40e1 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Onboarding/Router/OnboardingTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Onboarding/Router/OnboardingTarget.swift @@ -102,25 +102,25 @@ extension OnboardingTarget: TargetType { var path: String { switch self { case .postTokenChange: - return "/auth/oauth" + return "/v1/auth/oauth" case .getSchoolList: - return "/auth/group/univ/name" + return "/v1/auth/group/univ/name" case .getCheckDuplicate: - return "/auth/valid" + return "/v1/auth/valid" case .postUserInfo: - return "/auth/signup" + return "/v1/auth/signup" case .getMajorList: - return "/auth/group/univ/department" + return "/v1/auth/group/univ/department" case .postFirendsList: - return "/auth/friend" + return "/v1/auth/friend" case .postRefreshToken: - return "/auth/token/issue" + return "/v1/auth/token/issue" case .putDeviceToken: - return "/user/device" + return "/v1/user/device" case .getHighschoolList: - return "/auth/group/high/name" + return "/v1/auth/group/high/name" case .getHighschoolClass: - return "/auth/group/high/class" + return "/v1/auth/group/high/class" } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/DeleteRequestDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/DeleteRequestDTO.swift new file mode 100644 index 00000000..c5b3029b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/DeleteRequestDTO.swift @@ -0,0 +1,12 @@ +// +// DeleteRequestDTO.swift +// YELLO-iOS +// +// Created by 정채은 on 2/9/24. +// + +import Foundation + +struct DeleteRequestDTO: Codable { + let value: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/EditProfileRequestDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/EditProfileRequestDTO.swift new file mode 100644 index 00000000..16ac6121 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Request/EditProfileRequestDTO.swift @@ -0,0 +1,24 @@ +// +// EditProfileRequestDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/1/24. +// + +import Foundation + +// MARK: - EditProfileRequestDTO +struct EditProfileRequestDTO: Codable { + let name, yelloID, gender, email: String + let profileImageURL: String + let groupID, groupAdmissionYear: Int + + enum CodingKeys: String, CodingKey { + case name + case yelloID = "yelloId" + case gender, email + case profileImageURL = "profileImageUrl" + case groupID = "groupId" + case groupAdmissionYear + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUpadateDateResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUpadateDateResponseDTO.swift new file mode 100644 index 00000000..97aa3bc8 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUpadateDateResponseDTO.swift @@ -0,0 +1,12 @@ +// +// ProfileUpadateDateResponseDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/1/24. +// + +import Foundation + +struct ProfileUpadateDateResponseDTO: Codable { + let tag, value: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUserResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUserResponseDTO.swift index dcd25cda..8b57219a 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUserResponseDTO.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/DTO/Response/ProfileUserResponseDTO.swift @@ -8,12 +8,23 @@ import Foundation struct ProfileUserResponseDTO: Codable { - let userId: Int - let name: String - let profileImageUrl: String? - let group: String - let yelloId: String - let yelloCount: Int - let friendCount: Int - let point: Int + let userID: Int + let name, yelloID, gender, email: String + let profileImageURL, social, uuid, deviceToken: String + let groupID: Int + let group, groupType, groupName, subGroupName: String + let groupAdmissionYear, recommendCount, ticketCount, point: Int + let subscribe: String + let yelloCount, friendCount: Int + + enum CodingKeys: String, CodingKey { + case userID = "userId" + case name + case yelloID = "yelloId" + case gender, email + case profileImageURL = "profileImageUrl" + case social, uuid, deviceToken + case groupID = "groupId" + case group, groupType, groupName, subGroupName, groupAdmissionYear, recommendCount, ticketCount, point, subscribe, yelloCount, friendCount + } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/Router/ProfileTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/Router/ProfileTarget.swift index eff844f7..eceb9ede 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Profile/Router/ProfileTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/Router/ProfileTarget.swift @@ -13,8 +13,10 @@ enum ProfileTarget { case profileUser case profileFriend(_ queryDTO: ProfileFriendRequestQueryDTO) case profileDeleteFriend(id: Int) - case deleteUser + case deleteUser(_ requestBody: DeleteRequestDTO) case purchaseInfo + case accountUpdatedAt + case editProfile(_ request: EditProfileRequestDTO) } extension ProfileTarget: TargetType { @@ -30,6 +32,10 @@ extension ProfileTarget: TargetType { return .authorization case .purchaseInfo: return .authorization + case .accountUpdatedAt: + return .authorization + case .editProfile: + return .authorization } } @@ -45,6 +51,10 @@ extension ProfileTarget: TargetType { return .plain case .purchaseInfo: return .plain + case .accountUpdatedAt: + return .plain + case .editProfile: + return .plain } } @@ -60,21 +70,29 @@ extension ProfileTarget: TargetType { return .delete case .purchaseInfo: return .get + case .accountUpdatedAt: + return .get + case .editProfile: + return .post } } var path: String { switch self { case .profileUser: - return "/user" - case .profileFriend(_): - return "/friend" + return "/v2/user" + case .profileFriend: + return "/v1/friend" case .profileDeleteFriend(let id): - return "/friend/\(id)" + return "/v1/friend/\(id)" case .deleteUser: - return "/user" + return "/v2/user" case .purchaseInfo: - return "/purchase" + return "/v1/purchase" + case .accountUpdatedAt: + return "/v1/user/data/account-updated-at" + case .editProfile: + return "/v1/user" } } @@ -86,10 +104,14 @@ extension ProfileTarget: TargetType { return .requestQuery(queryDTO) case .profileDeleteFriend: return .requestPlain - case .deleteUser: - return .requestPlain + case .deleteUser(let requestBody): + return .requestWithBody(requestBody) case .purchaseInfo: return .requestPlain + case .accountUpdatedAt: + return .requestPlain + case let .editProfile(request): + return .requestWithBody(request) } } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Profile/Service/ProfileService.swift b/YELLO-iOS/YELLO-iOS/Network/Profile/Service/ProfileService.swift index 86ce9ecc..6e87d4bb 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Profile/Service/ProfileService.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Profile/Service/ProfileService.swift @@ -14,12 +14,18 @@ protocol ProfileServiceProtocol { func profileDeleteFriend(id: Int, completion: @escaping (NetworkResult>) -> Void) - func userDelete(completion: @escaping (NetworkResult>) -> Void) + func userDelete(requestDTO: DeleteRequestDTO, completion: @escaping (NetworkResult>) -> Void) func purchaseInfo(completion: @escaping (NetworkResult>) -> Void) + func getAccountUpdateAt(completion: @escaping (NetworkResult>) -> Void) + func editProfile(requestDTO: EditProfileRequestDTO, completion: @escaping (NetworkResult>) -> Void) } final class ProfileService: APIRequestLoader, ProfileServiceProtocol { + func editProfile(requestDTO: EditProfileRequestDTO, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .editProfile(requestDTO), responseData: BaseResponse.self, completion: completion) + } + func profileUser(completion: @escaping (NetworkResult>) -> Void) { fetchData(target: .profileUser, responseData: BaseResponse.self, completion: completion) @@ -35,11 +41,15 @@ final class ProfileService: APIRequestLoader, ProfileServiceProto responseData: BaseResponse.self, completion: completion) } - func userDelete(completion: @escaping (NetworkResult>) -> Void) { - fetchData(target: .deleteUser, responseData: BaseResponse.self, completion: completion) + func userDelete(requestDTO: DeleteRequestDTO, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .deleteUser(requestDTO), responseData: BaseResponse.self, completion: completion) } func purchaseInfo(completion: @escaping (NetworkResult>) -> Void) { fetchData(target: .purchaseInfo, responseData: BaseResponse.self, completion: completion) } + + func getAccountUpdateAt(completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .accountUpdatedAt, responseData: BaseResponse.self, completion: completion) + } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Purchase/DTO/Response/PurchaseSubscibeNeedResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/Purchase/DTO/Response/PurchaseSubscibeNeedResponseDTO.swift index 9f94b76f..4147177c 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Purchase/DTO/Response/PurchaseSubscibeNeedResponseDTO.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Purchase/DTO/Response/PurchaseSubscibeNeedResponseDTO.swift @@ -8,6 +8,7 @@ import Foundation struct PurchaseSubscibeNeedResponseDTO: Codable { + let id: Int let subscribe: String - let isSubscribeNeeded: Bool + let expiredDate: String } diff --git a/YELLO-iOS/YELLO-iOS/Network/Purchase/Router/PurchaseTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Purchase/Router/PurchaseTarget.swift index a572c713..58575e6b 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Purchase/Router/PurchaseTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Purchase/Router/PurchaseTarget.swift @@ -52,11 +52,11 @@ extension PurchaseTarget: TargetType { var path: String { switch self { case .purchaseSubscibe(_): - return "/purchase/apple/verify/subscribe" + return "/v1/purchase/apple/verify/subscribe" case .purchaseTicket(_): - return "/purchase/apple/verify/ticket" + return "/v1/purchase/apple/verify/ticket" case .purchaseSubscibeNeed: - return "/purchase/subscribe" + return "/v1/user/subscribe" } } @@ -66,7 +66,7 @@ extension PurchaseTarget: TargetType { return .requestWithBody(requestDTO) case let .purchaseTicket(requestDTO): return .requestWithBody(requestDTO) - case let .purchaseSubscibeNeed: + case .purchaseSubscibeNeed: return .requestPlain } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Recommending/Router/RecommendingTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Recommending/Router/RecommendingTarget.swift index 21beb95b..2ec7e93e 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Recommending/Router/RecommendingTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Recommending/Router/RecommendingTarget.swift @@ -13,6 +13,7 @@ enum RecommendingTarget { case recommendingKakaoFriend(_ queryDTO: RecommendingRequestQueryDTO, _ requestDTO: RecommendingFriendRequestDTO) case recommendingSchoolFriend(_ queryDTO: RecommendingRequestQueryDTO) case recommendingAddFriend(_ friendId: Int) + case recommendingDetailFriend(_ friendId: Int) } extension RecommendingTarget: TargetType { @@ -25,6 +26,8 @@ extension RecommendingTarget: TargetType { return .authorization case .recommendingAddFriend(_): return .authorization + case .recommendingDetailFriend(_): + return .authorization } } @@ -36,6 +39,8 @@ extension RecommendingTarget: TargetType { return .plain case .recommendingAddFriend(_): return .plain + case .recommendingDetailFriend(_): + return .plain } } @@ -47,17 +52,21 @@ extension RecommendingTarget: TargetType { return .get case .recommendingAddFriend: return .post + case .recommendingDetailFriend: + return .get } } var path: String { switch self { case .recommendingKakaoFriend(_, _): - return "/friend/recommend/kakao" + return "/v1/friend/recommend/kakao" case .recommendingSchoolFriend(_): - return "/friend/recommend/school" + return "/v1/friend/recommend/school" case .recommendingAddFriend(let friendId): - return "friend/\(friendId)" + return "/v1/friend/\(friendId)" + case .recommendingDetailFriend(let friendId): + return "/v1/user/\(friendId)" } } @@ -69,6 +78,8 @@ extension RecommendingTarget: TargetType { return .requestQuery(queryDTO) case .recommendingAddFriend: return .requestPlain + case .recommendingDetailFriend: + return .requestPlain } } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Recommending/Service/RecommendingService.swift b/YELLO-iOS/YELLO-iOS/Network/Recommending/Service/RecommendingService.swift index 13c6e8ed..f54dfa41 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Recommending/Service/RecommendingService.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Recommending/Service/RecommendingService.swift @@ -13,6 +13,8 @@ protocol RecommendingServiceProtocol { func recommendingSchoolFriend(queryDTO: RecommendingRequestQueryDTO, completion: @escaping (NetworkResult>) -> Void) func recommendingAddFriend(friendId: Int, completion: @escaping (NetworkResult>) -> Void) + + func recommendingDetailFriend(friendId: Int, completion: @escaping (NetworkResult>) -> Void) } final class RecommendingService: APIRequestLoader, RecommendingServiceProtocol { @@ -30,4 +32,9 @@ final class RecommendingService: APIRequestLoader, Recommend fetchData(target: .recommendingAddFriend(friendId), responseData: BaseResponse.self, completion: completion) } + + func recommendingDetailFriend(friendId: Int, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .recommendingDetailFriend(friendId), + responseData: BaseResponse.self, completion: completion) + } } diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardPossibleRequestQueryDTO.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardPossibleRequestQueryDTO.swift new file mode 100644 index 00000000..63816933 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardPossibleRequestQueryDTO.swift @@ -0,0 +1,12 @@ +// +// RewardPossibleRequestQueryDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation + +struct RewardPossibleRequestQueryDTO: Codable { + let tag: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardRequestDTO.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardRequestDTO.swift new file mode 100644 index 00000000..030d011a --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Request/RewardRequestDTO.swift @@ -0,0 +1,13 @@ +// +// RewardRequestDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation + +struct RewardRequestDTO: Codable { + let rewardType, randomType, uuid: String + let rewardNumber: Int +} diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardPossibleResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardPossibleResponseDTO.swift new file mode 100644 index 00000000..45d3287c --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardPossibleResponseDTO.swift @@ -0,0 +1,13 @@ +// +// RewardPossibleResponseDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation + +struct RewardPossibleResponseDTO: Codable { + let createdAt: String + let isPossible: Bool +} diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardResponseDTO.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardResponseDTO.swift new file mode 100644 index 00000000..756897a3 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/DTO/Response/RewardResponseDTO.swift @@ -0,0 +1,15 @@ +// +// RewardResponseDTO.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation + +struct RewardResponseDTO: Codable { + let rewardTag: String + let rewardValue: Int + let rewardTitle: String + let rewardImage: String +} diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/Router/RewardTarget.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/Router/RewardTarget.swift new file mode 100644 index 00000000..271f08fb --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/Router/RewardTarget.swift @@ -0,0 +1,63 @@ +// +// RewardTarget.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation +import Alamofire + +@frozen +enum RewardTarget { + case rewardPossible(_ tag: String) + case rewardResult(_ requestDTO: RewardRequestDTO) +} + +extension RewardTarget: TargetType { + + var authorization: Authorization { + switch self { + case .rewardPossible: + return .authorization + case .rewardResult: + return .authorization + } + } + + var headerType: HTTPHeaderType { + switch self { + case .rewardPossible: + return .hasToken + case .rewardResult: + return .hasToken + } + } + + var method: HTTPMethod { + switch self { + case .rewardPossible: + return .get + case .rewardResult: + return .post + } + } + + var path: String { + switch self { + case .rewardPossible(let tag): + return "/v1/admob/possible/\(tag)" + case .rewardResult: + return "/v1/admob/reward" + } + } + + var parameters: RequestParams { + switch self { + case .rewardPossible: + return .requestPlain + case .rewardResult(let requestDTO): + return .requestWithBody(requestDTO) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Network/RewardAd/Service/RewardServices.swift b/YELLO-iOS/YELLO-iOS/Network/RewardAd/Service/RewardServices.swift new file mode 100644 index 00000000..6e0dd68b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Network/RewardAd/Service/RewardServices.swift @@ -0,0 +1,27 @@ +// +// RewardServices.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/18/24. +// + +import Foundation + +protocol RewardServiceProtocol { + func checkRewardPossible(tag: String, completion: @escaping (NetworkResult>) -> Void) + func postRewardAd(requestDTO: RewardRequestDTO, completion: @escaping (NetworkResult>) -> Void) +} + +final class RewardServices: APIRequestLoader, RewardServiceProtocol { + func checkRewardPossible(tag: String, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .rewardPossible(tag), + responseData: BaseResponse.self, + completion: completion) + } + + func postRewardAd(requestDTO: RewardRequestDTO, completion: @escaping (NetworkResult>) -> Void) { + fetchData(target: .rewardResult(requestDTO), + responseData: BaseResponse.self, completion: completion) + } + +} diff --git a/YELLO-iOS/YELLO-iOS/Network/Search/Router/SearchTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Search/Router/SearchTarget.swift index 93bc5e16..6e8b25b5 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Search/Router/SearchTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Search/Router/SearchTarget.swift @@ -39,7 +39,7 @@ extension SearchTarget: TargetType { var path: String { switch self { case .friendSearch: - return "/friend/search" + return "/v1/friend/search" } } diff --git a/YELLO-iOS/YELLO-iOS/Network/Voting/Router/VotingTarget.swift b/YELLO-iOS/YELLO-iOS/Network/Voting/Router/VotingTarget.swift index 248f413d..c2802e94 100644 --- a/YELLO-iOS/YELLO-iOS/Network/Voting/Router/VotingTarget.swift +++ b/YELLO-iOS/YELLO-iOS/Network/Voting/Router/VotingTarget.swift @@ -66,15 +66,15 @@ extension VotingTarget: TargetType { var path: String { switch self { case .getVotingAvailable: - return "/vote/available" + return "/v1/vote/available" case .getVotingSuffle: - return "/friend/shuffle" + return "/v1/friend/shuffle" case .getVotingList: - return "/vote/question" + return "/v1/vote/question" case .postVotingAnswerList: - return "/vote" + return "/v1/vote" case .getUnreadCount: - return "/vote/count" + return "/v1/vote/count" } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Around/Cell/TimeLineTableViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Around/Cell/TimeLineTableViewCell.swift index 25637475..5e8aca48 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Around/Cell/TimeLineTableViewCell.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Around/Cell/TimeLineTableViewCell.swift @@ -218,6 +218,10 @@ final class TimeLineTableViewCell: UITableViewCell { self.keywordLabel.textColor = .semanticGenderF300 } + if model.isUserSenderVote { + self.genderLabel.text = StringLiterals.Around.fromMe + } + if model.receiverProfileImage != StringLiterals.Recommending.Title.defaultProfileImageLink { self.receiverProfileImageView.kfSetImage(url: model.receiverProfileImage) } else { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Around/View/AroundView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Around/View/AroundView.swift index d107cdec..519f465a 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Around/View/AroundView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Around/View/AroundView.swift @@ -26,11 +26,19 @@ final class AroundView: BaseView { } } var scrollCount = 0 + var isUserSenderVote = false var aroundModelDummy: [FriendVote] = [] // MARK: Component private let aroundNavigationBarView = UIView() + private let topDescriptionView = UIView() + private let descriptionImageView = UIImageView() + private let descriptionLabel = UILabel() + private let filterButton = UIButton() + private let filterButtonStackView = UIStackView() + private let filterButtonLabel = UILabel() + private let filterButtonImageView = UIImageView() private let aroundLabel = UILabel() lazy var aroundTableView = UITableView() let refreshControl = UIRefreshControl() @@ -47,6 +55,8 @@ final class AroundView: BaseView { self.backgroundColor = .clear aroundEmptyView.do { + $0.emptyDescriptionLabel.setTextWithLineHeight(text: StringLiterals.Recommending.Empty.timeLineAllTitle, + lineHeight: 24) $0.isHidden = true } @@ -54,6 +64,39 @@ final class AroundView: BaseView { $0.backgroundColor = .black } + descriptionImageView.do { + $0.image = ImageLiterals.Around.icInformation + } + + descriptionLabel.do { + $0.text = StringLiterals.Around.info + $0.textColor = .grayscales600 + $0.font = .uiLabelSmall + } + + filterButton.do { + $0.backgroundColor = .black + $0.makeBorder(width: 1, color: .grayscales800) + $0.makeCornerRound(radius: 14.adjustedHeight) + $0.addTarget(self, action: #selector(filterButtonTapped), for: .touchUpInside) + } + + filterButtonStackView.do { + $0.axis = .horizontal + $0.spacing = 6.adjustedWidth + $0.isUserInteractionEnabled = false + } + + filterButtonLabel.do { + $0.text = StringLiterals.Around.allYello + $0.textColor = .grayscales500 + $0.font = .uiLabelLarge + } + + filterButtonImageView.do { + $0.image = ImageLiterals.Around.icChevronDownGray + } + aroundLabel.do { $0.setTextWithLineHeight(text: StringLiterals.Around.around, lineHeight: 28.adjustedHeight) $0.font = .uiHeadline03 @@ -81,8 +124,18 @@ final class AroundView: BaseView { override func setLayout() { self.addSubviews( aroundNavigationBarView, + topDescriptionView, aroundTableView) + topDescriptionView.addSubviews(descriptionImageView, + descriptionLabel, + filterButton) + + filterButton.addSubviews(filterButtonStackView) + + filterButtonStackView.addArrangedSubviews(filterButtonLabel, + filterButtonImageView) + aroundTableView.addSubviews(aroundEmptyView) aroundNavigationBarView.addSubview(aroundLabel) @@ -98,8 +151,36 @@ final class AroundView: BaseView { $0.centerY.equalToSuperview() } + topDescriptionView.snp.makeConstraints { + $0.top.equalTo(aroundNavigationBarView.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(36.adjustedHeight) + } + + descriptionImageView.snp.makeConstraints { + $0.leading.equalToSuperview().inset(16.adjustedWidth) + $0.centerY.equalToSuperview() + } + + descriptionLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(descriptionImageView.snp.trailing).offset(2.adjustedWidth) + } + + filterButton.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.height.equalTo(26.adjustedHeight) + $0.width.equalTo(99.adjustedWidth) + } + + filterButtonStackView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(20.adjustedWidth) + } + aroundTableView.snp.makeConstraints { - $0.top.equalTo(aroundNavigationBarView.snp.bottom).offset(12.adjustedHeight) + $0.top.equalTo(topDescriptionView.snp.bottom).offset(12.adjustedHeight) $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) $0.bottom.equalToSuperview() } @@ -146,7 +227,7 @@ final class AroundView: BaseView { } self.aroundPage += 1 - let queryDTO = AroundRequestQueryDTO(page: aroundPage) + let queryDTO = AroundRequestQueryDTO(page: aroundPage, type: isUserSenderVote ? "send" : "") self.fetchingMore = true @@ -164,7 +245,7 @@ final class AroundView: BaseView { self.aroundCount = data.totalCount let friendVote = data.friendVotes.map { around in - return FriendVote(id: around.id, receiverName: around.receiverName, senderGender: around.senderGender, receiverProfileImage: around.receiverProfileImage, vote: around.vote, isHintUsed: around.isHintUsed, createdAt: around.createdAt) + return FriendVote(id: around.id, receiverName: around.receiverName, senderGender: around.senderGender, receiverProfileImage: around.receiverProfileImage, vote: around.vote, isHintUsed: around.isHintUsed, createdAt: around.createdAt, isUserSenderVote: around.isUserSenderVote) } // 중복되는 모델 필터 처리 @@ -243,3 +324,38 @@ extension AroundView: UITableViewDataSource { return 116.adjustedHeight } } + +extension AroundView { + @objc private func filterButtonTapped() { + isUserSenderVote.toggle() + + if isUserSenderVote { + filterButtonLabel.text = StringLiterals.Around.myYello + filterButtonStackView.spacing = 0 + filterButtonStackView.snp.updateConstraints { + $0.leading.equalToSuperview().inset(8.adjustedWidth) + } + aroundEmptyView.emptyDescriptionLabel.setTextWithLineHeight( + text: StringLiterals.Recommending.Empty.timeLineMyTitle, + lineHeight: 24) + } else { + filterButtonLabel.text = StringLiterals.Around.allYello + filterButtonStackView.spacing = 6.adjustedWidth + filterButtonStackView.snp.updateConstraints { + $0.leading.equalToSuperview().inset(20.adjustedWidth) + } + aroundEmptyView.emptyDescriptionLabel.setTextWithLineHeight( + text: StringLiterals.Recommending.Empty.timeLineAllTitle, + lineHeight: 24) + } + + self.aroundPage = -1 + self.aroundCount = -1 + self.isFinishPaging = false + self.fetchingMore = false + self.aroundTableView.reloadData() + self.aroundModelDummy = [] + self.around() + self.updateView() + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Base/BaseIconButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Base/BaseIconButton.swift new file mode 100644 index 00000000..8bf0b4d2 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Base/BaseIconButton.swift @@ -0,0 +1,25 @@ +// +// BaseIconButton.swift +// YELLO-iOS +// +// Created by 정채은 on 2/10/24. +// + +import UIKit + +class BaseIconButton: UIButton { + + // MARK: - Functions + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let expandedBounds = bounds.insetBy(dx: -20.adjustedWidth, dy: -20.adjustedHeight) + return expandedBounds.contains(point) + } + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Event/View/EventPointView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Event/View/EventPointView.swift new file mode 100644 index 00000000..c96993aa --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Event/View/EventPointView.swift @@ -0,0 +1,93 @@ +// +// EventPointView.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import UIKit + +import SnapKit +import Then + +final class EventPointView: BaseView { + + private let contentView = UIView() + let pointLabel = UILabel() + let nextTimeLabel = UILabel() + let pointImage = UIImageView() + let checkButton = UIButton() + + override func setStyle() { + self.backgroundColor = .black.withAlphaComponent(0.5) + + contentView.backgroundColor = .grayscales900 + contentView.makeCornerRound(radius: 10.adjustedHeight) + + pointLabel.do { + $0.text = StringLiterals.Event.point + $0.textColor = .white + $0.font = .uiSubtitle01 + } + + nextTimeLabel.do { + $0.text = StringLiterals.Event.nextTime + $0.textColor = .grayscales400 + $0.font = .uiLabelLarge + } + + pointImage.do { + $0.image = UIImage(imageLiteralResourceName: "imgPoint") + } + + checkButton.do { + $0.setTitle("확인", for: .normal) + $0.setTitleColor(.grayscales300, for: .normal) + $0.titleLabel?.font = .uiBodySmall + } + + } + + override func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubview(contentView) + contentView.addSubviews(pointLabel, + nextTimeLabel, + pointImage, + checkButton) + + contentView.snp.makeConstraints { + $0.width.equalTo(300.adjusted) + $0.height.equalTo(374.adjusted) + $0.center.equalToSuperview() + } + + pointLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(38.adjusted) + $0.centerX.equalToSuperview() + } + + nextTimeLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(66.adjusted) + $0.centerX.equalToSuperview() + } + + pointImage.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.size.equalTo(200.adjusted) + $0.top.equalToSuperview().inset(100.adjusted) + } + + checkButton.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.height.equalTo(48.adjusted) + $0.leading.trailing.equalToSuperview().inset(20.adjusted) + $0.bottom.equalToSuperview().inset(12.adjusted) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Event/View/LunchEventView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Event/View/LunchEventView.swift new file mode 100644 index 00000000..36233361 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Event/View/LunchEventView.swift @@ -0,0 +1,100 @@ +// +// LunchEventView.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import UIKit + +import SnapKit +import Then + +final class LunchEventView: BaseView { + + private let evnetTimeLabel = UILabel() + private let presentLabel = UILabel() + private let timeDescriptionLabel = UILabel() + let touchLabel = UILabel() + + private let itemImage = UIImageView() + + override func setStyle() { + self.backgroundColor = .black + + evnetTimeLabel.do { + $0.text = StringLiterals.Event.eventTime + $0.textColor = .black + $0.font = .uiEventLabel + $0.backgroundColor = .yelloMain500 + $0.textAlignment = .center + $0.transform = CGAffineTransform(rotationAngle: CGFloat.pi / -60) + } + + presentLabel.do { + $0.text = StringLiterals.Event.present + $0.textColor = .white + $0.font = .uiHeadline00 + } + + timeDescriptionLabel.do { + $0.text = StringLiterals.Event.time + $0.textColor = .grayscales500 + $0.font = .uiLabelSmall + } + + touchLabel.do { + $0.text = StringLiterals.Event.touch + $0.textColor = .grayscales400 + $0.font = .uiLabelLarge + } + + itemImage.do { + $0.image = UIImage(imageLiteralResourceName: "imgItemList") + } + + } + + override func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubviews(evnetTimeLabel, + presentLabel, + timeDescriptionLabel, + touchLabel, + itemImage) + + evnetTimeLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(statusBarHeight + 55.adjustedHeight) + $0.centerX.equalToSuperview() + $0.width.equalTo(102.adjusted) + $0.height.equalTo(21.adjusted) + } + + presentLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(statusBarHeight + 92.adjustedHeight) + $0.centerX.equalToSuperview() + } + + timeDescriptionLabel.snp.makeConstraints { + $0.top.equalTo(presentLabel.snp.bottom).offset(8.adjustedHeight) + $0.centerX.equalToSuperview() + } + + touchLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(statusBarHeight + 178.adjustedHeight) + $0.centerX.equalToSuperview() + } + + itemImage.snp.makeConstraints { + $0.width.equalTo(257.adjusted) + $0.height.equalTo(150.adjusted) + $0.centerX.equalToSuperview() + $0.bottom.equalTo(self.safeAreaLayoutGuide).inset(40.adjustedHeight) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Event/ViewController/LunchEventViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Event/ViewController/LunchEventViewController.swift new file mode 100644 index 00000000..54632f9a --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Event/ViewController/LunchEventViewController.swift @@ -0,0 +1,129 @@ +// +// LunchEventViewController.swift +// YELLO-iOS +// +// Created by 변희주 on 2/6/24. +// + +import UIKit + +import Lottie + +final class LunchEventViewController: BaseViewController { + + private let originView = LunchEventView() + private var animationView = LottieAnimationView() + private let eventPointView = EventPointView() + + override func loadView() { + self.view = originView + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + setAnimationView() + tabBarController?.tabBar.isHidden = false + } +} + +extension LunchEventViewController { + private func setAnimationView() { + animationView = .init(name: "eventbox_default-4") + let animationWidth: CGFloat = 400.adjustedWidth + let animationHeight: CGFloat = 534.adjustedHeight + animationView.frame = CGRect(x: 0, y: 0, width: animationWidth, height: animationHeight) + animationView.contentMode = .scaleAspectFill + animationView.loopMode = .loop + animationView.animationSpeed = 1.0 + let centerX = view.bounds.midX + let centerY = view.bounds.midY + animationView.center = CGPoint(x: centerX, y: centerY) + animationView.play() + + animationView.isUserInteractionEnabled = true + view.addSubview(animationView) + + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.animationViewTapped)) + self.animationView.addGestureRecognizer(tapGesture) + } + + @objc + private func animationViewTapped() { + self.originView.touchLabel.isHidden = true + + let generator = UIImpactFeedbackGenerator(style: .heavy) + generator.prepare() + generator.impactOccurred() + + // 점심시간 이벤트 서버통신 + getLunchEvent() + + animationView.removeFromSuperview() + animationView = .init(name: "eventbox_open-4") + let animationWidth: CGFloat = 400.adjustedWidth + let animationHeight: CGFloat = 534.adjustedHeight + animationView.frame = CGRect(x: 0, y: 0, width: animationWidth, height: animationHeight) + animationView.contentMode = .scaleAspectFill + animationView.loopMode = .playOnce + animationView.animationSpeed = 1.0 + let centerX = view.bounds.midX + let centerY = view.bounds.midY + animationView.center = CGPoint(x: centerX, y: centerY) + animationView.play(completion: { _ in + self.showEventPointView() + }) + view.addSubview(animationView) + } + + private func showEventPointView() { + animationView.removeFromSuperview() + UserDefaults.standard.set(false, forKey: "lunchEventAvailable") + + self.eventPointView.frame = self.view.bounds + self.eventPointView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.view.addSubview(self.eventPointView) + + self.eventPointView.checkButton.addTarget(self, action: #selector(checkButtonTapped), for: .touchUpInside) + } + + @objc + private func checkButtonTapped() { + self.eventPointView.removeFromSuperview() + self.navigationController?.popViewController(animated: false) + UserDefaults.standard.set(nil, forKey: "uuid.uuidString") + } + + private func getLunchEvent() { + NetworkService.shared.eventService.lunchEventStart(requestDTO: EventRequestDTO(tag: "LUNCH_EVENT")) { result in + switch result { + case .success(_): + DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) { + self.getRewardPoint() + } + default: + print("network failure") + return + } + } + } + + private func getRewardPoint() { + NetworkService.shared.eventService.eventReward { result in + switch result { + case .success(let data): + guard let data = data.data else { return } + if data.rewardTag == "TICKET" { + self.eventPointView.pointLabel.text = StringLiterals.Event.ticket + self.eventPointView.pointImage.image = UIImage(imageLiteralResourceName: "imgTicket") + } else { + self.eventPointView.pointLabel.text = String(data.rewardValue) + " " + StringLiterals.Event.point + self.eventPointView.pointImage.image = UIImage(imageLiteralResourceName: "imgPoint") + } + default: + print("network failure") + return + } + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_default-4.json b/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_default-4.json new file mode 100644 index 00000000..afb7f291 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_default-4.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":400,"h":534,"nm":"eventbox_default_2","ddd":0,"assets":[{"id":"comp_0","nm":"eventbox_default","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"waiting","parent":2,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[17]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[11]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[11]},{"t":58.0000023623884,"s":[17]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[65.934,94.668,0],"to":[3.207,3.399,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[75.17,98.26,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[75.17,98.26,0],"to":[0,0,0],"ti":[4.361,3.848,0]},{"t":58.0000023623884,"s":[65.934,94.668,0]}],"ix":2,"l":2},"a":{"a":0,"k":[50,50,0],"ix":1,"l":2},"s":{"a":0,"k":[28.734,28.734,100],"ix":6,"l":2}},"ao":0,"w":100,"h":100,"ip":0,"op":420.000017106951,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"동글이","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.179,402.541,0],"ix":2,"l":2},"a":{"a":0,"k":[80.229,105.229,0],"ix":1,"l":2},"s":{"a":0,"k":[97.446,97.446,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[74.457,74.457],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,1,0.243137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.229,105.229],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"반짝이","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[187,295,0],"to":[0,0,0],"ti":[0,0,0]},{"t":90.0000036657751,"s":[187,266,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.812,11.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.993183210784,0.993183210784,0.993183210784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-84.094,59.906],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[-64.094,39.906]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[100]},{"t":30.0000012219251,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5.922,5.922],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[142.961,18.961],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[152.961,-1.039]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"t":90.0000036657751,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.246,6.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[121.615,-88.104],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[111.615,-98.104]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[50]},{"t":22.0000008960784,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.074,6.074],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-29.963,32.037],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[20.037,22.037]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[50]},{"t":41.0000016699642,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.602,6.602],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[64.301,-44.699],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[74.301,-34.699]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[50]},{"t":72.0000029326201,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.16,10.16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-37.92,-95.92],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[-47.92,-105.92]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[100]},{"t":53.0000021587343,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[208.074,285.803,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.479,6.862],[5.227,35.738],[0,0]],"o":[[-21.849,-8.114],[-5.099,-34.864],[0,0]],"v":[[105.25,15.25],[99,-44.5],[101.5,-114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"t":69.0000028104276,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[0]},{"t":77.0000031362743,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.317],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":58,"s":[6]},{"t":71.0000028918893,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[98.574,-115.408],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":58.0000023623884,"op":78.0000031770051,"st":55.0000022401959,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[307.94,268.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[1.015,36.104],[0,0]],"o":[[7.892,-1.52],[-0.858,-30.52],[0,0]],"v":[[81.75,2.25],[90.5,-46.75],[95.5,-86.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"t":63.0000025660426,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[0]},{"t":67.0000027289659,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[6]},{"t":67.0000027289659,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[100.924,-81.189],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":51.0000020772726,"op":68.0000027696968,"st":51.0000020772726,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[146.711,254.52,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.035,-8.723],[-3.837,22.055],[0,0]],"o":[[-10.844,6.74],[3.837,-22.056],[0,0]],"v":[[110.75,16.25],[106.75,-18.5],[101.5,-56.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":14.0000005702317,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[0]},{"t":22.0000008960784,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[6]},{"t":22.0000008960784,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[101.227,-49.516],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":23.0000009368092,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.94,284.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[13.685,33.425],[0,0]],"o":[[7.892,-1.52],[-10.858,-26.52],[0,0]],"v":[[71.25,7.75],[81,-31.25],[92,-90.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"t":23.0000009368092,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":27.0000010997325,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[5]},{"t":27.0000010997325,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[97.262,-96.053],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":7.00000028511585,"op":27.0000010997325,"st":7.00000028511585,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"박스/뚜껑 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.846],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.58],"y":[0]},"t":5,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.784],"y":[1]},"o":{"x":[0.801],"y":[0]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.52],"y":[0]},"t":59,"s":[-1.5]},{"t":66.0000026882351,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":225,"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.327],"y":[1]},"o":{"x":[0.227],"y":[0]},"t":0,"s":[272]},{"i":{"x":[0.453],"y":[1]},"o":{"x":[0.07],"y":[0]},"t":5,"s":[268.474]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.008],"y":[0]},"t":17,"s":[272]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.691],"y":[0]},"t":52,"s":[272]},{"i":{"x":[0.856],"y":[1]},"o":{"x":[0.71],"y":[0]},"t":59,"s":[265]},{"t":66.0000026882351,"s":[272]}],"ix":4}},"a":{"a":0,"k":[104.46,72.568,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.218,0],[1.988,1.268],[0,2.056],[-1.988,1.269],[-3.218,0],[-1.957,-1.268],[0,-2.099],[1.955,-1.267]],"o":[[-3.218,0],[-1.988,-1.267],[0,-2.099],[1.988,-1.268],[3.218,0],[1.955,1.269],[0,2.056],[-1.957,1.268]],"v":[[-1.089,25.449],[-8.898,23.546],[-11.878,18.562],[-8.898,13.511],[-1.089,11.609],[6.673,13.511],[9.607,18.562],[6.673,23.546]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.35],[-1.641,1.553],[-3.724,1.181],[0,0],[-0.821,0.678],[0,0.832],[2.082,0.941],[3.911,0],[2.366,-1.202],[0.441,-2.099],[0,0],[-5.712,3.017],[-9.593,0],[-5.395,-2.646],[0,-4.809],[1.893,-1.88],[3.848,-1.223],[0,0],[0.757,-0.612],[0,-0.918],[0,0],[0,0],[0.063,0.373]],"o":[[0,-2.011],[1.64,-1.551],[0,0],[1.577,-0.525],[0.819,-0.678],[0,-1.661],[-2.083,-0.939],[-4.039,0],[-2.366,1.203],[0,0],[0.504,-5.379],[5.71,-3.017],[9.655,0],[5.395,2.646],[0,2.361],[-1.894,1.881],[0,0],[-1.453,0.481],[-0.757,0.612],[0,0],[0,0],[-0.189,-0.437],[-0.063,-0.371]],"v":[[-9.797,6.034],[-7.335,0.688],[0.71,-3.411],[8.092,-5.706],[11.689,-7.51],[12.919,-9.774],[9.796,-13.676],[0.805,-15.086],[-8.803,-13.283],[-13.014,-8.33],[-31.471,-8.33],[-22.148,-20.924],[0.805,-25.449],[23.378,-21.481],[31.471,-10.298],[28.633,-3.936],[20.018,0.721],[11.973,3.345],[8.66,4.985],[7.525,7.28],[7.525,8.33],[-9.324,8.33],[-9.702,7.116]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.521568627451,0.447058853449,0.952941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,55.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.606,2.082],[3.606,-2.082]],"o":[[-3.606,-2.082],[-3.606,2.082],[0,0]],"v":[[8.113,2.342],[0,-2.342],[-8.113,2.343]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.465,142.544],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.361,-5.822],[3.361,1.941],[3.362,1.941],[-3.362,5.822]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.525490196078,0.458823559331,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.612,54.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.361,-5.822],[-3.361,1.941],[-3.362,1.941],[3.362,5.822]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.207843152214,0.760784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[205.307,54.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0,8.605],[9.937,-8.605],[-9.937,-8.605]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.443137284821,0.329411764706,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,115.631],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.606,-2.081],[0,0],[1.528,2.647],[0,0],[-2.988,1.725],[0,0]],"o":[[0,0],[-3.606,2.082],[0,0],[-1.529,-2.646],[0,0],[2.988,-1.725],[0,0],[0,0]],"v":[[52.107,12.07],[52.107,39.526],[43.994,44.21],[-47.829,-8.799],[-52.107,-16.207],[-52.107,-40.329],[-45.384,-44.21],[52.098,12.07]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.498039245605,0.415686304429,0.952941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.357,100.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.988,-1.725],[0,0],[1.528,-2.647],[0,0],[3.606,2.082],[0,0],[0,0]],"o":[[0,0],[-1.528,2.647],[0,0],[-3.606,-2.082],[0,0],[0,0],[2.988,1.726]],"v":[[52.102,-40.329],[52.102,-16.207],[47.825,-8.799],[-43.989,44.21],[-52.103,39.525],[-52.103,12.07],[45.38,-44.21]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337254901961,0.223529426724,0.780392216701,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.566,100.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0],[0,0],[0,3.45],[0,0],[-5.326,0]],"o":[[0,3.45],[0,0],[0,0],[0,0],[0,-3.45],[0,0],[5.325,0],[0,0]],"v":[[97.487,-7.796],[97.487,-0.033],[0.005,56.248],[-0.005,56.248],[-97.487,-0.033],[-97.487,-7.796],[-7.449,-56.248],[7.458,-56.248]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.505882352941,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,56.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"박스/몸통 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[225,334.825,0],"ix":2,"l":2},"a":{"a":0,"k":[99.442,109.492,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.287,1.32],[1.412,2.116],[0,2.109],[-1.414,0.485],[-2.288,-1.321],[-1.391,-2.103],[0,-2.152],[1.389,-0.497]],"o":[[-2.288,-1.32],[-1.414,-2.116],[0,-2.152],[1.412,-0.486],[2.287,1.32],[1.389,2.103],[0,2.109],[-1.391,0.498]],"v":[[-0.773,27.612],[-6.323,22.457],[-8.443,16.12],[-6.323,12.165],[-0.773,13.418],[4.743,18.553],[6.829,24.937],[4.743,28.845]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.36],[-1.167,0.918],[-2.647,-0.317],[0,0],[-0.583,0.36],[0,0.853],[1.479,1.82],[2.78,1.605],[1.682,-0.263],[0.314,-1.972],[0,0],[-4.059,0.751],[-6.817,-3.936],[-3.835,-4.926],[0,-4.933],[1.346,-1.151],[2.734,0.325],[0,0],[0.539,-0.317],[0,-0.941],[0,0],[0,0],[0.044,0.407]],"o":[[0,-2.062],[1.165,-0.918],[0,0],[1.121,0.109],[0.582,-0.358],[0,-1.704],[-1.48,-1.818],[-2.871,-1.658],[-1.682,0.262],[0,0],[0.358,-5.309],[4.059,-0.752],[6.862,3.961],[3.834,4.929],[0,2.421],[-1.345,1.152],[0,0],[-1.033,-0.102],[-0.537,0.318],[0,0],[0,0],[-0.134,-0.526],[-0.046,-0.407]],"v":[[-6.962,4.126],[-5.213,-0.346],[0.505,-1.25],[5.751,-0.575],[8.309,-0.949],[9.183,-2.765],[6.963,-8.049],[0.572,-13.185],[-6.256,-15.277],[-9.25,-11.927],[-22.368,-19.501],[-15.742,-28.591],[0.572,-23.814],[16.617,-10.482],[22.368,4.31],[20.35,9.67],[14.229,10.911],[8.511,10.301],[6.155,10.624],[5.348,12.512],[5.348,13.588],[-6.626,6.675],[-6.895,5.275]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.392156892664,0.282352941176,0.84313731474,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.882,141.57],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.288,-1.32],[1.413,0.484],[0,2.108],[-1.413,2.117],[-2.287,1.32],[-1.39,-0.497],[0,-2.153],[1.39,-2.103]],"o":[[-2.287,1.32],[-1.413,-0.485],[0,-2.153],[1.413,-2.116],[2.288,-1.321],[1.39,0.499],[0,2.108],[-1.39,2.102]],"v":[[-0.774,28.467],[-6.324,29.721],[-8.443,25.832],[-6.324,19.428],[-0.774,14.273],[4.742,13.039],[6.828,17.015],[4.742,23.332]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.359],[-1.167,2.267],[-2.648,2.739],[0,0],[-0.583,1.033],[0,0.853],[1.48,0.111],[2.78,-1.605],[1.681,-2.204],[0.313,-2.334],[0,0],[-4.059,5.438],[-6.818,3.936],[-3.835,-0.499],[0,-4.933],[1.346,-2.705],[2.735,-2.834],[0,0],[0.539,-0.938],[0,-0.942],[0,0],[0,0],[0.043,0.356]],"o":[[0,-2.062],[1.165,-2.265],[0,0],[1.121,-1.186],[0.583,-1.03],[0,-1.704],[-1.479,-0.109],[-2.871,1.658],[-1.682,2.205],[0,0],[0.358,-5.722],[4.059,-5.439],[6.861,-3.962],[3.835,0.5],[0,2.422],[-1.346,2.705],[0,0],[-1.033,1.091],[-0.538,0.94],[0,0],[0,0],[-0.134,-0.37],[-0.046,-0.354]],"v":[[-6.963,12.128],[-5.213,5.635],[0.505,-1.87],[5.751,-7.254],[8.308,-10.581],[9.183,-13.407],[6.962,-16.127],[0.572,-13.884],[-6.256,-8.092],[-9.25,-1.284],[-22.368,6.289],[-15.742,-10.452],[0.572,-24.513],[16.616,-29.706],[22.368,-21.557],[20.35,-13.866],[14.228,-5.556],[8.51,0.436],[6.155,3.477],[5.348,6.298],[5.348,7.375],[-6.627,14.288],[-6.895,13.199]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.196078446332,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.001,143.239],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":6,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.433,1.982],[0,0],[3.432,-1.982]],"o":[[-3.432,-1.982],[0,0],[-3.432,1.981],[0,0]],"v":[[7.723,2.229],[-0.001,-2.23],[-0.001,-2.229],[-7.723,2.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.446,216.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.284],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.199,-5.542],[3.199,1.847],[3.2,1.848],[-3.2,5.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.525490196078,0.458823559331,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.45,51.913],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.284],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.199,-5.542],[-3.199,1.847],[-3.2,1.848],[3.2,5.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.207843152214,0.760784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.433,51.913],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.456,-8.195],[0.004,8.195],[-9.456,-8.195]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.443137284821,0.329411764706,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.441,110.077],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.077,-0.622],[1.716,-0.993],[0,0],[1.455,2.523],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.715,0.992],[-1.076,0.614],[0,0],[-1.455,-2.523],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[49.596,-17.975],[49.596,78.031],[45.736,80.26],[41.876,82.488],[-45.527,32.035],[-49.596,24.979],[-49.596,-78.788],[-43.197,-82.488],[40.154,-34.363],[40.136,-34.363]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.454901990704,0.341176470588,0.901960844152,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.849,136.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.455,-2.523],[0,0],[3.431,1.976],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.455,2.523],[0,0],[-3.431,-1.985],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[49.592,-78.788],[49.592,24.979],[45.522,32.035],[-41.872,82.488],[-49.592,78.032],[-49.592,-17.975],[-40.141,-34.363],[-40.158,-34.363],[43.194,-82.488]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.038,136.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.477,-2.745],[41.477,0.693],[-39.409,47.398],[-41.478,47.398],[-41.478,-47.398]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.215686289469,0.113725497676,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.39,50.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.357,-47.339],[6.357,47.457],[-6.357,47.457],[-6.357,-47.457],[6.138,-47.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196078446332,0.082352941176,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.555,50.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.591,-47.456],[41.591,47.456],[39.295,47.456],[-41.591,0.753],[-41.591,-2.687]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.062745098039,0.443137284821,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[51.607,50.272],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.54,46.662],[-89.426,-0.042],[-89.426,-3.481],[-6.243,-48.251],[6.253,-48.251],[6.471,-48.133],[6.471,46.662]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.102,-50.816],[-7.094,-50.816],[-92.79,-4.692],[-92.79,2.691],[-9.439,50.816],[9.44,50.816],[92.79,2.691],[92.79,-4.692]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.505882352941,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.441,51.066],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[305.534,189.546,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.479,6.862],[5.227,35.738],[0,0]],"o":[[-21.849,-8.114],[-5.099,-34.864],[0,0]],"v":[[105.25,15.25],[99,-44.5],[101.5,-114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":25.0000010182709,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"t":28.0000011404634,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.317],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[6]},{"t":28.0000011404634,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[98.574,-115.408],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9.00000036657752,"op":29.0000011811942,"st":6.00000024438501,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"그림자","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[225,389.836,0],"ix":2,"l":2},"a":{"a":0,"k":[8.205,165.429,0],"ix":1,"l":2},"s":{"a":0,"k":[86.681,86.681,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[91.954,35.376],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.058639705882,0.058639705882,0.058639705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.326,215.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"sr","sy":2,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"or":{"a":0,"k":136.729,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.058639705882,0.058639705882,0.058639705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.522,165.429],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[87.831,51.036],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"waiting","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"eyes/yello_face Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,14,0],"ix":2,"l":2},"a":{"a":0,"k":[31.5,12,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":11,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":95,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":129,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":134,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":139,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":169,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":174,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":179,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":266,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":271,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":276,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":306,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":311,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":316,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":343,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":348,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":353,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":380,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":385,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"t":390.000015885026,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":6,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":11,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":16,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":54,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":59,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":95,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":129,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":134,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":139,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":169,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":174,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":179,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":266,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":271,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":276,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":306,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":311,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":316,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":343,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":348,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":353,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":380,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":385,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"t":390.000015885026,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.624,0],[2.233,2.103],[0,3.301],[-2.233,2.104],[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.102]],"o":[[-3.56,0],[-2.233,-2.102],[0,-3.365],[2.233,-2.103],[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.103]],"v":[[-0.049,11.311],[-8.738,8.156],[-12.087,0.049],[-8.738,-8.156],[-0.049,-11.311],[8.738,-8.156],[12.087,0.049],[8.738,8.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.337,11.561],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.104],[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.103]],"o":[[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.103],[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.104]],"v":[[-0.049,11.311],[-8.738,8.156],[-12.088,0.049],[-8.738,-8.155],[-0.049,-11.311],[8.738,-8.155],[12.088,0.049],[8.738,8.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.793,11.561],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":421.000017147681,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"mouse","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":199,"s":[50,65,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.167,"y":0.167},"t":207,"s":[50,56,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":239,"s":[50,56,0],"to":[0,0,0],"ti":[0,0,0]},{"t":246.000010019785,"s":[50,65,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,15,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":199,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":207,"s":[105.506,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":239,"s":[105.506,100,100]},{"t":246.000010019785,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Warp","np":7,"mn":"ADBE WRPMESH","ix":1,"en":1,"ef":[{"ty":7,"nm":"Warp Style","mn":"ADBE WRPMESH-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":7,"nm":"Warp Axis","mn":"ADBE WRPMESH-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":0,"nm":"Bend","mn":"ADBE WRPMESH-0003","ix":3,"v":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":199,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":207,"s":[-14]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":239,"s":[-14]},{"t":246.000010019785,"s":[0]}],"ix":3}},{"ty":0,"nm":"Horizontal Distortion","mn":"ADBE WRPMESH-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Vertical Distortion","mn":"ADBE WRPMESH-0005","ix":5,"v":{"a":0,"k":0,"ix":5}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.259,"y":1},"o":{"x":0.333,"y":0},"t":199,"s":[{"i":[[19.687,0],[0.733,-6.089],[0,0],[-25.25,0],[0,0],[0.273,1.95]],"o":[[-20.224,0],[-0.2,1.664],[0,0],[25.25,0],[0,0],[-0.885,-6.331]],"v":[[-0.25,-8],[-25.084,12.277],[-25.25,15],[0,38],[24.75,15],[24.519,11.775]],"c":true}]},{"i":{"x":0.259,"y":1},"o":{"x":0.167,"y":0},"t":207,"s":[{"i":[[20.965,0],[0.78,-6.277],[-0.059,-2.403],[-26.889,0],[-0.087,2.683],[0.29,2.01]],"o":[[-21.537,0],[-0.213,1.715],[0.059,2.403],[26.889,0],[0.087,-2.683],[-0.943,-6.526]],"v":[[-0.264,2.783],[-26.711,10.514],[-26.887,13.321],[0.002,25.554],[26.358,13.321],[26.112,9.997]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":239,"s":[{"i":[[20.965,0],[0.78,-6.277],[-0.059,-2.403],[-26.889,0],[-0.087,2.683],[0.29,2.01]],"o":[[-21.537,0],[-0.213,1.715],[0.059,2.403],[26.889,0],[0.087,-2.683],[-0.943,-6.526]],"v":[[-0.264,2.783],[-26.711,10.514],[-26.887,13.321],[0.002,25.554],[26.358,13.321],[26.112,9.997]],"c":true}]},{"t":246.000010019785,"s":[{"i":[[19.687,0],[0.733,-6.089],[0,0],[-25.25,0],[0,0],[0.273,1.95]],"o":[[-20.224,0],[-0.2,1.664],[0,0],[25.25,0],[0,0],[-0.885,-6.331]],"v":[[-0.25,-8],[-25.084,12.277],[-25.25,15],[0,38],[24.75,15],[24.519,11.775]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":21,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[103.195,98.809],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":421.000017147681,"st":90.0000036657751,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"eventbox_default","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,267,0],"ix":2,"l":2},"a":{"a":0,"k":[225,300,0],"ix":1,"l":2},"s":{"a":0,"k":[89,89,100],"ix":6,"l":2}},"ao":0,"w":450,"h":600,"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_open-4.json b/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_open-4.json new file mode 100644 index 00000000..fddd8d7d --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Event/eventbox_open-4.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":29.9700012207031,"ip":0,"op":90.0000036657751,"w":400,"h":534,"nm":"eventbox_open_2","ddd":0,"assets":[{"id":"comp_0","nm":"eventbox_open","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[208.074,285.803,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.479,6.862],[5.227,35.738],[0,0]],"o":[[-21.849,-8.114],[-5.099,-34.864],[0,0]],"v":[[105.25,15.25],[99,-44.5],[101.5,-114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[0]},{"t":58.0000023623884,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":53,"s":[0]},{"t":66.0000026882351,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.317],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":47,"s":[6]},{"t":60.0000024438501,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[98.574,-115.408],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":47.0000019143492,"op":67.0000027289659,"st":44.0000017921567,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 10","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[258.94,238.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[1.015,36.104],[0,0]],"o":[[7.892,-1.52],[-0.858,-30.52],[0,0]],"v":[[81.75,2.25],[90.5,-46.75],[95.5,-86.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"t":72.0000029326201,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":65,"s":[0]},{"t":76.0000030955435,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[6]},{"t":76.0000030955435,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[100.924,-81.189],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":60.0000024438501,"op":77.0000031362743,"st":60.0000024438501,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[307.94,268.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[1.015,36.104],[0,0]],"o":[[7.892,-1.52],[-0.858,-30.52],[0,0]],"v":[[81.75,2.25],[90.5,-46.75],[95.5,-86.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":55.0000022401959,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"t":59.0000024031193,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[6]},{"t":59.0000024031193,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[100.924,-81.189],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43.0000017514259,"op":60.0000024438501,"st":43.0000017514259,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 9","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[132.711,228.52,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.035,-8.723],[-3.837,22.055],[0,0]],"o":[[-10.844,6.74],[3.837,-22.056],[0,0]],"v":[[110.75,16.25],[106.75,-18.5],[101.5,-56.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[0]},{"t":63.0000025660426,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[0]},{"t":71.0000028918893,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[6]},{"t":71.0000028918893,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[101.227,-49.516],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":49.0000019958109,"op":72.0000029326201,"st":49.0000019958109,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 8","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[132.711,228.52,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.035,-8.723],[-3.837,22.055],[0,0]],"o":[[-10.844,6.74],[3.837,-22.056],[0,0]],"v":[[110.75,16.25],[106.75,-18.5],[101.5,-56.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"t":56.0000022809268,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"t":64.0000026067734,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[6]},{"t":64.0000026067734,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[101.227,-49.516],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42.0000017106951,"op":65.0000026475043,"st":42.0000017106951,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[227.44,198.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[13.685,33.425],[0,0]],"o":[[7.892,-1.52],[-10.858,-26.52],[0,0]],"v":[[71.25,7.75],[81,-31.25],[92,-90.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"t":68.0000027696968,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[0]},{"t":72.0000029326201,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[5]},{"t":72.0000029326201,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[97.262,-96.053],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":52.0000021180034,"op":72.0000029326201,"st":52.0000021180034,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"face_edit","parent":8,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":11,"ix":10},"p":{"a":0,"k":[74.272,103.262,0],"ix":2,"l":2},"a":{"a":0,"k":[50,75,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.324,0.324,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":41,"s":[28.734,28.734,100]},{"t":45.0000018328876,"s":[30.786,30.786,100]}],"ix":6,"l":2}},"ao":0,"w":100,"h":150,"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"동글이","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.179,402.541,0],"ix":2,"l":2},"a":{"a":0,"k":[80.229,105.229,0],"ix":1,"l":2},"s":{"a":0,"k":[97.446,97.446,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[74.457,74.457],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.98431372549,1,0.243137254902,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.229,105.229],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"반짝이 2","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[187,295,0],"to":[0,0,0],"ti":[0,0,0]},{"t":89.0000036250443,"s":[187,266,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.812,11.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.993183210784,0.993183210784,0.993183210784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-84.094,59.906],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[-64.094,39.906]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[100]},{"t":70.0000028511585,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5.922,5.922],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[142.961,18.961],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[152.961,-1.039]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"t":89.0000036250443,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.246,6.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[121.615,-88.104],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[111.615,-98.104]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":55,"s":[50]},{"t":66.0000026882351,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.074,6.074],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-29.963,32.037],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[20.037,22.037]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":52,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[50]},{"t":70.0000028511585,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.602,6.602],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[64.301,-44.699],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[74.301,-34.699]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[50]},{"t":72.0000029326201,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.16,10.16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-37.92,-95.92],"to":[0,0],"ti":[0,0]},{"t":89.0000036250443,"s":[-47.92,-105.92]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":59,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[100]},{"t":77.0000031362743,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"반짝이","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[187,295,0],"to":[0,0,0],"ti":[0,0,0]},{"t":90.0000036657751,"s":[187,266,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.812,11.812],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.993183210784,0.993183210784,0.993183210784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-84.094,59.906],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[-64.094,39.906]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[100]},{"t":30.0000012219251,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[5.922,5.922],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[142.961,18.961],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[152.961,-1.039]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":63,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"t":90.0000036657751,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.246,6.246],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[121.615,-88.104],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[111.615,-98.104]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":11,"s":[50]},{"t":22.0000008960784,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.074,6.074],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-29.963,32.037],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[20.037,22.037]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[50]},{"t":41.0000016699642,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[6.602,6.602],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[64.301,-44.699],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[74.301,-34.699]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":50,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[50]},{"t":72.0000029326201,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[10.16,10.16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.887201406441,0.927313112745,0.197522840313,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-37.92,-95.92],"to":[0,0],"ti":[0,0]},{"t":90.0000036657751,"s":[-47.92,-105.92]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[100]},{"t":53.0000021587343,"s":[0]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[146.711,254.52,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[14.035,-8.723],[-3.837,22.055],[0,0]],"o":[[-10.844,6.74],[3.837,-22.056],[0,0]],"v":[[110.75,16.25],[106.75,-18.5],[101.5,-56.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[0]},{"t":24.00000097754,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[0]},{"t":32.0000013033867,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":10,"s":[2]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":18,"s":[6]},{"t":32.0000013033867,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[101.227,-49.516],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.0000004073083,"op":33.0000013441176,"st":10.0000004073083,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":80,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.94,284.958,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-19.356,3.728],[13.685,33.425],[0,0]],"o":[[7.892,-1.52],[-10.858,-26.52],[0,0]],"v":[[71.25,7.75],[81,-31.25],[92,-90.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"t":33.0000013441176,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":22,"s":[0]},{"t":37.0000015070409,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":23,"s":[5]},{"t":37.0000015070409,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[97.262,-96.053],"ix":4},"e":{"a":0,"k":[85.016,6.119],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[99.475,-38.105],"ix":2},"a":{"a":0,"k":[99.475,-38.105],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":17.0000006924242,"op":37.0000015070409,"st":17.0000006924242,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"연기 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"t":64.0000026067734,"s":[0]}],"ix":11},"r":{"a":0,"k":171,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[222.5,255,0],"to":[0,0,0],"ti":[0,0,0]},{"t":61.0000024845809,"s":[224.5,211,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-18.5,-45,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[39.225,39.225],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[18.658,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[-18.972,2.62],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[-20.784,-9.944]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":48.0000019550801,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":50.0000020365418,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[41.363,41.363],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[20.92,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[25.23,-44.725],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[59.818,-53.818],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[65.869,-76.061]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":49.0000019958109,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[0]},{"t":51.0000020772726,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[21.42,21.42],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[10.162,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[-42.085,-57.831],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[-74.511,-83.478]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":48.0000019550801,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":50.0000020365418,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[29.131,29.131],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[14.104,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[-47.562,-22.028],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[-86.435,-31.435],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[-104.411,-32.331]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":50.0000020365418,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"t":58.0000023623884,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24.317,24.317],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[12.248,1.307],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[16.63,-29.285],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[48.082,-32.996]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":48.0000019550801,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"t":50.0000020365418,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.465,63.465],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[30.836,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[-9.268,-62.268],"to":[0,0],"ti":[0,0]},{"t":64.0000026067734,"s":[-23.643,-66.656]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":34,"s":[0,0]},{"t":50.0000020365418,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"t":58.0000023623884,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":43.0000017514259,"op":93.0000037879676,"st":-6.00000024438501,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"연기","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44,"s":[100]},{"t":54.0000021994651,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[222.5,255,0],"to":[0,0,0],"ti":[0,0,0]},{"t":51.0000020772726,"s":[224.5,234,0]}],"ix":2,"l":2},"a":{"a":0,"k":[-18.5,-45,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[39.225,39.225],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[18.658,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-18.972,2.62],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[-20.784,-9.944]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":45.0000018328876,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"t":47.0000019143492,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 6","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[41.363,41.363],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[20.92,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[25.23,-44.725],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[59.818,-53.818],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[65.869,-76.061]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":46.0000018736184,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"t":48.0000019550801,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[21.42,21.42],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[10.162,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-42.085,-57.831],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[-74.511,-83.478]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":45.0000018328876,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"t":47.0000019143492,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[29.131,29.131],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[14.104,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-47.562,-22.028],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[-86.435,-31.435],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[-104.411,-32.331]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":47.0000019143492,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"t":55.0000022401959,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24.317,24.317],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[12.248,1.307],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[16.63,-29.285],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[48.082,-32.996]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":45.0000018328876,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"t":47.0000019143492,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[63.465,63.465],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[30.836,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[-9.268,-62.268],"to":[0,0],"ti":[0,0]},{"t":61.0000024845809,"s":[-23.643,-66.656]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":31,"s":[0,0]},{"t":47.0000019143492,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"t":55.0000022401959,"s":[100]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":40.0000016292334,"op":90.0000036657751,"st":-9.00000036657752,"ct":1,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"박스/뚜껑 Outlines","parent":19,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[100]},{"t":46.0000018736184,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.584],"y":[1]},"o":{"x":[0.69],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.325],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"t":51.0000020772726,"s":[-12]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":99.442,"ix":3},"y":{"a":1,"k":[{"t":6,"s":[46.667],"h":1},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12,"s":[43.667]},{"t":21,"s":[46.667],"h":1},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":28,"s":[43.667]},{"t":36,"s":[46.667],"h":1},{"i":{"x":[0.364],"y":[1]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[46.667]},{"t":51.0000020772726,"s":[-227.333]}],"ix":4}},"a":{"a":0,"k":[104.46,72.568,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"BOUNCr overSHOOT+","np":8,"mn":"Pseudo/pse bouncR overSHOOT+","ix":1,"en":1,"ef":[{"ty":0,"nm":"Amplitude","mn":"Pseudo/pse bouncR overSHOOT+-0001","ix":1,"v":{"a":0,"k":50,"ix":1}},{"ty":0,"nm":"Frequency","mn":"Pseudo/pse bouncR overSHOOT+-0002","ix":2,"v":{"a":0,"k":2,"ix":2}},{"ty":0,"nm":"Decay","mn":"Pseudo/pse bouncR overSHOOT+-0003","ix":3,"v":{"a":0,"k":4,"ix":3}},{"ty":7,"nm":"Floor","mn":"Pseudo/pse bouncR overSHOOT+-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":6,"nm":"ゥ2018 pixelbot - BOUNCr_v1.1","mn":"Pseudo/pse bouncR overSHOOT+-0005","ix":5,"v":0},{"ty":6,"nm":"BOUNCr overSHOOT+","mn":"Pseudo/pse bouncR overSHOOT+-0006","ix":6,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.218,0],[1.988,1.268],[0,2.056],[-1.988,1.269],[-3.218,0],[-1.957,-1.268],[0,-2.099],[1.955,-1.267]],"o":[[-3.218,0],[-1.988,-1.267],[0,-2.099],[1.988,-1.268],[3.218,0],[1.955,1.269],[0,2.056],[-1.957,1.268]],"v":[[-1.089,25.449],[-8.898,23.546],[-11.878,18.562],[-8.898,13.511],[-1.089,11.609],[6.673,13.511],[9.607,18.562],[6.673,23.546]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.35],[-1.641,1.553],[-3.724,1.181],[0,0],[-0.821,0.678],[0,0.832],[2.082,0.941],[3.911,0],[2.366,-1.202],[0.441,-2.099],[0,0],[-5.712,3.017],[-9.593,0],[-5.395,-2.646],[0,-4.809],[1.893,-1.88],[3.848,-1.223],[0,0],[0.757,-0.612],[0,-0.918],[0,0],[0,0],[0.063,0.373]],"o":[[0,-2.011],[1.64,-1.551],[0,0],[1.577,-0.525],[0.819,-0.678],[0,-1.661],[-2.083,-0.939],[-4.039,0],[-2.366,1.203],[0,0],[0.504,-5.379],[5.71,-3.017],[9.655,0],[5.395,2.646],[0,2.361],[-1.894,1.881],[0,0],[-1.453,0.481],[-0.757,0.612],[0,0],[0,0],[-0.189,-0.437],[-0.063,-0.371]],"v":[[-9.797,6.034],[-7.335,0.688],[0.71,-3.411],[8.092,-5.706],[11.689,-7.51],[12.919,-9.774],[9.796,-13.676],[0.805,-15.086],[-8.803,-13.283],[-13.014,-8.33],[-31.471,-8.33],[-22.148,-20.924],[0.805,-25.449],[23.378,-21.481],[31.471,-10.298],[28.633,-3.936],[20.018,0.721],[11.973,3.345],[8.66,4.985],[7.525,7.28],[7.525,8.33],[-9.324,8.33],[-9.702,7.116]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.521568627451,0.447058853449,0.952941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,55.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.606,2.082],[3.606,-2.082]],"o":[[-3.606,-2.082],[-3.606,2.082],[0,0]],"v":[[8.113,2.342],[0,-2.342],[-8.113,2.343]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.465,142.544],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.361,-5.822],[3.361,1.941],[3.362,1.941],[-3.362,5.822]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.525490196078,0.458823559331,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.612,54.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.361,-5.822],[-3.361,1.941],[-3.362,1.941],[3.362,5.822]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.207843152214,0.760784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[205.307,54.525],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0,8.605],[9.937,-8.605],[-9.937,-8.605]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.443137284821,0.329411764706,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,115.631],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[3.606,-2.081],[0,0],[1.528,2.647],[0,0],[-2.988,1.725],[0,0]],"o":[[0,0],[-3.606,2.082],[0,0],[-1.529,-2.646],[0,0],[2.988,-1.725],[0,0],[0,0]],"v":[[52.107,12.07],[52.107,39.526],[43.994,44.21],[-47.829,-8.799],[-52.107,-16.207],[-52.107,-40.329],[-45.384,-44.21],[52.098,12.07]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.498039245605,0.415686304429,0.952941236309,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.357,100.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.988,-1.725],[0,0],[1.528,-2.647],[0,0],[3.606,2.082],[0,0],[0,0]],"o":[[0,0],[-1.528,2.647],[0,0],[-3.606,-2.082],[0,0],[0,0],[2.988,1.726]],"v":[[52.102,-40.329],[52.102,-16.207],[47.825,-8.799],[-43.989,44.21],[-52.103,39.525],[-52.103,12.07],[45.38,-44.21]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.337254901961,0.223529426724,0.780392216701,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.566,100.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.45],[0,0],[0,0],[0,0],[0,3.45],[0,0],[-5.326,0]],"o":[[0,3.45],[0,0],[0,0],[0,0],[0,-3.45],[0,0],[5.325,0],[0,0]],"v":[[97.487,-7.796],[97.487,-0.033],[0.005,56.248],[-0.005,56.248],[-97.487,-0.033],[-97.487,-7.796],[-7.449,-56.248],[7.458,-56.248]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.505882352941,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.46,56.498],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"연기/1/eventbox Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[60]},{"t":57.0000023216576,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"t":57.0000023216576,"s":[-47]}],"ix":10},"p":{"a":0,"k":[167.246,276.373,0],"ix":2,"l":2},"a":{"a":0,"k":[36.5,43,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":31,"s":[0,0,100]},{"t":45.0000018328876,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.311,14.527],[14.527,-4.311],[0.558,-0.206],[7.992,-2.371],[-2.463,-8.302],[-5.648,-1.014],[-1.27,-4.28],[-0.455,-1.038],[0,-6.678],[-10.874,0],[0,10.873],[0.002,0.119],[-0.659,0.195]],"o":[[-4.311,-14.527],[-0.577,0.171],[-2.812,-7.732],[-8.302,2.464],[1.744,5.876],[-0.754,4.109],[0.331,1.114],[-5.085,3.559],[0,10.873],[10.873,0],[0,-0.12],[0.66,-0.144],[14.527,-4.311]],"v":[[31.859,-12.347],[-2.25,-30.845],[-3.949,-30.273],[-23.137,-39.934],[-33.708,-20.442],[-21.432,-9.468],[-20.747,3.264],[-19.56,6.489],[-27.977,22.617],[-8.288,42.305],[11.4,22.617],[11.382,22.262],[13.361,21.762]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36.421,42.555],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":41.0000016699642,"op":65.0000026475043,"st":41.0000016699642,"ct":1,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"연기/2/eventbox Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[78]},{"t":64.0000026067734,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[-43]},{"t":64.0000026067734,"s":[-105]}],"ix":10},"p":{"a":0,"k":[234.313,281.205,0],"ix":2,"l":2},"a":{"a":0,"k":[46,52.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":33,"s":[0,0,100]},{"t":47.0000019143492,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.683,3.864],[0,6.691],[22.711,0],[0,-22.711],[-22.712,0],[-0.888,0.058],[-12.495,0],[0,12.979]],"o":[[2.835,-5.584],[0,-22.711],[-22.712,0],[0,22.712],[0.903,0],[0.744,12.309],[12.979,0],[0,-9.186]],"v":[[32.422,7.604],[36.866,-10.983],[-4.257,-52.105],[-45.38,-10.983],[-4.257,30.14],[-1.572,30.043],[21.88,52.105],[45.38,28.605]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[45.63,52.355],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43.0000017514259,"op":65.0000026475043,"st":43.0000017514259,"ct":1,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"연기/3/eventbox Outlines","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":46,"s":[60]},{"t":60.0000024438501,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"t":60.0000024438501,"s":[4]}],"ix":10},"p":{"a":0,"k":[299.599,283.67,0],"ix":2,"l":2},"a":{"a":0,"k":[35.5,31,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[0,0,100]},{"t":44.0000017921567,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.578,-5.126],[4.464,0],[0,-15.153],[-15.153,0],[0,15.153],[0.039,0.593],[0,8.337],[8.659,0]],"o":[[-3.725,-1.892],[-15.153,0],[0,15.153],[15.153,0],[0,-0.602],[8.212,-0.496],[0,-8.659],[-6.129,0]],"v":[[5.074,-21.632],[-7.328,-24.596],[-34.765,2.84],[-7.328,30.277],[20.11,2.84],[20.045,1.048],[34.765,-14.599],[19.085,-30.277]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.976,1,0.588,0.668,0.98,1,0.665,1,0.984,1,0.741],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.015,30.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":40.0000016292334,"op":65.0000026475043,"st":40.0000016292334,"ct":1,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"박스/몸통 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"t":6,"s":[225,334.825,0],"h":1},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[223,334.825,0],"to":[0,0,0],"ti":[0,0,0]},{"t":21,"s":[227.37,334.825,0],"h":1},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":28,"s":[226.231,334.825,0],"to":[0,0,0],"ti":[0,0,0]},{"t":36.0000014663101,"s":[225,334.825,0]}],"ix":2,"l":2},"a":{"a":0,"k":[99.442,109.492,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.287,1.32],[1.412,2.116],[0,2.109],[-1.414,0.485],[-2.288,-1.321],[-1.391,-2.103],[0,-2.152],[1.389,-0.497]],"o":[[-2.288,-1.32],[-1.414,-2.116],[0,-2.152],[1.412,-0.486],[2.287,1.32],[1.389,2.103],[0,2.109],[-1.391,0.498]],"v":[[-0.773,27.612],[-6.323,22.457],[-8.443,16.12],[-6.323,12.165],[-0.773,13.418],[4.743,18.553],[6.829,24.937],[4.743,28.845]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.36],[-1.167,0.918],[-2.647,-0.317],[0,0],[-0.583,0.36],[0,0.853],[1.479,1.82],[2.78,1.605],[1.682,-0.263],[0.314,-1.972],[0,0],[-4.059,0.751],[-6.817,-3.936],[-3.835,-4.926],[0,-4.933],[1.346,-1.151],[2.734,0.325],[0,0],[0.539,-0.317],[0,-0.941],[0,0],[0,0],[0.044,0.407]],"o":[[0,-2.062],[1.165,-0.918],[0,0],[1.121,0.109],[0.582,-0.358],[0,-1.704],[-1.48,-1.818],[-2.871,-1.658],[-1.682,0.262],[0,0],[0.358,-5.309],[4.059,-0.752],[6.862,3.961],[3.834,4.929],[0,2.421],[-1.345,1.152],[0,0],[-1.033,-0.102],[-0.537,0.318],[0,0],[0,0],[-0.134,-0.526],[-0.046,-0.407]],"v":[[-6.962,4.126],[-5.213,-0.346],[0.505,-1.25],[5.751,-0.575],[8.309,-0.949],[9.183,-2.765],[6.963,-8.049],[0.572,-13.185],[-6.256,-15.277],[-9.25,-11.927],[-22.368,-19.501],[-15.742,-28.591],[0.572,-23.814],[16.617,-10.482],[22.368,4.31],[20.35,9.67],[14.229,10.911],[8.511,10.301],[6.155,10.624],[5.348,12.512],[5.348,13.588],[-6.626,6.675],[-6.895,5.275]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.392156892664,0.282352941176,0.84313731474,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.882,141.57],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.288,-1.32],[1.413,0.484],[0,2.108],[-1.413,2.117],[-2.287,1.32],[-1.39,-0.497],[0,-2.153],[1.39,-2.103]],"o":[[-2.287,1.32],[-1.413,-0.485],[0,-2.153],[1.413,-2.116],[2.288,-1.321],[1.39,0.499],[0,2.108],[-1.39,2.102]],"v":[[-0.774,28.467],[-6.324,29.721],[-8.443,25.832],[-6.324,19.428],[-0.774,14.273],[4.742,13.039],[6.828,17.015],[4.742,23.332]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0.359],[-1.167,2.267],[-2.648,2.739],[0,0],[-0.583,1.033],[0,0.853],[1.48,0.111],[2.78,-1.605],[1.681,-2.204],[0.313,-2.334],[0,0],[-4.059,5.438],[-6.818,3.936],[-3.835,-0.499],[0,-4.933],[1.346,-2.705],[2.735,-2.834],[0,0],[0.539,-0.938],[0,-0.942],[0,0],[0,0],[0.043,0.356]],"o":[[0,-2.062],[1.165,-2.265],[0,0],[1.121,-1.186],[0.583,-1.03],[0,-1.704],[-1.479,-0.109],[-2.871,1.658],[-1.682,2.205],[0,0],[0.358,-5.722],[4.059,-5.439],[6.861,-3.962],[3.835,0.5],[0,2.422],[-1.346,2.705],[0,0],[-1.033,1.091],[-0.538,0.94],[0,0],[0,0],[-0.134,-0.37],[-0.046,-0.354]],"v":[[-6.963,12.128],[-5.213,5.635],[0.505,-1.87],[5.751,-7.254],[8.308,-10.581],[9.183,-13.407],[6.962,-16.127],[0.572,-13.884],[-6.256,-8.092],[-9.25,-1.284],[-22.368,6.289],[-15.742,-10.452],[0.572,-24.513],[16.616,-29.706],[22.368,-21.557],[20.35,-13.866],[14.228,-5.556],[8.51,0.436],[6.155,3.477],[5.348,6.298],[5.348,7.375],[-6.627,14.288],[-6.895,13.199]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298039215686,0.196078446332,0.701960784314,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.001,143.239],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":6,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.433,1.982],[0,0],[3.432,-1.982]],"o":[[-3.432,-1.982],[0,0],[-3.432,1.981],[0,0]],"v":[[7.723,2.229],[-0.001,-2.23],[-0.001,-2.229],[-7.723,2.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.446,216.503],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.284],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.199,-5.542],[3.199,1.847],[3.2,1.848],[-3.2,5.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.525490196078,0.458823559331,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.45,51.913],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,-3.284],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-3.199,-5.542],[-3.199,1.847],[-3.2,1.848],[3.2,5.542]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.207843152214,0.760784373564,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.433,51.913],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[9.456,-8.195],[0.004,8.195],[-9.456,-8.195]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.443137284821,0.329411764706,0.909803981407,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.441,110.077],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.077,-0.622],[1.716,-0.993],[0,0],[1.455,2.523],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.715,0.992],[-1.076,0.614],[0,0],[-1.455,-2.523],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[49.596,-17.975],[49.596,78.031],[45.736,80.26],[41.876,82.488],[-45.527,32.035],[-49.596,24.979],[-49.596,-78.788],[-43.197,-82.488],[40.154,-34.363],[40.136,-34.363]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.454901990704,0.341176470588,0.901960844152,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.849,136.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.455,-2.523],[0,0],[3.431,1.976],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[-1.455,2.523],[0,0],[-3.431,-1.985],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[49.592,-78.788],[49.592,24.979],[45.522,32.035],[-41.872,82.488],[-49.592,78.032],[-49.592,-17.975],[-40.141,-34.363],[-40.158,-34.363],[43.194,-82.488]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.219607858097,0.745098039216,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.038,136.246],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.477,-2.745],[41.477,0.693],[-39.409,47.398],[-41.478,47.398],[-41.478,-47.398]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.215686289469,0.113725497676,0.498039245605,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.39,50.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.357,-47.339],[6.357,47.457],[-6.357,47.457],[-6.357,-47.457],[6.138,-47.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.196078446332,0.082352941176,0.466666696586,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.555,50.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[41.591,-47.456],[41.591,47.456],[39.295,47.456],[-41.591,0.753],[-41.591,-2.687]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.062745098039,0.443137284821,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[51.607,50.272],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-8.54,46.662],[-89.426,-0.042],[-89.426,-3.481],[-6.243,-48.251],[6.253,-48.251],[6.471,-48.133],[6.471,46.662]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.102,-50.816],[-7.094,-50.816],[-92.79,-4.692],[-92.79,2.691],[-9.439,50.816],[9.44,50.816],[92.79,2.691],[92.79,-4.692]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.56862745098,0.505882352941,0.945098099054,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.441,51.066],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":4,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[305.534,189.546,0],"ix":2,"l":2},"a":{"a":0,"k":[98.582,-38.812,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.479,6.862],[5.227,35.738],[0,0]],"o":[[-21.849,-8.114],[-5.099,-34.864],[0,0]],"v":[[105.25,15.25],[99,-44.5],[101.5,-114.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":9,"s":[0]},{"t":25.0000010182709,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":13,"s":[0]},{"t":28.0000011404634,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":1,"k":[{"i":{"x":[0.317],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":9,"s":[6]},{"t":28.0000011404634,"s":[0]}],"ix":10},"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.934,0.924,0.5,1,0.869,0.847,0],"ix":8}},"s":{"a":0,"k":[98.574,-115.408],"ix":4},"e":{"a":0,"k":[101.307,17.012],"ix":5},"t":1,"lc":2,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":1,"ix":1}},{"n":"g","nm":"gap","v":{"a":0,"k":20,"ix":2}},{"n":"d","nm":"dash2","v":{"a":0,"k":1,"ix":3}},{"n":"g","nm":"gap2","v":{"a":0,"k":10,"ix":4}},{"n":"o","nm":"offset","v":{"a":0,"k":0,"ix":7}}],"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[100.445,-49.406],"ix":2},"a":{"a":0,"k":[100.445,-49.406],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":9.00000036657752,"op":29.0000011811942,"st":6.00000024438501,"ct":1,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"그림자 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[225,389.836,0],"ix":2,"l":2},"a":{"a":0,"k":[8.205,165.429,0],"ix":1,"l":2},"s":{"a":0,"k":[86.681,86.681,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[91.954,35.376],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.058639705882,0.058639705882,0.058639705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.326,215.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"그림자","parent":19,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[98.353,164.503,0],"ix":2,"l":2},"a":{"a":0,"k":[8.205,165.429,0],"ix":1,"l":2},"s":{"a":0,"k":[86.681,86.681,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"sr","sy":2,"d":1,"pt":{"a":0,"k":4,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"or":{"a":0,"k":136.729,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":1,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ty":"fl","c":{"a":0,"k":[0.058639705882,0.058639705882,0.058639705882,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.522,165.429],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[87.831,51.036],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Polystar 2","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"face_edit","fr":29.9700012207031,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"eyes/yello_face Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[50,21.5,0],"ix":2,"l":2},"a":{"a":0,"k":[31.5,12,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.496,0.496,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"t":47.0000019143492,"s":[100,115,100]}],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[{"i":[[6.987,0],[0,-2.616],[-6.987,0],[0,2.384]],"o":[[-6.987,0],[0,2.134],[6.987,0],[0,-1.866]],"v":[[12.427,9.25],[-0.25,11.616],[12.427,12.231],[25.052,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"i":{"x":0.124,"y":1},"o":{"x":0.333,"y":0},"t":39,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]},{"t":44.0000017921567,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[12.401,-0.5],[-0.25,11.616],[12.401,23.731],[25.052,11.616]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"},{"inv":false,"mode":"a","pt":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":3,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":8,"s":[{"i":[[6.987,0],[0,-2.491],[-6.987,0],[0,2.509]],"o":[[-6.987,0],[0,2.384],[6.987,0],[0,-2.366]],"v":[[49.927,9.25],[37.25,11.616],[49.927,12.231],[62.552,11.616]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":13,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"i":{"x":0.124,"y":1},"o":{"x":0.333,"y":0},"t":39,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]},{"t":44.0000017921567,"s":[{"i":[[6.987,0],[0,-6.691],[-6.987,0],[0,6.691]],"o":[[-6.987,0],[0,6.691],[6.987,0],[0,-6.691]],"v":[[49.901,-0.5],[37.25,11.616],[49.901,23.731],[62.552,11.616]],"c":true}]}],"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 2"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.624,0],[2.233,2.103],[0,3.301],[-2.233,2.104],[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.102]],"o":[[-3.56,0],[-2.233,-2.102],[0,-3.365],[2.233,-2.103],[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.103]],"v":[[-0.049,11.311],[-8.738,8.156],[-12.087,0.049],[-8.738,-8.156],[-0.049,-11.311],[8.738,-8.156],[12.087,0.049],[8.738,8.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.337,11.561],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.104],[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.103]],"o":[[-3.56,0],[-2.233,-2.103],[0,-3.365],[2.233,-2.103],[3.624,0],[2.233,2.104],[0,3.301],[-2.233,2.104]],"v":[[-0.049,11.311],[-8.738,8.156],[-12.088,0.049],[-8.738,-8.155],[-0.049,-11.311],[8.738,-8.155],[12.088,0.049],[8.738,8.156]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.793,11.561],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":421.000017147681,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"mouse","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[49.742,49.595,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.258,-7.905,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Warp","np":7,"mn":"ADBE WRPMESH","ix":1,"en":1,"ef":[{"ty":7,"nm":"Warp Style","mn":"ADBE WRPMESH-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":7,"nm":"Warp Axis","mn":"ADBE WRPMESH-0002","ix":2,"v":{"a":0,"k":1,"ix":2}},{"ty":0,"nm":"Bend","mn":"ADBE WRPMESH-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Horizontal Distortion","mn":"ADBE WRPMESH-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Vertical Distortion","mn":"ADBE WRPMESH-0005","ix":5,"v":{"a":0,"k":0,"ix":5}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.177,"y":1},"o":{"x":0.089,"y":0.003},"t":39,"s":[{"i":[[19.687,0],[0.733,-6.089],[0,0],[-25.25,0],[0,0],[0.273,1.95]],"o":[[-20.224,0],[-0.2,1.664],[0,0],[25.25,0],[0,0],[-0.885,-6.331]],"v":[[-0.25,-8],[-25.084,12.277],[-25.25,15],[0,38],[24.75,15],[24.519,11.775]],"c":true}]},{"t":47.0000019143492,"s":[{"i":[[19.687,0],[0.733,-6.089],[0,0],[-25.25,0],[0,0],[0.273,1.95]],"o":[[-20.224,0],[-0.2,1.664],[0,0],[25.25,0],[0,0],[-0.885,-6.331]],"v":[[-0.456,-8],[-25.29,12.277],[-25.474,60.542],[0,80],[24.75,57],[24.313,11.775]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0,0,0,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":21,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[103.195,98.809],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":421.000017147681,"st":90.0000036657751,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"eventbox_open","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[200,267,0],"ix":2,"l":2},"a":{"a":0,"k":[225,300,0],"ix":1,"l":2},"s":{"a":0,"k":[89,89,100],"ix":6,"l":2}},"ao":0,"w":450,"h":600,"ip":0,"op":90.0000036657751,"st":0,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Global/YelloLoadingView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Global/YelloLoadingView.swift new file mode 100644 index 00000000..f100a402 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Global/YelloLoadingView.swift @@ -0,0 +1,65 @@ +// +// LoadingView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/21/24. +// + +import UIKit + +import Lottie +import SnapKit +import Then + +final class YelloLoadingView: UIView { + // MARK: - Variables + // MARK: Component + let yelloIndicatorView = LottieAnimationView(name: "lottie_spinner_loading_profile") + + // MARK: - Function + // MARK: LifeCycle + init() { + super.init(frame: .zero) + setUI() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + // MARK: Layout Helpers + private func setUI(){ + setStyle() + setLayout() + } + + private func setStyle() { + self.do { + $0.isHidden = true + $0.backgroundColor = .black.withAlphaComponent(0.5) + } + + yelloIndicatorView.do { + $0.play() + $0.loopMode = .loop + } + } + + private func setLayout() { + self.addSubviews(yelloIndicatorView) + + yelloIndicatorView.snp.makeConstraints { + $0.size.equalTo(85.adjusted) + $0.center.equalToSuperview() + } + } + + // MARK: Custom Function + func showIndicator() { + self.isHidden = false + } + + func stopIndicator() { + self.isHidden = true + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Inviting/CloseButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Inviting/CloseButton.swift new file mode 100644 index 00000000..ba13f9c5 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Inviting/CloseButton.swift @@ -0,0 +1,25 @@ +// +// CloseButton.swift +// YELLO-iOS +// +// Created by 정채은 on 2/10/24. +// + +import UIKit + +class CloseButton: UIButton { + + // MARK: - Functions + override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { + let expandedBounds = bounds.insetBy(dx: -12.adjustedWidth, dy: -14.adjustedHeight) + return expandedBounds.contains(point) + } + + override init(frame: CGRect) { + super.init(frame: frame) + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Inviting/InvitingView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Inviting/InvitingView.swift index ceb7c03a..3b36e57b 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Inviting/InvitingView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Inviting/InvitingView.swift @@ -19,11 +19,13 @@ final class InvitingView: BaseView { let contentsView = UIView() // 컴포넌트 위치 순서대로 - let closeButton = UIButton() + let closeButton = CloseButton() let titleLabel = UILabel() let textLabelOne = UILabel() let textLabelTwo = UILabel() + let textLabelThree = UILabel() + let textLabelFour = UILabel() let backGroundView = UIView() let recommender = UILabel() @@ -58,41 +60,59 @@ final class InvitingView: BaseView { } textLabelOne.do { - $0.setTextWithLineHeight(text: StringLiterals.Inviting.firstText, lineHeight: 20.adjustedHeight) + $0.text = StringLiterals.Inviting.firstText $0.textColor = .grayscales600 - $0.font = .uiBody03 + $0.font = .uiLabelLarge } textLabelTwo.do { - $0.setTextWithLineHeight(text: StringLiterals.Inviting.secondText, lineHeight: 20.adjustedHeight) - $0.textColor = .black - $0.font = .uiBody04 + $0.text = StringLiterals.Inviting.secondText + $0.textColor = .white + $0.textAlignment = .center + $0.backgroundColor = .purpleSub500 + $0.font = .uiLabelLarge + } + + textLabelThree.do { + $0.text = StringLiterals.Inviting.thirdText + $0.textColor = .grayscales600 + $0.font = .uiLabelLarge + } + + textLabelFour.do { + $0.text = StringLiterals.Inviting.fourthText + $0.textColor = .white + $0.textAlignment = .center + $0.backgroundColor = .purpleSub500 + $0.font = .uiLabelLarge } backGroundView.do { - $0.backgroundColor = .grayscales50 + $0.backgroundColor = .grayscales100 $0.makeCornerRound(radius: 8.adjustedHeight) } recommender.do { $0.text = "내 추천인 코드" - $0.textColor = .purpleSub500 - $0.font = .uiBody04 + $0.textColor = .grayscales600 + $0.font = .uiLabelLarge } recommenderID.do { $0.text = " " - $0.textColor = .black - $0.font = .uiExtraLarge + $0.textColor = .purpleSub500 + $0.font = .uiLittleLage } kakaoButton.do { $0.setImage(ImageLiterals.InvitingPopUp.icKakaoShare, for: .normal) + $0.imageView?.contentMode = .scaleAspectFill $0.addTarget(self, action: #selector(kakaoButtonClicked), for: .touchUpInside) } copyButton.do { $0.setImage(ImageLiterals.InvitingPopUp.icLinkCopy, for: .normal) + $0.imageView?.contentMode = .scaleAspectFill $0.addTarget(self, action: #selector(copyButtonClicked), for: .touchUpInside) } } @@ -103,12 +123,14 @@ final class InvitingView: BaseView { self.addSubview(contentsView) contentsView.addSubviews(closeButton, - titleLabel, - textLabelOne, - textLabelTwo, - backGroundView, - kakaoButton, - copyButton) + titleLabel, + textLabelOne, + textLabelTwo, + textLabelThree, + textLabelFour, + backGroundView, + kakaoButton, + copyButton) backGroundView.addSubviews(recommender, recommenderID) @@ -125,44 +147,60 @@ final class InvitingView: BaseView { } titleLabel.snp.makeConstraints { - $0.top.equalToSuperview().inset(50.adjustedHeight) + $0.top.equalToSuperview().inset(38.adjustedHeight) $0.centerX.equalToSuperview() } textLabelOne.snp.makeConstraints { - $0.top.equalTo(titleLabel.snp.bottom).offset(12.adjustedHeight) + $0.top.equalTo(titleLabel.snp.bottom).offset(18.adjustedHeight) $0.centerX.equalToSuperview() + $0.height.equalTo(16.adjustedHeight) } textLabelTwo.snp.makeConstraints { - $0.top.equalTo(textLabelOne.snp.bottom) + $0.top.equalTo(textLabelOne.snp.bottom).offset(1.adjusted) + $0.leading.trailing.equalToSuperview().inset(70.adjusted) + $0.height.equalTo(20.adjustedHeight) + } + + textLabelThree.snp.makeConstraints { + $0.top.equalTo(textLabelTwo.snp.bottom).offset(14.adjusted) $0.centerX.equalToSuperview() + $0.height.equalTo(16.adjustedHeight) + } + + textLabelFour.snp.makeConstraints { + $0.top.equalTo(textLabelThree.snp.bottom).offset(3.adjusted) + $0.leading.trailing.equalToSuperview().inset(94.adjusted) + $0.height.equalTo(20.adjustedHeight) } backGroundView.snp.makeConstraints { $0.leading.trailing.equalToSuperview().inset(14.adjustedWidth) - $0.top.equalTo(textLabelTwo.snp.bottom).offset(20.adjustedHeight) - $0.height.equalTo(108.adjustedHeight) + $0.bottom.equalToSuperview().inset(102.adjustedHeight) + $0.height.equalTo(80.adjustedHeight) } recommender.snp.makeConstraints { - $0.top.equalToSuperview().inset(27.adjustedHeight) + $0.top.equalToSuperview().inset(17.adjustedHeight) $0.centerX.equalToSuperview() } recommenderID.snp.makeConstraints { - $0.top.equalTo(recommender.snp.bottom).offset(2.adjustedHeight) + $0.top.equalTo(recommender.snp.bottom).offset(3.adjustedHeight) $0.centerX.equalToSuperview() } kakaoButton.snp.makeConstraints { - $0.leading.equalToSuperview().inset(100.adjustedWidth) - $0.bottom.equalToSuperview().inset(50.adjustedHeight) + $0.leading.equalToSuperview().inset(94.adjustedWidth) + $0.bottom.equalToSuperview().inset(36.adjustedHeight) + $0.size.equalTo(48.adjusted) } copyButton.snp.makeConstraints { - $0.trailing.equalToSuperview().inset(100.adjustedWidth) - $0.bottom.equalToSuperview().inset(50.adjustedHeight) + $0.trailing.equalToSuperview().inset(94.adjustedWidth) + $0.bottom.equalToSuperview().inset(36.adjustedHeight) + $0.size.equalTo(48.adjusted) } } } @@ -225,7 +263,7 @@ extension InvitingView { guard let data = data.data else { return } self.copyButton.isEnabled = false self.kakaoButton.isEnabled = false - self.recommenderID.text = "@" + data.yelloId + self.recommenderID.text = "@" + data.yelloID self.copyButton.isEnabled = true self.kakaoButton.isEnabled = true diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/Button/InstagramButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/Button/InstagramButton.swift index 66f392f8..eca7a021 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/Button/InstagramButton.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/Button/InstagramButton.swift @@ -8,18 +8,63 @@ import UIKit final class InstagramButton: UIButton { + + let instagramImageView = UIImageView() + let instagramLabel = UILabel() // MARK: - Functions - override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { - let expandedBounds = bounds.insetBy(dx: -89.adjustedWidth, dy: -84.adjustedHeight) - return expandedBounds.contains(point) - } +// override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { +// let expandedBounds = bounds.insetBy(dx: -89.adjustedWidth, dy: -84.adjustedHeight) +// return expandedBounds.contains(point) +// } override init(frame: CGRect) { super.init(frame: frame) + setUI() } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func setUI() { + setStyle() + setLayout() + } + + func setStyle() { + self.backgroundColor = .btnwhite + self.makeCornerRound(radius: 20.adjustedHeight) + + instagramImageView.do { + $0.image = ImageLiterals.MyYello.imgInstagram + } + + instagramLabel.do { + $0.text = StringLiterals.MyYello.Detail.instagram + $0.font = .uiButton + $0.textColor = .black + } + } + + func setLayout() { + self.addSubviews(instagramImageView, + instagramLabel) + + self.snp.makeConstraints { + $0.height.equalTo(40.adjustedHeight) + $0.width.equalTo(124.adjustedWidth) + } + + instagramImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(20.adjustedWidth) + $0.width.height.equalTo(20.adjusted) + } + + instagramLabel.snp.makeConstraints { + $0.leading.equalTo(instagramImageView.snp.trailing).offset(4.adjustedWidth) + $0.centerY.equalToSuperview() + } + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailNavigationBarView.swift index a6531478..4499c00b 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailNavigationBarView.swift @@ -17,7 +17,7 @@ final class MyYelloDetailNavigationBarView: BaseView { weak var handleBackButtonDelegate: HandleBackButtonDelegate? // MARK: Component - lazy var backButton = UIButton() + lazy var backButton = BaseIconButton() let titleLabel = UILabel() let pointView = UIView() let pointImageView = UIImageView() diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailView.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailView.swift index 8b1524db..0804af3c 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/View/MyYelloDetailView.swift @@ -32,9 +32,7 @@ final class MyYelloDetailView: BaseView { var indexNumber: Int = -1 var nameIndex: Int = -1 - lazy var instagramButton = InstagramButton(frame: CGRect(x: 0, y: 0, width: 60.adjusted, height: 60.adjusted)) - let instagramLabel = UILabel() - lazy var instagramView = UIView() + lazy var instagramButton = InstagramButton() lazy var keywordButton = HintButton(state: .keyword) lazy var senderButton = MyYelloButton(state: .noTicket) @@ -70,7 +68,7 @@ final class MyYelloDetailView: BaseView { senderButton.setButtonState(state: .useTicket) keywordButton.isHidden = true senderButton.snp.makeConstraints { - $0.top.equalTo(instagramView.snp.bottom).offset(77.adjustedHeight) + $0.top.equalTo(instagramButton.snp.bottom).offset(125.adjustedHeight) } if self.nameIndex == -3 { senderButton.setButtonState(state: .noTicket) @@ -111,7 +109,7 @@ final class MyYelloDetailView: BaseView { if isTicketUsed { keywordButton.isHidden = true senderButton.snp.makeConstraints { - $0.top.equalTo(instagramView.snp.bottom).offset(77.adjustedHeight) + $0.top.equalTo(instagramButton.snp.bottom).offset(125.adjustedHeight) } } @@ -129,10 +127,10 @@ final class MyYelloDetailView: BaseView { if self.isSenderUsed == true { keywordButton.isHidden = true senderButton.snp.makeConstraints { - $0.top.equalTo(instagramView.snp.bottom).offset(77.adjustedHeight) + $0.top.equalTo(instagramButton.snp.bottom).offset(125.adjustedHeight) } - instagramView.snp.makeConstraints { + instagramButton.snp.makeConstraints { $0.top.equalTo(detailKeywordView.snp.bottom).offset(44.adjustedHeight) } } @@ -170,22 +168,9 @@ final class MyYelloDetailView: BaseView { $0.isHidden = true } - instagramView.do { - $0.isHidden = true - } - instagramButton.do { - $0.backgroundColor = UIColor(white: 1.0, alpha: 0.35) - $0.makeCornerRound(radius: 30.adjusted) - $0.layer.cornerCurve = .continuous - $0.setImage(ImageLiterals.MyYello.imgInstagram, for: .normal) $0.addTarget(self, action: #selector(instagramButtonTapped), for: .touchUpInside) - } - - instagramLabel.do { - $0.setTextWithLineHeight(text: StringLiterals.MyYello.Detail.instagram, lineHeight: 20.adjustedHeight) - $0.textColor = .white - $0.font = .uiBodySmall + $0.isHidden = true } keywordButton.do { @@ -225,13 +210,10 @@ final class MyYelloDetailView: BaseView { detailSenderView, genderLabel, detailKeywordView, - instagramView, + instagramButton, keywordButton, senderButton) - instagramView.addSubviews(instagramButton, - instagramLabel) - myYelloDetailNavigationBarView.snp.makeConstraints { $0.top.equalTo(self.safeAreaInsets).offset(statusBarHeight) $0.width.equalToSuperview() @@ -255,26 +237,13 @@ final class MyYelloDetailView: BaseView { $0.centerX.equalToSuperview() } - instagramView.snp.makeConstraints { - $0.top.equalTo(detailKeywordView.snp.bottom).offset(33.adjustedHeight) - $0.centerX.equalToSuperview() - $0.height.equalTo(84.adjustedHeight) - $0.width.equalTo(89.adjustedWidth) - } - instagramButton.snp.makeConstraints { - $0.width.height.equalTo(60.adjusted) - $0.top.centerX.equalToSuperview() - } - - instagramLabel.snp.makeConstraints { - $0.top.equalTo(instagramButton.snp.bottom).offset(4.adjustedHeight) - $0.width.equalTo(89.adjustedWidth) - $0.centerX.bottom.equalToSuperview() + $0.top.equalTo(detailKeywordView.snp.bottom).offset(16.adjustedHeight) + $0.centerX.equalToSuperview() } keywordButton.snp.makeConstraints { - $0.top.equalTo(instagramView.snp.bottom).offset(33.adjustedHeight) + $0.top.equalTo(instagramButton.snp.bottom).offset(94.adjustedHeight) $0.height.equalTo(54.adjustedHeight) $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) } @@ -300,7 +269,7 @@ extension MyYelloDetailView { // MARK: Custom Function func setInstagramUI() { myYelloDetailNavigationBarView.isHidden = true - instagramView.isHidden = true + instagramButton.isHidden = true keywordButton.isHidden = true senderButton.isHidden = true @@ -332,7 +301,7 @@ extension MyYelloDetailView { func endInstagram() { myYelloDetailNavigationBarView.isHidden = false - instagramView.isHidden = false + instagramButton.isHidden = false senderButton.isHidden = false logoImageView.isHidden = true @@ -526,8 +495,7 @@ extension MyYelloDetailView { if self.indexNumber != -1 { MyYelloListView.myYelloModelDummy[self.indexNumber].nameHint = -2 } - - + UserManager.shared.userTicketCount -= 1 if !self.isKeywordUsed { Amplitude.instance().logEvent("view_open_fullnamefirst") } else { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/ViewController/MyYelloDetailViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/ViewController/MyYelloDetailViewController.swift index 0c61ce7c..da2bd3f8 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/ViewController/MyYelloDetailViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/Detail/ViewController/MyYelloDetailViewController.swift @@ -8,6 +8,7 @@ import UIKit import Amplitude +import GoogleMobileAds import SnapKit import Then @@ -19,11 +20,12 @@ struct MyYelloBackgroundColorStringDummy { final class MyYelloDetailViewController: BaseViewController { // MARK: - Variables - // MARK: Constants + // MARK: Property + var colorIndex: Int = 1 + + // MARK: Components let myYelloDetailView = MyYelloDetailView() let paymentPlusViewController = PaymentPlusViewController() - - var colorIndex: Int = 1 var myYelloBackgroundColorStringDummy: [MyYelloBackgroundColorStringDummy] = [MyYelloBackgroundColorStringDummy(backgroundColorTop: BackGroundColor.BackgroundColorTop.one, @@ -58,6 +60,7 @@ final class MyYelloDetailViewController: BaseViewController { setDelegate() setAddTarget() self.paymentPlusViewController.getProducts() + } override func viewWillAppear(_ animated: Bool) { @@ -143,7 +146,6 @@ extension MyYelloDetailViewController { myYelloDetailView.genderLabel.textColor = .black myYelloDetailView.senderButton.findLabel.textColor = .black myYelloDetailView.instagramButton.setTitleColor(.black, for: .normal) - myYelloDetailView.instagramLabel.textColor = .black } let gradientView = UIView(frame: view.bounds) @@ -169,7 +171,7 @@ extension MyYelloDetailViewController { self.myYelloDetailView.detailSenderView.isHidden = false self.myYelloDetailView.detailKeywordView.isHidden = false self.myYelloDetailView.genderLabel.isHidden = false - self.myYelloDetailView.instagramView.isHidden = false + self.myYelloDetailView.instagramButton.isHidden = false self.myYelloDetailView.keywordButton.isHidden = false self.myYelloDetailView.senderButton.isHidden = false self.setBackgroundView() @@ -233,7 +235,7 @@ extension MyYelloDetailViewController { self.myYelloDetailView.isKeywordUsed = true self.myYelloDetailView.keywordButton.isHidden = true self.myYelloDetailView.senderButton.snp.makeConstraints { - $0.top.equalTo(self.myYelloDetailView.instagramView.snp.bottom).offset(77.adjustedHeight) + $0.top.equalTo(self.myYelloDetailView.instagramButton.snp.bottom).offset(77.adjustedHeight) } } else if data.nameHint == -2 { self.myYelloDetailView.isTicketUsed = true @@ -242,8 +244,6 @@ extension MyYelloDetailViewController { } self.myYelloDetailView.ticketCount = data.ticketCount - - Amplitude.instance().setUserProperties(["user_subscription": data.isSubscribe ? "yes" : "no", "user_ticket": data.ticketCount]) @@ -291,6 +291,7 @@ extension MyYelloDetailViewController { return initialName } + // MARK: Objc Function @objc func popViewController(_ notification: Notification) { tabBarController?.tabBar.items?[2].imageInsets = UIEdgeInsets(top: -23, left: 0, bottom: 0, right: 0) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/View/MyYelloNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/View/MyYelloNavigationBarView.swift index b54975af..1b628c99 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/View/MyYelloNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/View/MyYelloNavigationBarView.swift @@ -19,6 +19,10 @@ final class MyYelloNavigationBarView: BaseView { // MARK: - Variables // MARK: Component private let titleLabel = UILabel() + let noticeButton = UIButton() + let noticeButtonImageView = UIImageView() + let noticeButtonLabel = UILabel() + let clickMeButtonLabel = UILabel() let yelloNumberLabel = UILabel() let yelloCountLabel = UILabel() lazy var shopButton = UIButton(frame: CGRect(x: 0, y: 0, width: 67.adjustedWidth, height: 28.adjustedHeight)) @@ -43,6 +47,31 @@ final class MyYelloNavigationBarView: BaseView { $0.textColor = .white } + noticeButton.do { + $0.makeCornerRound(radius: 8.adjustedHeight) + $0.backgroundColor = .black + $0.makeBorder(width: 1, color: .grayscales700) + } + + noticeButtonImageView.do { + $0.image = ImageLiterals.MyYello.icMegaphone + $0.isUserInteractionEnabled = false + } + + noticeButtonLabel.do { + $0.textColor = .white + $0.font = .uiLabelLarge + $0.isUserInteractionEnabled = false + } + + clickMeButtonLabel.do { + $0.text = StringLiterals.MyYello.NavigationBar.clickMe + $0.textColor = .yelloMain500 + $0.font = .uiLabelLarge + $0.isUserInteractionEnabled = false + $0.isHidden = true + } + shopButton.do { $0.setImage(ImageLiterals.MyYello.icShop, for: .normal) $0.setTitle(StringLiterals.MyYello.NavigationBar.shop, for: .normal) @@ -98,6 +127,7 @@ final class MyYelloNavigationBarView: BaseView { override func setLayout() { self.addSubviews(titleLabel, shopBackgroundView, + noticeButton, yelloNumberLabel, yelloCountLabel, countSkeletonLabel, @@ -106,10 +136,14 @@ final class MyYelloNavigationBarView: BaseView { saleView.addSubviews(saleLabel, saleTriangle) + noticeButton.addSubviews(noticeButtonImageView, + noticeButtonLabel, + clickMeButtonLabel) + shopBackgroundView.addSubview(shopButton) self.snp.makeConstraints { - $0.height.equalTo(74.adjustedHeight) + $0.height.equalTo(128.adjustedHeight) } titleLabel.snp.makeConstraints { @@ -124,18 +158,39 @@ final class MyYelloNavigationBarView: BaseView { $0.width.equalTo(71.adjustedWidth) } + noticeButton.snp.makeConstraints { + $0.top.equalTo(titleLabel.snp.bottom).offset(14.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.height.equalTo(36.adjustedHeight) + } + + noticeButtonImageView.snp.makeConstraints { + $0.leading.equalToSuperview().inset(8.adjustedWidth) + $0.centerY.equalToSuperview() + } + + noticeButtonLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(noticeButtonImageView.snp.trailing).offset(4.adjustedWidth) + } + + clickMeButtonLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(12.adjustedWidth) + } + yelloNumberLabel.snp.makeConstraints { $0.centerY.equalTo(yelloCountLabel) $0.leading.equalTo(titleLabel) } yelloCountLabel.snp.makeConstraints { - $0.bottom.equalToSuperview().inset(5.adjustedHeight) + $0.bottom.equalToSuperview().inset(10.adjustedHeight) $0.leading.equalTo(yelloNumberLabel.snp.trailing).inset(-4.adjustedWidth) } countSkeletonLabel.snp.makeConstraints { - $0.top.equalTo(titleLabel.snp.bottom).offset(20.adjustedHeight) + $0.top.equalTo(noticeButton.snp.bottom).offset(14.adjustedHeight) $0.leading.equalTo(titleLabel) $0.height.equalTo(16.adjustedHeight) $0.width.equalTo(70.adjustedWidth) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/ViewController/MyYelloViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/ViewController/MyYelloViewController.swift index 7157c643..ac09602a 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/MyYello/ViewController/MyYelloViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/MyYello/ViewController/MyYelloViewController.swift @@ -7,17 +7,30 @@ import UIKit +import Amplitude +import GoogleMobileAds +import Lottie import SnapKit import Then -import Amplitude final class MyYelloViewController: BaseViewController { // MARK: - Variables + // MARK: Constants + let interstitialId = Config.myYelloAd + + // MARK: Property + private var interstitial: GADInterstitialAd? + var myYelloViewCount = UserDefaults.standard.integer(forKey: "myYelloCount") + var indexNumber: Int = 0 + // MARK: Component + let loadingView = YelloLoadingView() let myYelloView = MyYelloView() let paymentPlusViewController = PaymentPlusViewController() - + + var noticeURL: String? + var countFetchingMore: Bool = false { didSet { if countFetchingMore { @@ -46,14 +59,7 @@ final class MyYelloViewController: BaseViewController { self.tabBarController?.tabBar.items?[2].imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) self.myYelloView.myYelloListView.myYelloTableView.reloadData() self.myYelloCount() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) + self.myYelloNotice() } // MARK: Layout Helpers @@ -62,7 +68,7 @@ final class MyYelloViewController: BaseViewController { } override func setLayout() { - view.addSubviews(myYelloView) + view.addSubviews(myYelloView, loadingView) let tabbarHeight = 60 + safeAreaBottomInset() @@ -77,6 +83,10 @@ final class MyYelloViewController: BaseViewController { $0.width.equalToSuperview() $0.bottom.equalToSuperview().inset(tabbarHeight) } + + loadingView.snp.makeConstraints { + $0.edges.equalToSuperview() + } } // MARK: Custom Function @@ -89,7 +99,27 @@ final class MyYelloViewController: BaseViewController { private func setAddTarget() { myYelloView.myYelloListView.refreshControl.addTarget(self, action: #selector(refreshCount), for: .valueChanged) myYelloView.myYelloListView.refreshControl.addTarget(self, action: #selector(refreshTable(refresh:)), for: .valueChanged) - + myYelloView.myYellowNavigationBarView.noticeButton.addTarget(self, action: #selector(myYelloNoticeButtonTapped), for: .touchUpInside) + + } + + private func setGoogleAds() { + let request = GADRequest() + GADInterstitialAd.load(withAdUnitID: interstitialId, + request: request) { ad, error in + if let error { + print("Failed to load interstitial ad with error: \(error.localizedDescription)") + self.loadingView.stopIndicator() + return + } + self.interstitial = ad + ad?.fullScreenContentDelegate = self + DispatchQueue.main.async { + ad?.present(fromRootViewController: self) + self.loadingView.stopIndicator() + self.view.isUserInteractionEnabled = true + } + } } @objc func refreshCount() { @@ -120,14 +150,28 @@ extension MyYelloViewController: HandleShopButton { // MARK: HandleMyYelloCellDelegate extension MyYelloViewController: HandleMyYelloCellDelegate { func pushMyYelloDetailViewController(index: Int) { - let myYelloDetailViewController = MyYelloDetailViewController() - self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) + self.indexNumber = index + let myYelloDetailViewController = MyYelloDetailViewController() + + self.myYelloView.myYelloListView.indexNumber = self.indexNumber + myYelloDetailViewController.myYelloDetailView.voteIdNumber = MyYelloListView.myYelloModelDummy[self.indexNumber].id + myYelloDetailViewController.myYelloDetail(voteId: MyYelloListView.myYelloModelDummy[self.indexNumber].id) + myYelloDetailViewController.myYelloDetailView.indexNumber = self.indexNumber + + myYelloViewCount += 1 + UserDefaults.standard.set(myYelloViewCount, forKey: "myYelloCount") + print("My Yello Count = \(myYelloViewCount)") - DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { - self.myYelloView.myYelloListView.indexNumber = index - myYelloDetailViewController.myYelloDetailView.voteIdNumber = MyYelloListView.myYelloModelDummy[index].id - myYelloDetailViewController.myYelloDetail(voteId: MyYelloListView.myYelloModelDummy[index].id) - myYelloDetailViewController.myYelloDetailView.indexNumber = index + if UserManager.shared.isYelloPlus { + self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) + } else { + if myYelloViewCount == 3 || myYelloViewCount % 5 == 3 { + self.loadingView.showIndicator() + self.setGoogleAds() + } else { + self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) + } + } } } @@ -141,34 +185,35 @@ extension MyYelloViewController { countFetchingMore = true let queryDTO = MyYelloRequestQueryDTO(page: 0) - + NetworkService.shared.myYelloService.myYello(queryDTO: queryDTO) { [weak self] response in guard let self = self else { return } - switch response { - case .success(let data): - guard let data = data.data else { return } - self.myYelloView.myYelloCount = data.totalCount - if data.ticketCount == 0 { - self.myYelloView.haveTicket = false - } else { - self.myYelloView.haveTicket = true - self.myYelloView.unlockButton.keyCountLabel.text = String(data.ticketCount) - } - - Amplitude.instance().setUserProperties(["user_message_open": data.openCount, - "user_message_open_keyword": data.openKeywordCount, - "user_message_open_firstletter": data.openNameCount, - "user_message_open_fullname": data.openFullNameCount, - "user_message_received": data.totalCount]) - - print(self.myYelloCount) - print("내 옐로 count 통신 성공") - self.myYelloView.resetLayout() - self.countFetchingMore = false - default: - print("network fail") - return + switch response { + case .success(let data): + guard let data = data.data else { return } + self.myYelloView.myYelloCount = data.totalCount + if data.ticketCount == 0 { + self.myYelloView.haveTicket = false + } else { + self.myYelloView.haveTicket = true + self.myYelloView.unlockButton.keyCountLabel.text = String(data.ticketCount) + UserManager.shared.userTicketCount = data.ticketCount } + + Amplitude.instance().setUserProperties(["user_message_open": data.openCount, + "user_message_open_keyword": data.openKeywordCount, + "user_message_open_firstletter": data.openNameCount, + "user_message_open_fullname": data.openFullNameCount, + "user_message_received": data.totalCount]) + + print(self.myYelloCount) + print("내 옐로 count 통신 성공") + self.myYelloView.resetLayout() + self.countFetchingMore = false + default: + print("network fail") + return + } } } @@ -204,6 +249,42 @@ extension MyYelloViewController { myYelloView.myYelloListView.myYelloTableView.reloadData() MyYelloListView.myYelloModelDummy = [] myYelloView.myYelloListView.myYello() + myYelloNotice() refresh.endRefreshing() } + + func myYelloNotice() { + NetworkService.shared.notificationService.userNotification(typeName: "BANNER") { result in + switch result { + case .success(let data): + guard let data = data.data else { return } + self.myYelloView.myYellowNavigationBarView.noticeButtonLabel.text = data.title + self.myYelloView.myYellowNavigationBarView.clickMeButtonLabel.isHidden = data.redirectUrl.isEmpty + self.myYelloView.myYellowNavigationBarView.noticeButton.isEnabled = !data.redirectUrl.isEmpty + self.noticeURL = data.redirectUrl + default: + print("서버 통신 오류") + } + } + } + + @objc func myYelloNoticeButtonTapped() { + let url = URL(string: noticeURL ?? "") ?? URL(fileURLWithPath: "") + UIApplication.shared.open(url, options: [:], completionHandler: nil) + + } +} + +// MARK: - GADInterstitialDelegate +extension MyYelloViewController: GADFullScreenContentDelegate { + func adWillDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { + let myYelloDetailViewController = MyYelloDetailViewController() + + self.myYelloView.myYelloListView.indexNumber = self.indexNumber + myYelloDetailViewController.myYelloDetailView.voteIdNumber = MyYelloListView.myYelloModelDummy[self.indexNumber].id + myYelloDetailViewController.myYelloDetail(voteId: MyYelloListView.myYelloModelDummy[self.indexNumber].id) + myYelloDetailViewController.myYelloDetailView.indexNumber = self.indexNumber + + self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Notification/NotificationView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Notification/NotificationView.swift new file mode 100644 index 00000000..2aa7d7e3 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Notification/NotificationView.swift @@ -0,0 +1,103 @@ +// +// NotificationView.swift +// YELLO-iOS +// +// Created by 변희주 on 1/28/24. +// + +import UIKit + +import SnapKit +import Then + +final class NotificationView: BaseView { + + let notificationImageView = UIImageView() + let doNotSeeAgainButton = UIButton() + private let doNotSeeAgainLabel = UILabel() + private let closeButton = UIButton() + + var isTapped: Bool = false + + override func setStyle() { + self.backgroundColor = .black.withAlphaComponent(0.8) + + notificationImageView.do { + $0.contentMode = .scaleAspectFill + $0.clipsToBounds = true + $0.isUserInteractionEnabled = true + } + + doNotSeeAgainButton.do { + $0.setImage(UIImage(imageLiteralResourceName: "btnNotCheckBox"), for: .normal) + $0.imageView?.contentMode = .scaleAspectFill + $0.addTarget(self, action: #selector(doNotSeeButtonTapped), for: .touchUpInside) + } + + doNotSeeAgainLabel.do { + $0.text = StringLiterals.Notification.doNotSeeAgainLabel + $0.textColor = .white + $0.font = .uiBody02 + } + + closeButton.do { + $0.setTitle(StringLiterals.Notification.close, for: .normal) + $0.setTitleColor(.white, for: .normal) + $0.titleLabel?.font = .uiButton02 + $0.addTarget(self, action: #selector(closeButtonTapped), for: .touchUpInside) + } + } + + override func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubviews(notificationImageView, + doNotSeeAgainButton, + doNotSeeAgainLabel, + closeButton) + + notificationImageView.snp.makeConstraints { + $0.top.equalToSuperview().inset(statusBarHeight + 126.adjustedHeight) + $0.centerX.equalToSuperview() + $0.width.equalTo(252.adjusted) + $0.height.equalTo(336.adjusted) + } + + doNotSeeAgainButton.snp.makeConstraints { + $0.top.equalTo(notificationImageView.snp.bottom).offset(8.adjusted) + $0.leading.equalTo(notificationImageView) + $0.size.equalTo(24.adjusted) + } + + doNotSeeAgainLabel.snp.makeConstraints { + $0.leading.equalTo(doNotSeeAgainButton.snp.trailing).offset(8.adjusted) + $0.centerY.equalTo(doNotSeeAgainButton) + } + + closeButton.snp.makeConstraints { + $0.top.equalTo(notificationImageView.snp.bottom).offset(8.adjusted) + $0.trailing.equalTo(notificationImageView).offset(-13.adjusted) + $0.width.equalTo(21.adjusted) + $0.height.equalTo(24.adjusted) + } + } +} + +extension NotificationView { + @objc + private func doNotSeeButtonTapped() { + isTapped.toggle() + doNotSeeAgainButton.setImage(UIImage(imageLiteralResourceName: isTapped ? "btnCheckBox" : "btnNotCheckBox"), for: .normal) + UserDefaults.standard.set(isTapped, forKey: "isTapped") + } + + @objc + private func closeButtonTapped() { + self.isHidden = true + self.removeFromSuperview() + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Cells/FriendsTableViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Cells/FriendsTableViewCell.swift index 21559b20..602286d8 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Cells/FriendsTableViewCell.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Cells/FriendsTableViewCell.swift @@ -82,7 +82,7 @@ class FriendsTableViewCell: UITableViewCell { contentView.bringSubviewToFront(selectedOverlayView) selectedOverlayView.snp.makeConstraints { $0.top.leading.bottom.equalToSuperview() - $0.trailing.equalToSuperview().inset(50) + $0.trailing.equalToSuperview().inset(50.adjustedWidth) } } } else { @@ -163,6 +163,7 @@ extension FriendsTableViewCell { } stackView.snp.makeConstraints { + $0.width.equalTo(230.adjustedWidth) $0.leading.equalTo(profileImageView.snp.trailing).offset(8.adjusted) $0.centerY.equalToSuperview() } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/OnboardingViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/OnboardingViewController.swift index 1067ec9d..9bac6e75 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/OnboardingViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/OnboardingViewController.swift @@ -77,9 +77,11 @@ class OnboardingBaseViewController: UIViewController { } skipButton.do { + $0.makeCornerRound(radius: 24.adjustedHeight) + $0.makeBorder(width: 1, color: .grayscales200) $0.setTitle("건너뛰기", for: .normal) $0.titleLabel?.font = .uiBody01 - $0.setTitleColor(.white, for: .normal) + $0.setTitleColor(.grayscales200, for: .normal) $0.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) } @@ -87,7 +89,7 @@ class OnboardingBaseViewController: UIViewController { $0.addArrangedSubviews(skipButton, nextButton) $0.axis = .vertical $0.alignment = .center - $0.spacing = 14 + $0.spacing = 10.adjustedHeight } skipButton.isHidden = !(isSkipable) @@ -104,7 +106,8 @@ class OnboardingBaseViewController: UIViewController { } skipButton.snp.makeConstraints { - $0.height.equalTo(32) + $0.height.equalTo(48.adjustedHeight) + $0.leading.trailing.equalToSuperview() } buttonStackView.snp.makeConstraints { @@ -125,7 +128,7 @@ class OnboardingBaseViewController: UIViewController { self.bottomConstraint = NSLayoutConstraint(item: self.nextButton, attribute: .bottom, relatedBy: .equal, toItem: safeArea, - attribute: .bottom, multiplier: 1.0, constant: -34.adjusted) + attribute: .bottom, multiplier: 1.0, constant: -34.adjustedHeight) self.bottomConstraint?.isActive = true NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/SearchBaseViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/SearchBaseViewController.swift index d3b2a541..eaf4a267 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/SearchBaseViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Base/SearchBaseViewController.swift @@ -8,23 +8,24 @@ import UIKit // MARK: - Delegate -protocol SearchResultTableViewSelectDelegate: AnyObject { +protocol SchoolSearchResultSelectDelegate: AnyObject { func didSelectSchoolResult(_ result: String) } protocol MajorSearchResultSelectDelegate: AnyObject { - func didSelectMajorResult(_ result: String) + func didSelectMajorResult(_ result: GroupList) } class SearchBaseViewController: BaseViewController { // MARK: - Variables // MARK: Property - var allArr: [String] = [] + var searchResults: [String] = [] + var totalItemCount: Int = 0 // MARK: Component let searchView = SearchView() - weak var delegate: SearchResultTableViewSelectDelegate? + weak var schoolSearchDelegate: SchoolSearchResultSelectDelegate? weak var majorSearchDelegate: MajorSearchResultSelectDelegate? // MARK: - Function @@ -47,7 +48,7 @@ class SearchBaseViewController: BaseViewController { } // MARK: Custom Function - func customView(titleText: String, helperText: String) { + func customTitle(titleText: String, helperText: String) { searchView.titleLabel.text = titleText searchView.helperButton.setTitle(helperText, for: .normal) searchView.helperButton.setUnderline() @@ -91,14 +92,19 @@ extension SearchBaseViewController: UITextFieldDelegate { // MARK: UITableViewDataSource extension SearchBaseViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - allArr.count + searchResults.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let searchResult = allArr[indexPath.row] - let cell = tableView.dequeueReusableCell(withIdentifier: SearchResultTableViewCell.identifier) as! SearchResultTableViewCell - cell.titleLabel.text = searchResult - cell.selectionStyle = .none - return cell + if let searchResult = searchResults[safe: indexPath.row], + let cell = tableView.dequeueReusableCell(withIdentifier: SearchResultTableViewCell.identifier) as? SearchResultTableViewCell { + cell.titleLabel.text = searchResult + cell.selectionStyle = .none + return cell + } else { + print("index out of range") + return UITableViewCell() + } + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/HighSchoolViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/HighSchoolViewController.swift index fa09111c..883a8d88 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/HighSchoolViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/HighSchoolViewController.swift @@ -25,9 +25,7 @@ class HighSchoolViewController: OnboardingBaseViewController { let baseView = HighSchoolView() let schoolSearchViewController = FindSchoolViewController() let studentIdViewController = StudentIdViewController() - lazy var studentIdView = StudentIdView() lazy var userViewController = UserInfoViewController() - let bottomSheetViewController = BaseBottomViewController() // MARK: - Function // MARK: LifeCycle @@ -40,7 +38,6 @@ class HighSchoolViewController: OnboardingBaseViewController { // MARK: Layout Helpers override func setStyle() { - studentIdView.studentIdList = (1...20).map { "\($0)반" } studentIdViewController.studentIdList = (1...20).map { "\($0)반" } } @@ -57,31 +54,22 @@ class HighSchoolViewController: OnboardingBaseViewController { private func addTarget() { baseView.schoolSearchTextField.delegate = self baseView.classSearchTextField.delegate = self - schoolSearchViewController.delegate = self + schoolSearchViewController.schoolSearchDelegate = self studentIdViewController.delegate = self } private func setDelegate() { baseView.buttonArray.forEach { - $0.addTarget(self, action: #selector(didTapClassButton), for: .touchUpInside) + $0.addTarget(self, action: #selector(classButtonTapped), for: .touchUpInside) } } private func classModalPresent() { - - if #available(iOS 16.0, *) { - let nav = UINavigationController(rootViewController: studentIdViewController) - if let sheet = nav.sheetPresentationController { - sheet.detents = [.medium()] - sheet.prefersGrabberVisible = true - sheet.invalidateDetents() - present(nav, animated: true, completion: nil) - } - - } else { - bottomSheetViewController.setCustomView(view: studentIdView) - bottomSheetViewController.modalPresentationStyle = .overFullScreen - present(bottomSheetViewController, animated: false) + let nav = UINavigationController(rootViewController: studentIdViewController) + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) } } @@ -124,13 +112,12 @@ class HighSchoolViewController: OnboardingBaseViewController { /// 학년 추출 func extractNumbers(from text: String) -> Int { let numberCharacterSet = CharacterSet.decimalDigits - let numbers = Int(text.components(separatedBy: numberCharacterSet.inverted).joined()) ?? - 0 + let numbers = Int(text.components(separatedBy: numberCharacterSet.inverted).joined()) ?? 0 return numbers } // MARK: Objc Function - @objc func didTapClassButton(sender: UIButton) { + @objc func classButtonTapped(sender: UIButton) { sender.makeBorder(width: 1, color: .yelloMain500) sender.setTitleColor(.yelloMain500, for: .normal) baseView.buttonArray.forEach { button in @@ -143,6 +130,20 @@ class HighSchoolViewController: OnboardingBaseViewController { guard let buttonTitleLabel = sender.titleLabel else { return } self.schoolLevel = extractNumbers(from: buttonTitleLabel.text ?? "") } + + @objc func textfieldButtonTapped(_ sender: UIButton) { + switch sender { + case baseView.schoolSearchTextField.searchButton: + let nextViewController = FindSchoolViewController() + nextViewController.schoolSearchDelegate = self + self.present(nextViewController, animated: true) + baseView.classSearchTextField.text = "" + case baseView.classSearchTextField.toggleButton: + classModalPresent() + default: + return + } + } } extension HighSchoolViewController: UITextFieldDelegate { @@ -151,8 +152,7 @@ extension HighSchoolViewController: UITextFieldDelegate { switch textField { case baseView.schoolSearchTextField: let nextViewController = FindSchoolViewController() - nextViewController.isHighSchool = true - nextViewController.delegate = self + nextViewController.schoolSearchDelegate = self self.present(nextViewController, animated: true) baseView.classSearchTextField.text = "" case baseView.classSearchTextField: @@ -169,7 +169,7 @@ extension HighSchoolViewController: UITextFieldDelegate { } -extension HighSchoolViewController: SearchResultTableViewSelectDelegate { +extension HighSchoolViewController: SchoolSearchResultSelectDelegate { func didSelectSchoolResult(_ result: String) { baseView.schoolSearchTextField.text = result self.highSchoolName = result @@ -178,7 +178,7 @@ extension HighSchoolViewController: SearchResultTableViewSelectDelegate { } extension HighSchoolViewController: SelectStudentIdDelegate { - func didSelectStudentId(_ result: Int) { + func didSelectStudentId(_ result: Int, type: SelectType ) { baseView.classSearchTextField.text = "\(result)반" getSchoolClass(keyword: String(result)) checkButtonEnable() diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindMajorViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindMajorViewController.swift index 80058577..a1136688 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindMajorViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindMajorViewController.swift @@ -7,28 +7,19 @@ import UIKit -// MARK: - Protocol -// MARK: FindMajorViewControllerDelegate -protocol FindMajorViewControllerDelegate: AnyObject { - func didDismissFindMajorViewController(with groupList: GroupList) -} - class FindMajorViewController: SearchBaseViewController { // MARK: - Variables // MARK: Property var allMajor: [GroupList] = [] var schoolName: String = "" - var pageCount: Int = 0 - var totalItemCount: Int = 0 - - weak var majorDelegate: FindMajorViewControllerDelegate? // MARK: - Function // MARK: LifeCycle override func viewDidLoad() { super.viewDidLoad() - super.customView(titleText: "학과 검색하기", helperText: "찾는 과가 없다면 클릭하세요!") + super.customTitle(titleText: StringLiterals.Onboarding.Search.majorSearchTitle, + helperText: StringLiterals.Onboarding.Search.majorHelperText ) addTarget() setDelegate() } @@ -49,7 +40,7 @@ class FindMajorViewController: SearchBaseViewController { let contentHeight = tableView.contentSize.height let visibleHeight = tableView.bounds.height self.searchView.searchTextField.endEditing(true) - if offsetY > contentHeight - visibleHeight, allArr.count < totalItemCount { + if offsetY > contentHeight - visibleHeight, searchResults.count < totalItemCount { pageCount += 1 guard let text = searchView.searchTextField.text else { return } searchMajor(text) @@ -66,7 +57,7 @@ class FindMajorViewController: SearchBaseViewController { guard let data = data.data else { return } DispatchQueue.main.async { self?.allMajor.append(contentsOf: data.groupList) - self?.allArr.append(contentsOf: data.groupList.map { $0.departmentName }) + self?.searchResults.append(contentsOf: data.groupList.map { $0.departmentName }) self?.totalItemCount = data.totalCount self?.searchView.searchResultTableView.reloadData() } @@ -79,10 +70,11 @@ class FindMajorViewController: SearchBaseViewController { // MARK: Objc Function @objc func textFieldDidChange(_ textField: YelloTextField) { - textField.debounce(delay: 0.5) { text in + textField.debounce(delay: 0.3) { text in guard let text = textField.text else { return } self.pageCount = 0 - self.allArr.removeAll() + self.searchResults.removeAll() + self.allMajor.removeAll() self.searchMajor(text) } } @@ -96,15 +88,13 @@ class FindMajorViewController: SearchBaseViewController { extension FindMajorViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let currentCell = tableView.cellForRow(at: indexPath) as? SearchResultTableViewCell else { - return + if let selectedItem = allMajor[safe: indexPath.row] { + majorSearchDelegate?.didSelectMajorResult(selectedItem) + searchView.searchResultTableView.reloadData() + self.dismiss(animated: true) + debugPrint("groupId: \(selectedItem.groupID)") + } else { + debugPrint("index가 잘못되었습니다. index out of range") } - majorSearchDelegate?.didSelectMajorResult(currentCell.titleLabel.text ?? "") - let selectedItem = allMajor[indexPath.row] - print(selectedItem.groupID) - majorDelegate?.didDismissFindMajorViewController(with: selectedItem) - allArr.removeAll() - searchView.searchResultTableView.reloadData() - self.dismiss(animated: true) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindSchoolViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindSchoolViewController.swift index 5f9d28ef..54e14543 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindSchoolViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/FindSchoolViewController.swift @@ -11,16 +11,21 @@ class FindSchoolViewController: SearchBaseViewController { // MARK: - Variables // MARK: Property - var isHighSchool = false - var allSchool: [String] = [] + var userType: UserGroupType = UserManager.shared.groupType var pageCount: Int = 0 - var totalItemCount: Int = 0 // MARK: LifeCycle + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + searchResults.removeAll() + searchView.searchTextField.text = "" + searchView.searchResultTableView.reloadData() + } + override func viewDidLoad() { super.viewDidLoad() - allSchool.removeAll() - customView(titleText: "우리 학교 검색하기", helperText: "우리 학교가 없나요? 학교를 추가해보세요!") + customTitle(titleText: StringLiterals.Onboarding.Search.schoolSearchTitle, + helperText: StringLiterals.Onboarding.Search.schoolHelperText) addTarget() } @@ -32,39 +37,39 @@ class FindSchoolViewController: SearchBaseViewController { } func searchSchool(_ word: String) { - - if isHighSchool { - /// 고등학교인 경우 - let highschoolQueryDTO: HighSchoolSearchRequestQueryDTO = HighSchoolSearchRequestQueryDTO(keyword: word, page: pageCount) - NetworkService.shared.onboardingService.getHighSchoolList(queryDTO: highschoolQueryDTO) { result in + switch userType { + case .univ, .SOPT: + let schoolQueryDTO: SchoolSearchRequestQueryDTO = SchoolSearchRequestQueryDTO(keyword: word, page: pageCount) + NetworkService.shared.onboardingService.getSchoolList(queryDTO: schoolQueryDTO) { result in switch result { case .success(let data): guard let data = data.data else { return } DispatchQueue.main.async { - self.allArr.append(contentsOf: data.groupNameList) + self.searchResults.append(contentsOf: data.groupNameList) self.totalItemCount = data.totalCount self.searchView.searchResultTableView.reloadData() } default: - print(ErrorPointer.self) - return +#if DEBUG + print("학교 검색 에러 발생\(ErrorPointer.self)") +#endif } } - } else { - /// 대학교인 경우 - let schoolQueryDTO: SchoolSearchRequestQueryDTO = SchoolSearchRequestQueryDTO(keyword: word, page: pageCount) - NetworkService.shared.onboardingService.getSchoolList(queryDTO: schoolQueryDTO) { result in + case .high, .middle: + let queryDTO = HighSchoolSearchRequestQueryDTO(keyword: word, page: pageCount) + NetworkService.shared.onboardingService.getHighSchoolList(queryDTO: queryDTO) { result in switch result { case .success(let data): guard let data = data.data else { return } DispatchQueue.main.async { - self.allArr.append(contentsOf: data.groupNameList) + self.searchResults.append(contentsOf: data.groupNameList) self.totalItemCount = data.totalCount self.searchView.searchResultTableView.reloadData() } default: - print(ErrorPointer.self) - return +#if DEBUG + print("학교 검색 에러 발생\(ErrorPointer.self)") +#endif } } } @@ -76,7 +81,7 @@ class FindSchoolViewController: SearchBaseViewController { let contentHeight = tableView.contentSize.height let visibleHeight = tableView.bounds.height self.searchView.searchTextField.endEditing(true) - if offsetY > contentHeight - visibleHeight, allArr.count < totalItemCount { + if offsetY > contentHeight - visibleHeight, searchResults.count < totalItemCount { pageCount += 1 guard let text = searchView.searchTextField.text else { return } searchSchool(text) @@ -84,17 +89,16 @@ class FindSchoolViewController: SearchBaseViewController { } // MARK: Objc Function @objc func textFieldDidChange(_ textField: YelloTextField) { - guard let text = textField.text else { return } - textField.debounce(delay: 0.5) { text in + textField.debounce(delay: 0.3) { text in guard let text = textField.text else { return } self.pageCount = 0 - self.allArr.removeAll() + self.searchResults.removeAll() self.searchSchool(text) } } @objc func helperButtonDidTap() { - let url = isHighSchool ? URL(string: "https://forms.gle/sMyn6uq7oHDovSdi8")! : URL(string: "https://bit.ly/46Yv0Hc")! + let url = userType == .high || userType == .middle ? URL(string: "https://forms.gle/sMyn6uq7oHDovSdi8")! : URL(string: "https://bit.ly/46Yv0Hc")! UIApplication.shared.open(url, options: [:], completionHandler: nil) } } @@ -103,10 +107,14 @@ class FindSchoolViewController: SearchBaseViewController { // MARK: UITableViewDelegate extension FindSchoolViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let currentCell = tableView.cellForRow(at: indexPath) as? SearchResultTableViewCell else { - return + if let currentCell = tableView.cellForRow(at: indexPath) as? SearchResultTableViewCell, + let selectedItem = searchResults[safe: indexPath.row] { + schoolSearchDelegate?.didSelectSchoolResult(currentCell.titleLabel.text ?? "") + } else { +#if DEBUG + debugPrint("index가 잘못되었습니다. index out of range") +#endif } - delegate?.didSelectSchoolResult(currentCell.titleLabel.text ?? "") self.dismiss(animated: true) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/StudentIdViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/StudentIdViewController.swift index b29a021e..d230bbcf 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/StudentIdViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/Modal/StudentIdViewController.swift @@ -10,19 +10,30 @@ import UIKit import SnapKit import Then +enum SelectType { + case grade // 중고등 학년 + case schoolClass // 중고등 반 + case studentId // 대학생 학번 +} + protocol SelectStudentIdDelegate: AnyObject { - func didSelectStudentId(_ result: Int) + func didSelectStudentId(_ result: Int, type: SelectType) } class StudentIdViewController: BaseViewController { // MARK: - Variables - // MARK: Constants - var studentIdList = (15...23).reversed().map { "\($0)학번" } - let studentIdTableView = UITableView() - // MARK: Property + var studentIdList = (15...24).reversed().map { "\($0)학번" } { + didSet { + studentIdTableView.reloadData() + } + } + var selectType: SelectType = .studentId weak var delegate: SelectStudentIdDelegate? + // MARK: Component + let studentIdTableView = UITableView() + // MARK: - Function // MARK: LifeCycle override func viewWillAppear(_ animated: Bool) { @@ -42,6 +53,7 @@ class StudentIdViewController: BaseViewController { $0.backgroundColor = .grayscales900 $0.separatorStyle = .none $0.tableHeaderView = UIView() + $0.showsVerticalScrollIndicator = false } } @@ -84,7 +96,7 @@ extension StudentIdViewController: UITableViewDelegate { // 학번 문자열에서 숫자 부분 추출 let studentId = cellTitle.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() guard let studentId = Int(studentId) else { return } - delegate?.didSelectStudentId(studentId) + delegate?.didSelectStudentId(studentId, type: self.selectType) self.dismiss(animated: true) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/NameViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/NameViewController.swift index 18e1b73f..38480632 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/NameViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/NameViewController.swift @@ -41,10 +41,15 @@ final class NameViewController: OnboardingBaseViewController { if !initialName.isEmpty { baseView.nameTextFieldView.textField.text = initialName } + + nextButton.setTitle(StringLiterals.Onboarding.CheckName.nextButtonText, + for: .normal) + baseView.nameTextFieldView.textField.cancelButton.do { $0.addTarget(self, action: #selector(nameCancelTapped), for: .touchUpInside) checkButtonEnable() } + baseView.nameTextFieldView.helperLabel.asCustomFont(targetString: "실제 이름", color: .yelloMain500, font: .uiBody05) } override func setLayout() { @@ -79,6 +84,7 @@ final class NameViewController: OnboardingBaseViewController { } else if isNameEmpty { nameTextFieldView.textField.setButtonState(state: .normal) nameTextFieldView.helperLabel.setLabelStyle(text: StringLiterals.Onboarding.Name.nameHelper, State: .normal) + nameTextFieldView.helperLabel.asCustomFont(targetString: "실제 이름", color: .yelloMain500, font: .uiBody05) } if !isNameEmpty, isKoreanOnly { @@ -97,6 +103,7 @@ final class NameViewController: OnboardingBaseViewController { // MARK: objc Function @objc func nameCancelTapped() { baseView.nameTextFieldView.helperLabel.setLabelStyle(text: StringLiterals.Onboarding.Name.nameHelper, State: .normal) + baseView.nameTextFieldView.helperLabel.asCustomFont(targetString: "실제 이름", color: .yelloMain500, font: .uiBody05) nextButton.setButtonEnable(state: false) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/RecommendIdViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/RecommendIdViewController.swift index d742bae9..4910defb 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/RecommendIdViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/RecommendIdViewController.swift @@ -11,6 +11,10 @@ import FirebaseCrashlytics class RecommendIdViewController: OnboardingBaseViewController { // MARK: - Variables + // MARK: Constants + let maxLength = 20 + + // MARK: Property var isExisted = false private var didPostUserInfo = false private var isFail = false @@ -37,6 +41,7 @@ class RecommendIdViewController: OnboardingBaseViewController { nextButton.do { $0.setTitle("완료", for: .normal) + $0.setButtonEnable(state: false) } } @@ -50,6 +55,10 @@ class RecommendIdViewController: OnboardingBaseViewController { // MARK: Custom Function func setDelegate() { + NotificationCenter.default.addObserver(self, + selector: #selector(textDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: baseView.recommendIdTextField.textField) baseView.recommendIdTextField.textField.delegate = self } @@ -57,7 +66,6 @@ class RecommendIdViewController: OnboardingBaseViewController { nextButton.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) skipButton.addTarget(self, action: #selector(didTapButton), for: .touchUpInside) baseView.recommendIdTextField.textField.cancelButton.addTarget(self, action: #selector(idCancelTapped), for: .touchUpInside) - baseView.recommendIdTextField.textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged) } func checkButtonEnable() { @@ -177,15 +185,30 @@ class RecommendIdViewController: OnboardingBaseViewController { nextButton.setButtonEnable(state: false) } - @objc func textFieldDidChange() { + @objc func textDidChange(_ notification: Notification) { guard let text = baseView.recommendIdTextField.textField.text else { return } checkIdValid(text: text) + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + textField.resignFirstResponder() + } + + // 초과되는 텍스트 제거 + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + guard let text = textField.text else {return false} + + // 최대 글자수 이상을 입력한 이후에는 중간에 다른 글자를 추가할 수 없게끔 작동 + if text.count >= maxLength && range.length == 0 && range.location < maxLength { + return false + } + + return true + } + func textFieldDidBeginEditing(_ textField: UITextField) { baseView.recommendIdTextField.textField.setButtonState(state: .cancel) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/SchoolSelectViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/SchoolSelectViewController.swift index 47151641..6d68fb30 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/SchoolSelectViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/SchoolSelectViewController.swift @@ -8,11 +8,14 @@ import UIKit class SchoolSelectViewController: OnboardingBaseViewController { + // MARK: - Variables + // MARK: Component let baseView = SchoolSelectView() - var schoolLevel: SchoolLevel = .high let highSchoolViewController = HighSchoolViewController() let universityViewController = UniversityViewController() + // MARK: - Function + // MARK: LifeCycle override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationBarView.isHidden = false @@ -26,14 +29,16 @@ class SchoolSelectViewController: OnboardingBaseViewController { addTarget() } + // MARK: Layout Helpers override func setLayout() { view.addSubviews(baseView) baseView.snp.makeConstraints { - $0.top.equalTo(navigationBarView.snp.bottom).offset(4) + $0.top.equalTo(navigationBarView.snp.bottom).offset(4.adjustedHeight) $0.leading.trailing.bottom.equalToSuperview() } } + // MARK: Custom Function private func addTarget() { baseView.highSchoolButton.addTarget(self, action: #selector(highButtonDidTap), for: .touchUpInside) baseView.univButton.addTarget(self, action: #selector(univButtonDidTap), for: .touchUpInside) @@ -41,13 +46,16 @@ class SchoolSelectViewController: OnboardingBaseViewController { baseView.univButton.checkButton.addTarget(self, action: #selector(univButtonDidTap), for: .touchUpInside) } + // MARK: Objc Function @objc func highButtonDidTap() { nextViewController = highSchoolViewController + UserManager.shared.groupType = .high nextButton.setButtonEnable(state: true) } @objc func univButtonDidTap() { nextViewController = universityViewController + UserManager.shared.groupType = .univ nextButton.setButtonEnable(state: true) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/UniversityViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/UniversityViewController.swift index eff36526..2ba64893 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/UniversityViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/ViewController/UniversityViewController.swift @@ -23,17 +23,17 @@ class UniversityViewController: OnboardingBaseViewController { weak var delegate: SelectStudentIdDelegate? let baseView = UniversityView() - let studentIdView = StudentIdView() let findSchooViewController = FindSchoolViewController() let majorSearchViewController = FindMajorViewController() let studentIdViewController = StudentIdViewController() - let bottomSheet = BaseBottomViewController() + let userViewController = UserInfoViewController() override func viewDidLoad() { step = 2 UserManager.shared.isFirstUser = true super.viewDidLoad() + addTarget() setDelegate() } @@ -45,15 +45,19 @@ class UniversityViewController: OnboardingBaseViewController { $0.leading.trailing.equalToSuperview() $0.bottom.equalTo(nextButton.snp.top) } - + } + + private func addTarget() { + baseView.schoolSearchTextField.searchButton.addTarget(self, action: #selector(searchButtonTapped), for: .touchUpInside) + baseView.majorSearchTextField.searchButton.addTarget(self, action: #selector(searchButtonTapped), for: .touchUpInside) + baseView.studentIdTextField.toggleButton.addTarget(self, action: #selector(searchButtonTapped), for: .touchUpInside) } private func setDelegate() { baseView.schoolSearchTextField.delegate = self baseView.majorSearchTextField.delegate = self baseView.studentIdTextField.delegate = self - majorSearchViewController.majorDelegate = self - studentIdView.idDelegate = self + majorSearchViewController.majorSearchDelegate = self studentIdViewController.delegate = self } @@ -73,20 +77,11 @@ class UniversityViewController: OnboardingBaseViewController { } private func studentIDSelect() { - - if #available(iOS 16.0, *) { - let nav = UINavigationController(rootViewController: studentIdViewController) - if let sheet = nav.sheetPresentationController { - sheet.detents = [.medium()] - sheet.prefersGrabberVisible = true - sheet.invalidateDetents() - present(nav, animated: true, completion: nil) - } - - } else { - bottomSheet.setCustomView(view: studentIdView) - bottomSheet.modalPresentationStyle = .overFullScreen - present(bottomSheet, animated: false) + let nav = UINavigationController(rootViewController: studentIdViewController) + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) } } @@ -104,6 +99,25 @@ class UniversityViewController: OnboardingBaseViewController { nextButton.setButtonEnable(state: isButtonEnabled) } + @objc + func searchButtonTapped(_ sender: UIButton) { + switch sender { + case baseView.schoolSearchTextField.searchButton: + let nextViewController = FindSchoolViewController() + nextViewController.schoolSearchDelegate = self + self.present(nextViewController, animated: true) + case baseView.majorSearchTextField.searchButton: + let nextViewController = majorSearchViewController + nextViewController.schoolName = self.schoolName + nextViewController.majorSearchDelegate = self + self.present(nextViewController, animated: true) + case baseView.studentIdTextField.toggleButton: + studentIDSelect() + default: + return + } + } + } // MARK: - extension // MARK: UITextFieldDelegate @@ -113,7 +127,7 @@ extension UniversityViewController: UITextFieldDelegate { guard let schoolText = baseView.schoolSearchTextField.text else {return} if schoolText.isEmpty && textField == baseView.majorSearchTextField { - view.showToast(message: StringLiterals.Onboarding.School.universityToastText, at: 88) + view.showToast(message: StringLiterals.Onboarding.School.universityToastText, at: 100.adjustedHeight) textField.endEditing(true) return } @@ -121,7 +135,7 @@ extension UniversityViewController: UITextFieldDelegate { switch textField { case baseView.schoolSearchTextField: let nextViewController = FindSchoolViewController() - nextViewController.delegate = self + nextViewController.schoolSearchDelegate = self self.present(nextViewController, animated: true) case baseView.majorSearchTextField: let nextViewController = majorSearchViewController @@ -142,9 +156,24 @@ extension UniversityViewController: UITextFieldDelegate { } +// MARK: StudentIdView +extension UniversityViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let currentCell = tableView.cellForRow(at: indexPath), + let cellTitle = currentCell.textLabel?.text else { + return + } + + // 학번 문자열에서 숫자 부분 추출 + let studentId = cellTitle.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() + guard let studentId = Int(studentId) else { return } + delegate?.didSelectStudentId(studentId, type: .studentId) + self.dismiss(animated: true) + } +} + // MARK: SearchResultTableViewSelectDelegate -extension UniversityViewController: SearchResultTableViewSelectDelegate { - +extension UniversityViewController: SchoolSearchResultSelectDelegate { func didSelectSchoolResult(_ result: String) { baseView.schoolSearchTextField.setButtonState(state: .done) baseView.schoolSearchTextField.text = result @@ -154,42 +183,21 @@ extension UniversityViewController: SearchResultTableViewSelectDelegate { } extension UniversityViewController: MajorSearchResultSelectDelegate { - func didSelectMajorResult(_ result: String) { + func didSelectMajorResult(_ result: GroupList) { baseView.majorSearchTextField.setButtonState(state: .done) - baseView.majorSearchTextField.text = result + baseView.majorSearchTextField.text = result.departmentName + self.groupId = result.groupID checkButtonEnable() } } // MARK: SelectStudentIdDelegate extension UniversityViewController: SelectStudentIdDelegate { - func didSelectStudentId(_ result: Int) { + func didSelectStudentId(_ result: Int, type: SelectType) { baseView.studentIdTextField.setButtonState(state: .done) baseView.studentIdTextField.text = "\(result)학번" groupAdmissionYear = result checkButtonEnable() - bottomSheet.dismiss(animated: false) - } -} - -// MARK: StudentIdView -extension UniversityViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let currentCell = tableView.cellForRow(at: indexPath), - let cellTitle = currentCell.textLabel?.text else { - return - } - - // 학번 문자열에서 숫자 부분 추출 - let studentId = cellTitle.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() - guard let studentId = Int(studentId) else { return } - delegate?.didSelectStudentId(studentId) - self.dismiss(animated: true) - } -} - -extension UniversityViewController: FindMajorViewControllerDelegate { - func didDismissFindMajorViewController(with groupList: GroupList) { - self.groupId = groupList.groupID + studentIdViewController.dismiss(animated: true) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloButton.swift index 12d7e2d5..2f69ca68 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloButton.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloButton.swift @@ -56,7 +56,7 @@ extension YelloButton { private func setStyle() { self.setTitle(buttonText, for: .normal) self.makeCornerRound(radius: buttonHeight/2) - self.titleLabel?.font = .uiButton + self.titleLabel?.font = .uiBody01 setButtonEnable(state: self.buttonState) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloNavigationBarView.swift index 468bc5c0..2e92ec6e 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloNavigationBarView.swift @@ -8,7 +8,7 @@ import UIKit final class YelloNavigationBarView: UIView { - let backButton = UIButton() + let backButton = BaseIconButton() let progressBar = ProgressBarManager.shared.progressBarView override init(frame: CGRect) { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloSelectButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloSelectButton.swift index 4223a9c7..ad32c005 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloSelectButton.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloSelectButton.swift @@ -160,7 +160,6 @@ extension YelloSelectButton { superview?.subviews.forEach { subview in if let button = subview as? YelloSelectButton, button != self { button.isSelected = false - button.backgroundColor = .grayscales900 button.makeBorder(width: 1, color: .grayscales700) var image = UIImage() switch buttonFormat { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextField.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextField.swift index 86be3ddc..8f3736b0 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextField.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextField.swift @@ -39,12 +39,11 @@ final class YelloTextField: UITextField { private var delay: Double = 0 private var callback: ((String?) -> Void)? = nil - // MARK: Components private lazy var paddingView = UIView(frame: CGRect(x: 0, y: 0, width: padding, height: self.frame.size.height)) lazy var cancelButton = UIButton() - private lazy var toggleImageView = UIImageView() - lazy var searchImageView = UIImageView() + lazy var toggleButton = UIButton() + lazy var searchButton = UIButton() private let errorImageView = UIImageView() private let labelPaddingView = UIView() @@ -89,24 +88,29 @@ extension YelloTextField { $0.addLeftPadding(20) $0.rightViewMode = .always $0.leftViewMode = .always + $0.autocorrectionType = .no + $0.spellCheckingType = .no $0.makeCornerRound(radius: 8) } - searchImageView.do { - $0.image = ImageLiterals.OnBoarding.icSearch + searchButton.do { + let searchImage = ImageLiterals.OnBoarding.icSearch .withTintColor(.yelloMain500, renderingMode: .alwaysOriginal) + $0.setImage(searchImage, for: .normal) + $0.isUserInteractionEnabled = true } cancelButton.do { - let image = ImageLiterals.OnBoarding.icXCircle + let cancelImage = ImageLiterals.OnBoarding.icXCircle .withTintColor(.yelloMain500, renderingMode: .alwaysOriginal) - $0.setImage(image, for: .normal) + $0.setImage(cancelImage, for: .normal) $0.addTarget(self, action: #selector(cancelButtonDidTap), for: .touchUpInside) } - toggleImageView.do { - $0.image = ImageLiterals.OnBoarding.icChevronDown + toggleButton.do { + let toggleimage = ImageLiterals.OnBoarding.icChevronDown .withTintColor(.yelloMain500, renderingMode: .alwaysOriginal) + $0.setImage(toggleimage, for: .normal) } errorImageView.do { @@ -130,12 +134,12 @@ extension YelloTextField { private func setLayout() { self.snp.makeConstraints { - $0.height.equalTo(52) + $0.height.equalTo(52.adjusted) } [labelPaddingView, paddingView].forEach { $0.snp.makeConstraints { - $0.width.equalTo(20) + $0.width.equalTo(20.adjustedWidth) } } @@ -149,10 +153,11 @@ extension YelloTextField { let cancelImage = xCircleImage.withTintColor(.yelloMain500) switch state { case .normal: + self.makeBorder(width: 0, color: .grayscales700) self.backgroundColor = .grayscales800 self.rightViewMode = .never case .search: - buttonStackView.addArrangedSubviews(searchImageView, paddingView) + buttonStackView.addArrangedSubviews(searchButton, paddingView) case .editing: self.backgroundColor = .grayscales800 self.makeBorder(width: 1, color: .grayscales700) @@ -163,7 +168,7 @@ extension YelloTextField { buttonStackView.addArrangedSubviews(cancelButton, paddingView) self.rightViewMode = .always case .toggle: - buttonStackView.addArrangedSubviews(toggleImageView, paddingView) + buttonStackView.addArrangedSubviews(toggleButton, paddingView) case .error: buttonStackView.clearSubViews() let errorImage = xCircleImage.withTintColor(.semanticStatusRed500) @@ -173,12 +178,20 @@ extension YelloTextField { self.backgroundColor = .semanticStatusRed500.withAlphaComponent(0.2) self.layer.borderColor = UIColor.semanticStatusRed500.cgColor case .id: + self.placeholder = StringLiterals.Onboarding.Id.idPlaceholder cancelButton.setImage(cancelImage, for: .normal) + self.leftView = idLabelStackView guard let text = self.text else { break } self.rightViewMode = (text.isEmpty) ? .never : .always + self.attributedPlaceholder = NSAttributedString( + string: self.placeholder ?? "", + attributes: [ + .foregroundColor: UIColor.grayscales600, + .font: self.font ?? .uiBodyLarge, + ] + ) let borderWidth: CGFloat = (text.isEmpty) ? 1 : 0 self.makeBorder(width: borderWidth, color: .grayscales700) - self.leftView = idLabelStackView return case .done: self.makeBorder(width: 1, color: .grayscales700) @@ -203,13 +216,13 @@ extension YelloTextField { self.rightViewMode = .never self.text = "" } - + @objc private func editingChanged(_ sender: UITextField) { - self.workItem?.cancel() - let workItem = DispatchWorkItem(block: { [weak self] in - self?.callback?(sender.text) - }) - self.workItem = workItem - DispatchQueue.main.asyncAfter(deadline: .now() + self.delay, execute: workItem) + self.workItem?.cancel() + let workItem = DispatchWorkItem(block: { [weak self] in + self?.callback?(sender.text) + }) + self.workItem = workItem + DispatchQueue.main.asyncAfter(deadline: .now() + self.delay, execute: workItem) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextFieldView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextFieldView.swift index 1ab5c851..59220796 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextFieldView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/Helper/YelloTextFieldView.swift @@ -29,10 +29,9 @@ final class YelloTextFieldView: UIView { /// 텍스트필드 상태도 인자로 받아서 분기 처리 init(title: String, state: iconState, - placeholder: String = "", helper: String = "") { + placeholder: String, helper: String = "") { super.init(frame: CGRect()) titleLabel.text = title - textField.placeholder = placeholder self.state = state textField.setButtonState(state: state) helperLabel.setLabelStyle(text: helper, State: state) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/NameView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/NameView.swift index b8823bc8..b230423e 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/NameView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/NameView.swift @@ -15,7 +15,9 @@ final class NameView: UIView { // MARK: Property // MARK: Component let nameGuideImageView = UIImageView() - let nameTextFieldView = YelloTextFieldView(title: "나의 이름은?", state: .normal, placeholder: "ex.김옐로", helper: "이후에는 이름 수정이 어려우니 실제 이름을 적어주세요.") + let nameTextFieldView = YelloTextFieldView(title: StringLiterals.Onboarding.Name.title, + state: .normal, placeholder: StringLiterals.Onboarding.Name.namePlaceHolder, + helper: StringLiterals.Onboarding.Name.nameHelper) // MARK: - Function // MARK: LifeCycle @@ -38,10 +40,6 @@ final class NameView: UIView { nameGuideImageView.do { $0.image = ImageLiterals.OnBoarding.nameGuide } - - nameTextFieldView.helperLabel.do { - $0.asColor(targetString: "실제 이름", color: .yelloMain500) - } } private func setLayout() { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/RecommendIdView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/RecommendIdView.swift index e9bc1830..03d47643 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/RecommendIdView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/RecommendIdView.swift @@ -16,7 +16,8 @@ class RecommendIdView: BaseView { // MARK: let stringLiteral = StringLiterals.Onboarding.self // MARK: Component - let guideLabel = YelloGuideLabel(labelText: "추천인 코드") + let guideLabel = YelloGuideLabel(labelText: + StringLiterals.Onboarding.Recommand.recommandTitle) let subGuideLabel = UILabel() lazy var recommendIdTextField = YelloTextFieldView(title: "", state: .id, placeholder: stringLiteral.Id.idPlaceholder, @@ -32,7 +33,6 @@ class RecommendIdView: BaseView { $0.textColor = .grayscales600 $0.asColor(targetString: "+100", color: .yelloMain500) } - } override func setLayout() { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/StudentIdView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/StudentIdView.swift index 73f708b3..8ca30f29 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/StudentIdView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Onboarding/Views/View/StudentIdView.swift @@ -68,6 +68,6 @@ extension StudentIdView: UITableViewDelegate { // 학번 문자열에서 숫자 부분 추출 let studentId = cellTitle.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() guard let studentId = Int(studentId) else { return } - idDelegate?.didSelectStudentId(studentId) + idDelegate?.didSelectStudentId(studentId, type: .studentId) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/AdsTimer/Timer.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/AdsTimer/Timer.swift new file mode 100644 index 00000000..654cbb5c --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/AdsTimer/Timer.swift @@ -0,0 +1,59 @@ +// +// Timer.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/19/24. +// + +import UIKit + +extension PaymentPlusViewController { + + func startTimerFormat(_ createdAtDate: String) { + let currentDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + + let currentDateString = dateFormatter.string(from: currentDate) + + guard let date = dateFormatter.date(from: currentDateString) else { return } + let secondsSince1970 = date.timeIntervalSince1970 + + guard let afterDate = dateFormatter.date(from: createdAtDate) else { return } + let afterSecondsSince1970 = afterDate.timeIntervalSince1970 + 3600 + + var duration = afterSecondsSince1970 - secondsSince1970 + + if duration < 0 { + duration = 0 + } + + start(duration: duration) + } + + private func start(duration: TimeInterval) { + DispatchQueue.main.async { + // timer + self.countdownTimer?.invalidate() + let startDate = Date() + self.countdownTimer = Timer.scheduledTimer( + withTimeInterval: 1, + repeats: true, + block: { [weak self] _ in + + let elapsedSeconds = round(abs(startDate.timeIntervalSinceNow)) + let remainingSeconds = max(duration - elapsedSeconds, 0) + guard remainingSeconds > 0 else { + self?.stop() + return + } + self?.remainingSeconds = remainingSeconds + } + ) + } + } + + func stop() { + self.countdownTimer?.invalidate() + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PaymentNameKeyButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PaymentNameKeyButton.swift index 03a33fa4..8d39aba6 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PaymentNameKeyButton.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PaymentNameKeyButton.swift @@ -11,15 +11,18 @@ import SnapKit import Then final class PaymentNameKeyButton: UIButton { - + // MARK: - Variables + // MARK: Enum enum KeyCount { case one case two case five } - let nameKeyTitleLabel = UILabel() + // MARK: Component let keyImageView = UIImageView() + let infoContainerView = UIView() + let nameKeyTitleLabel = UILabel() let priceView = UIView(frame: CGRect(x: 0, y: 0, width: 78.adjustedWidth, height: 30.adjustedHeight)) let priceLabel = UILabel() @@ -52,13 +55,20 @@ final class PaymentNameKeyButton: UIButton { } private func setStyle() { - self.makeBorder(width: 1, color: .purpleSub700) - self.makeCornerRound(radius: 10.adjustedHeight) self.backgroundColor = .black + infoContainerView.do { + $0.isUserInteractionEnabled = false + $0.makeBorder(width: 1, color: .purpleSub700) + $0.makeCornerRound(radius: 10.adjustedHeight) + } + nameKeyTitleLabel.do { $0.font = .uiBodyMedium $0.textColor = .purpleSub100 + $0.numberOfLines = 2 + $0.textAlignment = .center + $0.setTextWithLineHeight(text: StringLiterals.MyYello.Payment.nameKeyOne, lineHeight: 20.adjustedHeight) $0.isUserInteractionEnabled = false } @@ -76,15 +86,16 @@ final class PaymentNameKeyButton: UIButton { discountLabel.do { $0.text = StringLiterals.MyYello.Payment.discount + $0.textAlignment = .center + $0.transform = CGAffineTransform(rotationAngle: CGFloat.pi / -60) $0.font = .uiLabelMedium $0.textColor = .white - $0.roundCorners(cornerRadius: 10.adjustedHeight, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMaxYCorner]) $0.backgroundColor = .purpleSub800 $0.isUserInteractionEnabled = false } priceBeforeLabel.do { - $0.font = .uiBody02 + $0.font = .uiLabelSmall $0.textColor = .grayscales400 $0.isUserInteractionEnabled = false } @@ -96,33 +107,36 @@ final class PaymentNameKeyButton: UIButton { } private func setLayout() { - self.addSubviews(nameKeyTitleLabel, - keyImageView, - priceView, - discountLabel, - priceBeforeLabel) + self.addSubviews(infoContainerView, + keyImageView) + infoContainerView.addSubviews(nameKeyTitleLabel,priceView,discountLabel,priceBeforeLabel) priceView.addSubview(priceLabel) priceBeforeLabel.addSubviews(priceBeforeView) self.snp.makeConstraints { - $0.width.equalTo(343.adjustedWidth) - $0.height.equalTo(60.adjustedHeight) + $0.height.equalTo(172.adjustedHeight) + $0.width.equalTo(108.adjustedWidth) } - nameKeyTitleLabel.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().inset(16.adjustedWidth) + infoContainerView.snp.makeConstraints { + $0.top.equalToSuperview().offset(10) + $0.leading.trailing.bottom.equalToSuperview() } keyImageView.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.leading.equalTo(nameKeyTitleLabel.snp.trailing).offset(5.adjustedWidth) + $0.centerX.equalToSuperview() + $0.top.equalTo(infoContainerView.snp.top).offset(-10.adjusted) + } + + nameKeyTitleLabel.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.top.equalTo(keyImageView.snp.bottom).offset(10.adjustedHeight) } priceView.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.trailing.equalToSuperview().inset(13.adjustedWidth) + $0.centerX.equalToSuperview() + $0.top.equalTo(priceBeforeLabel.snp.bottom).offset(24.adjustedHeight) $0.height.equalTo(30.adjustedHeight) $0.width.equalTo(78.adjustedWidth) } @@ -132,14 +146,15 @@ final class PaymentNameKeyButton: UIButton { } discountLabel.snp.makeConstraints { - $0.leading.top.equalToSuperview() + $0.top.equalTo(priceView.snp.top).offset(-16.adjusted) + $0.leading.equalToSuperview().offset(7.adjusted) $0.height.equalTo(21.adjustedHeight) $0.width.equalTo(35.adjustedWidth) } priceBeforeLabel.snp.makeConstraints { - $0.trailing.equalTo(priceView.snp.leading).offset(-6.adjustedWidth) - $0.centerY.equalToSuperview() + $0.centerX.equalToSuperview() + $0.top.equalTo(nameKeyTitleLabel.snp.bottom) } priceBeforeView.snp.makeConstraints { @@ -163,7 +178,7 @@ final class PaymentNameKeyButton: UIButton { keyImageView.image = ImageLiterals.Payment.imgNameKeyTwo priceLabel.text = StringLiterals.MyYello.Payment.nameKeyTwoSalePrice priceBeforeLabel.text = StringLiterals.MyYello.Payment.nameKeyTwoPrice - + case .five: nameKeyTitleLabel.text = StringLiterals.MyYello.Payment.nameKeyFive keyImageView.image = ImageLiterals.Payment.imgNameKeyFive diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PointButton.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PointButton.swift new file mode 100644 index 00000000..24fbb08a --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/Button/PointButton.swift @@ -0,0 +1,122 @@ +// +// PaymentNameKeyButton.swift +// YELLO-iOS +// +// Created by 정채은 on 2023/08/11. +// + +import UIKit + +import SnapKit +import Then + +final class PointButton: UIButton { + + enum RewardItem { + case voting + case ad + } + + let pointTitleLabel = UILabel() + let subTitleLabel = UILabel() + let labelStackView = UIStackView() + let pointImageView = UIImageView() + let pointLabel = UILabel() + + // MARK: - Function + // MARK: LifeCycle + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + setUI() + } + + init(reward: RewardItem) { + super.init(frame: CGRect()) + setButtonState(reward: reward) + setUI() + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + self.makeBorder(width: 1, color: .purpleSub700) + self.makeCornerRound(radius: 10.adjustedHeight) + self.backgroundColor = .black + + pointImageView.do { + $0.image = ImageLiterals.Payment.imgCoin + } + + pointTitleLabel.do { + $0.font = .uiSubtitle02 + $0.textColor = .purpleSub100 + } + + subTitleLabel.do { + $0.font = .uiLabelMedium + $0.textColor = .yelloMain500 + } + + labelStackView.do { + $0.axis = .vertical + $0.spacing = 0 + $0.alignment = .leading + $0.addArrangedSubviews(pointTitleLabel, subTitleLabel) + $0.isUserInteractionEnabled = false + } + + pointLabel.do { + $0.textColor = .white + $0.font = .uiBodyMedium + $0.isUserInteractionEnabled = false + } + } + + private func setLayout() { + self.addSubviews(labelStackView, + pointImageView, + pointLabel) + + self.snp.makeConstraints { + $0.width.equalTo(343.adjustedWidth) + $0.height.equalTo(70.adjusted) + } + + pointImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().inset(16.adjustedWidth) + } + + labelStackView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(pointImageView.snp.trailing).offset(10.adjustedWidth) + } + + pointLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(31.adjustedWidth) + } + } + + // MARK: Custom Function + func setButtonState(reward: RewardItem) { + switch reward { + case .voting: + pointTitleLabel.text = StringLiterals.MyYello.Payment.votingPointTitle + pointLabel.text = StringLiterals.MyYello.Payment.votingPoint + case .ad: + pointTitleLabel.text = StringLiterals.MyYello.Payment.adPointTitle + subTitleLabel.text = StringLiterals.MyYello.Payment.adPointsubTitle + pointLabel.text = StringLiterals.MyYello.Payment.adPoint + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/NavigationBarCountView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/NavigationBarCountView.swift new file mode 100644 index 00000000..aeaacb5b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/NavigationBarCountView.swift @@ -0,0 +1,71 @@ +// +// NavigationBarCountView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/16/24. +// + +import UIKit + +import SnapKit +import Then + +final class NavigationBarCountView: UIView { + // MARK: - Variables + // MARK: Component + let iconImageView = UIImageView() + let countLabel = UILabel() + + // MARK: - Function + // MARK: LifeCycle + init(image: UIImage, count: String) { + super.init(frame: .zero) + iconImageView.image = image + countLabel.text = count + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + self.do { + $0.backgroundColor = .grayscales900 + $0.makeCornerRound(radius: 16.adjustedHeight) + } + + countLabel.do { + $0.font = .uiBodySmall + $0.textColor = .white + } + + } + + private func setLayout() { + self.addSubviews(iconImageView, + countLabel) + + self.snp.makeConstraints { + $0.width.equalTo(countLabel.snp.width).offset(45.adjustedWidth) + $0.height.equalTo(32.adjustedHeight) + } + + iconImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(10.adjustedWidth) + } + + countLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(iconImageView.snp.trailing).offset(4) + $0.trailing.equalToSuperview().inset(10.adjustedWidth) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentNavigationBarView.swift index 58f5c47a..d4359a83 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentNavigationBarView.swift @@ -14,13 +14,16 @@ final class PaymentNavigationBarView: BaseView { // MARK: - Variables // MARK: Property + var keyCount = 0 + var point = 0 weak var handleBackButtonDelegate: HandleBackButtonDelegate? // MARK: Component - lazy var backButton = UIButton() - let subscribeView = UIView() - let yelloPlusImageView = UIImageView() - let yelloPlusLabel = UILabel() + lazy var backButton = BaseIconButton() + let titleLabel = UILabel() + + lazy var keyCountView = NavigationBarCountView(image: ImageLiterals.MyYello.icKey, count: String(keyCount)) + lazy var pointCountView = NavigationBarCountView(image: ImageLiterals.MyYello.icPoint, count: String(point)) override func setStyle() { self.backgroundColor = .black @@ -30,50 +33,38 @@ final class PaymentNavigationBarView: BaseView { $0.addTarget(self, action: #selector(backButtonDidTap), for: .touchUpInside) } - subscribeView.do { - $0.backgroundColor = .grayscales900 - $0.makeCornerRound(radius: 8.adjustedHeight) - $0.isHidden = true - } - - yelloPlusImageView.do { - $0.image = ImageLiterals.Payment.imgYelloPlusStar + titleLabel.do { + $0.text = StringLiterals.MyYello.NavigationBar.shop + $0.font = .uiSubtitle05 + $0.textColor = .white } - yelloPlusLabel.do { - $0.text = StringLiterals.MyYello.Payment.subscribing - $0.font = .uiBodySmall - $0.textColor = .grayscales100 - } } override func setLayout() { self.addSubviews(backButton, - subscribeView) - - subscribeView.addSubviews(yelloPlusImageView, - yelloPlusLabel) + titleLabel, + keyCountView, + pointCountView) backButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.leading.equalToSuperview().inset(16.adjustedWidth) } - subscribeView.snp.makeConstraints { - $0.height.equalTo(32.adjustedHeight) - $0.width.equalTo(144.adjustedWidth) + titleLabel.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.leading.equalTo(backButton.snp.trailing).offset(8.adjustedWidth) } - yelloPlusImageView.snp.makeConstraints { - $0.leading.equalToSuperview().inset(10.adjustedWidth) + pointCountView.snp.makeConstraints { $0.centerY.equalToSuperview() + $0.trailing.equalToSuperview().inset(16.adjustedWidth) } - yelloPlusLabel.snp.makeConstraints { + keyCountView.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.trailing.equalToSuperview().inset(10.adjustedWidth) + $0.trailing.equalTo(pointCountView.snp.leading).offset(-4.adjustedWidth) } } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentPlusView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentPlusView.swift index 4d11733d..aff7fccd 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentPlusView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentPlusView.swift @@ -17,18 +17,29 @@ final class PaymentPlusView: BaseView { let paymentLabel = UILabel() let paymentView = PaymentView() lazy var paymentYelloPlusButton = PaymentYelloPlusButton() + + let subscribeView = UIView(frame: .init(x: 0, y: 0, width: 78.adjustedWidth, height: 30.adjustedHeight)) + let subscribeBackgroundView = UIView(frame: .init(x: 0, y: 0, width: 80.adjustedWidth, height: 32.adjustedHeight)) + let subscribeImageView = UIImageView() + let subscribeLabel = UILabel() + let nameKeyLabel = UILabel() + let nameKeyButtonStackView = UIStackView() lazy var nameKeyOneButton = PaymentNameKeyButton(state: .one) lazy var nameKeyTwoButton = PaymentNameKeyButton(state: .two) lazy var nameKeyFiveButton = PaymentNameKeyButton(state: .five) + let pointButtonStackView = UIStackView() + lazy var votingPointButton = PointButton(reward: .voting) + lazy var adPointButton = PointButton(reward: .ad) + let descriptionLabel = UILabel() let descriptionStackView = UIStackView() let serviceButton = UIButton() let seperateLine = UIView() let privacyButton = UIButton() - + override func setStyle() { self.backgroundColor = .black @@ -44,6 +55,27 @@ final class PaymentPlusView: BaseView { $0.textColor = .white } + subscribeBackgroundView.do { + $0.makeCornerRound(radius: 16.adjustedHeight) + $0.applyGradientBackground(topColor: UIColor(hex: "D96AFF"), bottomColor: UIColor(hex: "7C57FF"), startPointY: 0.5, endPointY: 0.5) + $0.layer.cornerCurve = .continuous + } + + subscribeView.do { + $0.backgroundColor = .grayscales900 + $0.makeCornerRound(radius: 15.adjustedHeight) + } + + subscribeLabel.do { + $0.textColor = .white + $0.font = .uiBodySmall + $0.text = StringLiterals.MyYello.Payment.subscribing + } + + subscribeImageView.do { + $0.image = ImageLiterals.Profile.icProfileStar + } + nameKeyLabel.do { $0.setTextWithLineHeight(text: StringLiterals.MyYello.Payment.sale + "\n" + StringLiterals.MyYello.Payment.paymentSender, lineHeight: 24.adjustedHeight) $0.textAlignment = .left @@ -64,6 +96,19 @@ final class PaymentPlusView: BaseView { $0.makeShadow(radius: 8, color: UIColor(hex: "6437FF", alpha: 0.25), offset: CGSize(width: 0, height: 0), opacity: 0.25) } + nameKeyButtonStackView.do { + $0.axis = .horizontal + $0.spacing = 10.adjustedWidth + $0.alignment = .center + $0.addArrangedSubviews(nameKeyOneButton, nameKeyTwoButton, nameKeyFiveButton) + } + + pointButtonStackView.do { + $0.axis = .vertical + $0.spacing = 10.adjustedHeight + $0.addArrangedSubviews(votingPointButton, adPointButton) + } + descriptionLabel.do { $0.setTextWithLineHeight(text: StringLiterals.MyYello.Payment.descriptionLabel, lineHeight: 16.adjustedHeight) $0.font = .uiLabelLarge @@ -111,13 +156,15 @@ final class PaymentPlusView: BaseView { scrollView.addSubviews(paymentLabel, paymentView, paymentYelloPlusButton, + subscribeBackgroundView, nameKeyLabel, - nameKeyOneButton, - nameKeyTwoButton, - nameKeyFiveButton, + nameKeyButtonStackView, + pointButtonStackView, descriptionLabel, descriptionStackView ) + subscribeBackgroundView.addSubview(subscribeView) + subscribeView.addSubviews(subscribeImageView, subscribeLabel) paymentNavigationBarView.snp.makeConstraints { $0.top.equalTo(self.safeAreaInsets).offset(statusBarHeight) @@ -139,7 +186,7 @@ final class PaymentPlusView: BaseView { $0.top.equalTo(paymentLabel.snp.bottom).offset(16.adjustedHeight) $0.leading.trailing.equalToSuperview() $0.centerX.equalToSuperview() - $0.height.equalTo(228) + $0.height.equalTo(228.adjustedHeight) } paymentYelloPlusButton.snp.makeConstraints { @@ -150,29 +197,49 @@ final class PaymentPlusView: BaseView { $0.width.equalTo(343.adjustedWidth) } - nameKeyLabel.snp.makeConstraints { - $0.top.equalTo(paymentYelloPlusButton.snp.bottom).offset(28.adjustedHeight) - $0.leading.equalToSuperview().inset(16.adjustedWidth) + subscribeBackgroundView.snp.makeConstraints { + $0.height.equalTo(32.adjustedHeight) + $0.width.equalTo(80.adjustedWidth) + + $0.top.equalTo(paymentYelloPlusButton.snp.bottom).offset(8.adjustedHeight) + $0.centerX.equalToSuperview() } - nameKeyOneButton.snp.makeConstraints { - $0.top.equalTo(nameKeyLabel.snp.bottom).offset(12.adjustedHeight) - $0.centerX.equalToSuperview() + subscribeView.snp.makeConstraints { + $0.height.equalTo(30.adjustedHeight) + $0.width.equalTo(78.adjustedWidth) + + $0.center.equalToSuperview() } - nameKeyTwoButton.snp.makeConstraints { - $0.top.equalTo(nameKeyOneButton.snp.bottom).offset(10.adjustedHeight) - $0.centerX.equalToSuperview() + subscribeImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(10.adjustedWidth) } - nameKeyFiveButton.snp.makeConstraints { - $0.top.equalTo(nameKeyTwoButton.snp.bottom).offset(10.adjustedHeight) - $0.centerX.equalToSuperview() + subscribeLabel.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalTo(subscribeImageView.snp.trailing).offset(4.adjustedWidth) + } + + nameKeyLabel.snp.makeConstraints { + $0.top.equalTo(paymentYelloPlusButton.snp.bottom).offset(63.adjustedHeight) + $0.leading.equalToSuperview().inset(16.adjustedWidth) + } + + nameKeyButtonStackView.snp.makeConstraints { + $0.top.equalTo(nameKeyLabel.snp.bottom).offset(16.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + } + + pointButtonStackView.snp.makeConstraints { + $0.top.equalTo(nameKeyButtonStackView.snp.bottom).offset(12.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) } descriptionLabel.snp.makeConstraints { - $0.top.equalTo(nameKeyFiveButton.snp.bottom).offset(36.adjustedHeight) - $0.centerX.equalToSuperview() + $0.top.equalTo(pointButtonStackView.snp.bottom).offset(112.adjustedHeight) + $0.leading.equalToSuperview().offset(18.adjustedWidth) } descriptionStackView.snp.makeConstraints { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentView.swift index 5b3cccc9..a0cc0cbd 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/View/PaymentView.swift @@ -15,7 +15,8 @@ final class PaymentView: BaseView { var nowPage: Int = 0 private var paymentImage = [ImageLiterals.Payment.imgPaymentFirst, ImageLiterals.Payment.imgPaymentSecond, - ImageLiterals.Payment.imgPaymentThird] + ImageLiterals.Payment.imgPaymentThird, + UIImage(imageLiteralResourceName: "imgPaymentFourth")] private let flowLayout = UICollectionViewFlowLayout().then { $0.scrollDirection = .horizontal @@ -39,7 +40,7 @@ final class PaymentView: BaseView { self.backgroundColor = .clear pageControl.do { - $0.numberOfPages = 3 + $0.numberOfPages = 4 $0.currentPage = 0 $0.pageIndicatorTintColor = .grayscales700 $0.currentPageIndicatorTintColor = .white @@ -53,7 +54,7 @@ final class PaymentView: BaseView { collectionView.snp.makeConstraints { $0.top.equalToSuperview() $0.centerX.equalToSuperview() - $0.height.equalTo(219) + $0.height.equalTo(219.adjustedHeight) $0.width.equalTo(375.adjustedWidth) } @@ -98,7 +99,7 @@ extension PaymentView: UICollectionViewDelegate, UICollectionViewDataSource { extension PaymentView: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - return CGSize(width: 375.adjustedWidth, height: 219) + return CGSize(width: 375.adjustedWidth, height: 219.adjustedHeight) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Payment/ViewController/PaymentPlusViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Payment/ViewController/PaymentPlusViewController.swift index f503902b..bd98f2d2 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Payment/ViewController/PaymentPlusViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Payment/ViewController/PaymentPlusViewController.swift @@ -8,6 +8,7 @@ import UIKit import Amplitude +import GoogleMobileAds import SnapKit import StoreKit import Then @@ -24,18 +25,44 @@ final class PaymentPlusViewController: BaseViewController { // MARK: - Variables // MARK: Constants let identify = AMPIdentify().setOnce("user_subscriptionbuy_count", value: NSNumber(value: 0)) - .setOnce("", value: NSNumber(value: 0)) ?? AMPIdentify() + .setOnce("", value: NSNumber(value: 0)) ?? AMPIdentify() + let uuid = UUID().uuidString + + // MARK: Property + var isRewardPossible = true + var countdownTimer: Timer? + var remainingSeconds: TimeInterval? { + didSet { + paymentPlusView.adPointButton.isEnabled = true + if let remainingSeconds { + paymentPlusView.adPointButton.subTitleLabel.text = String(format: "%02d:%02d", Int(remainingSeconds/60), Int(remainingSeconds.truncatingRemainder(dividingBy: 60))) + } + if remainingSeconds == 0 { + isRewardPossible = true + stop() + UIView.transition(with: self.navigationController!.view, duration: 0.001, options: .transitionCrossDissolve, animations: { + self.paymentPlusView.adPointButton.pointTitleLabel.textColor = .purpleSub100 + self.paymentPlusView.adPointButton.pointLabel.textColor = .purpleSub100 + self.paymentPlusView.adPointButton.makeBorder(width: 1, color: .purpleSub800) + self.paymentPlusView.adPointButton.subTitleLabel.text = StringLiterals.MyYello.Payment.adPointsubTitle + }) + } + } + } + // MARK: Component + private var rewardedAd: GADRewardedAd? let paymentPlusView = PaymentPlusView() var paymentConfirmView = PaymentConfirmView() + private let eventPointView = EventPointView() private let loadingIndicator = UIActivityIndicatorView(style: .large) private var dimView = UIView() - var subscribeStatus = "NORMAL" { + var subscribeStatus = "normal" { didSet { - if subscribeStatus == "NORMAL" { - paymentPlusView.paymentNavigationBarView.subscribeView.isHidden = true + if subscribeStatus == "normal" || !UserManager.shared.isYelloPlus { + paymentPlusView.subscribeBackgroundView.isHidden = true } else { - paymentPlusView.paymentNavigationBarView.subscribeView.isHidden = false + paymentPlusView.subscribeBackgroundView.isHidden = false } } @@ -64,8 +91,9 @@ final class PaymentPlusViewController: BaseViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - + checkRewardPossible() tabBarController?.tabBar.isHidden = true + setInitialUI() paymentPlusView.paymentView.bannerTimer() purchaseSubscribeNeed() } @@ -119,6 +147,19 @@ final class PaymentPlusViewController: BaseViewController { paymentPlusView.nameKeyFiveButton.addTarget(self, action: #selector(paymentNameKeyFiveButtonTapped), for: .touchUpInside) paymentPlusView.serviceButton.addTarget(self, action: #selector(serviceButtonTapped), for: .touchUpInside) paymentPlusView.privacyButton.addTarget(self, action: #selector(privacyButtonTapped), for: .touchUpInside) + paymentPlusView.votingPointButton.addTarget(self, action: #selector(votingPointButtonTapped), for: .touchUpInside) + paymentPlusView.adPointButton.addTarget(self, action: #selector(adPointButtonTapped), for: .touchUpInside) + } + + private func setInitialUI() { + self.paymentPlusView.adPointButton.isEnabled = true + paymentPlusView.paymentNavigationBarView.pointCountView.countLabel.text = String(UserManager.shared.userPoint) + paymentPlusView.paymentNavigationBarView.keyCountView.countLabel.text = String(UserManager.shared.userTicketCount) + if UserManager.shared.isYelloPlus { + paymentPlusView.subscribeBackgroundView.isHidden = false + } else { + paymentPlusView.subscribeBackgroundView.isHidden = true + } } } @@ -136,69 +177,6 @@ extension PaymentPlusViewController: HandleConfirmPaymentButtonDelegate { } extension PaymentPlusViewController { - - @objc private func privacyButtonTapped() { - // 개인정보 처리방침 링크 연결 - let url = URL(string: "https://yell0.notion.site/97f57eaed6c749bbb134c7e8dc81ab3f")! - UIApplication.shared.open(url, options: [:], completionHandler: nil) - } - - @objc private func serviceButtonTapped() { - // 이용약관 링크 연결 - let url = URL(string: "https://yell0.notion.site/2afc2a1e60774dfdb47c4d459f01b1d9")! - UIApplication.shared.open(url, options: [:], completionHandler: nil) - } - - @objc private func paymentYelloPlusButtonTapped() { - showLoadingIndicator() - if self.subscribeStatus == "NORMAL" { - print("구독하고 있지 않는 사용자입니다.") - // 첫 구매 일자 구하기 - let currentDate = Date() - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" - let formattedDate = dateFormatter.string(from: currentDate) - identify.setOnce("user_buy_date", value: NSString(string: formattedDate)) - .add("user_subscriptionbuy_count", value: NSNumber(value: 1)) - Amplitude.instance().identify(identify) - - MyProducts.iapService.buyProduct(self.products[0]) - } else { - print("구독하고 있는 사용자입니다.") - self.showAlertView(title: "현재 구독 중", message: "이미 구독하고 있는 상품입니다.") - self.hideLoadingIndicator() - } - - Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type":"subscribe"]) - } - - @objc private func paymentNameKeyOneButtonTapped() { - showLoadingIndicator() - - MyProducts.iapService.buyProduct(products[1]) - print("이름 열람권 1개 구입") - - Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type":"ticket1"]) - } - - @objc private func paymentNameKeyTwoButtonTapped() { - showLoadingIndicator() - - MyProducts.iapService.buyProduct(products[2]) - print("이름 열람권 2개 구입") - - Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type":"ticket2"]) - } - - @objc private func paymentNameKeyFiveButtonTapped() { - showLoadingIndicator() - - MyProducts.iapService.buyProduct(products[3]) - print("이름 열람권 5개 구입") - - Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type":"ticket5"]) - } - func showPaymentConfirmView(state: PaymentStatus) { guard let viewController = UIApplication.shared.keyWindow?.rootViewController else { return } paymentConfirmView.removeFromSuperview() @@ -223,9 +201,6 @@ extension PaymentPlusViewController { paymentConfirmView.titleLabel.text = StringLiterals.MyYello.Payment.paymentAlertKeyFiveTitle paymentConfirmView.descriptionLabel.text = StringLiterals.MyYello.Payment.paymentAlertKeyDescription paymentConfirmView.paymentImageView.image = ImageLiterals.Payment.imgNameKeyFiveCheck - - default: - return } paymentConfirmView.handleConfirmPaymentButtonDelegate = self @@ -234,30 +209,6 @@ extension PaymentPlusViewController { viewController.view.addSubview(paymentConfirmView) } - @objc private func restore() { - MyProducts.iapService.restorePurchases() - } - - @objc private func handlePurchaseNoti(_ notification: Notification) { - guard let productID = notification.object as? String else { return } - - guard let transactionID = notification.userInfo?["transactionID"] as? String else { return } - - // 상품 구매 - if productID == MyProducts.nameKeyOneProductID || - productID == MyProducts.nameKeyTwoProductID || - productID == MyProducts.nameKeyFiveProductID { - print(transactionID) - verifyConsumablePurchase(transactionID: transactionID, productID: productID) - } - - // 구독 상품 구매 - if productID == MyProducts.yelloPlusProductID { - verifySubscriptionPurchase(transactionID: transactionID) - - } - } - private func verifyConsumablePurchase(transactionID: String, productID: String) { let productID = productID let transactionID = transactionID @@ -391,7 +342,190 @@ extension PaymentPlusViewController { } } - @objc private func hideLoadingIndicator() { + func showAlertView(title: String, message: String) { + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + let action = UIAlertAction(title: "확인", style: .default, handler: nil) + alert.addAction(action) + present(alert, animated: true, completion: nil) + } + + // 광고 관련 Custom Function + func checkRewardPossible() { + NetworkService.shared.rewardService.checkRewardPossible(tag: StringLiterals.Reward.admobReward) { result in + switch result { + case .success(let data): + if let data = data.data { + self.isRewardPossible = data.isPossible + if data.isPossible { + self.paymentPlusView.adPointButton.pointTitleLabel.textColor = .purpleSub100 + self.paymentPlusView.adPointButton.pointLabel.textColor = .purpleSub100 + self.paymentPlusView.adPointButton.subTitleLabel.text = StringLiterals.MyYello.Payment.adPointsubTitle + self.paymentPlusView.adPointButton.makeBorder(width: 1, color: .purpleSub800) + } else { + self.startTimerFormat(data.createdAt) + self.paymentPlusView.adPointButton.pointTitleLabel.textColor = .grayscales500 + self.paymentPlusView.adPointButton.pointLabel.textColor = .grayscales500 + self.paymentPlusView.adPointButton.makeBorder(width: 1, color: .grayscales800) + } + } + default: + debugPrint("Failed to communicate availability of rewarded ads") + } + } + } + + func getReward() { + let request = RewardRequestDTO(rewardType: StringLiterals.Reward.admobReward, + randomType: StringLiterals.Reward.fix, + uuid: uuid, + rewardNumber: 10) + NetworkService.shared.rewardService.postRewardAd(requestDTO: request) { result in + switch result { + case .success(let data): + if let data = data.data { + self.eventPointView.pointLabel.text = data.rewardTitle + self.eventPointView.nextTimeLabel.text = "" + UserManager.shared.userPoint += data.rewardValue + self.paymentPlusView.paymentNavigationBarView.pointCountView.countLabel.text = String(UserManager.shared.userPoint) + self.paymentPlusView.adPointButton.pointTitleLabel.textColor = .grayscales500 + self.paymentPlusView.adPointButton.pointLabel.textColor = .grayscales500 + self.paymentPlusView.adPointButton.makeBorder(width: 1, color: .grayscales800) + self.paymentPlusView.adPointButton.isEnabled = false + self.showEventPointView() + } + + default: + self.view.showToast(message: "광고 보상 포인트 받기에 실패했습니다.\n잠시 후 다시 시도해주세요", at: 100.adjustedHeight) + debugPrint("보상형 광고 보상 실패") + } + } + } + + func loadRewardedAd(completion: @escaping (Bool) -> Void) { + showLoadingIndicator() + let request = GADRequest() + GADRewardedAd.load(withAdUnitID: Config.rewardAd, + request: request, + completionHandler: { [self] ad, error in + if let error = error { + print("Failed to load rewarded ad with error: \(error.localizedDescription)") + view.showToast(message: "광고 보기에 실패했습니다.", at: 100.adjustedHeight) + self.hideLoadingIndicator() + return + } + rewardedAd = ad + let options = GADServerSideVerificationOptions() + options.customRewardString = uuid + rewardedAd?.serverSideVerificationOptions = options + rewardedAd?.fullScreenContentDelegate = self + print("Rewarded ad loaded.") + completion(true) + } + ) + } + + func show() { + if let ad = rewardedAd { + ad.present(fromRootViewController: self) { + let reward = ad.adReward + debugPrint("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)") + } + } + } + + private func showEventPointView() { + self.eventPointView.frame = self.view.bounds + self.eventPointView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.startTimerFormat(Date().toString()) + self.view.addSubview(self.eventPointView) + + self.eventPointView.checkButton.addTarget(self, action: #selector(checkButtonTapped), for: .touchUpInside) + } + + // MARK: Objc Function + @objc private func privacyButtonTapped() { + // 개인정보 처리방침 링크 연결 + let url = URL(string: "https://yell0.notion.site/97f57eaed6c749bbb134c7e8dc81ab3f")! + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } + + @objc private func serviceButtonTapped() { + // 이용약관 링크 연결 + let url = URL(string: "https://yell0.notion.site/2afc2a1e60774dfdb47c4d459f01b1d9")! + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } + + @objc private func paymentYelloPlusButtonTapped() { + showLoadingIndicator() + if self.subscribeStatus == "NORMAL" { + print("구독하고 있지 않는 사용자입니다.") + // 첫 구매 일자 구하기 + let currentDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" + let formattedDate = dateFormatter.string(from: currentDate) + identify.setOnce("user_buy_date", value: NSString(string: formattedDate)) + .add("user_subscriptionbuy_count", value: NSNumber(value: 1)) + Amplitude.instance().identify(identify) + + MyProducts.iapService.buyProduct(self.products[0]) + } else { + print("구독하고 있는 사용자입니다.") + self.showAlertView(title: "현재 구독 중", message: "이미 구독하고 있는 상품입니다.") + self.hideLoadingIndicator() + } + + Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type": "subscribe"]) + } + + @objc private func paymentNameKeyOneButtonTapped() { + showLoadingIndicator() + + MyProducts.iapService.buyProduct(products[1]) + print("이름 열람권 1개 구입") + + Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type": "ticket1"]) + } + + @objc private func paymentNameKeyTwoButtonTapped() { + showLoadingIndicator() + + MyProducts.iapService.buyProduct(products[2]) + print("이름 열람권 2개 구입") + + Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type": "ticket2"]) + } + + @objc private func paymentNameKeyFiveButtonTapped() { + showLoadingIndicator() + + MyProducts.iapService.buyProduct(products[3]) + print("이름 열람권 5개 구입") + + Amplitude.instance().logEvent("click_shop_buy", withEventProperties: ["buy_type": "ticket5"]) + } + + @objc private func votingPointButtonTapped() { + tabBarController?.tabBar.items?[2].imageInsets = UIEdgeInsets(top: -23, left: 0, bottom: 0, right: 0) + tabBarController?.selectedIndex = 2 + tabBarController?.tabBar.isHidden = false + popView() + } + + @objc private func adPointButtonTapped() { + if isRewardPossible { + loadRewardedAd { isEndLoading in + if isEndLoading { + self.hideLoadingIndicator() + self.show() + } + } + } else { + self.view.showToast(message: StringLiterals.MyYello.Payment.adPointErrorToast, at: 100.adjustedHeight) + } + } + + @objc private func hideLoadingIndicator() { navigationController?.interactivePopGestureRecognizer?.isEnabled = true loadingIndicator.stopAnimating() @@ -399,10 +533,42 @@ extension PaymentPlusViewController { dimView.removeFromSuperview() } - func showAlertView(title: String, message: String) { - let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) - let action = UIAlertAction(title: "확인", style: .default, handler: nil) - alert.addAction(action) - present(alert, animated: true, completion: nil) + @objc private func restore() { + MyProducts.iapService.restorePurchases() + } + + @objc private func handlePurchaseNoti(_ notification: Notification) { + guard let productID = notification.object as? String else { return } + + guard let transactionID = notification.userInfo?["transactionID"] as? String else { return } + + // 상품 구매 + if productID == MyProducts.nameKeyOneProductID || + productID == MyProducts.nameKeyTwoProductID || + productID == MyProducts.nameKeyFiveProductID { + print(transactionID) + verifyConsumablePurchase(transactionID: transactionID, productID: productID) + } + + // 구독 상품 구매 + if productID == MyProducts.yelloPlusProductID { + verifySubscriptionPurchase(transactionID: transactionID) + + } + } + + @objc private func checkButtonTapped() { + self.eventPointView.removeFromSuperview() + } +} + +extension PaymentPlusViewController: GADFullScreenContentDelegate { + func adWillDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { + self.getReward() + } + + func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { + debugPrint("광고 로드 실패") + loadingIndicator.stopAnimating() } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditProfileTableViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditProfileTableViewCell.swift new file mode 100644 index 00000000..96c1b453 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditProfileTableViewCell.swift @@ -0,0 +1,104 @@ +// +// EditProfileTableViewCell.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/25/24. +// + +import UIKit + +import SnapKit +import Then + +class EditProfileTableViewCell: UITableViewCell { + // MARK: - Variables + // MARK: Constants + static let reusableId = "EditProfileTableViewCell" + + // MARK: Property + + // MARK: Component + let titleLabel = UILabel() + let infoLabel = UILabel() + let editButton = UIButton() + let separatorView = UIView() + + // MARK: - Function + // MARK: LifeCycle + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + + self.backgroundColor = .clear + + titleLabel.do { + $0.font = .uiBodySmall + } + + infoLabel.do { + $0.font = .uiSubtitle01 + } + + editButton.do { + $0.setImage(ImageLiterals.Profile.icEdit, for: .normal) + } + + separatorView.do { + $0.backgroundColor = .grayscales700 + } + } + + private func setLayout() { + self.addSubviews(titleLabel, infoLabel, editButton, separatorView) + titleLabel.snp.makeConstraints { + $0.width.equalTo(283.adjustedWidth) + $0.top.equalToSuperview().offset(12.adjustedHeight) + $0.leading.equalToSuperview().offset(16.adjustedWidth) + } + + infoLabel.snp.makeConstraints { + $0.width.equalTo(283.adjustedWidth) + $0.top.equalTo(titleLabel.snp.bottom).offset(3.adjustedHeight) + $0.leading.equalTo(titleLabel.snp.leading) + } + + editButton.snp.makeConstraints { + $0.top.equalToSuperview().offset(21.adjustedHeight) + $0.trailing.equalToSuperview().inset(9.adjustedWidth) + } + + separatorView.snp.makeConstraints { + $0.height.equalTo(1) + $0.top.equalTo(infoLabel.snp.bottom).offset(7.adjustedHeight) + $0.bottom.equalToSuperview().inset(12.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + } + } + + // MARK: Custom Function + func configureCell(isEditable: Bool, title: String, info: String) { + titleLabel.text = title + infoLabel.text = info + editButton.isHidden = !isEditable + if isEditable { + titleLabel.textColor = .grayscales500 + infoLabel.textColor = .white + } else { + titleLabel.textColor = .grayscales700 + infoLabel.textColor = .grayscales600 + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditSchoolInfoTableViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditSchoolInfoTableViewCell.swift new file mode 100644 index 00000000..b0682579 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/Cell/EditSchoolInfoTableViewCell.swift @@ -0,0 +1,166 @@ +// +// EditSchoolInfoTableViewCell.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/30/24. +// + +import UIKit + +import SnapKit +import Then + +@frozen +enum IconType { + case search + case toggle +} + +class EditSchoolInfoTableViewCell: UITableViewCell { + // MARK: - Variables + // MARK: Constants + static let reuseId = "EditSchoolInfoTableViewCell" + // MARK: Property + var iconType: IconType = .search + var isError = false { + didSet { + if isError { + editBackgroundView.backgroundColor = UIColor(hex: "#F04646").withAlphaComponent(0.3) + editBackgroundView.makeBorder(width: 1, color: .red) + errorLabel.isHidden = false + separatorView.backgroundColor = .white + } else { + editBackgroundView.makeBorder(width: 0, color: .clear) + editBackgroundView.backgroundColor = .grayscales900 + separatorView.backgroundColor = .grayscales700 + errorLabel.isHidden = true + } + } + } + + // MARK: Component + let editBackgroundView = UIView() + let titleLabel = UILabel() + let infoLabel = UILabel() + let iconImageView = UIImageView() + let separatorView = UIView() + + let errorLabel = UILabel() + + // MARK: - Function + // MARK: LifeCycle + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + setUI() + errorLabel.isHidden = !isError + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + self.do { + $0.backgroundColor = .clear + } + + editBackgroundView.do { + $0.backgroundColor = isError ? UIColor(hex: "#F04646").withAlphaComponent(0.3) : .grayscales900 + $0.makeCornerRound(radius: 10) + } + + titleLabel.do { + $0.font = .uiBodySmall + $0.textColor = .grayscales500 + } + + infoLabel.do { + $0.font = .uiSubtitle01 + $0.textColor = .white + } + + separatorView.do { + $0.backgroundColor = .grayscales700 + } + + errorLabel.do { + $0.text = StringLiterals.Profile.EditProfile.majorErrorMessage + $0.font = .uiLabelLarge + $0.textColor = .semanticStatusRed500 + } + + switch iconType { + case .search: + iconImageView.image = ImageLiterals.OnBoarding.icSearch.withTintColor(.yelloMain500) + case .toggle: + iconImageView.image = ImageLiterals.OnBoarding.icChevronDown.withTintColor(.yelloMain500) + } + } + + private func setLayout() { + contentView.addSubview(editBackgroundView) + + editBackgroundView.addSubviews(titleLabel, + infoLabel, + iconImageView, + separatorView, + errorLabel) + + editBackgroundView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.bottom.equalToSuperview().inset(10.adjustedHeight) + } + + titleLabel.snp.makeConstraints { + + $0.top.equalToSuperview().offset(12.adjustedHeight) + $0.leading.equalToSuperview().offset(16.adjustedWidth) + } + + infoLabel.snp.makeConstraints { + $0.width.equalTo(283.adjustedWidth) + $0.top.equalTo(titleLabel.snp.bottom) + $0.leading.equalTo(titleLabel.snp.leading) + } + + iconImageView.snp.makeConstraints { + $0.top.equalTo(infoLabel.snp.top) + $0.trailing.equalToSuperview().inset(16.adjustedWidth) + } + + separatorView.snp.makeConstraints { + $0.top.equalTo(infoLabel.snp.bottom).offset(7.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.height.equalTo(1) + } + + errorLabel.snp.makeConstraints { + $0.top.equalTo(separatorView.snp.bottom).offset(4.adjustedHeight) + $0.leading.equalTo(separatorView.snp.leading) + } + } + + // MARK: Custom Function + override func prepareForReuse() { + super.prepareForReuse() + editBackgroundView.makeBorder(width: 0, color: .clear) + editBackgroundView.backgroundColor = .grayscales900 + separatorView.backgroundColor = .grayscales700 + errorLabel.isHidden = true + } + + func configureCell(iconType: IconType, titleText: String, InfoText: String) { + self.iconType = iconType + titleLabel.text = titleText + infoLabel.text = InfoText + + setUI() + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileHeaderView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileHeaderView.swift new file mode 100644 index 00000000..d454a85c --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileHeaderView.swift @@ -0,0 +1,122 @@ +// +// EditProfileHeaderView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/30/24. +// + +import UIKit + +import SnapKit +import Then +import KakaoSDKAuth +import KakaoSDKUser + +final class EditProfileHeaderView: UITableViewHeaderFooterView { + // MARK: - Variables + static let reusableId = "EditProfileView" + // MARK: Component + let profileImageView = UIImageView() + let kakaoSyncButton = UIButton() + + // MARK: - Function + // MARK: LifeCycle + override init(reuseIdentifier: String?) { + super.init(reuseIdentifier: reuseIdentifier) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + profileImageView.do { + if UserManager.shared.profileImage == StringLiterals.Profile.EditProfile.KakaoDefaultProfileURL { + $0.image = ImageLiterals.Profile.imgDefaultProfile + } else { + $0.kfSetImage(url: UserManager.shared.profileImage) + } + $0.makeCornerRound(radius: 36.adjusted) + $0.contentMode = .scaleAspectFill + } + + kakaoSyncButton.do { + $0.setTitle(StringLiterals.Profile.EditProfile.kakaoSync, for: .normal) + $0.setTitleColor(.grayscales400, for: .normal) + $0.titleLabel?.font = .uiLabelSmall + $0.setImage(ImageLiterals.Profile.icRotate, for: .normal) + $0.imageEdgeInsets = UIEdgeInsets(top: 0, left: -3, bottom: 0, right: 0) + $0.makeCornerRound(radius: 4.adjusted) + $0.backgroundColor = .grayscales900 + $0.addTarget(self, action: #selector(kakaoSyncButtonDidTapped), for: .touchUpInside) + } + } + + private func setLayout() { + self.addSubviews(profileImageView, kakaoSyncButton) + + profileImageView.snp.makeConstraints { + $0.size.equalTo(72.adjusted) + $0.top.equalToSuperview().offset(32.adjustedHeight) + $0.centerX.equalToSuperview() + } + + kakaoSyncButton.snp.makeConstraints { + $0.height.equalTo(22.adjustedHeight) + $0.width.equalTo(94.adjustedWidth) + $0.top.equalTo(profileImageView.snp.bottom).offset(10) + $0.centerX.equalToSuperview() + } + } + + // MARK: Custom Function + private func updateProfile() { + let request = EditProfileRequestDTO(name: UserManager.shared.name, + yelloID: UserManager.shared.yelloId, + gender: UserManager.shared.gender, + email: UserManager.shared.email, + profileImageURL: UserManager.shared.profileImage, + groupID: UserManager.shared.groupId, + groupAdmissionYear: UserManager.shared.groupAdmissionYear) + NetworkService.shared.profileService.editProfile(requestDTO: request) { result in + switch result { + case .success: + break + default: + print("프로필 변경 통신 실패") + } + } + } + + // MARK: Objc Function + @objc func kakaoSyncButtonDidTapped() { + AuthApi.shared.refreshToken(completion: {_, _ in }) + UserApi.shared.me () {(user, error) in + if let error = error { + print(error) + } else { + if let user { + if let kakaoAccount = user.kakaoAccount { + if let profileImage = kakaoAccount.profile?.profileImageUrl { + UserManager.shared.profileImage = profileImage.absoluteString + if profileImage.absoluteString == StringLiterals.Profile.EditProfile.KakaoDefaultProfileURL { + self.profileImageView.image = ImageLiterals.Profile.imgDefaultProfile + } else { + self.profileImageView.kfSetImage(url: profileImage.absoluteString) + } + self.updateProfile() + } + } + } + } + + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileView.swift new file mode 100644 index 00000000..7b45fb94 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditProfileView.swift @@ -0,0 +1,77 @@ +// +// EditProfileView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/25/24. +// + +import UIKit + +import SnapKit +import Then + +class EditProfileView: UIView { + + // MARK: - Variables + // MARK: Component + let navigationBarView = SettingNavigationBarView() + let editHeaderView = EditProfileHeaderView() + let profileTableView = UITableView(frame: .zero, style: .grouped) + + // MARK: - Function + // MARK: LifeCycle + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + self.backgroundColor = .black + + navigationBarView.do { + $0.titleLabel.text = StringLiterals.Profile.EditProfile.profileInfoTitle + } + + profileTableView.do { + $0.backgroundColor = .clear + $0.showsVerticalScrollIndicator = false + $0.showsHorizontalScrollIndicator = false + $0.register(EditProfileTableViewCell.self, forCellReuseIdentifier: EditProfileTableViewCell.reusableId) + $0.register(EditProfileHeaderView.self, forHeaderFooterViewReuseIdentifier: EditProfileHeaderView.reusableId) + $0.rowHeight = 75.adjustedHeight + $0.separatorStyle = .none + } + } + + private func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubviews(navigationBarView, profileTableView) + + navigationBarView.snp.makeConstraints { + $0.top.equalTo(self.safeAreaInsets).offset(statusBarHeight) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(48.adjustedHeight) + } + + profileTableView.snp.makeConstraints { + $0.top.equalTo(navigationBarView.snp.bottom) + $0.bottom.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditSchoolInfoView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditSchoolInfoView.swift new file mode 100644 index 00000000..d8edecda --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/View/EditSchoolInfoView.swift @@ -0,0 +1,154 @@ +// +// EditSchoolInfoView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/30/24. +// + +import UIKit + +import SnapKit +import Then + +class EditSchoolInfoView: UIView { + // MARK: - Variables + // MARK: Property + var groupType: UserGroupType = UserManager.shared.groupType { + didSet { + if groupType == .high || groupType == .middle { + convertButton.setTitle(StringLiterals.Profile.EditProfile.convertUnivButton, for: .normal) + } else { + convertButton.setTitle(StringLiterals.Profile.EditProfile.convertHighButton, for: .normal) + return + } + } + } + + lazy var convertButtonText: String = { + if groupType == .high || groupType == .middle { + return StringLiterals.Profile.EditProfile.convertUnivButton + } else { + return StringLiterals.Profile.EditProfile.convertHighButton + } + }() + + // MARK: Component + let navigationBarView = SettingNavigationBarView() + let iconImageView = UIImageView() + let guideLabel = UILabel() + let modificationDateLabel = UILabel() + let editTableView = UITableView(frame: .zero, style: .plain) + let convertButton = UIButton() + + // MARK: - Function + // MARK: LifeCycle + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + navigationBarView.do { + $0.isHasSaveButton = true + $0.titleLabel.text = StringLiterals.Profile.EditProfile.profileEditTitle + } + + iconImageView.do { + $0.image = ImageLiterals.Profile.icAlert + } + + guideLabel.do { + $0.font = .uiLabelLarge + $0.textColor = .yelloMain500 + $0.text = StringLiterals.Profile.EditProfile.guideText + $0.textAlignment = .center + $0.numberOfLines = 2 + } + + modificationDateLabel.do { + $0.font = .uiLabelMedium + $0.textColor = .grayscales400 + $0.text = StringLiterals.Profile.EditProfile.modifireDateText + } + + editTableView.do { + $0.register(EditSchoolInfoTableViewCell.self, + forCellReuseIdentifier: EditSchoolInfoTableViewCell.reuseId) + $0.rowHeight = UITableView.automaticDimension + $0.estimatedRowHeight = UITableView.automaticDimension + $0.showsVerticalScrollIndicator = false + $0.showsHorizontalScrollIndicator = false + $0.backgroundColor = .clear + $0.isScrollEnabled = false + $0.separatorStyle = .none + } + + convertButton.do { + $0.setTitle(convertButtonText, for: .normal) + $0.setTitleColor(.yelloMain500, for: .normal) + $0.setImage(ImageLiterals.Profile.icRightSmall, for: .normal) + $0.titleLabel?.font = .uiLabelLarge + $0.makeCornerRound(radius: 22.adjusted) + $0.makeBorder(width: 1, color: .yelloMain500) + } + } + + private func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubviews(navigationBarView, + iconImageView, + guideLabel, + modificationDateLabel, + editTableView, + convertButton) + + navigationBarView.snp.makeConstraints { + $0.top.equalTo(self.safeAreaInsets).offset(statusBarHeight) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(48.adjustedHeight) + } + + iconImageView.snp.makeConstraints { + $0.top.equalTo(navigationBarView.snp.bottom).offset(6.adjustedHeight) + $0.centerX.equalToSuperview() + $0.size.equalTo(24.adjusted) + } + + guideLabel.snp.makeConstraints { + $0.top.equalTo(iconImageView.snp.bottom).offset(6.adjustedHeight) + $0.centerX.equalToSuperview() + } + + modificationDateLabel.snp.makeConstraints { + $0.top.equalTo(guideLabel.snp.bottom).offset(4.adjustedHeight) + $0.centerX.equalToSuperview() + } + + editTableView.snp.makeConstraints { + $0.top.equalTo(modificationDateLabel.snp.bottom).offset(16.adjusted) + $0.bottom.leading.trailing.equalToSuperview() + } + + convertButton.snp.makeConstraints { + $0.bottom.equalToSuperview().inset(30.adjustedHeight) + $0.centerX.equalToSuperview() + $0.height.equalTo(44.adjusted) + $0.width.equalTo(140.adjustedWidth) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditProfileViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditProfileViewController.swift new file mode 100644 index 00000000..9fa7f080 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditProfileViewController.swift @@ -0,0 +1,124 @@ +// +// EditProfileViewController.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/25/24. +// + +import UIKit + +final class EditProfileViewController: BaseViewController { + + // MARK: - Variables + // MARK: Property + var userGroupType: UserGroupType = UserManager.shared.groupType + var universityTitleList = [StringLiterals.Profile.EditProfile.major, + StringLiterals.Profile.EditProfile.studentId] + var highschoolTitleList = [StringLiterals.Profile.EditProfile.grade, + StringLiterals.Profile.EditProfile.schoolClass] + + // MARK: Component + let editProfileView = EditProfileView() + + // MARK: - Function + // MARK: LifeCycle + override func loadView() { + self.view = editProfileView + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + editProfileView.profileTableView.reloadData() + self.tabBarController?.tabBar.isHidden = true + } + + override func viewDidLoad() { + super.viewDidLoad() + setDelegate() + } + + // MARK: Custom Function + private func setDelegate() { + editProfileView.profileTableView.dataSource = self + editProfileView.profileTableView.delegate = self + editProfileView.navigationBarView.handleBackButtonDelegate = self + } +} + +// MARK: - extension +// MARK: UITableViewDataSource +extension EditProfileViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 5 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: EditProfileTableViewCell.reusableId) as? EditProfileTableViewCell else { return UITableViewCell() } + userGroupType = UserManager.shared.groupType + switch indexPath.item { + case 0: + cell.configureCell(isEditable: false, + title: StringLiterals.Profile.EditProfile.name, + info: UserManager.shared.name) + case 1: + cell.configureCell(isEditable: false, + title: StringLiterals.Profile.EditProfile.id, + info: UserManager.shared.yelloId) + case 2: + cell.configureCell(isEditable: true, + title: StringLiterals.Profile.EditProfile.school, + info: UserManager.shared.groupName) + case 3: + if userGroupType == .univ || userGroupType == .SOPT { + cell.configureCell(isEditable: true, + title: universityTitleList[indexPath.item - 3], + info: UserManager.shared.subGroupName) + } else if userGroupType == .high || userGroupType == .middle { + cell.configureCell(isEditable: true, + title: highschoolTitleList[indexPath.item - 3], + info: "\(UserManager.shared.groupAdmissionYear)학년") + } + case 4: + if userGroupType == .univ || userGroupType == .SOPT { + cell.configureCell(isEditable: true, + title: universityTitleList[indexPath.item - 3], + info: String(UserManager.shared.groupAdmissionYear)) + } else if userGroupType == .high || userGroupType == .middle { + cell.configureCell(isEditable: true, + title: highschoolTitleList[indexPath.item - 3], + info: "\(UserManager.shared.subGroupName)반") + } + default: + return cell + } + cell.selectionStyle = .none + return cell + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let view = tableView.dequeueReusableHeaderFooterView(withIdentifier: EditProfileHeaderView.reusableId) as? EditProfileHeaderView + return view + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 155.adjustedHeight + } +} + +// MARK: UITableViewDelegate +extension EditProfileViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if indexPath.item > 1 { + let editSchoolInfoViewController = EditSchoolInfoViewController() + navigationController?.pushViewController(editSchoolInfoViewController, animated: true) + + } + } +} + +// MARK: HandleBackButtonDelegate +extension EditProfileViewController: HandleBackButtonDelegate { + func popView() { + navigationController?.popViewController(animated: true) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditSchoolInfoViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditSchoolInfoViewController.swift new file mode 100644 index 00000000..2f29e7d3 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Edit/ViewController/EditSchoolInfoViewController.swift @@ -0,0 +1,350 @@ +// +// EditSchoolInfoViewController.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/30/24. +// + +import UIKit + +import SnapKit +import Then + +final class EditSchoolInfoViewController: BaseViewController { + // MARK: - Variables + // MARK: Property + var isEditAvailable: Bool = true + var isMajorSearchError: Bool = false + var groupName: String = UserManager.shared.groupName + var subgroupName: String = UserManager.shared.subGroupName + var groupAdmissionYear: Int = UserManager.shared.groupAdmissionYear + var groupId: Int = UserManager.shared.groupId + var userGroupType = UserManager.shared.groupType + var lastEditDate: String = "" { + didSet { + editSchoolInfoView.modificationDateLabel.text?.append(lastEditDate) + } + } + var createDate: String = "" + + // MARK: Component + let editSchoolInfoView = EditSchoolInfoView() + let studentIdViewController = StudentIdViewController() + let schoolSearchViewController = FindSchoolViewController() + let majorSearchViewController = FindMajorViewController() + lazy var studentIdView = StudentIdView() + + // MARK: - Function + // MARK: LifeCycle + override func loadView() { + self.view = editSchoolInfoView + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + checkUpdateAvailable() + self.tabBarController?.tabBar.isHidden = true + } + + override func viewDidLoad() { + super.viewDidLoad() + addTarget() + setDelegate() + } + + // MARK: Custom Function + private func addTarget() { + editSchoolInfoView.convertButton.addTarget(self, action: #selector(convertButtonTapped), for: .touchUpInside) + } + + private func setDelegate() { + editSchoolInfoView.editTableView.dataSource = self + editSchoolInfoView.editTableView.delegate = self + editSchoolInfoView.navigationBarView.handleSaveButtonDelegate = self + editSchoolInfoView.navigationBarView.handleBackButtonDelegate = self + schoolSearchViewController.schoolSearchDelegate = self + majorSearchViewController.majorSearchDelegate = self + studentIdViewController.delegate = self + } + + private func updateProfile() { + UserManager.shared.groupName = self.groupName + UserManager.shared.subGroupName = self.subgroupName + UserManager.shared.groupAdmissionYear = self.groupAdmissionYear + UserManager.shared.groupId = self.groupId + UserManager.shared.groupType = self.userGroupType + + let request = EditProfileRequestDTO(name: UserManager.shared.name, + yelloID: UserManager.shared.yelloId, + gender: UserManager.shared.gender, + email: UserManager.shared.email, + profileImageURL: UserManager.shared.profileImage, + groupID: UserManager.shared.groupId, + groupAdmissionYear: UserManager.shared.groupAdmissionYear) + NetworkService.shared.profileService.editProfile(requestDTO: request) { result in + switch result { + case .success(let response): + break + default: + print("프로필 변경 통신 실패") + } + } + } + + func getSchoolClass(keyword: String) { + let queryDTO = HighSchoolClassRequestQueryDTO(name: self.groupName, keyword: keyword) + NetworkService.shared.onboardingService.getHighSchoolClass(queryDTO: queryDTO) { result in + switch result { + case .success(let data): + if let data = data.data { + self.groupId = data.groupId + } + default: + print("network Error") + } + } + } + + private func checkUpdateAvailable() { + NetworkService.shared.profileService.getAccountUpdateAt { result in + switch result { + case .success(let response): + var valueArray: [String.SubSequence] = [] + if let data = response.data { + valueArray = data.value.split(separator: "|") + } + if !valueArray.isEmpty { + self.isEditAvailable = valueArray[0] == "true" ? true : false + self.createDate = DateConverter.convertDateString(String(valueArray[2])) ?? "" + if valueArray[1] != "null" { + self.lastEditDate = DateConverter.convertDateString(String(valueArray[1])) ?? "" + } else { + // 변경한 이력이 없는 경우 프로필 생성일을 마지막 수정일로 설정 + self.lastEditDate = self.createDate + } + } + default: + print("프로필 수정 가능 여부 확인 실패") + } + } + } + + // MARK: Objc Function + @objc func convertButtonTapped() { + schoolSearchViewController.searchResults.removeAll() + schoolSearchViewController.searchView.searchResultTableView.reloadData() + self.groupId = 0 + majorSearchViewController.schoolName = "" + + if userGroupType == .high || userGroupType == .middle { + userGroupType = .univ + } else { + userGroupType = .high + isMajorSearchError = false + } + + groupName = StringLiterals.Profile.EditProfile.defaultText + subgroupName = (userGroupType == .univ) ? StringLiterals.Profile.EditProfile.defaultText : "1" + groupAdmissionYear = userGroupType == .univ ? 24 : 1 + + editSchoolInfoView.groupType = userGroupType + + print("유저 타입 변경 완료 \n - 그룹 타입: \(userGroupType) \n - 그룹명: \(groupName) \n - 서브그룹명: \(subgroupName)") + editSchoolInfoView.editTableView.reloadData() + } +} + +// MARK: - extension +// MARK: UITableViewDataSource +extension EditSchoolInfoViewController: UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 3 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + if let cell = tableView.dequeueReusableCell(withIdentifier: EditSchoolInfoTableViewCell.reuseId, for: indexPath) as? EditSchoolInfoTableViewCell { + switch indexPath.row { + case 0: + cell.isError = false + cell.configureCell(iconType: .search, + titleText: StringLiterals.Profile.EditProfile.school, + InfoText: groupName) + case 1: + if userGroupType == .univ || userGroupType == .SOPT { + cell.isError = isMajorSearchError + cell.configureCell(iconType: .search, + titleText: StringLiterals.Profile.EditProfile.major, + InfoText: self.subgroupName) + } else if userGroupType == .high || userGroupType == .middle { + cell.configureCell(iconType: .toggle, + titleText: StringLiterals.Profile.EditProfile.grade, + InfoText: "\(self.groupAdmissionYear)학년") + } + case 2: + cell.isError = false + if userGroupType == .univ || userGroupType == .SOPT { + cell.configureCell(iconType: .toggle, + titleText: StringLiterals.Profile.EditProfile.studentId, + InfoText: String(self.groupAdmissionYear)) + } else if userGroupType == .high || userGroupType == .middle { + cell.configureCell(iconType: .toggle, + titleText: StringLiterals.Profile.EditProfile.schoolClass, + InfoText: "\(subgroupName)반") + } + default: + break + } + cell.selectionStyle = .none + return cell + } + return UITableViewCell() + } +} + +// MARK: UITableViewDelegate +extension EditSchoolInfoViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + switch indexPath.row { + case 0: + schoolSearchViewController.userType = userGroupType + self.present(schoolSearchViewController, animated: true) + case 1: + if userGroupType == .univ || userGroupType == .SOPT { + if groupName == StringLiterals.Profile.EditProfile.defaultText { + self.view.showToast(message: "학교를 먼저 선택해주세요", at: 82.adjustedHeight) + } else { + majorSearchViewController.schoolName = groupName + self.present(majorSearchViewController, animated: true) + } + } else if userGroupType == .high || userGroupType == .middle { + if userGroupType == .high || userGroupType == .middle { + studentIdViewController.selectType = .grade + studentIdViewController.studentIdList = (1...3).map { "\($0)학년" } + } + let nav = UINavigationController(rootViewController: studentIdViewController) + let detentIdentifier = UISheetPresentationController.Detent.Identifier("customDetent") + if #available(iOS 16.0, *) { + let customDetent = UISheetPresentationController.Detent.custom(identifier: detentIdentifier) { _ in + let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene + let safeAreaBottom = windowScene?.windows.first?.safeAreaInsets.bottom ?? 0 + return 166.adjustedHeight - safeAreaBottom + } + if let sheet = nav.sheetPresentationController { + sheet.detents = [customDetent] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) + } + } else { + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) + } + } + } + case 2: + if userGroupType == .high || userGroupType == .middle { + studentIdViewController.selectType = .schoolClass + studentIdViewController.studentIdList = (1...20).map { "\($0)반" } + } else { + studentIdViewController.selectType = .studentId + studentIdViewController.studentIdList = (15...24).reversed().map { "\($0)학번" } + } + let nav = UINavigationController(rootViewController: studentIdViewController) + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) + } + + default: + break + } + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + if indexPath.item == 1 && isMajorSearchError { + return 95.adjustedHeight + } + return 75.adjustedHeight + } +} + +// MARK: HandleBackButtonDelegate +extension EditSchoolInfoViewController: HandleBackButtonDelegate { + func popView() { + navigationController?.popViewController(animated: true) + } +} + +// MARK: HandleSaveButtonDelegate +extension EditSchoolInfoViewController: HandleSaveButtonDelegate { + func saveModifiedInfo() { + if groupId == 0 { + if groupName == StringLiterals.Profile.EditProfile.defaultText { + self.view.showToast(message: StringLiterals.Profile.EditProfile.notYetErrorMessage, at: 82.adjustedHeight) + return + } + } + + if subgroupName == StringLiterals.Profile.EditProfile.defaultText { + isMajorSearchError = true + editSchoolInfoView.editTableView.reloadData() + return + } + + if groupName == UserManager.shared.groupName && + subgroupName == UserManager.shared.subGroupName && + groupAdmissionYear == UserManager.shared.groupAdmissionYear { + // 변경 내역이 없는 경우 + self.view.showToast(message: StringLiterals.Profile.EditProfile.notYetErrorMessage, at: 82.adjustedHeight) + } else { + if isEditAvailable && !isMajorSearchError { + updateProfile() + navigationController?.popViewController(animated: true) + } else if !isEditAvailable { + // 1년이내 변경한 경우 + self.view.showToast(message: StringLiterals.Profile.EditProfile.editDateErrorMessage, at: 82.adjustedHeight) + } + } + } +} + +// MARK: SearchResultTableViewSelectDelegate +extension EditSchoolInfoViewController: SchoolSearchResultSelectDelegate { + func didSelectSchoolResult(_ result: String) { + groupName = result + if userGroupType == .univ || userGroupType == .SOPT { + subgroupName = StringLiterals.Profile.EditProfile.defaultText + } + editSchoolInfoView.editTableView.reloadData() + } +} + +// MARK: MajorSearchResultSelectDelegate +extension EditSchoolInfoViewController: MajorSearchResultSelectDelegate { + func didSelectMajorResult(_ result: GroupList) { + subgroupName = result.departmentName + groupId = result.groupID + isMajorSearchError = false + print(result.departmentName) + editSchoolInfoView.editTableView.reloadData() + } +} + +// MARK: SelectStudentIdDelegate +extension EditSchoolInfoViewController: SelectStudentIdDelegate { + func didSelectStudentId(_ result: Int, type: SelectType) { + if userGroupType == .high || userGroupType == .middle { + if type == .grade { + groupAdmissionYear = result + } else if type == .schoolClass { + subgroupName = "\(result)" + getSchoolClass(keyword: String(result)) + } + } else if userGroupType == .univ { + groupAdmissionYear = result + } + editSchoolInfoView.editTableView.reloadData() + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Helper/DateConverter.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Helper/DateConverter.swift new file mode 100644 index 00000000..299d86f2 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Helper/DateConverter.swift @@ -0,0 +1,26 @@ +// +// DateConverter.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 2/2/24. +// + +import Foundation + +class DateConverter { + static func convertDateString(_ dateString: String) -> String? { + + let inputFormatter = DateFormatter() + inputFormatter.dateFormat = "yyyy-MM-dd" + + let outputFormatter = DateFormatter() + outputFormatter.dateFormat = "yyyy.MM.dd" + + if let date = inputFormatter.date(from: dateString) { + let formattedDate = outputFormatter.string(from: date) + return formattedDate + } else { + return nil + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/InfoView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/InfoView.swift new file mode 100644 index 00000000..4c82e3e1 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/InfoView.swift @@ -0,0 +1,75 @@ +// +// InfoView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/24/24. +// + +import UIKit + +import Then +import SnapKit + +final class InfoView: UIView { + + // MARK: - Variables + // MARK: Component + let infoLabel = UILabel() + let descriptionLabel = UILabel() + let stackView = UIStackView() + + // MARK: - Function + // MARK: LifeCycle + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: Layout Helpers + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + self.do { + $0.makeCornerRound(radius: 12.adjusted) + $0.backgroundColor = .grayscales900 + } + + infoLabel.do { + $0.font = .uiHeadline02 + $0.textColor = .white + } + + descriptionLabel.do { + $0.font = .uiLabelMedium + $0.textColor = .grayscales500 + } + + stackView.do { + $0.addArrangedSubviews(infoLabel, descriptionLabel) + $0.axis = .vertical + $0.alignment = .center + } + } + + private func setLayout() { + self.addSubviews(stackView) + + self.snp.makeConstraints { + $0.width.equalTo(109.adjustedWidth) + $0.height.equalTo(68.adjustedHeight) + } + + stackView.snp.makeConstraints { + $0.height.equalTo(45.adjustedHeight) + $0.center.equalToSuperview() + } + } + +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MainProfileView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MainProfileView.swift new file mode 100644 index 00000000..2eb5b93a --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MainProfileView.swift @@ -0,0 +1,193 @@ +// +// ThirdMyProfileView.swift +// YELLO-iOS +// +// Created by 지희의 MAC on 1/23/24. +// + +import UIKit + +import Then +import SnapKit + +final class MainProfileView: UIView { + // MARK: - Variables + // MARK: Property + // MARK: Component + let profileImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 48 + .adjusted, height: 48.adjusted)) + let profileStarGradientView = UIView(frame: CGRect(x: 0, y: 0, width: 344.adjusted, height: 6.adjustedHeight)) + let profileStarImageView = UIImageView() + let editProfileButton = UIButton() + + let nameLabel = UILabel() + let instagramLabel = UILabel() + let schoolLabel = UILabel() + + let userInfoStackView = UIStackView() + + let nameSkeletonLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 66.adjustedWidth, height: 16.adjustedHeight)) + let schoolSkeletonLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 66.adjustedWidth, height: 16.adjustedHeight)) + + // 옐로 플러스 여부에 따라서 달라짐 + var isYelloPlus: Bool = false { + didSet { + updateProfileView() + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + + self.do { + $0.backgroundColor = .grayscales900 + $0.makeCornerRound(radius: 12.adjusted) + } + + profileImageView.do { + $0.backgroundColor = .grayscales800 + $0.contentMode = .scaleAspectFill + $0.makeCornerRound(radius: 24.adjusted) + $0.layer.cornerCurve = .continuous + } + + profileStarGradientView.do { + $0.applyGradientBackground(topColor: UIColor(hex: "D96AFF"), bottomColor: UIColor(hex: "7C57FF"), startPointY: 0.5, endPointY: 0.5) + + $0.layer.cornerCurve = .continuous + $0.isHidden = true + } + + profileStarImageView.do { + $0.image = ImageLiterals.Profile.icProfileStar + $0.isHidden = true + } + + editProfileButton.do { + $0.setImage(ImageLiterals.Profile.icRight, for: .normal) + } + + nameLabel.do { + $0.setTextWithLineHeight(text: "", lineHeight: 28.adjustedHeight) + $0.font = .uiHeadline02 + $0.textColor = .white + $0.numberOfLines = 2 + $0.lineBreakMode = .byCharWrapping + } + + instagramLabel.do { + $0.setTextWithLineHeight(text: " ", lineHeight: 16.adjustedHeight) + $0.font = .uiBody02 + $0.textColor = .yelloMain500 + } + + schoolLabel.do { + $0.setTextWithLineHeight(text: " ", lineHeight: 16.adjustedHeight) + $0.font = .uiLabelLarge + $0.textColor = .grayscales400 + $0.numberOfLines = 2 + $0.textAlignment = .left + $0.lineBreakMode = .byCharWrapping + } + + userInfoStackView.do { + $0.axis = .vertical + $0.alignment = .leading + $0.addArrangedSubviews(nameLabel, + schoolLabel) + } + + nameSkeletonLabel.do { + $0.backgroundColor = .grayscales800 + $0.makeCornerRound(radius: 2.adjustedHeight) + $0.isHidden = true + } + + schoolSkeletonLabel.do { + $0.backgroundColor = .grayscales800 + $0.makeCornerRound(radius: 2.adjustedHeight) + $0.isHidden = true + } + + updateProfileView() + } + + private func setLayout() { + self.addSubviews(profileImageView, + profileStarImageView, + instagramLabel, + userInfoStackView, + editProfileButton, + profileStarGradientView, + nameSkeletonLabel, + schoolSkeletonLabel) + + profileImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(20.adjusted) + $0.size.equalTo(48.adjusted) + } + + userInfoStackView.snp.makeConstraints { + $0.leading.equalTo(profileImageView.snp.trailing).offset(12.adjusted) + $0.centerY.equalToSuperview() + } + + instagramLabel.snp.makeConstraints { + $0.leading.equalTo(nameLabel.snp.trailing).offset(10.adjusted) + $0.centerY.equalTo(nameLabel) + } + + schoolLabel.snp.makeConstraints { + $0.width.equalTo(208.adjustedWidth) + } + + editProfileButton.snp.makeConstraints { + $0.trailing.equalToSuperview().inset(15) + $0.centerY.equalToSuperview() + $0.size.equalTo(24.adjusted) + } + + nameSkeletonLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(22.adjustedHeight) + $0.leading.equalTo(profileImageView.snp.trailing).offset(12.adjustedWidth) + $0.height.equalTo(24.adjustedHeight) + $0.width.equalTo(60.adjustedWidth) + } + + schoolSkeletonLabel.snp.makeConstraints { + $0.top.equalTo(nameSkeletonLabel.snp.bottom).offset(4.adjustedHeight) + $0.leading.equalTo(nameSkeletonLabel) + $0.height.equalTo(16.adjustedHeight) + $0.width.equalTo(243.adjustedWidth) + } + + profileStarImageView.snp.makeConstraints { + $0.top.equalToSuperview().inset(10.adjustedHeight) + $0.leading.equalToSuperview().inset(18.adjustedWidth) + } + } + + func updateProfileView() { + if isYelloPlus { + profileStarGradientView.isHidden = false + profileStarImageView.isHidden = false + } else { + profileStarGradientView.isHidden = true + profileStarImageView.isHidden = true + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileHeaderView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileHeaderView.swift index 1ced828e..fb1b308c 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileHeaderView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileHeaderView.swift @@ -14,6 +14,9 @@ import Then final class MyProfileHeaderView: UITableViewHeaderFooterView { // MARK: - Variables + // MARK: Property + var groupType: String? + // MARK: Component let myProfileView = MyProfileView() let friendCountView = FriendCountView() @@ -22,6 +25,7 @@ final class MyProfileHeaderView: UITableViewHeaderFooterView { // MARK: LifeCycle override init(reuseIdentifier: String?) { super.init(reuseIdentifier: reuseIdentifier) + print(UserManager.shared.groupType) setUI() } @@ -41,13 +45,13 @@ extension MyProfileHeaderView { } private func setStyle() { - self.backgroundColor = .black + self.backgroundColor = .clear backgroundView?.backgroundColor = .clear } private func setLayout() { self.addSubviews(myProfileView, - friendCountView) + friendCountView) myProfileView.snp.makeConstraints { $0.top.equalToSuperview().offset(12.adjustedHeight) @@ -55,7 +59,7 @@ extension MyProfileHeaderView { } friendCountView.snp.makeConstraints { - $0.top.equalTo(myProfileView.snp.bottom).offset(40.adjustedHeight) + $0.top.equalTo(myProfileView.snp.bottom).offset(12.adjustedHeight) $0.leading.trailing.equalToSuperview() $0.bottom.equalToSuperview().inset(8.adjustedHeight) } @@ -67,23 +71,23 @@ extension MyProfileHeaderView { switch response { case .success(let data): guard let data = data.data else { return } - - if data.profileImageUrl != StringLiterals.Recommending.Title.defaultProfileImageLink { - self.myProfileView.profileImageView.kfSetImage(url: data.profileImageUrl) + updateUserInfo(data) + if data.profileImageURL != StringLiterals.Recommending.Title.defaultProfileImageLink && + data.profileImageURL != StringLiterals.Profile.EditProfile.KakaoDefaultProfileURL { + self.myProfileView.mainProfileView.profileImageView.kfSetImage(url: data.profileImageURL) } else { - self.myProfileView.profileImageView.image = ImageLiterals.Profile.imgDefaultProfile + self.myProfileView.mainProfileView.profileImageView.image = ImageLiterals.Profile.imgDefaultProfile } - self.myProfileView.nameLabel.text = data.name - self.myProfileView.instagramLabel.text = "@" + data.yelloId - self.myProfileView.schoolLabel.text = data.group - self.myProfileView.messageView.countLabel.text = String(data.yelloCount) - self.myProfileView.friendView.countLabel.text = String(data.friendCount) - self.myProfileView.pointView.countLabel.text = String(data.point) + self.myProfileView.mainProfileView.nameLabel.text = data.name + self.myProfileView.mainProfileView.instagramLabel.text = "@" + data.yelloID + self.myProfileView.mainProfileView.schoolLabel.text = data.group + self.myProfileView.messageInfoView.infoLabel.text = String(data.yelloCount) + self.myProfileView.friendInfoView.infoLabel.text = String(data.friendCount) + self.myProfileView.pointInfoView.infoLabel.text = String(data.point) self.friendCountView.friendCountLabel.text = String(data.friendCount) + "명" self.friendCountView.friendCountLabel.asColor(targetString: "명", color: .grayscales500) - Amplitude.instance().setUserProperties(["user_friends": data.friendCount, "user_message_received": data.yelloCount, "user_name": data.name]) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileView.swift index 10a39002..4ae0a088 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/MyProfileView.swift @@ -14,36 +14,28 @@ import Then final class MyProfileView: UIView { // MARK: - Variables + // MARK: Property + var height = 57.adjustedHeight + var isAvailable = false { + didSet { + updateNotification() + } + } + // MARK: Component - let mainProfileView = UIView() + let mainProfileView = MainProfileView() - let profileImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 48 - .adjusted, height: 48.adjusted)) - let profileStarGradientView = UIView(frame: CGRect(x: 0, y: 0, width: 344.adjusted, height: 6.adjustedHeight)) - let profileStarImageView = UIImageView() + let messageInfoView = InfoView() + let friendInfoView = InfoView() + let pointInfoView = InfoView() - let nameLabel = UILabel() - let instagramLabel = UILabel() - let schoolLabel = UILabel() - private let separateView = UIView() - let messageView = CountCustomView() - let friendView = CountCustomView() - let pointView = CountCustomView() + let infoStackView = UIStackView() - private let addGroupButton = UIButton(frame: CGRect(x: 0, y: 0, width: 129.adjustedWidth, height: 48.adjustedHeight)) - lazy var shopButton = UIButton(frame: CGRect(x: 0, y: 0, width: 202.adjustedWidth, height: 44.adjustedHeight)) - let shopBackgroundView = UIView(frame: CGRect(x: 0, y: 0, width: 206.adjustedWidth, height: 48.adjustedHeight)) - let saleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 48.adjustedWidth, height: 22.adjustedHeight)) + lazy var shopButton = UIButton(frame: CGRect(x: 0, y: 0, width: 0, height: 44.adjustedHeight)) + let shopBackgroundView = UIView(frame: CGRect(x: 0, y: 0, width: 343.adjustedWidth, height: 48.adjustedHeight)) + let saleLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: 22.adjustedHeight)) - let nameSkeletonLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 66.adjustedWidth, height: 16.adjustedHeight)) - let schoolSkeletonLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 66.adjustedWidth, height: 16.adjustedHeight)) - - // 옐로 플러스 여부에 따라서 달라짐 - var isYelloPlus: Bool = false { - didSet { - updateProfileView() - } - } + let notificationImageView = UIImageView() // MARK: - Function // MARK: LifeCycle @@ -56,6 +48,17 @@ final class MyProfileView: UIView { required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + func updateNotification() { + self.notificationImageView.isHidden = !isAvailable + height = isAvailable ? 57.adjustedHeight : 0 + notificationImageView.snp.remakeConstraints { + $0.height.equalTo(height) + $0.leading.trailing.equalToSuperview() + $0.top.equalTo(shopBackgroundView.snp.bottom).offset(10.adjusted) + $0.bottom.equalToSuperview() + } + } } // MARK: - extension @@ -68,80 +71,22 @@ extension MyProfileView { } private func setStyle() { - - mainProfileView.do { - $0.backgroundColor = .grayscales900 - $0.roundCorners(cornerRadius: 12.adjustedHeight, maskedCorners: [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]) - } - - profileImageView.do { - $0.backgroundColor = .grayscales800 - $0.contentMode = .scaleAspectFill - $0.makeCornerRound(radius: 24.adjusted) - $0.layer.cornerCurve = .continuous - } - - profileStarGradientView.do { - $0.applyGradientBackground(topColor: UIColor(hex: "D96AFF"), bottomColor: UIColor(hex: "7C57FF"), startPointY: 0.5, endPointY: 0.5) - $0.layer.cornerCurve = .continuous - $0.isHidden = true - } - - profileStarImageView.do { - $0.image = ImageLiterals.Profile.icProfileStar - $0.isHidden = true - } - - nameLabel.do { - $0.setTextWithLineHeight(text: " ", lineHeight: 30.adjustedHeight) - $0.font = .uiHeadline02 - $0.textColor = .white - $0.numberOfLines = 2 - $0.lineBreakMode = .byCharWrapping - } - - instagramLabel.do { - $0.setTextWithLineHeight(text: " ", lineHeight: 20.adjustedHeight) - $0.font = .uiBody02 - $0.textColor = .yelloMain500 + messageInfoView.do { + $0.descriptionLabel.text = StringLiterals.Profile.Count.message } - schoolLabel.do { - $0.setTextWithLineHeight(text: " ", lineHeight: 16.adjustedHeight) - $0.font = .uiLabelLarge - $0.textColor = .grayscales400 - $0.textAlignment = .left - $0.lineBreakMode = .byCharWrapping + friendInfoView.do { + $0.descriptionLabel.text = StringLiterals.Profile.Count.friend } - separateView.do { - $0.backgroundColor = .grayscales700 + pointInfoView.do { + $0.descriptionLabel.text = StringLiterals.Profile.Count.point } - messageView.do { - $0.countLabel.text = " " - $0.titleLabel.text = StringLiterals.Profile.Count.message - } - - friendView.do { - $0.countLabel.text = " " - $0.titleLabel.text = StringLiterals.Profile.Count.friend - } - - pointView.do { - $0.countLabel.text = " " - $0.titleLabel.text = StringLiterals.Profile.Count.point - } - - addGroupButton.do { - $0.backgroundColor = .grayscales900 - $0.makeCornerRound(radius: 24.adjustedHeight) - $0.titleLabel?.font = .uiBodyMedium - $0.setTitleColor(.yelloMain500, for: .normal) - $0.setImage(ImageLiterals.Profile.icPlus, for: .normal) - $0.imageEdgeInsets = .init(top: 0, left: 0, bottom: 0, right: 4.adjustedWidth) - $0.setTitle(StringLiterals.Profile.MyProfile.addGroup, for: .normal) - $0.addTarget(self, action: #selector(addGroupButtonTapped), for: .touchUpInside) + infoStackView.do { + $0.addArrangedSubviews(messageInfoView, friendInfoView, pointInfoView) + $0.spacing = 8.adjustedWidth + $0.alignment = .fill } shopButton.do { @@ -170,173 +115,60 @@ extension MyProfileView { $0.textAlignment = .center } - nameSkeletonLabel.do { - $0.backgroundColor = .grayscales800 - $0.makeCornerRound(radius: 2.adjustedHeight) - $0.isHidden = true + notificationImageView.do { + $0.makeCornerRound(radius: 12.adjusted) + $0.contentMode = .scaleAspectFit } - - schoolSkeletonLabel.do { - $0.backgroundColor = .grayscales800 - $0.makeCornerRound(radius: 2.adjustedHeight) - $0.isHidden = true - } - - updateProfileView() } private func setLayout() { + let nameLabelHeight = mainProfileView.nameLabel.bounds.height + let newMainProfileViewHeight = nameLabelHeight + 88.adjustedHeight + self.addSubviews( mainProfileView, - profileStarGradientView, - addGroupButton, + infoStackView, shopBackgroundView, - saleLabel) - - mainProfileView.addSubviews(profileImageView, - profileStarImageView, - nameLabel, - instagramLabel, - schoolLabel, - separateView, - messageView, - friendView, - pointView, - nameSkeletonLabel, - schoolSkeletonLabel - ) + saleLabel, + notificationImageView) shopBackgroundView.addSubviews(shopButton) mainProfileView.snp.makeConstraints { - $0.top.equalTo(profileStarGradientView.snp.bottom) - $0.width.equalTo(343.adjustedWidth) - } - - profileStarGradientView.snp.makeConstraints { - $0.leading.trailing.equalTo(mainProfileView) $0.top.equalToSuperview() - $0.height.equalTo(6.adjustedHeight) - } - - profileImageView.snp.makeConstraints { - $0.top.equalToSuperview().inset(20.adjustedHeight) - $0.leading.equalToSuperview().inset(27.5.adjustedWidth) - $0.height.width.equalTo(48.adjusted) - } - - profileStarImageView.snp.makeConstraints { - $0.top.equalTo(mainProfileView).offset(10.adjustedHeight) - $0.leading.equalToSuperview().inset(18.adjustedWidth) - } - - nameLabel.snp.makeConstraints { - $0.top.equalToSuperview().inset(20.adjustedHeight) - $0.leading.equalTo(profileImageView.snp.trailing).offset(12.adjustedWidth) - } - - instagramLabel.snp.makeConstraints { - $0.bottom.equalTo(nameLabel).offset(-3.adjustedHeight) - $0.leading.equalTo(nameLabel.snp.trailing).offset(8.adjustedWidth) - } - - schoolLabel.snp.makeConstraints { - $0.top.equalTo(nameLabel.snp.bottom) - $0.leading.equalTo(nameLabel) - $0.width.equalTo(243.adjustedWidth) - } - - separateView.snp.makeConstraints { - $0.top.equalTo(schoolLabel.snp.bottom).offset(16.adjustedHeight) - $0.height.equalTo(1.adjusted) - $0.leading.trailing.equalToSuperview().inset(32.adjustedWidth) + $0.leading.trailing.equalToSuperview() + $0.height.equalTo(newMainProfileViewHeight) } - messageView.snp.makeConstraints { - $0.top.equalTo(separateView.snp.bottom).offset(16.adjustedHeight) - $0.trailing.equalTo(friendView.snp.leading).offset(-12.adjustedWidth) - $0.height.equalTo(64.adjustedHeight) - $0.width.equalTo(84.adjustedWidth) - $0.bottom.equalToSuperview().inset(20.adjustedHeight) - } - - friendView.snp.makeConstraints { - $0.top.equalTo(messageView) - $0.centerX.equalToSuperview() - $0.height.equalTo(64.adjustedHeight) - $0.width.equalTo(84.adjustedWidth) - $0.bottom.equalTo(messageView) - } - - pointView.snp.makeConstraints { - $0.top.equalTo(messageView) - $0.leading.equalTo(friendView.snp.trailing).offset(12.adjustedWidth) - $0.height.equalTo(64.adjustedHeight) - $0.width.equalTo(84.adjustedWidth) - $0.bottom.equalTo(messageView) - } - - addGroupButton.snp.makeConstraints { + infoStackView.snp.makeConstraints { $0.top.equalTo(mainProfileView.snp.bottom).offset(8.adjustedHeight) - $0.height.equalTo(48.adjustedHeight) - $0.width.equalTo(129.adjustedWidth) - $0.leading.equalTo(mainProfileView) - $0.bottom.equalToSuperview() + $0.leading.trailing.equalToSuperview() } shopBackgroundView.snp.makeConstraints { - $0.trailing.equalTo(mainProfileView) + $0.leading.trailing.equalToSuperview() $0.height.equalTo(48.adjustedHeight) - $0.width.equalTo(206.adjustedWidth) - $0.top.equalTo(addGroupButton) - $0.bottom.equalToSuperview() + $0.top.equalTo(infoStackView.snp.bottom).offset(12.adjustedHeight) } shopButton.snp.makeConstraints { $0.center.equalToSuperview() $0.leading.trailing.bottom.top.equalToSuperview().inset(2.adjustedWidth) $0.height.equalTo(44.adjustedHeight) - $0.width.equalTo(202.adjustedWidth) } saleLabel.snp.makeConstraints { $0.height.equalTo(22.adjustedHeight) $0.width.equalTo(48.adjustedWidth) $0.trailing.equalTo(shopBackgroundView).inset(6.adjustedWidth) - $0.top.equalTo(mainProfileView.snp.bottom).offset(4.adjustedHeight) + $0.top.equalTo(infoStackView.snp.bottom).offset(4.adjustedHeight) } - nameSkeletonLabel.snp.makeConstraints { - $0.top.equalToSuperview().inset(22.adjustedHeight) - $0.leading.equalTo(profileImageView.snp.trailing).offset(12.adjustedWidth) - $0.height.equalTo(24.adjustedHeight) - $0.width.equalTo(60.adjustedWidth) - } - - schoolSkeletonLabel.snp.makeConstraints { - $0.top.equalTo(nameSkeletonLabel.snp.bottom).offset(4.adjustedHeight) - $0.leading.equalTo(nameSkeletonLabel) - $0.height.equalTo(16.adjustedHeight) - $0.width.equalTo(243.adjustedWidth) - } - } - - // MARK: Objc Function - @objc private func addGroupButtonTapped() { - let url = URL(string: "https://bit.ly/44xDDqC")! - UIApplication.shared.open(url, options: [:], completionHandler: nil) - Amplitude.instance().logEvent("click_profile_group") - } - - func updateProfileView() { - if isYelloPlus { - mainProfileView.roundCorners(cornerRadius: 12.adjustedHeight, maskedCorners: [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]) - profileStarGradientView.isHidden = false - profileStarImageView.isHidden = false - } else { - mainProfileView.roundCorners(cornerRadius: 12.adjustedHeight, maskedCorners: [.layerMinXMinYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner]) - profileStarGradientView.isHidden = true - profileStarImageView.isHidden = true + notificationImageView.snp.makeConstraints { + $0.height.equalTo(height) + $0.leading.trailing.equalToSuperview() + $0.top.equalTo(shopBackgroundView.snp.bottom).offset(10.adjusted) + $0.bottom.equalToSuperview() } } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/ProfileView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/ProfileView.swift index 8592bd1e..871001bf 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/ProfileView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/View/ProfileView.swift @@ -16,12 +16,17 @@ protocol HandleFriendCellDelegate: AnyObject { func presentModal(index: Int) } +protocol HandleEditButton: AnyObject { + func editButtonTapped() +} + final class ProfileView: UIView { // MARK: - Variables // MARK: Property weak var handleFriendCellDelegate: HandleFriendCellDelegate? weak var handleShopButton: HandleShopButton? + weak var handleEditButton: HandleEditButton? var indexNumber: Int = -1 var friendCount: Int = 0 @@ -32,6 +37,13 @@ final class ProfileView: UIView { self.myFriendTableView.reloadData() } } + var redirectionURL: String = "" + var notiBannerImageURL = "" + var isAvailable = false { + didSet { + self.myFriendTableView.reloadData() + } + } var pageCount = -1 var myYelloCount = 0 var profileFriendPage: Int = 0 @@ -44,6 +56,7 @@ final class ProfileView: UIView { let myProfileHeaderView = MyProfileHeaderView() lazy var myFriendTableView = UITableView(frame: .zero, style: .grouped) let refreshControl = UIRefreshControl() + let headerBorder = CALayer() lazy var topButton = UIButton() private var isButtonHidden: Bool = false @@ -84,7 +97,7 @@ extension ProfileView { $0.register(MyFriendTableViewCell.self, forCellReuseIdentifier: MyFriendTableViewCell.identifier) $0.register(MyFriendSkeletonTableViewCell.self, forCellReuseIdentifier: MyFriendSkeletonTableViewCell.identifier) $0.register(MyProfileHeaderView.self, forHeaderFooterViewReuseIdentifier: "MyProfileHeaderView") - $0.backgroundColor = .black + $0.backgroundColor = .clear $0.separatorColor = .grayscales800 $0.separatorStyle = .singleLine $0.showsVerticalScrollIndicator = false @@ -103,6 +116,10 @@ extension ProfileView { $0.isHidden = true $0.layer.applyShadow(color: .black, alpha: 0.6, x: 0, y: 0, blur: 8) } + + headerBorder.do { + $0.backgroundColor = UIColor.black.cgColor + } } private func setLayout() { @@ -158,6 +175,10 @@ extension ProfileView { handleShopButton?.shopButtonTapped() } + @objc func editButtonTapped() { + handleEditButton?.editButtonTapped() + } + private func presentModal(index: Int) { handleFriendCellDelegate?.presentModal(index: index) } @@ -217,15 +238,42 @@ extension ProfileView { guard let data = data.data else { return } self.isYelloPlus = data.isSubscribe + UserManager.shared.isYelloPlus = data.isSubscribe self.ticketCount = data.ticketCount print("구독 통신 성공") default: print("network fail") + UserManager.shared.isYelloPlus = false + self.isYelloPlus = false return } } } + + // MARK: Custom Function + func loadProfileNoti() { + NetworkService.shared.notificationService.userNotification(typeName: "PROFILE-BANNER") { result in + switch result { + case .success(let data): + if let data = data.data { + self.isAvailable = data.isAvailable + if data.isAvailable { + self.notiBannerImageURL = data.imageUrl + self.redirectionURL = data.redirectUrl + } + } + default: + print("프로필 공지사항 Network Error") + } + } + } + + // MARK: Objc Function + @objc func tapNotification() { + let url = URL(string: redirectionURL)! + UIApplication.shared.open(url, options: [:], completionHandler: nil) + } } // MARK: UITableViewDelegate @@ -247,6 +295,7 @@ extension ProfileView: UITableViewDelegate { } } +// MARK: UITableViewDataSource // MARK: UITableViewDataSource extension ProfileView: UITableViewDataSource { @@ -265,13 +314,21 @@ extension ProfileView: UITableViewDataSource { } DispatchQueue.main.async { [self] in - view?.addBottomBorderWithColor(color: .black) view?.profileUser() - view?.myProfileView.nameSkeletonLabel.isHidden = true - view?.myProfileView.schoolSkeletonLabel.isHidden = true + view?.myProfileView.mainProfileView.nameSkeletonLabel.isHidden = true + view?.myProfileView.mainProfileView.schoolSkeletonLabel.isHidden = true view?.myProfileView.shopButton.addTarget(self, action: #selector(shopButtonTapped), for: .touchUpInside) - view?.myProfileView.isYelloPlus = self.isYelloPlus - view?.myProfileView.updateProfileView() + view?.myProfileView.mainProfileView.editProfileButton.addTarget(self, action: #selector(editButtonTapped), for: .touchUpInside) + view?.myProfileView.isAvailable = self.isAvailable + view?.myProfileView.notificationImageView.kfSetImage(url: notiBannerImageURL) + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tapNotification)) + view?.myProfileView.notificationImageView.addGestureRecognizer(tapGesture) + view?.myProfileView.notificationImageView.isUserInteractionEnabled = true + view?.myProfileView.mainProfileView.isYelloPlus = self.isYelloPlus + view?.myProfileView.mainProfileView.updateProfileView() + headerBorder.removeFromSuperlayer() + headerBorder.frame = CGRect(x: 0, y: view?.frame.size.height ?? CGFloat(), width: UIScreen.main.bounds.width, height: 1) + view?.layer.addSublayer(headerBorder) } return view default: @@ -280,7 +337,7 @@ extension ProfileView: UITableViewDataSource { } func tableView(_ tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat { - return section == 0 ? 304.adjustedHeight : 0 + return isAvailable ? 347.adjusted : 307.adjusted } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/ViewController/ProfileViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/ViewController/ProfileViewController.swift index 58237a51..8dbce8b1 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/ViewController/ProfileViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Main/ViewController/ProfileViewController.swift @@ -16,6 +16,7 @@ final class ProfileViewController: BaseViewController { // MARK: - Variables // MARK: Component let profileView = ProfileView() + let editProfileViewController = EditProfileViewController() let friendProfileViewController = FriendProfileViewController() let bottomSheetViewController = BottomFriendProfileViewController() let paymentPlusViewController = PaymentPlusViewController() @@ -33,13 +34,13 @@ final class ProfileViewController: BaseViewController { Amplitude.instance().setUserProperties(["user_friends": profileView.friendCount, "user_message_received": profileView.myYelloCount, "user_subscription": profileView.isYelloPlus ? "yes" : "no", - "user_ticket": profileView.ticketCount, - "user_name": profileView.myProfileHeaderView.myProfileView.nameLabel.text ?? ""]) + "user_ticket": profileView.ticketCount]) self.navigationController?.navigationBar.isHidden = true self.tabBarController?.tabBar.isHidden = false self.tabBarController?.tabBar.items?[2].imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) self.profileView.myProfileHeaderView.profileUser() self.profileView.purchaseInfo() + self.profileView.loadProfileNoti() self.resetProfileView() self.paymentPlusViewController.getProducts() } @@ -51,6 +52,7 @@ final class ProfileViewController: BaseViewController { friendProfileViewController.friendProfileView.handleDeleteFriendButtonDelegate = self bottomSheetViewController.friendProfileView.handleDeleteFriendButtonDelegate = self profileView.handleShopButton = self + profileView.handleEditButton = self } override func setLayout() { @@ -99,15 +101,10 @@ extension ProfileViewController: HandleFriendCellDelegate { let nav = UINavigationController(rootViewController: friendProfileViewController) - if #available(iOS 15.0, *) { - if let sheet = nav.sheetPresentationController { - sheet.detents = [.medium()] - sheet.prefersGrabberVisible = true - present(nav, animated: true, completion: nil) - } - } else { - bottomSheetViewController.modalPresentationStyle = .overFullScreen - present(bottomSheetViewController, animated: false) + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) } } @@ -117,12 +114,7 @@ extension ProfileViewController: HandleDeleteFriendButtonDelegate { func deleteFriendButtonTapped() { profileView.showToast(message: profileView.myProfileFriendModelDummy[profileView.indexNumber].name + StringLiterals.Profile.Friend.toastMessage) - if #available(iOS 15.0, *) { - friendProfileViewController.friendProfileView.profileDeleteFriend(id: profileView.myProfileFriendModelDummy[profileView.indexNumber].userId) - } else { - bottomSheetViewController.friendProfileView.profileDeleteFriend(id: profileView.myProfileFriendModelDummy[profileView.indexNumber].userId) - } - + friendProfileViewController.friendProfileView.profileDeleteFriend(id: profileView.myProfileFriendModelDummy[profileView.indexNumber].userId) // 삭제 작업이 적용된 후에 UI 업데이트 DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { self.profileView.myProfileFriendModelDummy.remove(at: self.profileView.indexNumber) @@ -140,3 +132,9 @@ extension ProfileViewController: HandleShopButton { navigationController?.pushViewController(paymentPlusViewController, animated: true) } } + +extension ProfileViewController: HandleEditButton { + func editButtonTapped() { + navigationController?.pushViewController(editProfileViewController, animated: true) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/MyProfileFriendModel.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Model/MyProfileFriendModel.swift similarity index 100% rename from YELLO-iOS/YELLO-iOS/Presentation/Profile/MyProfileFriendModel.swift rename to YELLO-iOS/YELLO-iOS/Presentation/Profile/Model/MyProfileFriendModel.swift diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/View/SettingNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/View/SettingNavigationBarView.swift index a96bd91c..04ea57ae 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/View/SettingNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/View/SettingNavigationBarView.swift @@ -15,16 +15,27 @@ protocol HandleBackButtonDelegate: AnyObject { func popView() } +protocol HandleSaveButtonDelegate: AnyObject { + func saveModifiedInfo() +} + final class SettingNavigationBarView: UIView { // MARK: - Variables // MARK: Property weak var handleBackButtonDelegate: HandleBackButtonDelegate? + weak var handleSaveButtonDelegate: HandleSaveButtonDelegate? + var isHasSaveButton: Bool = false { + didSet { + setUI() + } + } // MARK: Component - lazy var backButton = UIButton() + lazy var backButton = BaseIconButton() let titleLabel = UILabel() - + let saveButton = UIButton() + // MARK: - Function // MARK: LifeCycle override init(frame: CGRect) { @@ -61,25 +72,44 @@ extension SettingNavigationBarView { $0.imageView?.tintColor = .white $0.addTarget(self, action: #selector(backButtonDidTap), for: .touchUpInside) } + + saveButton.do { + $0.setTitle(StringLiterals.Profile.EditProfile.saveButton, for: .normal) + $0.titleLabel?.font = .uiButton + $0.setTitleColor(.white, for: .normal) + $0.addTarget(self, action: #selector(saveButtonDidTap), for: .touchUpInside) + } } private func setLayout() { self.addSubviews(backButton, - titleLabel) + titleLabel, + saveButton) backButton.snp.makeConstraints { $0.centerY.equalToSuperview() $0.leading.equalToSuperview().inset(16.adjustedWidth) } - + titleLabel.snp.makeConstraints { $0.centerY.equalToSuperview() $0.leading.equalTo(backButton.snp.trailing).offset(8.adjustedWidth) } + + saveButton.snp.makeConstraints { + $0.centerY.equalTo(titleLabel) + $0.trailing.equalToSuperview().inset(16.adjustedWidth) + } + + saveButton.isHidden = !isHasSaveButton } // MARK: Objc Function @objc private func backButtonDidTap() { self.handleBackButtonDelegate?.popView() } + + @objc private func saveButtonDidTap() { + self.handleSaveButtonDelegate?.saveModifiedInfo() + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/ViewController/ProfileSettingViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/ViewController/ProfileSettingViewController.swift index 27e3a94a..d46b86b6 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/ViewController/ProfileSettingViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/ViewController/ProfileSettingViewController.swift @@ -31,7 +31,6 @@ final class ProfileSettingViewController: BaseViewController { tabBarController?.tabBar.isHidden = true } - // MARK: Layout Helpers override func setStyle() { navigationController?.setNavigationBarHidden(true, animated: true) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/Cell/ReasonCollectionViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/Cell/ReasonCollectionViewCell.swift new file mode 100644 index 00000000..79ce5aea --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/Cell/ReasonCollectionViewCell.swift @@ -0,0 +1,160 @@ +// +// ReasonCollectionViewCell.swift +// YELLO-iOS +// +// Created by 정채은 on 1/23/24. +// + +import UIKit + +import SnapKit +import Then + +final class ReasonCollectionViewCell: UICollectionViewCell { + + // MARK: - Variables + // MARK: Constants + static let identifier = "ReasonCollectionViewCell" + + let reasonView = UIView() + let unselectedView = UIView() + let selectedView = UIView() + let descriptionLabel = UILabel() + let etcTextView = UITextView() + + var isReasonSelected = false { + didSet { + setButtonStyle() + } + } + + // MARK: - Function + // MARK: LifeCycle + override init(frame: CGRect) { + super.init(frame: frame) + setUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + reasonView.do { + $0.makeCornerRound(radius: 8.adjustedHeight) + $0.backgroundColor = .grayscales900 + $0.isUserInteractionEnabled = true + } + + unselectedView.do { + $0.makeCornerRound(radius: 9.adjusted) + $0.makeBorder(width: 2, color: .grayscales700) + $0.isUserInteractionEnabled = false + } + + selectedView.do { + $0.makeCornerRound(radius: 4.adjusted) + $0.backgroundColor = .white + $0.isHidden = true + $0.isUserInteractionEnabled = false + } + + descriptionLabel.do { + $0.textColor = .white + $0.font = .uiBodyLarge + $0.isUserInteractionEnabled = false + } + + etcTextView.do { + $0.font = .uiBody02 + $0.textColor = .grayscales600 + $0.textAlignment = .left + $0.makeCornerRound(radius: 8.adjustedHeight) + $0.backgroundColor = .grayscales800 + $0.isHidden = true + $0.textContainerInset = UIEdgeInsets(top: 12.adjustedHeight, left: 14.adjustedWidth, bottom: 12.adjustedHeight, right: 14.adjustedWidth) + $0.isUserInteractionEnabled = true + $0.accessibilityRespondsToUserInteraction = true + } + } + + private func setLayout() { + self.addSubviews(reasonView) + reasonView.addSubviews(unselectedView, + descriptionLabel, + etcTextView) + + unselectedView.addSubview(selectedView) + + reasonView.snp.makeConstraints { + $0.width.equalTo(UIScreen.main.bounds.width - 68.adjustedWidth) + $0.height.equalTo(56.adjustedHeight) + } + + unselectedView.snp.makeConstraints { + $0.top.equalToSuperview().inset(20.adjustedHeight) + $0.leading.equalToSuperview().inset(16.adjustedWidth) + $0.width.height.equalTo(18.adjusted) + } + + selectedView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.width.height.equalTo(8.adjusted) + } + + descriptionLabel.snp.makeConstraints { + $0.centerY.equalTo(unselectedView) + $0.leading.equalTo(unselectedView.snp.trailing).offset(8.adjustedWidth) + } + + etcTextView.snp.makeConstraints { + $0.top.equalToSuperview().inset(45.adjustedHeight) + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.height.equalTo(76.adjustedHeight) + $0.width.equalTo(275.adjustedWidth) + $0.bottom.equalToSuperview().inset(20.adjustedHeight) + } + } + + private func setButtonStyle() { + if isReasonSelected { + reasonView.do { + $0.backgroundColor = .black + $0.makeBorder(width: 1, color: .white) + } + + selectedView.isHidden = false + } else { + reasonView.do { + $0.backgroundColor = .grayscales900 + $0.makeBorder(width: 0, color: .clear) + } + + selectedView.isHidden = true + } + } + + func setTextView(isEtc: Bool) { + etcTextView.isHidden = !isEtc + if isEtc { + reasonView.snp.updateConstraints { + $0.width.equalTo(UIScreen.main.bounds.width - 68.adjustedWidth) + $0.height.equalTo(141.adjustedHeight) + } + } else { + reasonView.snp.updateConstraints { + $0.width.equalTo(UIScreen.main.bounds.width - 68.adjustedWidth) + $0.height.equalTo(56.adjustedHeight) + } + } + } + + func dataBind(data: String) { + self.descriptionLabel.text = data + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/ReasonHeaderView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/ReasonHeaderView.swift new file mode 100644 index 00000000..d32d5490 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/ReasonHeaderView.swift @@ -0,0 +1,44 @@ +// +// ReasonHeaderView.swift +// YELLO-iOS +// +// Created by 정채은 on 1/25/24. +// + +import UIKit + +import SnapKit +import Then + +final class ReasonHeaderView: UICollectionReusableView { + static let identifier = "ReasonHeaderView" + + let titleLabel = UILabel() + + func setUI() { + setStyle() + setLayout() + } + + private func setStyle() { + titleLabel.do { + $0.setTextWithLineHeight(text: StringLiterals.Profile.WithdrawalReason.title, lineHeight: 32.adjustedHeight) + $0.font = .uiHeadline01 + $0.textColor = .white + } + } + + private func setLayout() { + self.addSubviews(titleLabel) + + self.snp.makeConstraints { + $0.height.equalTo(91.adjustedHeight) + $0.width.equalTo(UIScreen.main.bounds.width) + } + + titleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(39.adjustedHeight) + $0.centerX.equalToSuperview() + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalAlertView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalAlertView.swift index 7facbb37..ec0a5166 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalAlertView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalAlertView.swift @@ -22,13 +22,20 @@ final class WithdrawalAlertView: BaseView { let noButton = UIButton() let yesButton = UIButton() + var withdrawalReason: String = "" + // MARK: - Function // MARK: Layout Helpers override func setStyle() { self.backgroundColor = .black.withAlphaComponent(0.5) - contentsView.makeCornerRound(radius: 12.adjustedHeight) - contentsView.backgroundColor = .grayscales900 + let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(noButtonClicked)) + self.addGestureRecognizer(tapGestureRecognizer) + + contentsView.do { + $0.makeCornerRound(radius: 12.adjustedHeight) + $0.backgroundColor = .grayscales900 + } titleLabel.do { $0.setTextWithLineHeight(text: StringLiterals.Profile.WithdrawalAlert.title, lineHeight: 22.adjustedHeight) @@ -96,7 +103,7 @@ extension WithdrawalAlertView { @objc func yesButtonClicked() { Amplitude.instance().logEvent("click_profile_withdrawal", withEventProperties: ["withdrawal_button": "withdrawal4"]) - NetworkService.shared.profileService.userDelete { result in + NetworkService.shared.profileService.userDelete(requestDTO: DeleteRequestDTO(value: withdrawalReason)) { result in switch result { case .success(let data): if data.status == 200 { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalCheckView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalCheckView.swift index e3b90bc0..c4933665 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalCheckView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalCheckView.swift @@ -66,7 +66,6 @@ final class WithdrawalCheckView: BaseView { $0.titleLabel?.font = .uiBodyMedium $0.setTitleColor(.semanticStatusRed500, for: .normal) $0.setTitle(StringLiterals.Profile.WithdrawalCheck.confirm, for: .normal) - $0.addTarget(self, action: #selector(showAlert), for: .touchUpInside) } } @@ -120,21 +119,4 @@ final class WithdrawalCheckView: BaseView { $0.width.equalTo(343.adjustedWidth) } } - - // MARK: Objc Function - @objc func showAlert() { - Amplitude.instance().logEvent("click_profile_withdrawal", withEventProperties: ["withdrawal_button":"withdrawal3"]) - guard let viewController = UIApplication.shared.keyWindow?.rootViewController else { return } - - if let withdrawalAlertView = withdrawalAlertView { - withdrawalAlertView.removeFromSuperview() - } - - withdrawalAlertView = WithdrawalAlertView() - withdrawalAlertView?.frame = viewController.view.bounds - withdrawalAlertView?.autoresizingMask = [.flexibleWidth, .flexibleHeight] - - viewController.view.addSubview(withdrawalAlertView!) - - } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalReasonView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalReasonView.swift new file mode 100644 index 00000000..ac38d25f --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/View/WithdrawalReasonView.swift @@ -0,0 +1,250 @@ +// +// WithdrawalReasonView.swift +// YELLO-iOS +// +// Created by 정채은 on 1/23/24. +// + +import UIKit + +import SnapKit +import Then + +final class WithdrawalReasonView: BaseView { + + let reasonList = [StringLiterals.Profile.WithdrawalReason.nobody, + StringLiterals.Profile.WithdrawalReason.expensive, + StringLiterals.Profile.WithdrawalReason.error, + StringLiterals.Profile.WithdrawalReason.notFunny, + StringLiterals.Profile.WithdrawalReason.lessPoint, + StringLiterals.Profile.WithdrawalReason.delete, + StringLiterals.Profile.WithdrawalReason.otherApp, + StringLiterals.Profile.WithdrawalReason.etc] + var selectedIndex = -1 + var isCompleteEnabled = false { + didSet { + self.setCompleteButton(isEnabled: isCompleteEnabled) + } + } + var etcReason: String = "" + var tap = UITapGestureRecognizer() + var withdrawalReason: String = "" + + let withdrawalNavigationBarView = SettingNavigationBarView() + let reasonHeaderView = ReasonHeaderView() + lazy var reasonCollectionView = UICollectionView(frame: .zero, collectionViewLayout: reasonFlowLayout) + let reasonFlowLayout = UICollectionViewFlowLayout() + let completeButton = UIButton() + + func setCollectionView() { + reasonCollectionView.register(ReasonCollectionViewCell.self, forCellWithReuseIdentifier: ReasonCollectionViewCell.identifier) + reasonCollectionView.register(ReasonHeaderView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: ReasonHeaderView.identifier) + reasonCollectionView.delegate = self + reasonCollectionView.dataSource = self + } + + override func setStyle() { + self.backgroundColor = .black + + withdrawalNavigationBarView.do { + $0.titleLabel.setTextWithLineHeight(text: StringLiterals.Profile.WithdrawalCheck.withdrawal, lineHeight: 24.adjustedHeight) + $0.backgroundColor = .black + } + + reasonCollectionView.do { + $0.backgroundColor = .clear + $0.showsVerticalScrollIndicator = false + $0.showsHorizontalScrollIndicator = false + $0.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 26.adjustedHeight, right: 0) + } + + reasonFlowLayout.do { + $0.scrollDirection = .vertical + $0.minimumLineSpacing = 4.adjustedWidth + } + + completeButton.do { + $0.backgroundColor = .black + $0.layer.borderColor = UIColor.grayscales600.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 24.adjustedHeight + $0.titleLabel?.font = .uiBodyMedium + $0.setTitleColor(.grayscales600, for: .normal) + $0.setTitle(StringLiterals.Profile.WithdrawalReason.complete, for: .normal) + $0.isEnabled = false + } + } + + override func setLayout() { + let statusBarHeight = UIApplication.shared.connectedScenes + .compactMap { $0 as? UIWindowScene } + .first? + .statusBarManager? + .statusBarFrame.height ?? 20 + + self.addSubviews(withdrawalNavigationBarView, + reasonCollectionView, + completeButton) + + withdrawalNavigationBarView.snp.makeConstraints { + $0.top.equalTo(self.safeAreaInsets).offset(statusBarHeight) + $0.width.equalToSuperview() + $0.height.equalTo(48.adjustedHeight) + } + + reasonCollectionView.snp.makeConstraints { + $0.top.equalTo(withdrawalNavigationBarView.snp.bottom) + $0.leading.trailing.equalToSuperview() + $0.width.equalToSuperview() + $0.bottom.equalToSuperview().inset(82.adjustedHeight) + } + + completeButton.snp.makeConstraints { + $0.centerX.equalToSuperview() + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.height.equalTo(48.adjustedHeight) + $0.width.equalTo(343.adjustedWidth) + $0.bottom.equalToSuperview().inset(34.adjustedHeight) + } + } + + func setNotificationCenter() { + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: UIResponder.keyboardWillHideNotification, object: nil) + } + + func setCompleteButton(isEnabled: Bool) { + completeButton.do { + $0.layer.borderColor = isEnabled ? UIColor.grayscales700.cgColor : UIColor.grayscales600.cgColor + $0.setTitleColor(isEnabled ? .semanticStatusRed500 : .grayscales600, for: .normal) + $0.isEnabled = isEnabled + } + } +} + +extension WithdrawalReasonView: UICollectionViewDelegate { } +extension WithdrawalReasonView: UICollectionViewDataSource { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return reasonList.count + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + if kind == UICollectionView.elementKindSectionHeader { + guard let header = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: ReasonHeaderView.identifier, for: indexPath) as? ReasonHeaderView else { + return ReasonHeaderView() + } + + header.setUI() + return header + } + return UICollectionReusableView() + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ReasonCollectionViewCell.identifier, for: indexPath) as? ReasonCollectionViewCell else { return UICollectionViewCell() } + cell.dataBind(data: reasonList[indexPath.row]) + cell.isReasonSelected = (indexPath.row == selectedIndex) + if selectedIndex == 7 && indexPath.row == 7 { + cell.setTextView(isEtc: true) + cell.etcTextView.isUserInteractionEnabled = true + cell.etcTextView.delegate = self + cell.etcTextView.text = self.etcReason.isEmpty ? StringLiterals.Profile.WithdrawalReason.etcReason : self.etcReason + cell.etcTextView.textColor = self.etcReason.isEmpty ? .grayscales600 : .white + self.isCompleteEnabled = !self.etcReason.isEmpty + } else { + cell.setTextView(isEtc: false) + } + return cell + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { + return CGSize(width: UIScreen.main.bounds.width, height: 91.adjustedHeight) + } + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + print(indexPath.row) + if indexPath.row != selectedIndex { + selectedIndex = indexPath.row + + isCompleteEnabled = selectedIndex != 7 ? true : false + reasonCollectionView.reloadData() + if indexPath.row == 7 { + let indexPath = IndexPath(item: self.reasonList.count - 1, section: 0) + reasonCollectionView.scrollToItem(at: indexPath, at: .bottom, animated: true) + withdrawalReason = etcReason + } else { + withdrawalReason = reasonList[indexPath.row] + } + } + } +} + +extension WithdrawalReasonView: UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + if selectedIndex == 7 && indexPath.row == 7 { + return CGSize(width: UIScreen.main.bounds.width - 68.adjustedWidth, height: 141.adjustedHeight) + } else { + return CGSize(width: UIScreen.main.bounds.width - 68.adjustedWidth, height: 56.adjustedHeight) + } + } +} + +extension WithdrawalReasonView: UITextViewDelegate { + func textViewDidBeginEditing(_ textView: UITextView) { + hideKeyboardWhenTappedAround() + if textView.text == StringLiterals.Profile.WithdrawalReason.etcReason { + textView.text = nil + textView.textColor = .white + } + } + + func textViewShouldEndEditing(_ textView: UITextView) -> Bool { + if textView.text.isEmpty || textView.text == "" || textView.text == StringLiterals.Profile.WithdrawalReason.etcReason { + self.isCompleteEnabled = false + textView.text = StringLiterals.Profile.WithdrawalReason.etcReason + textView.textColor = .grayscales600 + self.etcReason = "" + } else { + self.isCompleteEnabled = true + self.etcReason = textView.text + } + withdrawalReason = etcReason + textView.resignFirstResponder() + return true + } + + func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { + let maxCharacterCount = 30 + let currentText = textView.text ?? "" + let newText = (currentText as NSString).replacingCharacters(in: range, with: text) + return newText.count <= maxCharacterCount + } +} + +extension WithdrawalReasonView { + func hideKeyboardWhenTappedAround() { + tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard)) + tap.cancelsTouchesInView = true + self.addGestureRecognizer(tap) + } + + @objc func dismissKeyboard() { + self.endEditing(true) + self.removeGestureRecognizer(tap) + } + + @objc func keyboardWillShow(_ notification: Notification) { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { + let scrollIndicatorInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height - 26.adjustedHeight, right: 0) + reasonCollectionView.contentInset = scrollIndicatorInsets + reasonCollectionView.scrollIndicatorInsets = scrollIndicatorInsets + } + let indexPath = IndexPath(item: self.reasonList.count - 1, section: 0) + reasonCollectionView.scrollToItem(at: indexPath, at: .bottom, animated: true) + } + + @objc func keyboardWillHide(_ notification: Notification) { + reasonCollectionView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 26.adjustedHeight, right: 0) + reasonCollectionView.scrollIndicatorInsets = .zero + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalCheckViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalCheckViewController.swift index 1e7dae44..a51faf3f 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalCheckViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalCheckViewController.swift @@ -17,6 +17,11 @@ final class WithdrawalCheckViewController: BaseViewController { private let withdrawalCheckView = WithdrawalCheckView() // MARK: - Function + override func viewDidLoad() { + super.viewDidLoad() + setAddTarget() + } + // MARK: - Layout override func setStyle() { navigationController?.setNavigationBarHidden(true, animated: true) @@ -33,11 +38,20 @@ final class WithdrawalCheckViewController: BaseViewController { $0.edges.equalToSuperview() } } + + private func setAddTarget() { + withdrawalCheckView.withdrawalButton.addTarget(self, action: #selector(withdrawalButtonTapped), for: .touchUpInside) + } + + @objc func withdrawalButtonTapped() { + let withdrawalReasonViewController = WithdrawalReasonViewController() + navigationController?.pushViewController(withdrawalReasonViewController, animated: true) + } } // MARK: HandleBackButtonDelegate extension WithdrawalCheckViewController: HandleBackButtonDelegate { func popView() { - self.navigationController?.popViewController(animated: true) + self.navigationController?.popToRootViewController(animated: true) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalReasonViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalReasonViewController.swift new file mode 100644 index 00000000..05b27409 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalReasonViewController.swift @@ -0,0 +1,62 @@ +// +// WithdrawalReasonViewController.swift +// YELLO-iOS +// +// Created by 정채은 on 1/23/24. +// + +import UIKit + +import Amplitude +import SnapKit +import Then + +final class WithdrawalReasonViewController: BaseViewController { + + private let withdrawalReasonView = WithdrawalReasonView() + + override func viewDidLoad() { + super.viewDidLoad() + withdrawalReasonView.setCollectionView() + withdrawalReasonView.setNotificationCenter() + self.setAddTarget() + } + + override func setStyle() { + withdrawalReasonView.withdrawalNavigationBarView.handleBackButtonDelegate = self + } + + override func setLayout() { + view.addSubviews(withdrawalReasonView) + + withdrawalReasonView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func setAddTarget() { + withdrawalReasonView.completeButton.addTarget(self, action: #selector(showAlert), for: .touchUpInside) + } +} + +extension WithdrawalReasonViewController { + // MARK: Objc Function + @objc func showAlert() { + Amplitude.instance().logEvent("click_profile_withdrawal", withEventProperties: ["withdrawal_button":"withdrawal3"]) + + let withdrawalAlertView = WithdrawalAlertView() + withdrawalAlertView.withdrawalReason = withdrawalReasonView.withdrawalReason + print(withdrawalAlertView.withdrawalReason) + self.view.addSubview(withdrawalAlertView) + withdrawalAlertView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } +} + +// MARK: HandleBackButtonDelegate +extension WithdrawalReasonViewController: HandleBackButtonDelegate { + func popView() { + self.navigationController?.popViewController(animated: true) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalViewController.swift index 3fbefe34..e44ddc99 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Profile/Setting/Withdrawal/ViewController/WithdrawalViewController.swift @@ -41,7 +41,7 @@ final class WithdrawalViewController: BaseViewController { // MARK: HandleBackButtonDelegate extension WithdrawalViewController: HandleBackButtonDelegate { func popView() { - self.navigationController?.popViewController(animated: true) + self.navigationController?.popToRootViewController(animated: true) } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Cells/FriendTableViewCell.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Cells/FriendTableViewCell.swift index 58f5cc4b..1ed6f828 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Cells/FriendTableViewCell.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Cells/FriendTableViewCell.swift @@ -28,6 +28,7 @@ final class FriendTableViewCell: UITableViewCell { lazy var addButton = UIButton() let separatorLine = UIView() var isTapped: Bool = false + var friendId: Int = -1 weak var handleAddFriendButton: HandleAddFriendButton? @@ -143,6 +144,7 @@ extension FriendTableViewCell { // MARK: Custom Function func configureFriendCell(_ model: FriendModel) { + friendId = model.friends.id addButton.isHidden = false nameLabel.text = model.friends.name schoolLabel.text = model.friends.group diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Search/View/FriendSearchView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Search/View/FriendSearchView.swift index 26d29548..650890c7 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Search/View/FriendSearchView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/Search/View/FriendSearchView.swift @@ -52,7 +52,8 @@ final class FriendSearchView: BaseView { $0.textColor = .white $0.placeholder = StringLiterals.Recommending.Search.placeholder $0.setPlaceholderColor(.grayscales300) - $0.searchImageView.image = ImageLiterals.Recommending.icSearchWhite + $0.searchButton.setImage(ImageLiterals.Recommending.icSearchWhite, + for: .normal) $0.tintColor = .white } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/EmptyFriendView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/EmptyFriendView.swift index 74b6cff2..2ea10466 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/EmptyFriendView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/EmptyFriendView.swift @@ -17,7 +17,7 @@ final class EmptyFriendView: UIView { // MARK: Component private let containView = UIView() private let emptyImageView = UIImageView() - private let emptyDescriptionLabel = UILabel() + let emptyDescriptionLabel = UILabel() lazy var inviteButton = UIButton(frame: CGRect(x: 0, y: 0, width: 236.adjustedWidth, height: 48.adjustedHeight)) var viewControllerName = "" diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/KakaoFriendView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/KakaoFriendView.swift index 7c20e202..ae28cf65 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/KakaoFriendView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/KakaoFriendView.swift @@ -15,6 +15,7 @@ final class KakaoFriendView: UIView { // MARK: - Variables // MARK: Property + weak var handleFriendCellDelegate: HandleFriendCellDelegate? var fetchingMore = false var isRefreshing = false var isFinishPaging = false @@ -222,6 +223,26 @@ extension KakaoFriendView { } } + func addFriendAtModal(friendId: Int) { + recommendingAddFriend(friendId: friendId) + + if let index = self.recommendingKakaoFriendTableViewDummy.firstIndex(where: { $0.friends.id == friendId }) { + recommendingKakaoFriendTableViewDummy.remove(at: index) + kakaoFriendCount = recommendingKakaoFriendTableViewDummy.count + let indexPath = IndexPath(row: index, section: 0) + kakaoFriendTableView.deleteRows(at: [indexPath], with: .right) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + self.kakaoFriendTableView.reloadData() + } + self.updateView() + } + } + + private func presentModal(index: Int) { + handleFriendCellDelegate?.presentModal(index: index) + } + func kakaoFriends(completion: @escaping () -> Void) { TalkApi.shared.friends(limit: 100) { [weak self] (friends, error) in if let error = error { @@ -246,7 +267,7 @@ extension KakaoFriendView: HandleAddFriendButton { let point = sender.convert(CGPoint.zero, to: kakaoFriendTableView) guard let indexPath = kakaoFriendTableView.indexPathForRow(at: point) else { return } - // 삭제 서버통신 + // 친구 추가 서버통신 recommendingAddFriend(friendId: recommendingKakaoFriendTableViewDummy[indexPath.row].friends.id) recommendingKakaoFriendTableViewDummy[indexPath.row].isButtonSelected = true @@ -324,4 +345,12 @@ extension KakaoFriendView: UITableViewDataSource { func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if fetchingMore { + return + } else { + self.presentModal(index: self.recommendingKakaoFriendTableViewDummy[indexPath.row].friends.id) + } + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendFriendProfileView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendFriendProfileView.swift new file mode 100644 index 00000000..c9a7f008 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendFriendProfileView.swift @@ -0,0 +1,172 @@ +// +// RecommendFriendProfileView.swift +// YELLO-iOS +// +// Created by 정채은 on 12/30/23. +// + +import UIKit + +import Amplitude +import Kingfisher +import SnapKit +import Then + +// MARK: - Protocol +protocol HandleAddFriendButtonDelegate: AnyObject { + func addFriendButtonTapped(id: Int) +} + +final class RecommendFriendProfileView: BaseView { + + // MARK: - Variables + // MARK: Component + weak var handleBottomSheetButtonDelegate: HandleBottomSheetButtonDelegate? + weak var handleAddFriendButtonDelegate: HandleAddFriendButtonDelegate? + var userId: Int = -1 + + let profileImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 72.adjusted, height: 72.adjusted)) + let nameLabel = UILabel() + let instagramLabel = UILabel() + let schoolLabel = UILabel() + let messageCountView = CountCustomView() + let friendCountView = CountCustomView() + let addButton = UIButton() + private let groupView = UIView() + + // MARK: - Function + // MARK: Layout Helpers + override func setStyle() { + self.backgroundColor = .black + + profileImageView.do { + $0.image = ImageLiterals.Profile.imgDefaultProfile + $0.contentMode = .scaleAspectFill + $0.makeCornerRound(radius: 36.adjusted) + } + + nameLabel.do { + $0.setTextWithLineHeight(text: "", lineHeight: 28.adjustedHeight) + $0.font = .uiHeadline03 + $0.textColor = .white + } + + instagramLabel.do { + $0.setTextWithLineHeight(text: "", lineHeight: 16.adjustedHeight) + $0.font = .uiLabelLarge + $0.textColor = .yelloMain600 + } + + schoolLabel.do { + $0.setTextWithLineHeight(text: "", lineHeight: 20.adjustedHeight) + $0.font = .uiBody02 + $0.textColor = .grayscales500 + $0.textAlignment = .center + $0.lineBreakMode = .byCharWrapping + } + + messageCountView.do { + $0.countLabel.text = "" + $0.titleLabel.text = StringLiterals.Profile.Friend.message + } + + friendCountView.do { + $0.countLabel.text = "" + $0.titleLabel.text = StringLiterals.Profile.Friend.friendNumber + } + + addButton.do { + $0.setImage(ImageLiterals.Recommending.btnAddFriend, for: .normal) + $0.addTarget(self, action: #selector(addButtonTapped), for: .touchUpInside) + } + } + + override func setLayout() { + self.addSubviews(profileImageView, + groupView, + schoolLabel, + messageCountView, + friendCountView, + addButton) + + groupView.addSubviews(nameLabel, + instagramLabel) + + profileImageView.snp.makeConstraints { + $0.top.equalToSuperview().offset(40.adjustedHeight) + $0.centerX.equalToSuperview() + $0.size.equalTo(72.adjusted) + } + + groupView.snp.makeConstraints { + $0.top.equalTo(profileImageView.snp.bottom).offset(16.adjustedHeight) + $0.centerX.equalToSuperview() + $0.height.equalTo(28.adjustedHeight) + } + + nameLabel.snp.makeConstraints { + $0.top.bottom.leading.equalToSuperview() + } + + instagramLabel.snp.makeConstraints { + $0.top.equalToSuperview().offset(9.adjustedHeight) + $0.leading.equalTo(nameLabel.snp.trailing).offset(8.adjustedWidth) + $0.trailing.equalToSuperview() + } + + schoolLabel.snp.makeConstraints { + $0.top.equalTo(nameLabel.snp.bottom).offset(4.adjustedHeight) + $0.centerX.equalToSuperview() + $0.width.equalTo(200.adjustedWidth) + $0.height.equalTo(40.adjustedHeight) + } + + addButton.snp.makeConstraints { + $0.top.equalTo(messageCountView.snp.bottom).offset(16.adjustedHeight) + $0.centerX.equalToSuperview() + } + + messageCountView.snp.makeConstraints { + $0.trailing.equalTo(self.snp.centerX).inset(6.adjustedWidth) + $0.top.equalTo(schoolLabel.snp.bottom).offset(12.adjustedHeight) + } + + friendCountView.snp.makeConstraints { + $0.leading.equalTo(messageCountView.snp.trailing).offset(12.adjustedWidth) + $0.bottom.equalTo(messageCountView) + } + } + + // MARK: Objc Function + @objc private func addButtonTapped() { + addButton.setImage(ImageLiterals.Recommending.icAddFriendButtonTapped, for: .normal) + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + self.dismissView() + self.handleAddFriendButtonDelegate?.addFriendButtonTapped(id: self.userId) + } + } + + // MARK: Layout Helpers + func configureMyProfileFriendDetailCell(_ model: ProfileFriendResponseDetail) { + self.userId = model.userId + if model.profileImageUrl != StringLiterals.Recommending.Title.defaultProfileImageLink { + profileImageView.kfSetImage(url: model.profileImageUrl) + } else { + profileImageView.image = ImageLiterals.Profile.imgDefaultProfile + } + nameLabel.text = model.name + instagramLabel.text = "@" + model.yelloId + schoolLabel.text = model.group + messageCountView.countLabel.text = String(model.yelloCount) + friendCountView.countLabel.text = String(model.friendCount) + } + + // MARK: Layout Helpers + private func dismissView() { + handleBottomSheetButtonDelegate?.dismissView() + } + + func layoutChange() { + addButton.setImage(ImageLiterals.Recommending.btnAddFriend, for: .normal) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendingNavigationBarView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendingNavigationBarView.swift index b6b249b8..722fcd72 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendingNavigationBarView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/RecommendingNavigationBarView.swift @@ -15,7 +15,7 @@ final class RecommendingNavigationBarView: BaseView { // MARK: - Variables // MARK: Component private let titleLabel = UILabel() - lazy var searchButton = UIButton() + lazy var searchButton = BaseIconButton() // MARK: - Function // MARK: Layout Helpers diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/SchoolFriendView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/SchoolFriendView.swift index aac329ba..47ccff5d 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/SchoolFriendView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/View/SchoolFriendView.swift @@ -14,6 +14,7 @@ final class SchoolFriendView: UIView { // MARK: - Variables // MARK: Property + weak var handleFriendCellDelegate: HandleFriendCellDelegate? var fetchingMore = false var isRefreshing = false var isFinishPaging = false @@ -216,6 +217,26 @@ extension SchoolFriendView { } } } + + func addFriendAtModal(friendId: Int) { + recommendingAddFriend(friendId: friendId) + + if let index = self.recommendingSchoolFriendTableViewDummy.firstIndex(where: { $0.friends.id == friendId }) { + recommendingSchoolFriendTableViewDummy.remove(at: index) + schoolFriendCount = recommendingSchoolFriendTableViewDummy.count + let indexPath = IndexPath(row: index, section: 0) + schoolFriendTableView.deleteRows(at: [indexPath], with: .right) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { + self.schoolFriendTableView.reloadData() + } + self.updateView() + } + } + + private func presentModal(index: Int) { + handleFriendCellDelegate?.presentModal(index: index) + } } extension SchoolFriendView: HandleAddFriendButton { @@ -225,7 +246,7 @@ extension SchoolFriendView: HandleAddFriendButton { let point = sender.convert(CGPoint.zero, to: schoolFriendTableView) guard let indexPath = schoolFriendTableView.indexPathForRow(at: point) else { return } - // 삭제 서버통신 + // 친구 추가 서버통신 recommendingAddFriend(friendId: recommendingSchoolFriendTableViewDummy[indexPath.row].friends.id) recommendingSchoolFriendTableViewDummy[indexPath.row].isButtonSelected = true @@ -299,4 +320,12 @@ extension SchoolFriendView: UITableViewDataSource { func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { return UITableView.automaticDimension } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if fetchingMore { + return + } else { + self.presentModal(index: self.recommendingSchoolFriendTableViewDummy[indexPath.row].friends.id) + } + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendProfileViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendProfileViewController.swift new file mode 100644 index 00000000..97de6928 --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendProfileViewController.swift @@ -0,0 +1,63 @@ +// +// RecommendProfileViewController.swift +// YELLO-iOS +// +// Created by 정채은 on 1/23/24. +// + +import UIKit + +import SnapKit +import Then + +final class RecommendProfileViewController: BaseViewController { + + // MARK: - Variables + // MARK: Component + let recommendFriendProfileView = RecommendFriendProfileView() + + // MARK: - Function + // MARK: LifeCycle + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.resetProfile() + self.navigationController?.navigationBar.isHidden = true + self.tabBarController?.tabBar.isHidden = true + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + self.recommendFriendProfileView.layoutChange() + } + + // MARK: Layout Helpers + override func setStyle() { + view.backgroundColor = .black + recommendFriendProfileView.handleBottomSheetButtonDelegate = self + } + + override func setLayout() { + view.addSubview(recommendFriendProfileView) + + recommendFriendProfileView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + private func resetProfile() { + recommendFriendProfileView.profileImageView.image = nil + recommendFriendProfileView.nameLabel.text = nil + recommendFriendProfileView.instagramLabel.text = nil + recommendFriendProfileView.schoolLabel.text = nil + recommendFriendProfileView.messageCountView.countLabel.text = nil + recommendFriendProfileView.friendCountView.countLabel.text = nil + } +} + +// MARK: - extension +// MARK: HandleBottomSheetButtonDelegate +extension RecommendProfileViewController: HandleBottomSheetButtonDelegate { + func dismissView() { + self.dismiss(animated: true) + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendingViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendingViewController.swift index b96807fa..7931161e 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendingViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Recommending/ViewController/RecommendingViewController.swift @@ -20,6 +20,10 @@ final class RecommendingViewController: UIViewController { private lazy var pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) let kakaoFriendViewController = KakaoFriendViewController() let schoolFriendViewController = SchoolFriendViewController() + let recommendProfileViewController = RecommendProfileViewController() + var currentFriendViewController: UIViewController { + return dataViewControllers[currentPage] + } // MARK: Property var dataViewControllers: [UIViewController] { @@ -110,6 +114,9 @@ extension RecommendingViewController { private func setDelegate() { pageViewController.delegate = self pageViewController.dataSource = self + schoolFriendViewController.schoolFriendView.handleFriendCellDelegate = self + kakaoFriendViewController.kakaoFriendView.handleFriendCellDelegate = self + recommendProfileViewController.recommendFriendProfileView.handleAddFriendButtonDelegate = self } private func setAddTarget() { @@ -136,6 +143,20 @@ extension RecommendingViewController { Amplitude.instance().logEvent("click_search_button") self.navigationController?.pushViewController(searchViewController, animated: true) } + + // MARK: Network Helpers + private func friendsDetailProfile(id: Int) { + NetworkService.shared.recommendingService.recommendingDetailFriend(friendId: id) { response in + switch response { + case .success(let data): + guard let data = data.data else { return } + self.recommendProfileViewController.recommendFriendProfileView.configureMyProfileFriendDetailCell(data) + default: + print("network fail") + return + } + } + } } // MARK: UIPageViewControllerDelegate @@ -169,3 +190,28 @@ extension RecommendingViewController: UIPageViewControllerDataSource { self.segmentedControl.selectedSegmentIndex = index } } + +// MARK: HandleFriendCellDelegate +extension RecommendingViewController: HandleFriendCellDelegate { + func presentModal(index: Int) { + friendsDetailProfile(id: index) + + let nav = UINavigationController(rootViewController: recommendProfileViewController) + + if let sheet = nav.sheetPresentationController { + sheet.detents = [.medium()] + sheet.prefersGrabberVisible = true + present(nav, animated: true, completion: nil) + } + } +} + +extension RecommendingViewController: HandleAddFriendButtonDelegate { + func addFriendButtonTapped(id: Int) { + if currentFriendViewController == schoolFriendViewController { + schoolFriendViewController.schoolFriendView.addFriendAtModal(friendId: id) + } else if currentFriendViewController == kakaoFriendViewController { + kakaoFriendViewController.kakaoFriendView.addFriendAtModal(friendId: id) + } + } +} diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Subscription/SubscriptionExtensionView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Subscription/SubscriptionExtensionView.swift index 6cba4563..7699c710 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Subscription/SubscriptionExtensionView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Subscription/SubscriptionExtensionView.swift @@ -51,10 +51,9 @@ final class SubscriptionExtensionView: BaseView { if let tomorrow = Calendar.current.date(byAdding: dayComponent, to: today) { let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" // 원하는 형식 설정 + dateFormatter.dateFormat = "yyyy-MM-dd" let dateString = dateFormatter.string(from: tomorrow) $0.text = dateString - print(dateString) } $0.setTextWithLineHeight(text: $0.text, lineHeight: 24.adjusted) diff --git a/YELLO-iOS/YELLO-iOS/Presentation/TabBar/TabBarHeight.swift b/YELLO-iOS/YELLO-iOS/Presentation/TabBar/TabBarHeight.swift index 34b2e489..17580e94 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/TabBar/TabBarHeight.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/TabBar/TabBarHeight.swift @@ -8,11 +8,7 @@ import UIKit func safeAreaBottomInset() -> CGFloat { - if #available(iOS 11.0, *) { - let window = UIApplication.shared.keyWindow - let bottomPadding = window?.safeAreaInsets.bottom - return bottomPadding ?? 0.0 - } else { - return 0.0 - } + let window = UIApplication.shared.keyWindow + let bottomPadding = window?.safeAreaInsets.bottom + return bottomPadding ?? 0.0 } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/TabBar/YELLOTabBarController.swift b/YELLO-iOS/YELLO-iOS/Presentation/TabBar/YELLOTabBarController.swift index 57062168..cc9b664b 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/TabBar/YELLOTabBarController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/TabBar/YELLOTabBarController.swift @@ -5,6 +5,7 @@ // Created by 변희주 on 2023/07/05. // +import SafariServices import UIKit import SnapKit @@ -24,6 +25,7 @@ final class YELLOTabBarController: UITabBarController { } } private var messageIndex: Int = 0 + private var redirectUrl: String = "" let recommendingViewController = RecommendingViewController() let aroundViewController = AroundViewController() let myYelloViewController = MyYelloViewController() @@ -31,6 +33,8 @@ final class YELLOTabBarController: UITabBarController { let votingStartViewController = VotingStartViewController() let subscriptionExtensionView = SubscriptionExtensionView() let paymentPlusViewController = PaymentPlusViewController() + let userNotificationView = NotificationView() + var notificationReadCount = 0 // MARK: - Life Cycle override func loadView() { @@ -41,7 +45,7 @@ final class YELLOTabBarController: UITabBarController { super.viewDidLoad() network() -// purchaseSubscribeNeed() + getUserNotification() NotificationCenter.default.addObserver(self, selector: #selector(showMessage(_:)), name: NSNotification.Name("showMessage"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(showPage(_:)), name: NSNotification.Name("showPage"), object: nil) @@ -55,6 +59,12 @@ final class YELLOTabBarController: UITabBarController { self.navigationController?.navigationBar.isHidden = true } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + + lunchEvent() + } + // MARK: - TabBar Height override func viewDidLayoutSubviews() { @@ -232,14 +242,80 @@ extension YELLOTabBarController { paymentPlusViewController.getProducts() } + func getUserNotification() { + NetworkService.shared.notificationService.userNotification(typeName: "NOTICE") { result in + switch result { + case .success(let data): + guard let data = data.data else { return } + if data.isAvailable && self.notificationReadCount == 0 { + // 다시 보지 않기 버튼을 안눌렀거나 이전 공지와 현재 공지의 title이 다른 경우에만 표시 + if !UserDefaults.standard.bool(forKey: "isTapped") || UserDefaults.standard.string(forKey: "notificationTitle") != data.title { + self.userNotificationView.frame = self.view.bounds + self.userNotificationView.autoresizingMask = [.flexibleWidth, .flexibleHeight] + self.userNotificationView.notificationImageView.kfSetImage(url: data.imageUrl) + self.redirectUrl = data.redirectUrl + let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.imageViewTapped)) + self.userNotificationView.notificationImageView.addGestureRecognizer(tapGesture) + self.view.addSubview(self.userNotificationView) + } + } + + let notificationTitle = data.title + UserDefaults.standard.set(notificationTitle, forKey: "notificationTitle") + + default: + print("network failure") + return + } + } + + // 유저 대상 공지 확인 후 재구독 유도 + purchaseSubscribeNeed() + } + /// 구독 연장 여부 서버통신 func purchaseSubscribeNeed() { NetworkService.shared.purchaseService.purchaseSubscibeNeed { result in switch result { case .success(let data): guard let data = data.data else { return } - if data.isSubscribeNeeded { - self.toResubscribeView() + + let currentDate = Date() + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyy-MM-dd" + + if data.subscribe == "canceled" { + if let expiredDate = dateFormatter.date(from: data.expiredDate) { + let calendar = Calendar.current + if let daysDifference = calendar.dateComponents([.day], from: currentDate, to: expiredDate).day { + if daysDifference <= 1 { + // 하루 이하로 남았으면 + self.toResubscribeView() + } + } + } + } + default: + print("network failure") + return + } + } + } + + func lunchEvent() { + NetworkService.shared.eventService.lunchEventCheck { result in + switch result { + case .success(let data): + guard let data = data.data else { return } + let tags = data.map { $0.tag } + let containsLunchEvent = tags.contains("LUNCH_EVENT") + let index = tags.firstIndex(of: "LUNCH_EVENT") ?? 0 + + if containsLunchEvent && data[index].eventReward != nil { + let viewController = LunchEventViewController() + UIView.transition(with: self.navigationController?.view ?? UIView(), duration: 0.3, options: .transitionCrossDissolve, animations: { + self.navigationController?.pushViewController(viewController, animated: false) + }) } default: print("network failure") @@ -270,71 +346,8 @@ extension YELLOTabBarController { tabBar.items?[2].imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) let myYelloDetailViewController = MyYelloDetailViewController() - NetworkService.shared.myYelloService.myYelloDetail(voteId: messageIndex) { response in - switch response { - case .success(let data): - guard let data = data.data else { return } - - myYelloDetailViewController.myYelloDetailView.voteIdNumber = self.messageIndex - myYelloDetailViewController.colorIndex = data.colorIndex - myYelloDetailViewController.myYelloDetailView.currentPoint = data.currentPoint - myYelloDetailViewController.myYelloDetailView.detailSenderView.isHidden = false - myYelloDetailViewController.myYelloDetailView.detailKeywordView.isHidden = false - myYelloDetailViewController.myYelloDetailView.genderLabel.isHidden = false - myYelloDetailViewController.myYelloDetailView.instagramView.isHidden = false - myYelloDetailViewController.myYelloDetailView.keywordButton.isHidden = false - myYelloDetailViewController.myYelloDetailView.senderButton.isHidden = false - myYelloDetailViewController.setBackgroundView() - - if data.senderGender == "MALE" { - myYelloDetailViewController.myYelloDetailView.genderLabel.text = StringLiterals.MyYello.Detail.male - } else { - myYelloDetailViewController.myYelloDetailView.genderLabel.text = StringLiterals.MyYello.Detail.female - } - - if data.vote.nameHead == nil { - myYelloDetailViewController.myYelloDetailView.detailKeywordView.nameKeywordLabel.text = "너" + (data.vote.nameFoot ?? "") - } else { - myYelloDetailViewController.myYelloDetailView.detailKeywordView.nameKeywordLabel.text = (data.vote.nameHead ?? "") + " 너" + (data.vote.nameFoot ?? "") - } - - myYelloDetailViewController.myYelloDetailView.detailKeywordView.keywordHeadLabel.text = (data.vote.keywordHead ?? "") - myYelloDetailViewController.myYelloDetailView.detailKeywordView.keywordLabel.text = data.vote.keyword - myYelloDetailViewController.myYelloDetailView.detailKeywordView.keywordFootLabel.text = (data.vote.keywordFoot ?? "") - - myYelloDetailViewController.myYelloDetailView.isKeywordUsed = data.isAnswerRevealed - - if data.nameHint == 0 { - myYelloDetailViewController.myYelloDetailView.isSenderUsed = true - if let initial = myYelloDetailViewController.getFirstInitial(data.senderName as NSString, index: 0) { - myYelloDetailViewController.myYelloDetailView.detailSenderView.senderLabel.text = initial - } - } else if data.nameHint == 1 { - myYelloDetailViewController.myYelloDetailView.isSenderUsed = true - if let initial = myYelloDetailViewController.getSecondInitial(data.senderName as NSString, index: 1) { - myYelloDetailViewController.myYelloDetailView.detailSenderView.senderLabel.text = initial - } - } else if data.nameHint == -3 { - myYelloDetailViewController.myYelloDetailView.isSenderUsed = true - myYelloDetailViewController.myYelloDetailView.detailSenderView.senderLabel.text = data.senderName - myYelloDetailViewController.myYelloDetailView.isKeywordUsed = true - myYelloDetailViewController.myYelloDetailView.senderButton.setButtonState(state: .noTicket) - myYelloDetailViewController.myYelloDetailView.keywordButton.isHidden = true - myYelloDetailViewController.myYelloDetailView.haveTicket = false - myYelloDetailViewController.myYelloDetailView.senderButton.snp.makeConstraints { - $0.top.equalTo(myYelloDetailViewController.myYelloDetailView.instagramView.snp.bottom).offset(77.adjustedHeight) - } - } - if data.isSubscribe { - myYelloDetailViewController.myYelloDetailView.isPlus = true - } - myYelloDetailViewController.myYelloDetailView.ticketCount = data.ticketCount - self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) - default: - print("network fail") - return - } - } + myYelloDetailViewController.myYelloDetail(voteId: Int(messageIndex)) + self.navigationController?.pushViewController(myYelloDetailViewController, animated: true) } else if selectedIndex == 4 { tabBar.items?[2].imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) @@ -348,6 +361,17 @@ extension YELLOTabBarController { self.selectedIndex = 3 self.navigationController?.pushViewController(paymentPlusViewController, animated: true) } + + @objc + func imageViewTapped() { + let notiView: SFSafariViewController + if let url = URL(string: self.redirectUrl) { + notiView = SFSafariViewController(url: url) + self.present(notiView, animated: true, completion: nil) + } else { + print("유효하지 않은 URL 입니다") + } + } } extension YELLOTabBarController { diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Tutorial/View/FourthTutorialView.swift b/YELLO-iOS/YELLO-iOS/Presentation/Tutorial/View/FourthTutorialView.swift index 83a564b3..aa550e93 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Tutorial/View/FourthTutorialView.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Tutorial/View/FourthTutorialView.swift @@ -51,8 +51,7 @@ final class FourthTutorial: UIView { self.addSubviews(tutorialImageView) tutorialImageView.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() - $0.center.equalToSuperview() + $0.edges.equalToSuperview() } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingFunction.swift b/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingFunction.swift index 17ef7450..4ed96f9f 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingFunction.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingFunction.swift @@ -22,7 +22,7 @@ extension VotingViewController { view.insertSubview(gradientView, at: 0) let progressPercent = Float(VotingViewController.pushCount + 1) / 8.0 - self.originView.progressView.setProgress(progressPercent, animated: true) + self.originView.progressView.setProgress(progressPercent, animated: false) setAnimationView() self.originView.yelloProgress.image = dummy[VotingViewController.pushCount].yelloProgress @@ -157,7 +157,6 @@ extension VotingViewController { func setNextViewController() { // 투표 끝나면 포인트뷰컨으로 push if VotingViewController.pushCount > 6 { - VotingViewController.pushCount = 0 let identify = AMPIdentify() .add("user_instagram", value: NSNumber(value: votingAnswer.count)) @@ -169,17 +168,20 @@ extension VotingViewController { let myPlusPoint = UserDefaults.standard.integer(forKey: "UserPlusPoint") viewController.myPoint = myPoint + myPlusPoint viewController.votingPlusPoint = myPlusPoint - let previousData = loadUserData() ?? [] - let combinedData = previousData + votingAnswer - saveUserData(combinedData) - + let status = votingList[0].subscribe if status == "CANCELED" || status == "ACTIVE" { viewController.multiplyByTwoImageView.isHidden = false + UserDefaults.standard.set(true, forKey: "isYelloPlus") + viewController.adButtonStackView.isHidden = true + viewController.originView.yellowButton.isHidden = false viewController.myPoint += myPlusPoint viewController.votingPlusPoint *= 2 } else { viewController.multiplyByTwoImageView.isHidden = true + UserDefaults.standard.set(false, forKey: "isYelloPlus") + viewController.adButtonStackView.isHidden = false + viewController.originView.yellowButton.isHidden = true } UserDefaults.standard.set(viewController.myPoint, forKey: "UserPoint") @@ -191,16 +193,45 @@ extension VotingViewController { } else { let viewController = VotingViewController() viewController.votingList = votingList - let previousData = loadUserData() ?? [] - let combinedData = previousData + votingAnswer - saveUserData(combinedData) - print(combinedData) + + let topAnimatedView = viewController.originView.questionBackground + let nameAnimatedViews = [viewController.originView.nameOneButton, viewController.originView.nameTwoButton, viewController.originView.nameThreeButton, viewController.originView.nameFourButton] + let keywordAnimatedViews = [viewController.originView.keywordOneButton, viewController.originView.keywordTwoButton, viewController.originView.keywordThreeButton, viewController.originView.keywordFourButton] - UIView.transition(with: self.navigationController?.view ?? UIView(), duration: 0.5, options: .transitionCrossDissolve, animations: { - // 전환 시 스르륵 바뀌는 애니메이션 적용 - VotingViewController.pushCount += 1 - self.navigationController?.pushViewController(viewController, animated: false) - }) + // 모든 버튼 비활성화 + nameAnimatedViews.forEach { $0.isEnabled = false } + keywordAnimatedViews.forEach { $0.isEnabled = false } + + // 0.6초 후에 다시 활성화 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { + nameAnimatedViews.forEach { $0.isEnabled = true } + keywordAnimatedViews.forEach { $0.isEnabled = true } + } + + let transition = CATransition() + transition.type = CATransitionType.fade + transition.duration = 0.6 + self.navigationController?.view.layer.add(transition, forKey: nil) + + DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) { + UIView.transition(with: self.navigationController?.view ?? UIView(), duration: 0.3, options: .allowUserInteraction, animations: { + + // 검정색 배경들이 밀리는 것과 같은 애니메이션 구현 + let newXPosition = -500.adjusted + topAnimatedView.frame.origin.x = CGFloat(newXPosition) + + for nameView in nameAnimatedViews { + nameView.frame.origin.x = CGFloat(newXPosition) + } + + for keywordView in keywordAnimatedViews { + keywordView.frame.origin.x = CGFloat(newXPosition + 148.adjusted) + } + VotingViewController.pushCount += 1 + self.navigationController?.pushViewController(viewController, animated: false) + }) + } + } } @@ -379,6 +410,10 @@ extension VotingViewController { @objc func skipButtonClicked() { + self.originView.skipButton.isEnabled = false + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { + self.originView.skipButton.isEnabled = true + } if keywordButtonClick { originView.skipButton.isEnabled = false originView.skipButton.isEnabled = true diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingViewController.swift index 1f866d5c..38f5a843 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/Voting/VotingViewController.swift @@ -29,7 +29,7 @@ final class VotingViewController: BaseViewController { let originView = BaseVotingMainView() - private let nameStackView = UIStackView() + let nameStackView = UIStackView() let nameHead = UILabel() var nameMiddleBackground = UIView(frame: CGRect(x: 0, y: 0, width: 70.adjusted, height: 34.adjusted)) @@ -41,7 +41,7 @@ final class VotingViewController: BaseViewController { var nameTextThree = UILabel() var nameTextFour = UILabel() - private let keywordStackView = UIStackView() + let keywordStackView = UIStackView() let keywordHead = UILabel() var keywordMiddleBackground = UIView(frame: CGRect(x: 0, y: 0, width: 150.adjusted, height: 34.adjusted)) let keywordMiddleText = UILabel() @@ -73,9 +73,22 @@ final class VotingViewController: BaseViewController { // name, keyword 버튼이 모두 클릭되었을 때 동작 var bothButtonClicked: Bool = false { didSet { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.001) { - self.setNextViewController() + guard bothButtonClicked && !oldValue else { return } + self.setNextViewController() + + let allNameButtons = [self.originView.nameOneButton, self.originView.nameTwoButton, self.originView.nameThreeButton, self.originView.nameFourButton] + let allKeywordButtons = [self.originView.keywordOneButton, self.originView.keywordTwoButton, self.originView.keywordThreeButton, self.originView.keywordFourButton] + + // 모든 버튼 비활성화 + allNameButtons.forEach { $0.isEnabled = false } + allKeywordButtons.forEach { $0.isEnabled = false } + + // 0.6초 후에 다시 활성화 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) { + allNameButtons.forEach { $0.isEnabled = true } + allKeywordButtons.forEach { $0.isEnabled = true } } + if VotingViewController.pushCount <= 8 { DispatchQueue.global(qos: .background).async { @@ -89,7 +102,9 @@ final class VotingViewController: BaseViewController { myColorIndex = myColorIndex - 12 } votingAnswer.append(VoteAnswerList(friendId: friendID, questionId: votingList[VotingViewController.pushCount].questionId, keywordName: keyword, colorIndex: myColorIndex)) - print(myColorIndex) + let previousData = loadUserData() ?? [] + let combinedData = previousData + votingAnswer + saveUserData(combinedData) } } } @@ -160,7 +175,7 @@ final class VotingViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() - Amplitude.instance().logEvent("view_vote_question", withEventProperties: ["vote_step" : VotingViewController.pushCount]) + Amplitude.instance().logEvent("view_vote_question", withEventProperties: ["vote_step": VotingViewController.pushCount]) Color.shared.restoreFromUserDefaults() votingList = loadVotingData() ?? [] myPoint = UserDefaults.standard.integer(forKey: "UserPoint") diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingLocked/VotingLockedViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingLocked/VotingLockedViewController.swift index b19cac37..714ce816 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingLocked/VotingLockedViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingLocked/VotingLockedViewController.swift @@ -53,7 +53,7 @@ final class VotingLockedViewController: BaseViewController { } originView.yellowButton.do { - $0.setTitle("친구 초대하고 100포인트 받기", for: .normal) + $0.setTitle(StringLiterals.Voting.Locked.button, for: .normal) $0.addTarget(self, action: #selector(yellowButtonClicked), for: .touchUpInside) $0.makeCornerRound(radius: 30.adjusted) } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/Lottie/lottie_spinner_loading_profile.json b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/Lottie/lottie_spinner_loading_profile.json new file mode 100644 index 00000000..6501695b --- /dev/null +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/Lottie/lottie_spinner_loading_profile.json @@ -0,0 +1 @@ +{"v":"5.12.2","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":40,"h":40,"nm":"spinner_loading_2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[20,20,0],"ix":2,"l":2},"a":{"a":0,"k":[2.017,-0.412,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[28.605,28.605],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.98431372549,1,0.243137254902,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[2.017,-0.412],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":29.0000011811942,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":29,"s":[0]},{"t":60.0000024438501,"s":[99]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":120.0000048877,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/VotingPointViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/VotingPointViewController.swift index c7059d3c..6bb7fbcc 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/VotingPointViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingPoint/VotingPointViewController.swift @@ -8,18 +8,33 @@ import UIKit import Amplitude +import GoogleMobileAds +import Lottie import SnapKit import Then final class VotingPointViewController: BaseViewController { - - let originView = BaseVotingETCView() - let multiplyByTwoImageView = UIImageView() + // MARK: - Variables + // MARK: Constants + let userNotiCenter = UNUserNotificationCenter.current() + + // MARK: Property var myPoint = 0 var votingPlusPoint = 0 var votingPlusPointToPost = 0 var votingAnswer: [VoteAnswerList] = [] - let userNotiCenter = UNUserNotificationCenter.current() + private var rewardedAd: GADRewardedAd? + var uuid = UUID().uuidString + private var isWatchAd: Bool = false + private var isYelloPlus: Bool = false + + // MARK: Component + let originView = BaseVotingETCView() + let multiplyByTwoImageView = UIImageView() + let adButtonStackView = UIStackView() + let cancelButton = UIButton() + let rewardAdButton = UIButton() + let loadingView = YelloLoadingView() override func loadView() { self.view = originView @@ -27,17 +42,29 @@ final class VotingPointViewController: BaseViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - + UserManager.shared.adUUID = uuid tabBarController?.tabBar.isHidden = true myPoint = UserDefaults.standard.integer(forKey: "UserPoint") votingPlusPoint = UserDefaults.standard.integer(forKey: "UserPlusPointNotPost") votingPlusPointToPost = UserDefaults.standard.integer(forKey: "UserPlusPoint") + isWatchAd = UserDefaults.standard.bool(forKey: "isWatchAd") + isYelloPlus = UserDefaults.standard.bool(forKey: "isYelloPlus") originView.topOfMyPoint.text = String(myPoint) originView.realMyPoint.setTextWithLineHeight(text: String(myPoint), lineHeight: 22) originView.plusPoint.setTextWithLineHeight(text: "+ " + String(votingPlusPoint) + " Point", lineHeight: 22) originView.plusPoint.asColor(targetString: String(votingPlusPoint), color: .yelloMain500) + VotingViewController.pushCount = 0 + + if isYelloPlus { + multiplyByTwoImageView.isHidden = false + } else { + multiplyByTwoImageView.isHidden = true + adButtonStackView.isHidden = isWatchAd + originView.yellowButton.isHidden = !isWatchAd + } + } // MARK: - Style @@ -66,11 +93,34 @@ final class VotingPointViewController: BaseViewController { } originView.yellowButton.do { - $0.setTitle("확인", for: .normal) + $0.setTitle(StringLiterals.Voting.Point.yelloButtonText, for: .normal) $0.titleLabel?.font = .uiSubtitle04 $0.addTarget(self, action: #selector(yellowButtonClicked), for: .touchUpInside) $0.makeCornerRound(radius: 23.adjusted) } + + cancelButton.do { + $0.setTitle(StringLiterals.Voting.Point.cancelButtonText, for: .normal) + $0.titleLabel?.font = .uiBody01 + $0.setTitleColor(.white, for: .normal) + $0.addTarget(self, action: #selector(yellowButtonClicked), for: .touchUpInside) + } + + rewardAdButton.do { + $0.setTitle(StringLiterals.Voting.Point.rewardAdButtonText, for: .normal) + $0.setTitleColor(.black, for: .normal) + $0.titleLabel?.font = .uiBody01 + $0.backgroundColor = .yelloMain500 + $0.makeCornerRound(radius: 24.adjustedHeight) + $0.addTarget(self, action: #selector(rewardAdsButtonClicked), for: .touchUpInside) + } + + adButtonStackView.do { + $0.axis = .horizontal + $0.addArrangedSubviews(cancelButton, rewardAdButton) + $0.spacing = 8.adjustedWidth + $0.alignment = .center + } } // MARK: - Layout @@ -85,7 +135,7 @@ final class VotingPointViewController: BaseViewController { let tabBarHeight = tabBarController?.tabBar.frame.height ?? 60 - view.addSubview(multiplyByTwoImageView) + view.addSubviews(multiplyByTwoImageView, adButtonStackView, loadingView) originView.topOfPointIcon.snp.makeConstraints { $0.centerY.equalTo(originView.topOfMyPoint) @@ -96,7 +146,7 @@ final class VotingPointViewController: BaseViewController { $0.top.equalTo(view.safeAreaInsets).inset(statusBarHeight + 47.adjustedHeight) $0.trailing.equalToSuperview().inset(16.adjusted) } - + originView.titleLabel.snp.makeConstraints { $0.top.equalTo(view.safeAreaInsets).inset(statusBarHeight + 100.adjustedHeight) } @@ -132,14 +182,113 @@ final class VotingPointViewController: BaseViewController { $0.bottom.equalTo(view.safeAreaInsets.bottom).inset(tabBarHeight + 28.adjustedHeight) $0.height.equalTo(48.adjusted) } + + cancelButton.snp.makeConstraints { + $0.width.equalTo(150.adjustedWidth) + $0.height.equalTo(48.adjustedHeight) + } + + rewardAdButton.snp.makeConstraints { + $0.width.equalTo(185.adjustedWidth) + $0.height.equalTo(48.adjustedHeight) + } + + adButtonStackView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(16.adjustedWidth) + $0.bottom.equalTo(view.safeAreaInsets.bottom).inset(tabBarHeight + 28.adjustedHeight) + } + + loadingView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + func loadRewardedAd() { + loadingView.showIndicator() + let request = GADRequest() + GADRewardedAd.load(withAdUnitID: Config.rewardAd, + request: request, + completionHandler: { [self] ad, error in + if let error = error { + print("Failed to load rewarded ad with error: \(error.localizedDescription)") + loadingView.stopIndicator() + adButtonStackView.isHidden = true + originView.yellowButton.isHidden = false + return + } + + rewardedAd = ad + let options = GADServerSideVerificationOptions() + options.customRewardString = uuid + rewardedAd?.serverSideVerificationOptions = options + rewardedAd?.fullScreenContentDelegate = self + debugPrint("Rewarded ad loaded.") + loadingView.stopIndicator() + rewardAdButton.isEnabled = true + cancelButton.isEnabled = true + showAds() + } + ) + } + + func getReward() { + let request = RewardRequestDTO(rewardType: StringLiterals.Reward.admobMultipleReward, + randomType: StringLiterals.Reward.fix, + uuid: uuid, + rewardNumber: votingPlusPoint) + + NetworkService.shared.rewardService.postRewardAd(requestDTO: request) { result in + switch result { + case .success(let data): + if data.status == 400 { + self.view.showToast(message: "알 수 없는 오류로 보상 받기에 실패했습니다.") + return + } + self.loadingView.stopIndicator() + self.adButtonStackView.isHidden = true + self.originView.yellowButton.isHidden = false + if let data = data.data { + self.myPoint += self.votingPlusPoint + self.votingPlusPoint = self.votingPlusPoint * 2 + self.updateUI() + } + UserDefaults.standard.set(true, forKey: "isWatchAd") + UserDefaults.standard.set(self.myPoint, forKey: "UserPoint") + UserDefaults.standard.set(self.votingPlusPoint, forKey: "UserPlusPointNotPost") + + debugPrint("광고 보상이 완료되었습니다.") + + default: + debugPrint("보상형 광고 보상 실패") + } + } + } + + func showAds() { + if let ad = rewardedAd { + ad.present(fromRootViewController: self) { + let reward = ad.adReward + debugPrint("Reward received with currency \(reward.amount), amount \(reward.amount.doubleValue)") + } + } else { + debugPrint("Ad wasn't ready") + } + } + + private func updateUI() { + originView.topOfMyPoint.text = String(myPoint) + originView.realMyPoint.setTextWithLineHeight(text: String(myPoint), lineHeight: 22) + originView.plusPoint.setTextWithLineHeight(text: "+ " + String(votingPlusPoint) + " Point", lineHeight: 22) + originView.plusPoint.asColor(targetString: String(votingPlusPoint), color: .yelloMain500) } // MARK: - Objc Function - + @objc func yellowButtonClicked() { originView.yellowButton.isEnabled = false - guard let loadedUserArray = loadUserData() else { return } + cancelButton.isEnabled = false + let loadedUserArray = loadUserData() ?? [] let requestDTO = VotingAnswerListRequestDTO(voteAnswerList: loadedUserArray, totalPoint: votingPlusPointToPost) NetworkService.shared.votingService.postVotingAnswerList(requestDTO: requestDTO) { result in switch result { @@ -156,14 +305,32 @@ final class VotingPointViewController: BaseViewController { let viewController = YELLOTabBarController() let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as! SceneDelegate viewController.startStatus = 2 - + viewController.notificationReadCount = 1 DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) { sceneDelegate.window?.rootViewController = UINavigationController(rootViewController: viewController) self.originView.yellowButton.isEnabled = true + self.cancelButton.isEnabled = true } - + UserDefaults.standard.removeObject(forKey: "isWatchAd") UserDefaults.standard.removeObject(forKey: "UserDataKey") UserDefaults.standard.removeObject(forKey: "UserPlusPoint") } + @objc + func rewardAdsButtonClicked() { + loadRewardedAd() + } +} + +extension VotingPointViewController: GADFullScreenContentDelegate { + func adWillDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) { + getReward() + } + + func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) { + debugPrint("광고 로드 실패") + loadingView.stopIndicator() + adButtonStackView.isHidden = true + originView.yellowButton.isHidden = false + } } diff --git a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingStart/VotingStartViewController.swift b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingStart/VotingStartViewController.swift index 28ef9535..97e7c305 100644 --- a/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingStart/VotingStartViewController.swift +++ b/YELLO-iOS/YELLO-iOS/Presentation/Voting/VotingStart/VotingStartViewController.swift @@ -36,6 +36,7 @@ final class VotingStartViewController: BaseViewController { Amplitude.instance().setUserProperties(["user_point": myPoint]) setAnimationView() getVotingAvailable() + UserManager.shared.userPoint = UserDefaults.standard.integer(forKey: "UserPoint") myPoint = String(UserDefaults.standard.integer(forKey: "UserPoint")) originView.topOfMyPoint.setTextWithLineHeight(text: String(myPoint), lineHeight: 24) getSubscribe() @@ -243,6 +244,7 @@ extension VotingStartViewController { self.speechBubbleBackground.isHidden = true } let point = data.point + UserManager.shared.userPoint = data.point self.originView.topOfMyPoint.setTextWithLineHeight(text: String(point), lineHeight: 24) self.myPoint = String(point) UserDefaults.standard.set(point, forKey: "UserPoint") @@ -316,6 +318,7 @@ extension VotingStartViewController { guard let data = data.data else { return } let subscribeStatus = data[0].subscribe if subscribeStatus == "CANCELED" || subscribeStatus == "ACTIVE" { + UserManager.shared.isYelloPlus = true self.multiplyByTwoStackView.isHidden = false } else { self.multiplyByTwoStackView.isHidden = true