diff --git a/SOOUM/Podfile b/SOOUM/Podfile index 15dc37e4..91759f34 100644 --- a/SOOUM/Podfile +++ b/SOOUM/Podfile @@ -23,8 +23,11 @@ def pods pod 'Then', '~> 3.0.0' pod 'Kingfisher', '~> 7.10.0' pod 'YPImagePicker', '~> 5.2.2' + pod 'SwiftEntryKit', '~> 2.0.0' pod 'CocoaLumberjack/Swift', '~> 3.7.2' + + pod 'lottie-ios' end target 'SOOUM-Dev' do diff --git a/SOOUM/Podfile.lock b/SOOUM/Podfile.lock index 4f8b5a2c..29b8109f 100644 --- a/SOOUM/Podfile.lock +++ b/SOOUM/Podfile.lock @@ -127,6 +127,7 @@ PODS: - GoogleUtilities/Logger - GoogleUtilities/Privacy - Kingfisher (7.10.2) + - lottie-ios (4.5.1) - nanopb (2.30910.0): - nanopb/decode (= 2.30910.0) - nanopb/encode (= 2.30910.0) @@ -153,6 +154,7 @@ PODS: - RxSwift (6.8.0) - SnapKit (5.7.1) - SteviaLayout (5.1.2) + - SwiftEntryKit (2.0.0) - SwiftLint (0.56.2) - Then (3.0.0) - WeakMapTable (1.2.0) @@ -168,12 +170,14 @@ DEPENDENCIES: - Firebase/Crashlytics (~> 10.22.0) - Firebase/Messaging (~> 10.22.0) - Kingfisher (~> 7.10.0) + - lottie-ios - ReactorKit (~> 3.2.0) - RxCocoa (~> 6.8.0) - RxGesture (~> 4.0.4) - RxKeyboard (~> 2.0.0) - RxSwift (~> 6.8.0) - SnapKit (~> 5.7.1) + - SwiftEntryKit (~> 2.0.0) - SwiftLint (~> 0.56.2) - Then (~> 3.0.0) - YPImagePicker (~> 5.2.2) @@ -196,6 +200,7 @@ SPEC REPOS: - GoogleDataTransport - GoogleUtilities - Kingfisher + - lottie-ios - nanopb - PromisesObjC - PromisesSwift @@ -208,6 +213,7 @@ SPEC REPOS: - RxSwift - SnapKit - SteviaLayout + - SwiftEntryKit - SwiftLint - Then - WeakMapTable @@ -230,6 +236,7 @@ SPEC CHECKSUMS: GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15 Kingfisher: 99edc495d3b7607e6425f0d6f6847b2abd6d716d + lottie-ios: 248b380fa1b97d18e792c37d90da7ab2aa0d6562 nanopb: 438bc412db1928dac798aa6fd75726007be04262 PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851 @@ -242,11 +249,12 @@ SPEC CHECKSUMS: RxSwift: 4e28be97cbcfeee614af26d83415febbf2bf6f45 SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a SteviaLayout: 05424e528d643657d39ce72c786e4adf13cfc5f2 + SwiftEntryKit: 61b5fa36f34a97dd8013e48a7345bc4c4720be9a SwiftLint: bd7cfb914762ab5f0cbb632964849571db075706 Then: 844265ae87834bbe1147d91d5d41a404da2ec27d WeakMapTable: 05c694ce8439a7a9ebabb56187287a63c57673d6 YPImagePicker: afc81b3cffab05a6e7261c5daf80dc31b4e917b4 -PODFILE CHECKSUM: 77a47a04877511a9af2378cb76d7e51ca6d46f27 +PODFILE CHECKSUM: f064785e258ff9ada0428a59015c8a3fd3ccfe5d COCOAPODS: 1.16.2 diff --git a/SOOUM/SOOUM.xcodeproj/project.pbxproj b/SOOUM/SOOUM.xcodeproj/project.pbxproj index a78bfb81..ad1fa310 100644 --- a/SOOUM/SOOUM.xcodeproj/project.pbxproj +++ b/SOOUM/SOOUM.xcodeproj/project.pbxproj @@ -23,7 +23,7 @@ 2A44A4352CAC21A500DC463E /* SignUpResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A44A4332CAC21A500DC463E /* SignUpResponse.swift */; }; 2A44A4372CAC227300DC463E /* BaseAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A44A4362CAC227300DC463E /* BaseAuthResponse.swift */; }; 2A44A4382CAC227300DC463E /* BaseAuthResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A44A4362CAC227300DC463E /* BaseAuthResponse.swift */; }; - 2A45B36D2CE3A3E30071026A /* ProfileImageSettingViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7F92CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift */; }; + 2A45B36D2CE3A3E30071026A /* OnboardingProfileImageSettingViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7F92CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift */; }; 2A45B36F2CE4C5510071026A /* RegisterUserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A45B36E2CE4C5510071026A /* RegisterUserResponse.swift */; }; 2A45B3702CE4C5510071026A /* RegisterUserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A45B36E2CE4C5510071026A /* RegisterUserResponse.swift */; }; 2A5ABA342D464E0B00BF6C9B /* ConfigureRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5ABA332D464E0B00BF6C9B /* ConfigureRequest.swift */; }; @@ -34,8 +34,8 @@ 2A5BB7BF2CDB870000E1C799 /* OnboardingGuideMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7BD2CDB870000E1C799 /* OnboardingGuideMessageView.swift */; }; 2A5BB7C92CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7C82CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift */; }; 2A5BB7CA2CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7C82CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift */; }; - 2A5BB7CD2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7CC2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift */; }; - 2A5BB7CE2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7CC2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift */; }; + 2A5BB7CD2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7CC2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift */; }; + 2A5BB7CE2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7CC2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift */; }; 2A5BB7D12CDC7ADC00E1C799 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7D02CDC7ADC00E1C799 /* OnboardingViewController.swift */; }; 2A5BB7D22CDC7ADC00E1C799 /* OnboardingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7D02CDC7ADC00E1C799 /* OnboardingViewController.swift */; }; 2A5BB7D52CDCA5C900E1C799 /* TermsOfServiceAgreeButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7D42CDCA5C900E1C799 /* TermsOfServiceAgreeButtonView.swift */; }; @@ -48,7 +48,7 @@ 2A5BB7E42CDCD97300E1C799 /* JoinRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7E22CDCD97300E1C799 /* JoinRequest.swift */; }; 2A5BB7E72CDCDC3600E1C799 /* NicknameValidationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7E62CDCDC3600E1C799 /* NicknameValidationResponse.swift */; }; 2A5BB7E82CDCDC3600E1C799 /* NicknameValidationResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7E62CDCDC3600E1C799 /* NicknameValidationResponse.swift */; }; - 2A5BB7FA2CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7F92CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift */; }; + 2A5BB7FA2CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5BB7F92CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift */; }; 2A62805B2D084FEB00803BE9 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 2A62805A2D084FEB00803BE9 /* GoogleService-Info.plist */; }; 2A649ECF2CAE8970002D8284 /* SOMDialogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A649ECE2CAE8970002D8284 /* SOMDialogViewController.swift */; }; 2A649ED42CAE990B002D8284 /* SOMDialogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A649ECE2CAE8970002D8284 /* SOMDialogViewController.swift */; }; @@ -384,6 +384,8 @@ 388A2D342D00D7BF00E2F2F0 /* UpdateProfileViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388A2D322D00D7BF00E2F2F0 /* UpdateProfileViewReactor.swift */; }; 388C96362CCE41700061C598 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388C96352CCE41700061C598 /* AuthInfo.swift */; }; 388C96372CCE41700061C598 /* AuthInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388C96352CCE41700061C598 /* AuthInfo.swift */; }; + 388D8ADF2E73E6190044BA79 /* SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388D8ADE2E73E6130044BA79 /* SwiftEntryKit.swift */; }; + 388D8AE02E73E6190044BA79 /* SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388D8ADE2E73E6130044BA79 /* SwiftEntryKit.swift */; }; 388DA0FB2C8F521000A9DD56 /* FontContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388DA0FA2C8F521000A9DD56 /* FontContainer.swift */; }; 388DA0FC2C8F521300A9DD56 /* FontContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388DA0FA2C8F521000A9DD56 /* FontContainer.swift */; }; 388DA0FE2C8F526C00A9DD56 /* UIFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 388DA0FD2C8F526C00A9DD56 /* UIFont.swift */; }; @@ -410,14 +412,24 @@ 38A5D1552C8CB12300B68363 /* UIImage+SOOUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A5D1532C8CB11E00B68363 /* UIImage+SOOUM.swift */; }; 38A627172CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A627162CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift */; }; 38A627182CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A627162CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift */; }; + 38A721952E73E7140071E1D8 /* View+SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A721942E73E7010071E1D8 /* View+SwiftEntryKit.swift */; }; + 38A721962E73E7140071E1D8 /* View+SwiftEntryKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A721942E73E7010071E1D8 /* View+SwiftEntryKit.swift */; }; + 38A721992E73EA6F0071E1D8 /* SelectProfileBottomFloatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A721982E73EA610071E1D8 /* SelectProfileBottomFloatView.swift */; }; + 38A7219A2E73EA6F0071E1D8 /* SelectProfileBottomFloatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38A721982E73EA610071E1D8 /* SelectProfileBottomFloatView.swift */; }; 38AA00022CAD1BCC002C5F1E /* LikeAndCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA00012CAD1BCC002C5F1E /* LikeAndCommentView.swift */; }; 38AA00032CAD1BCC002C5F1E /* LikeAndCommentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA00012CAD1BCC002C5F1E /* LikeAndCommentView.swift */; }; 38AA00062CAD96E3002C5F1E /* MoreBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA00052CAD96E3002C5F1E /* MoreBottomSheetViewController.swift */; }; 38AA00072CAD96E3002C5F1E /* MoreBottomSheetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA00052CAD96E3002C5F1E /* MoreBottomSheetViewController.swift */; }; - 38AA66262D3AC3F500B3F6B2 /* DialogMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA66252D3AC3F500B3F6B2 /* DialogMessageView.swift */; }; - 38AA66272D3AC3F500B3F6B2 /* DialogMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AA66252D3AC3F500B3F6B2 /* DialogMessageView.swift */; }; 38AE565C2D048B4800CAA431 /* SOMDialogViewController+Show.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE565B2D048B4800CAA431 /* SOMDialogViewController+Show.swift */; }; 38AE565D2D048B4800CAA431 /* SOMDialogViewController+Show.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE565B2D048B4800CAA431 /* SOMDialogViewController+Show.swift */; }; + 38AE77D42E74580000B6FD13 /* OnboardingCompletedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77D32E7457F400B6FD13 /* OnboardingCompletedViewController.swift */; }; + 38AE77D52E74580000B6FD13 /* OnboardingCompletedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77D32E7457F400B6FD13 /* OnboardingCompletedViewController.swift */; }; + 38AE77D72E7459F400B6FD13 /* OnboardingCompletedViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77D62E7459EA00B6FD13 /* OnboardingCompletedViewReactor.swift */; }; + 38AE77D82E7459F400B6FD13 /* OnboardingCompletedViewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77D62E7459EA00B6FD13 /* OnboardingCompletedViewReactor.swift */; }; + 38AE77DB2E745FFF00B6FD13 /* EnterMemberTransferTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77DA2E745FF700B6FD13 /* EnterMemberTransferTextFieldView.swift */; }; + 38AE77DC2E745FFF00B6FD13 /* EnterMemberTransferTextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77DA2E745FF700B6FD13 /* EnterMemberTransferTextFieldView.swift */; }; + 38AE77DE2E7465F500B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77DD2E7465E600B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift */; }; + 38AE77DF2E7465F500B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38AE77DD2E7465E600B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift */; }; 38B543DF2D46171300DDF2C5 /* ManagerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543DE2D46171300DDF2C5 /* ManagerConfiguration.swift */; }; 38B543E02D46171300DDF2C5 /* ManagerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543DE2D46171300DDF2C5 /* ManagerConfiguration.swift */; }; 38B543E22D46179500DDF2C5 /* AuthManagerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543E12D46179500DDF2C5 /* AuthManagerConfiguration.swift */; }; @@ -430,6 +442,10 @@ 38B543EC2D461B1A00DDF2C5 /* LocationManagerConfigruation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543EA2D461B1A00DDF2C5 /* LocationManagerConfigruation.swift */; }; 38B543EE2D46506300DDF2C5 /* ManagerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543ED2D46506300DDF2C5 /* ManagerType.swift */; }; 38B543EF2D46506300DDF2C5 /* ManagerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B543ED2D46506300DDF2C5 /* ManagerType.swift */; }; + 38B65E792E72A29F00DF6919 /* OnboardingNumberingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B65E782E72A29100DF6919 /* OnboardingNumberingView.swift */; }; + 38B65E7A2E72A29F00DF6919 /* OnboardingNumberingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B65E782E72A29100DF6919 /* OnboardingNumberingView.swift */; }; + 38B65E7C2E72ADB900DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B65E7B2E72ADB500DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift */; }; + 38B65E7D2E72ADB900DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B65E7B2E72ADB500DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift */; }; 38B6AACD2CA410D800CE6DB6 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B6AACC2CA410D800CE6DB6 /* MainTabBarController.swift */; }; 38B6AACE2CA410D800CE6DB6 /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B6AACC2CA410D800CE6DB6 /* MainTabBarController.swift */; }; 38B6AAD82CA424AE00CE6DB6 /* MoveTopButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B6AAD72CA424AE00CE6DB6 /* MoveTopButtonView.swift */; }; @@ -478,6 +494,10 @@ 38D3CB192CC2362B001EC280 /* Hakgyoansim-Light.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 38D3CB152CC2362B001EC280 /* Hakgyoansim-Light.ttf */; }; 38D488CA2D0C557300F2D38D /* SOMButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D488C92D0C557300F2D38D /* SOMButton.swift */; }; 38D488CB2D0C557300F2D38D /* SOMButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D488C92D0C557300F2D38D /* SOMButton.swift */; }; + 38D522652E742F1A0044911B /* loading_indicator_lottie.json in Resources */ = {isa = PBXBuildFile; fileRef = 38D522642E742F1A0044911B /* loading_indicator_lottie.json */; }; + 38D522662E742F1A0044911B /* loading_indicator_lottie.json in Resources */ = {isa = PBXBuildFile; fileRef = 38D522642E742F1A0044911B /* loading_indicator_lottie.json */; }; + 38D522682E742F610044911B /* SOMLoadingIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D522672E742F550044911B /* SOMLoadingIndicatorView.swift */; }; + 38D522692E742F610044911B /* SOMLoadingIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D522672E742F550044911B /* SOMLoadingIndicatorView.swift */; }; 38D5637B2D16D72D006265AA /* SOMSwipeTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D5637A2D16D72D006265AA /* SOMSwipeTabBar.swift */; }; 38D5637C2D16D72D006265AA /* SOMSwipeTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D5637A2D16D72D006265AA /* SOMSwipeTabBar.swift */; }; 38D5637E2D17152F006265AA /* SOMSwipeTabBarDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38D5637D2D17152F006265AA /* SOMSwipeTabBarDelegate.swift */; }; @@ -587,14 +607,14 @@ 2A5BB7B82CDB860D00E1C799 /* OnboardingTermsOfServiceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTermsOfServiceViewController.swift; sourceTree = ""; }; 2A5BB7BD2CDB870000E1C799 /* OnboardingGuideMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingGuideMessageView.swift; sourceTree = ""; }; 2A5BB7C82CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNicknameSettingViewController.swift; sourceTree = ""; }; - 2A5BB7CC2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileImageSettingViewController.swift; sourceTree = ""; }; + 2A5BB7CC2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingProfileImageSettingViewController.swift; sourceTree = ""; }; 2A5BB7D02CDC7ADC00E1C799 /* OnboardingViewController.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OnboardingViewController.swift; sourceTree = ""; tabWidth = 4; }; 2A5BB7D42CDCA5C900E1C799 /* TermsOfServiceAgreeButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TermsOfServiceAgreeButtonView.swift; sourceTree = ""; }; 2A5BB7D82CDCBA8400E1C799 /* OnboardingNicknameTextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNicknameTextFieldView.swift; sourceTree = ""; }; 2A5BB7DF2CDCBE7E00E1C799 /* OnboardingNicknameSettingViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNicknameSettingViewReactor.swift; sourceTree = ""; }; 2A5BB7E22CDCD97300E1C799 /* JoinRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinRequest.swift; sourceTree = ""; }; 2A5BB7E62CDCDC3600E1C799 /* NicknameValidationResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameValidationResponse.swift; sourceTree = ""; }; - 2A5BB7F92CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileImageSettingViewReactor.swift; sourceTree = ""; }; + 2A5BB7F92CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingProfileImageSettingViewReactor.swift; sourceTree = ""; }; 2A62805A2D084FEB00803BE9 /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 2A6280602D085C6200803BE9 /* SOOUM.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SOOUM.entitlements; sourceTree = ""; }; 2A6280612D085C7600803BE9 /* SOOUM-Dev.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SOOUM-Dev.entitlements"; sourceTree = ""; }; @@ -774,6 +794,7 @@ 388A2D2F2D00D6A100E2F2F0 /* FollowViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowViewReactor.swift; sourceTree = ""; }; 388A2D322D00D7BF00E2F2F0 /* UpdateProfileViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateProfileViewReactor.swift; sourceTree = ""; }; 388C96352CCE41700061C598 /* AuthInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthInfo.swift; sourceTree = ""; }; + 388D8ADE2E73E6130044BA79 /* SwiftEntryKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftEntryKit.swift; sourceTree = ""; }; 388DA0FA2C8F521000A9DD56 /* FontContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontContainer.swift; sourceTree = ""; }; 388DA0FD2C8F526C00A9DD56 /* UIFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIFont.swift; sourceTree = ""; }; 388DA1002C8F538400A9DD56 /* PretendardVariable.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = PretendardVariable.ttf; sourceTree = ""; }; @@ -788,17 +809,24 @@ 389EF81D2D2F469B00E053AE /* CocoaLumberjack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CocoaLumberjack.swift; sourceTree = ""; }; 38A5D1532C8CB11E00B68363 /* UIImage+SOOUM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+SOOUM.swift"; sourceTree = ""; }; 38A627162CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMTagsLayoutConfigure.swift; sourceTree = ""; }; + 38A721942E73E7010071E1D8 /* View+SwiftEntryKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+SwiftEntryKit.swift"; sourceTree = ""; }; + 38A721982E73EA610071E1D8 /* SelectProfileBottomFloatView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectProfileBottomFloatView.swift; sourceTree = ""; }; 38AA00012CAD1BCC002C5F1E /* LikeAndCommentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LikeAndCommentView.swift; sourceTree = ""; }; 38AA00052CAD96E3002C5F1E /* MoreBottomSheetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreBottomSheetViewController.swift; sourceTree = ""; }; 38AA66212D3AA86F00B3F6B2 /* SOMDialogAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMDialogAction.swift; sourceTree = ""; }; - 38AA66252D3AC3F500B3F6B2 /* DialogMessageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DialogMessageView.swift; sourceTree = ""; }; 38AE565B2D048B4800CAA431 /* SOMDialogViewController+Show.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SOMDialogViewController+Show.swift"; sourceTree = ""; }; + 38AE77D32E7457F400B6FD13 /* OnboardingCompletedViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingCompletedViewController.swift; sourceTree = ""; }; + 38AE77D62E7459EA00B6FD13 /* OnboardingCompletedViewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingCompletedViewReactor.swift; sourceTree = ""; }; + 38AE77DA2E745FF700B6FD13 /* EnterMemberTransferTextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnterMemberTransferTextFieldView.swift; sourceTree = ""; }; + 38AE77DD2E7465E600B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "EnterMemberTransferTextFieldView+Rx.swift"; sourceTree = ""; }; 38B543DE2D46171300DDF2C5 /* ManagerConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagerConfiguration.swift; sourceTree = ""; }; 38B543E12D46179500DDF2C5 /* AuthManagerConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthManagerConfiguration.swift; sourceTree = ""; }; 38B543E42D4617CB00DDF2C5 /* PushManagerConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushManagerConfiguration.swift; sourceTree = ""; }; 38B543E72D4617EA00DDF2C5 /* NetworkManagerConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManagerConfiguration.swift; sourceTree = ""; }; 38B543EA2D461B1A00DDF2C5 /* LocationManagerConfigruation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationManagerConfigruation.swift; sourceTree = ""; }; 38B543ED2D46506300DDF2C5 /* ManagerType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagerType.swift; sourceTree = ""; }; + 38B65E782E72A29100DF6919 /* OnboardingNumberingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingNumberingView.swift; sourceTree = ""; }; + 38B65E7B2E72ADB500DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TermsOfServiceAgreeButtonView+Rx.swift"; sourceTree = ""; }; 38B6AACC2CA410D800CE6DB6 /* MainTabBarController.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; tabWidth = 4; }; 38B6AAD72CA424AE00CE6DB6 /* MoveTopButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoveTopButtonView.swift; sourceTree = ""; }; 38B6AADA2CA4740B00CE6DB6 /* LaunchScreenViewReactor.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = LaunchScreenViewReactor.swift; sourceTree = ""; tabWidth = 4; }; @@ -825,6 +853,8 @@ 38D3CB142CC2362B001EC280 /* Hakgyoansim-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Hakgyoansim-Bold.ttf"; sourceTree = ""; }; 38D3CB152CC2362B001EC280 /* Hakgyoansim-Light.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Hakgyoansim-Light.ttf"; sourceTree = ""; }; 38D488C92D0C557300F2D38D /* SOMButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMButton.swift; sourceTree = ""; }; + 38D522642E742F1A0044911B /* loading_indicator_lottie.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = loading_indicator_lottie.json; sourceTree = ""; }; + 38D522672E742F550044911B /* SOMLoadingIndicatorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMLoadingIndicatorView.swift; sourceTree = ""; }; 38D5637A2D16D72D006265AA /* SOMSwipeTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMSwipeTabBar.swift; sourceTree = ""; }; 38D5637D2D17152F006265AA /* SOMSwipeTabBarDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMSwipeTabBarDelegate.swift; sourceTree = ""; }; 38D563832D1719B1006265AA /* SOMSwipeTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SOMSwipeTabBarItem.swift; sourceTree = ""; }; @@ -927,6 +957,7 @@ 2A5BB7BB2CDB86DD00E1C799 /* TermsOfService */, 2A5BB7C72CDBA4F400E1C799 /* NicknameSetting */, 2A5BB7CB2CDBB7B200E1C799 /* ProfileImageSetting */, + 38AE77D22E7457E700B6FD13 /* Completed */, 2A5BB7BC2CDB86E500E1C799 /* Views */, ); path = Onboarding; @@ -945,6 +976,7 @@ 2A5BB7BC2CDB86E500E1C799 /* Views */ = { isa = PBXGroup; children = ( + 38B65E782E72A29100DF6919 /* OnboardingNumberingView.swift */, 2A5BB7BD2CDB870000E1C799 /* OnboardingGuideMessageView.swift */, ); path = Views; @@ -963,8 +995,9 @@ 2A5BB7CB2CDBB7B200E1C799 /* ProfileImageSetting */ = { isa = PBXGroup; children = ( - 2A5BB7CC2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift */, - 2A5BB7F92CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift */, + 2A5BB7CC2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift */, + 2A5BB7F92CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift */, + 38A721972E73EA5B0071E1D8 /* Views */, ); path = ProfileImageSetting; sourceTree = ""; @@ -974,7 +1007,6 @@ children = ( 2A5BB7D02CDC7ADC00E1C799 /* OnboardingViewController.swift */, 38E9CE122D37711600E85A2D /* OnboardingViewReactor.swift */, - 38AA66242D3AC3E400B3F6B2 /* Views */, ); path = Onboarding; sourceTree = ""; @@ -982,6 +1014,7 @@ 2A5BB7D32CDCA5BE00E1C799 /* Views */ = { isa = PBXGroup; children = ( + 38B65E7B2E72ADB500DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift */, 2A5BB7D42CDCA5C900E1C799 /* TermsOfServiceAgreeButtonView.swift */, 3816E2362D3BEE7E004CC196 /* TermsOfServiceCellView.swift */, 3816E2392D3BF402004CC196 /* TermsOfServiceCellView+Rx.swift */, @@ -1288,6 +1321,7 @@ children = ( 3803CF812D017DB800FD90DB /* EnterMemberTransferViewController.swift */, 3803CF842D017DC700FD90DB /* EnterMemberTransferViewReactor.swift */, + 38AE77D92E745FF100B6FD13 /* Views */, ); path = Enter; sourceTree = ""; @@ -1385,6 +1419,7 @@ 3836ACB12C8F042C00A3C566 /* Utilities */ = { isa = PBXGroup; children = ( + 388D8ADD2E73E60B0044BA79 /* SwiftEntryKit */, 385620F42CA19E8600E0AB5A /* Alamofire */, 3836ACB22C8F043500A3C566 /* Typography */, 38D5CE0A2CBCE8CA0054AB9A /* SimpleDefaults.swift */, @@ -1715,6 +1750,7 @@ 387FBB052C87038F00A5E139 /* Resources */ = { isa = PBXGroup; children = ( + 38D522642E742F1A0044911B /* loading_indicator_lottie.json */, 387FBAF82C8702C200A5E139 /* Assets.xcassets */, 2A6280602D085C6200803BE9 /* SOOUM.entitlements */, 387FBAFA2C8702C200A5E139 /* LaunchScreen.storyboard */, @@ -1858,6 +1894,15 @@ path = Views; sourceTree = ""; }; + 388D8ADD2E73E60B0044BA79 /* SwiftEntryKit */ = { + isa = PBXGroup; + children = ( + 38A721942E73E7010071E1D8 /* View+SwiftEntryKit.swift */, + 388D8ADE2E73E6130044BA79 /* SwiftEntryKit.swift */, + ); + path = SwiftEntryKit; + sourceTree = ""; + }; 389596A12D15A4CB000662B6 /* Notification */ = { isa = PBXGroup; children = ( @@ -1878,6 +1923,14 @@ path = Log; sourceTree = ""; }; + 38A721972E73EA5B0071E1D8 /* Views */ = { + isa = PBXGroup; + children = ( + 38A721982E73EA610071E1D8 /* SelectProfileBottomFloatView.swift */, + ); + path = Views; + sourceTree = ""; + }; 38AA00002CAD1BB2002C5F1E /* Views */ = { isa = PBXGroup; children = ( @@ -1904,14 +1957,6 @@ path = Intro; sourceTree = ""; }; - 38AA66242D3AC3E400B3F6B2 /* Views */ = { - isa = PBXGroup; - children = ( - 38AA66252D3AC3F500B3F6B2 /* DialogMessageView.swift */, - ); - path = Views; - sourceTree = ""; - }; 38AE56572D0489E500CAA431 /* SOMDialogController */ = { isa = PBXGroup; children = ( @@ -1922,6 +1967,24 @@ path = SOMDialogController; sourceTree = ""; }; + 38AE77D22E7457E700B6FD13 /* Completed */ = { + isa = PBXGroup; + children = ( + 38AE77D32E7457F400B6FD13 /* OnboardingCompletedViewController.swift */, + 38AE77D62E7459EA00B6FD13 /* OnboardingCompletedViewReactor.swift */, + ); + path = Completed; + sourceTree = ""; + }; + 38AE77D92E745FF100B6FD13 /* Views */ = { + isa = PBXGroup; + children = ( + 38AE77DD2E7465E600B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift */, + 38AE77DA2E745FF700B6FD13 /* EnterMemberTransferTextFieldView.swift */, + ); + path = Views; + sourceTree = ""; + }; 38B6AACB2CA410C000CE6DB6 /* Main */ = { isa = PBXGroup; children = ( @@ -2072,6 +2135,7 @@ 38D488C92D0C557300F2D38D /* SOMButton.swift */, 38773E7B2CB3ACB2004815CD /* SOMRefreshControl.swift */, 38D055C22CD862FE00E75590 /* SOMActivityIndicatorView.swift */, + 38D522672E742F550044911B /* SOMLoadingIndicatorView.swift */, ); path = Components; sourceTree = ""; @@ -2346,6 +2410,7 @@ 385441962C870544004E2BB0 /* Base in Resources */, 38D3CB192CC2362B001EC280 /* Hakgyoansim-Light.ttf in Resources */, 2A62805B2D084FEB00803BE9 /* GoogleService-Info.plist in Resources */, + 38D522652E742F1A0044911B /* loading_indicator_lottie.json in Resources */, 388DA1022C8F538400A9DD56 /* PretendardVariable.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2366,6 +2431,7 @@ 38D3CB162CC2362B001EC280 /* Hakgyoansim-Bold.ttf in Resources */, 387FBAFC2C8702C200A5E139 /* Base in Resources */, 38D3CB182CC2362B001EC280 /* Hakgyoansim-Light.ttf in Resources */, + 38D522662E742F1A0044911B /* loading_indicator_lottie.json in Resources */, 388DA1012C8F538400A9DD56 /* PretendardVariable.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2587,7 +2653,6 @@ 38CC49892CDE3972007A0145 /* SOMPresentationController+Show.swift in Sources */, 38F70E5C2D1905D000B33C9D /* MainHomeTabBarController.swift in Sources */, 38E7FBF02D3CF6BC00A359CD /* SOMDialogAction.swift in Sources */, - 38AA66272D3AC3F500B3F6B2 /* DialogMessageView.swift in Sources */, 3878D07E2CFFE6E500F9522F /* IssueMemberTransferViewController.swift in Sources */, 3878B8632D0DC8BD00B3B128 /* UIViewController+Toast.swift in Sources */, 2A44A4352CAC21A500DC463E /* SignUpResponse.swift in Sources */, @@ -2598,10 +2663,12 @@ 2AFD056A2D03264C007C84AD /* AddFavoriteTagResponse.swift in Sources */, 2AFD05532D007F2F007C84AD /* TagSearchViewReactor.swift in Sources */, 2A44A42B2CAC09AE00DC463E /* RSAKeyResponse.swift in Sources */, + 38A721962E73E7140071E1D8 /* View+SwiftEntryKit.swift in Sources */, 38572CD92D2230C900B07C69 /* NotificationAllowResponse.swift in Sources */, 382E15402D15AF4F0097B09C /* CommentHistoryInNotiResponse.swift in Sources */, 388698632D1986B100008600 /* NotificationRequest.swift in Sources */, 2A980BA52D803EEA007DFA45 /* SOMEvent.swift in Sources */, + 38B65E7C2E72ADB900DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift in Sources */, 38C2D4152CFEA9CC00CEA092 /* MyProfileViewCell.swift in Sources */, 38F720B22CD4F15900DF32B5 /* distanceCardResponse.swift in Sources */, 38FD4DB52D034F6600BF5FF1 /* MyFollowerViewCell.swift in Sources */, @@ -2624,9 +2691,10 @@ 3878D07A2CFFE1E800F9522F /* ResignViewController.swift in Sources */, 38738D4C2D2FDCC300C37574 /* WithoutReadNotisCountResponse.swift in Sources */, 38A627182CECC5A800C37A03 /* SOMTagsLayoutConfigure.swift in Sources */, + 38AE77D82E7459F400B6FD13 /* OnboardingCompletedViewReactor.swift in Sources */, 3887D03A2CC5504500FB52E1 /* UITextField+Typography.swift in Sources */, 2AE6B15B2CBEAEC000FA5C3C /* ReportRequest.swift in Sources */, - 2A5BB7CE2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift in Sources */, + 2A5BB7CE2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift in Sources */, 3893B6D22D36739500F2004C /* CompositeManager.swift in Sources */, 3800575D2D9C12CB00E58A19 /* DefinedError.swift in Sources */, 38F131892CC7B7E0000D0475 /* RelatedTagResponse.swift in Sources */, @@ -2651,7 +2719,7 @@ 38CE94C02C904D460004B238 /* SOMNavigationBar.swift in Sources */, 2A5BB7D22CDC7ADC00E1C799 /* OnboardingViewController.swift in Sources */, 2AFF955B2CF3227900CBFB12 /* TagSearchTextFieldView.swift in Sources */, - 2A45B36D2CE3A3E30071026A /* ProfileImageSettingViewReactor.swift in Sources */, + 2A45B36D2CE3A3E30071026A /* OnboardingProfileImageSettingViewReactor.swift in Sources */, 38D5CE0C2CBCE8CA0054AB9A /* SimpleDefaults.swift in Sources */, 382D5CF72CFE9B8600BFA23E /* ProfileViewController.swift in Sources */, 388698552D191F4B00008600 /* MainHomeDistanceViewReactor.swift in Sources */, @@ -2659,11 +2727,14 @@ 388A2D312D00D6A100E2F2F0 /* FollowViewReactor.swift in Sources */, 2A649ED42CAE990B002D8284 /* SOMDialogViewController.swift in Sources */, 3893B6CF2D36728000F2004C /* ManagerProvider.swift in Sources */, + 38A7219A2E73EA6F0071E1D8 /* SelectProfileBottomFloatView.swift in Sources */, 2AFF95692CF5DFF800CBFB12 /* RecommendTagTableViewCell.swift in Sources */, 3866577F2CEF3554009F7F60 /* UIButton+Rx.swift in Sources */, 385441912C870544004E2BB0 /* AppDelegate.swift in Sources */, + 38D522692E742F610044911B /* SOMLoadingIndicatorView.swift in Sources */, 38D869642CF821F900BF87DA /* UserDefaults.swift in Sources */, 2AE6B1902CC121BB00FA5C3C /* BottomSheetSegmentTableViewCell.swift in Sources */, + 38AE77DB2E745FFF00B6FD13 /* EnterMemberTransferTextFieldView.swift in Sources */, 3878D0602CFFD45100F9522F /* FollowerResponse.swift in Sources */, 381701722CD88374005FC220 /* CompositeInterceptor.swift in Sources */, 2A5BB7CA2CDBA53E00E1C799 /* OnboardingNicknameSettingViewController.swift in Sources */, @@ -2710,6 +2781,7 @@ 388A2D342D00D7BF00E2F2F0 /* UpdateProfileViewReactor.swift in Sources */, 38B543E62D4617CB00DDF2C5 /* PushManagerConfiguration.swift in Sources */, 2AE6B14A2CBC15BF00FA5C3C /* ReportViewController.swift in Sources */, + 388D8AE02E73E6190044BA79 /* SwiftEntryKit.swift in Sources */, 2AFD055A2D008D23007C84AD /* TagDetailViewController.swift in Sources */, 2AE6B1552CBCC34B00FA5C3C /* ReportReasonView.swift in Sources */, 2AFF95562CF3222400CBFB12 /* TagsViewController.swift in Sources */, @@ -2766,6 +2838,7 @@ 2A5BB7DA2CDCBA8400E1C799 /* OnboardingNicknameTextFieldView.swift in Sources */, 3878D0682CFFDAF100F9522F /* OtherFollowViewCell.swift in Sources */, 38F006AB2D395A7F001AC5F7 /* SuspensionResponse.swift in Sources */, + 38AE77D42E74580000B6FD13 /* OnboardingCompletedViewController.swift in Sources */, 2AE6B1792CBFE49D00FA5C3C /* SelectFontTableViewCell.swift in Sources */, 389EF81B2D2F454600E053AE /* Log+Extract.swift in Sources */, 381701792CD88854005FC220 /* LogginMonitor.swift in Sources */, @@ -2777,6 +2850,7 @@ 385053532C92DBE200C80B02 /* SOMTabBarItem.swift in Sources */, 3803CF6D2D0156FC00FD90DB /* SettingsRequest.swift in Sources */, 2A5BB7E42CDCD97300E1C799 /* JoinRequest.swift in Sources */, + 38B65E7A2E72A29F00DF6919 /* OnboardingNumberingView.swift in Sources */, 2AFD055E2D009513007C84AD /* TagDetailNavigationBarView.swift in Sources */, 2AFF95652CF33D9F00CBFB12 /* TagsHeaderView.swift in Sources */, 38B543EC2D461B1A00DDF2C5 /* LocationManagerConfigruation.swift in Sources */, @@ -2791,6 +2865,7 @@ 384972A42CA54DC10012FCA1 /* UIImgeView.swift in Sources */, 38D6F1812CC2413400E11530 /* WriteCardTextView.swift in Sources */, 3816E2382D3BEE7E004CC196 /* TermsOfServiceCellView.swift in Sources */, + 38AE77DE2E7465F500B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift in Sources */, 3878F4722CA3F03400AA46A2 /* SOMCard.swift in Sources */, 3803CF862D017DC700FD90DB /* EnterMemberTransferViewReactor.swift in Sources */, 38B6AAE32CA4787200CE6DB6 /* MainTabBarReactor.swift in Sources */, @@ -2876,7 +2951,6 @@ 3803CF7A2D016BDB00FD90DB /* IssueMemberTransferViewReactor.swift in Sources */, 38C2D4172CFEAACA00CEA092 /* ProfileViewFooterCell.swift in Sources */, 38E7FBEF2D3CF6BB00A359CD /* SOMDialogAction.swift in Sources */, - 38AA66262D3AC3F500B3F6B2 /* DialogMessageView.swift in Sources */, 38AA00022CAD1BCC002C5F1E /* LikeAndCommentView.swift in Sources */, 2AE6B1542CBCC34B00FA5C3C /* ReportReasonView.swift in Sources */, 38D5CE0B2CBCE8CA0054AB9A /* SimpleDefaults.swift in Sources */, @@ -2887,10 +2961,12 @@ 38F70E622D19113E00B33C9D /* MainHomeLatestViewController.swift in Sources */, 38F70E6F2D191DFB00B33C9D /* MainHomePopularViewReactor.swift in Sources */, 3878D0792CFFE1E800F9522F /* ResignViewController.swift in Sources */, + 38A721952E73E7140071E1D8 /* View+SwiftEntryKit.swift in Sources */, 38F720B12CD4F15900DF32B5 /* distanceCardResponse.swift in Sources */, 38816DA22D004DED00EB87D6 /* UpdateProfileView.swift in Sources */, 38FDC2B62C9E746B00C094C2 /* BaseViewController.swift in Sources */, 2A980BA42D803EEA007DFA45 /* SOMEvent.swift in Sources */, + 38B65E7D2E72ADB900DF6919 /* TermsOfServiceAgreeButtonView+Rx.swift in Sources */, 2AFD05492CFF7687007C84AD /* RecommendTagsResponse.swift in Sources */, 2AE6B17F2CBFEA5200FA5C3C /* ToggleView.swift in Sources */, 38601E1B2D3139D000A465A9 /* RecommendTagView.swift in Sources */, @@ -2913,6 +2989,7 @@ 389EF81A2D2F454600E053AE /* Log+Extract.swift in Sources */, 38C2D4142CFEA9CC00CEA092 /* MyProfileViewCell.swift in Sources */, 3803CF882D01914200FD90DB /* ResignViewReactor.swift in Sources */, + 38AE77D72E7459F400B6FD13 /* OnboardingCompletedViewReactor.swift in Sources */, 38816D9E2D004A5E00EB87D6 /* UpdateProfileViewController.swift in Sources */, 38D8E2912CCD232B00CE2E0A /* AuthManager.swift in Sources */, 3886985F2D1984D600008600 /* NotificationViewReactor.swift in Sources */, @@ -2948,11 +3025,14 @@ 38121E342CA6DA4000602499 /* Date.swift in Sources */, 38F720A52CD4F15900DF32B5 /* CardSummaryResponse.swift in Sources */, 3878D0752CFFE01500F9522F /* SettingScrollViewHeader.swift in Sources */, + 38A721992E73EA6F0071E1D8 /* SelectProfileBottomFloatView.swift in Sources */, 3893B6CE2D36728000F2004C /* ManagerProvider.swift in Sources */, 2AFF95682CF5DFF800CBFB12 /* RecommendTagTableViewCell.swift in Sources */, 3880097B2CABEE3D002A9209 /* DetailViewController.swift in Sources */, + 38D522682E742F610044911B /* SOMLoadingIndicatorView.swift in Sources */, 38D869632CF821F900BF87DA /* UserDefaults.swift in Sources */, 385620F22CA19D2D00E0AB5A /* Alamofire_Request.swift in Sources */, + 38AE77DC2E745FFF00B6FD13 /* EnterMemberTransferTextFieldView.swift in Sources */, 38389B9F2CCCFB7D006728AF /* AuthKeyChain.swift in Sources */, 3878B8622D0DC8BD00B3B128 /* UIViewController+Toast.swift in Sources */, 2AFD05522D007F2F007C84AD /* TagSearchViewReactor.swift in Sources */, @@ -2999,6 +3079,7 @@ 38F720AD2CD4F15900DF32B5 /* DetailCardResponse.swift in Sources */, 38B543E52D4617CB00DDF2C5 /* PushManagerConfiguration.swift in Sources */, 2AE6B1502CBCC2F600FA5C3C /* ReportTableViewCell.swift in Sources */, + 388D8ADF2E73E6190044BA79 /* SwiftEntryKit.swift in Sources */, 2AFF95552CF3222400CBFB12 /* TagsViewController.swift in Sources */, 2AE6B1922CC1286D00FA5C3C /* SelectMyImageTableViewCell.swift in Sources */, 2AE6B18F2CC121BB00FA5C3C /* BottomSheetSegmentTableViewCell.swift in Sources */, @@ -3014,7 +3095,7 @@ 388A2D332D00D7BF00E2F2F0 /* UpdateProfileViewReactor.swift in Sources */, 38C2D41A2CFEAAED00CEA092 /* ProfileViewFooter.swift in Sources */, 3887D0362CC5335D00FB52E1 /* WriteCardView.swift in Sources */, - 2A5BB7CD2CDBB7D100E1C799 /* ProfileImageSettingViewController.swift in Sources */, + 2A5BB7CD2CDBB7D100E1C799 /* OnboardingProfileImageSettingViewController.swift in Sources */, 385053552C92DCF900C80B02 /* SOMTabBar.swift in Sources */, 387FBAF22C8702C100A5E139 /* SceneDelegate.swift in Sources */, 2A048E7B2C9BDF5F00FFD485 /* SOMLocationFilter.swift in Sources */, @@ -3053,8 +3134,9 @@ 38A5D1542C8CB11E00B68363 /* UIImage+SOOUM.swift in Sources */, 38F70E5E2D190FBD00B33C9D /* MainHomeTabBarReactor.swift in Sources */, 38601E182D31399400A465A9 /* CardRequest.swift in Sources */, - 2A5BB7FA2CE277AF00E1C799 /* ProfileImageSettingViewReactor.swift in Sources */, + 2A5BB7FA2CE277AF00E1C799 /* OnboardingProfileImageSettingViewReactor.swift in Sources */, 38F006AA2D395A7F001AC5F7 /* SuspensionResponse.swift in Sources */, + 38AE77D52E74580000B6FD13 /* OnboardingCompletedViewController.swift in Sources */, 3878D06F2CFFDF9600F9522F /* SettingTextCellView.swift in Sources */, 38B8A5842CAE9CC4000AFE83 /* MainHomeViewCell.swift in Sources */, 2AFF95612CF33A3900CBFB12 /* FavoriteTagView.swift in Sources */, @@ -3066,6 +3148,7 @@ 2AE6B16D2CBFBC7600FA5C3C /* UploadCardBottomSheetSegmentView.swift in Sources */, 38F720A72CD4F15900DF32B5 /* CommentCardResponse.swift in Sources */, 38B6AAE22CA4787200CE6DB6 /* MainTabBarReactor.swift in Sources */, + 38B65E792E72A29F00DF6919 /* OnboardingNumberingView.swift in Sources */, 2A5BB7D52CDCA5C900E1C799 /* TermsOfServiceAgreeButtonView.swift in Sources */, 2AFF95782CF5F0B000CBFB12 /* TagPreviewCardView.swift in Sources */, 38B543EB2D461B1A00DDF2C5 /* LocationManagerConfigruation.swift in Sources */, @@ -3080,6 +3163,7 @@ 38B8A5882CAEA5F9000AFE83 /* DetailViewCell.swift in Sources */, 389EF8172D2F450000E053AE /* Log.swift in Sources */, 3816E2372D3BEE7E004CC196 /* TermsOfServiceCellView.swift in Sources */, + 38AE77DF2E7465F500B6FD13 /* EnterMemberTransferTextFieldView+Rx.swift in Sources */, 38738D4B2D2FDCC300C37574 /* WithoutReadNotisCountResponse.swift in Sources */, 388698622D1986B100008600 /* NotificationRequest.swift in Sources */, 38572CDE2D2254E800B07C69 /* PlaceholderViewCell.swift in Sources */, @@ -3157,7 +3241,7 @@ SOOUM_CLARITY_ID = qrggvyniav; SOOUM_DISPLAY_NAME = "[D]SOOUM"; SOOUM_LOCATION_DESCRIPTION = "사용자의 위치 기반으로 피드 정보를 제공하기 위해 권한이 필요합니다."; - SOOUM_SERVER_ENDPOINT = "ec2-52-79-234-222.ap-northeast-2.compute.amazonaws.com:8080"; + SOOUM_SERVER_ENDPOINT = "test-core.sooum.org:555"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; @@ -3211,7 +3295,7 @@ SOOUM_CLARITY_ID = qrggvyniav; SOOUM_DISPLAY_NAME = "[D]SOOUM"; SOOUM_LOCATION_DESCRIPTION = "사용자의 위치 기반으로 피드 정보를 제공하기 위해 권한이 필요합니다."; - SOOUM_SERVER_ENDPOINT = "ec2-52-79-234-222.ap-northeast-2.compute.amazonaws.com:8080"; + SOOUM_SERVER_ENDPOINT = "test-core.sooum.org:555"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; diff --git a/SOOUM/SOOUM/Base/BaseNavigationViewController.swift b/SOOUM/SOOUM/Base/BaseNavigationViewController.swift index 3219bc2d..79c24adc 100644 --- a/SOOUM/SOOUM/Base/BaseNavigationViewController.swift +++ b/SOOUM/SOOUM/Base/BaseNavigationViewController.swift @@ -101,6 +101,8 @@ class BaseNavigationViewController: BaseViewController { $0.trailing.equalTo(self.navigationBar.snp.trailing) $0.height.equalTo(1.4) } + // 로딩 뷰는 항상 최상단에 표시 + self.view.bringSubviewToFront(self.loadingIndicatorView) } override func bind() { diff --git a/SOOUM/SOOUM/Base/BaseViewController.swift b/SOOUM/SOOUM/Base/BaseViewController.swift index aa8ceb40..650b8af7 100644 --- a/SOOUM/SOOUM/Base/BaseViewController.swift +++ b/SOOUM/SOOUM/Base/BaseViewController.swift @@ -13,12 +13,15 @@ import RxSwift import SnapKit import Then +import Lottie + class BaseViewController: UIViewController { var disposeBag = DisposeBag() let activityIndicatorView = SOMActivityIndicatorView() + let loadingIndicatorView = SOMLoadingIndicatorView() private(set) var isEndEditingWhenWillDisappear: Bool = true @@ -58,6 +61,11 @@ class BaseViewController: UIViewController { $0.centerX.equalTo(self.view.safeAreaLayoutGuide.snp.centerX) $0.centerY.equalTo(self.view.safeAreaLayoutGuide.snp.centerY) } + + self.view.addSubview(self.loadingIndicatorView) + self.loadingIndicatorView.snp.makeConstraints { + $0.edges.equalToSuperview() + } self.bind() diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMActivityIndicatorView.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMActivityIndicatorView.swift index 75bb28f6..21507717 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMActivityIndicatorView.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMActivityIndicatorView.swift @@ -71,13 +71,13 @@ class SOMActivityIndicatorView: UIActivityIndicatorView { self.tintColor = .clear - self.addSubviews(self.backgroundView) + self.addSubview(self.backgroundView) self.backgroundView.snp.makeConstraints { $0.center.equalToSuperview() $0.size.equalTo(40) } - self.backgroundView.addSubviews(self.imageView) + self.backgroundView.addSubview(self.imageView) self.imageView.snp.makeConstraints { $0.center.equalToSuperview() $0.size.equalTo(28) diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMButton.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMButton.swift index b65e5a05..f6f00433 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMButton.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMButton.swift @@ -7,105 +7,158 @@ import UIKit - class SOMButton: UIButton { var title: String? { didSet { if oldValue != self.title { - self.setConfiguration() + self.setNeedsUpdateConfiguration() } } } - var image: UIImage? { + var typography: Typography? { didSet { - if oldValue != self.image { - self.setConfiguration() + if oldValue != self.typography { + self.setNeedsUpdateConfiguration() } } } - var typography: Typography? { + var hasUnderlined: Bool? { didSet { - if oldValue != self.typography { - self.setConfiguration() + if oldValue != self.hasUnderlined { + self.setNeedsUpdateConfiguration() } } } - var foregroundColor: UIColor? { + var inset: UIEdgeInsets? { didSet { - if oldValue != self.foregroundColor { - self.setConfiguration() + if oldValue != self.inset { + self.setNeedsUpdateConfiguration() } } } - var hasUnderlined: Bool? { + var image: UIImage? { didSet { - if oldValue != self.hasUnderlined { - self.setConfiguration() + if oldValue != self.image { + self.setNeedsUpdateConfiguration() + } + } + } + + var imagePlacement: NSDirectionalRectEdge? { + didSet { + if oldValue != self.imagePlacement { + self.setNeedsUpdateConfiguration() + } + } + } + + var foregroundColor: UIColor? { + didSet { + if oldValue != self.foregroundColor { + self.setNeedsUpdateConfiguration() } } } override init(frame: CGRect) { super.init(frame: .zero) + self.setupConfiguration() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } +} + +private extension SOMButton { - private func setConfiguration() { + func setupConfiguration() { var configuration = UIButton.Configuration.plain() + configuration.contentInsets = .zero - // 이미지 설정 - if let image = self.image { - configuration.image = image + self.configuration = configuration + self.backgroundColor = .clear + self.layer.cornerRadius = 10 + self.clipsToBounds = true + + self.configurationUpdateHandler = { [weak self] button in + guard let self = self else { return } + + var updatedConfig = button.configuration - if let foregroundColor = self.foregroundColor { - configuration.image?.withTintColor(foregroundColor) - configuration.imageColorTransformer = UIConfigurationColorTransformer { _ in - foregroundColor + updatedConfig?.background.backgroundColor = self.backgroundColor + updatedConfig?.background.backgroundColorTransformer = UIConfigurationColorTransformer { _ in + // 비활성화 상태일 때, backgroundColor + if button.isEnabled == false { + return .som.v2.gray200 } + // 하이라이트 상태일 때, backgroundColor + if button.isHighlighted { + var highlightedColor: UIColor { + if self.backgroundColor == .som.v2.black { + return .som.v2.gray600 + } + if self.backgroundColor == .som.v2.gray100 { + return .som.v2.gray200 + } + if self.backgroundColor == .clear || self.backgroundColor == .som.v2.white{ + return .som.v2.gray100 + } + return self.backgroundColor ?? .clear + } + return highlightedColor + } + // 기본 상태일 때, backgroundColor + return self.backgroundColor ?? .clear } + + self.applyConfiguration(to: &updatedConfig) + button.configuration = updatedConfig + } + } + + func applyConfiguration(to configuration: inout UIButton.Configuration?) { + + var foregroundColor: UIColor { + return self.isEnabled ? (self.foregroundColor ?? .som.v2.white) : .som.v2.gray400 + } + + if let image = self.image { + configuration?.image = image + configuration?.imageColorTransformer = UIConfigurationColorTransformer { _ in foregroundColor } + configuration?.imagePadding = 8 + configuration?.imagePlacement = self.imagePlacement ?? .leading } - // 타이틀 설정 if let title = self.title, let typography = self.typography { var attributes = typography.attributes attributes.updateValue(typography.font, forKey: .font) - - if let foregroundColor = self.foregroundColor { - attributes.updateValue(foregroundColor, forKey: .foregroundColor) - } + attributes.updateValue(foregroundColor, forKey: .foregroundColor) if self.hasUnderlined == true { attributes.updateValue(NSUnderlineStyle.single.rawValue, forKey: .underlineStyle) - attributes.updateValue(foregroundColor ?? UIColor.som.gray400, forKey: .underlineColor) + attributes.updateValue(foregroundColor, forKey: .underlineColor) } - configuration.attributedTitle = .init(title, attributes: AttributeContainer(attributes)) - configuration.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { _ in - AttributeContainer(attributes) + if let inset = self.inset { + configuration?.contentInsets = .init( + top: inset.top, + leading: inset.left, + bottom: inset.bottom, + trailing: inset.right + ) } - if image == nil { - configuration.titleAlignment = .center - } else { - configuration.imagePadding = 2 + configuration?.attributedTitle = .init(title, attributes: AttributeContainer(attributes)) + configuration?.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { _ in + AttributeContainer(attributes) } } - - if self.backgroundColor == nil { - self.backgroundColor = .clear - - configuration.contentInsets = .zero - } - - self.configuration = configuration } } diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogAction.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogAction.swift index 632883f2..c5475e38 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogAction.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogAction.swift @@ -17,7 +17,7 @@ class SOMDialogAction { var backgroundColor: UIColor { switch self { case .primary: - return .som.p300 + return .som.v2.black case .gray: return .som.gray300 } @@ -26,7 +26,7 @@ class SOMDialogAction { var foregroundColor: UIColor { switch self { case .primary: - return .som.white + return .som.v2.white case .gray: return .som.gray700 } diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController+Show.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController+Show.swift index 124969b1..c285d268 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController+Show.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController+Show.swift @@ -14,6 +14,7 @@ extension SOMDialogViewController { static func show( title: String, message: String, + textAlignment: NSTextAlignment = .center, actions: [SOMDialogAction], dismissesWhenBackgroundTouched: Bool = false, completion: ((SOMDialogViewController) -> Void)? = nil @@ -24,6 +25,7 @@ extension SOMDialogViewController { let dialogViewController = SOMDialogViewController( title: title, message: message, + textAlignment: textAlignment, completion: { alertController in window.windowScene = nil completion?(alertController) @@ -40,6 +42,7 @@ extension SOMDialogViewController { static func show( title: String, messageView: UIView, + textAlignment: NSTextAlignment = .center, actions: [SOMDialogAction], dismissesWhenBackgroundTouched: Bool = false, completion: ((SOMDialogViewController) -> Void)? = nil @@ -50,6 +53,7 @@ extension SOMDialogViewController { let dialogViewController = SOMDialogViewController( title: title, messageView: messageView, + textAlignment: textAlignment, completion: { alertController in window.windowScene = nil completion?(alertController) diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController.swift index 76fcd83d..551033e4 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMDialogController/SOMDialogViewController.swift @@ -18,25 +18,25 @@ class SOMDialogViewController: UIViewController { /// container 밖의 영역 private let backgroundButton = UIButton().then { - $0.backgroundColor = .som.dim + $0.backgroundColor = .som.v2.dim } private let containerView = UIView().then { - $0.backgroundColor = .som.white + $0.backgroundColor = .som.v2.white $0.layer.cornerRadius = 20 } private let titleLabel = UILabel().then { - $0.textColor = .som.black - $0.typography = .som.body1WithBold + $0.textColor = .som.v2.black + $0.typography = .som.v2.head3 $0.lineBreakMode = .byWordWrapping $0.lineBreakStrategy = .hangulWordPriority $0.numberOfLines = 0 } private let messageLabel = UILabel().then { - $0.textColor = .som.gray600 - $0.typography = .som.body2WithRegular + $0.textColor = .som.v2.gray600 + $0.typography = .som.v2.body1 $0.lineBreakMode = .byWordWrapping $0.lineBreakStrategy = .hangulWordPriority $0.numberOfLines = 0 @@ -58,7 +58,7 @@ class SOMDialogViewController: UIViewController { private var message: String? { set { if let message = newValue { - let attributes = Typography.som.body2WithRegular.attributes + let attributes = Typography.som.v2.body1.attributes self.messageLabel.attributedText = .init(string: message, attributes: attributes) } self.messageLabel.isHidden = (newValue == nil) @@ -104,22 +104,31 @@ class SOMDialogViewController: UIViewController { convenience init( title: String, message: String, + textAlignment: NSTextAlignment = .center, completion: ((SOMDialogViewController) -> Void)? = nil ) { - self.init(title: title, messageView: nil, completion: completion) + self.init(title: title, messageView: nil, textAlignment: textAlignment, completion: completion) self.message = message + self.messageLabel.textAlignment = textAlignment } - init(title: String, messageView: UIView?, completion: ((SOMDialogViewController) -> Void)? = nil) { + init( + title: String, + messageView: UIView?, + textAlignment: NSTextAlignment = .center, + completion: ((SOMDialogViewController) -> Void)? = nil + ) { self.messageView = messageView super.init(nibName: nil, bundle: nil) self.setupConstraints() - let attributes = Typography.som.body1WithBold.attributes + let attributes = Typography.som.v2.head3.attributes self.titleLabel.attributedText = .init(string: title, attributes: attributes) + self.titleLabel.textAlignment = textAlignment + self.completion = completion } @@ -149,16 +158,15 @@ class SOMDialogViewController: UIViewController { self.view.addSubview(self.containerView) self.containerView.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().offset(32) - $0.trailing.equalToSuperview().offset(-32) + $0.leading.equalToSuperview().offset(52) + $0.trailing.equalToSuperview().offset(-52) } self.containerView.addSubview(self.titleLabel) self.titleLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(20) - $0.leading.greaterThanOrEqualToSuperview().offset(20) - $0.trailing.lessThanOrEqualToSuperview().offset(-20) - $0.centerX.equalToSuperview() + $0.top.equalToSuperview().offset(16) + $0.leading.equalToSuperview().offset(24) + $0.trailing.equalToSuperview().offset(-24) } if let messageView = self.messageView { @@ -166,28 +174,27 @@ class SOMDialogViewController: UIViewController { self.containerView.addSubview(messageView) messageView.snp.makeConstraints { $0.top.equalTo(self.titleLabel.snp.bottom).offset(20) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) + $0.leading.equalToSuperview().offset(24) + $0.trailing.equalToSuperview().offset(-24) } } else { self.containerView.addSubview(self.messageLabel) self.messageLabel.snp.makeConstraints { - $0.top.equalTo(self.titleLabel.snp.bottom).offset(12) - $0.leading.greaterThanOrEqualToSuperview().offset(20) - $0.trailing.lessThanOrEqualToSuperview().offset(-20) - $0.centerX.equalToSuperview() + $0.top.equalTo(self.titleLabel.snp.bottom).offset(6) + $0.leading.equalToSuperview().offset(24) + $0.trailing.equalToSuperview().offset(-24) } } self.containerView.addSubview(self.buttonContainer) self.buttonContainer.snp.makeConstraints { let hasMessage = self.message != nil - $0.top.equalTo((self.messageView ?? self.messageLabel).snp.bottom).offset(hasMessage ? 20 : 27) - $0.bottom.equalToSuperview().offset(-14) - $0.leading.equalToSuperview().offset(14) - $0.trailing.equalToSuperview().offset(-14) - $0.height.equalTo(46) + $0.top.equalTo((self.messageView ?? self.messageLabel).snp.bottom).offset(hasMessage ? 20 : 24) + $0.bottom.equalToSuperview().offset(-16) + $0.leading.equalToSuperview().offset(24) + $0.trailing.equalToSuperview().offset(-24) + $0.height.equalTo(48) } } @@ -200,11 +207,11 @@ class SOMDialogViewController: UIViewController { let button = SOMButton().then { $0.title = action.title - $0.typography = .som.body1WithBold + $0.typography = .som.v2.subtitle1 $0.foregroundColor = action.style.foregroundColor $0.backgroundColor = action.style.backgroundColor - $0.layer.cornerRadius = 12 + $0.layer.cornerRadius = 10 $0.clipsToBounds = true } button.tag = action.tag diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMLoadingIndicatorView.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMLoadingIndicatorView.swift new file mode 100644 index 00000000..b303d1d0 --- /dev/null +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMLoadingIndicatorView.swift @@ -0,0 +1,75 @@ +// +// SOMLoadingIndicatorWithLottie.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import SnapKit +import Then + +import Lottie + +class SOMLoadingIndicatorView: UIView { + + + // MARK: Views + + private let backgroundView = UIView().then { + $0.backgroundColor = .som.v2.dim + } + + private let animationView = LottieAnimationView(name: "loading_indicator_lottie").then { + $0.contentMode = .scaleAspectFit + $0.loopMode = .loop + } + + + // MARK: Init + + convenience init() { + self.init(frame: .zero) + } + + override init(frame: CGRect) { + super.init(frame: frame) + self.setupConstraints() + } + + required init(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + // MARK: Public func + + func startAnimating() { + self.isHidden = false + self.animationView.play() + } + + func stopAnimating() { + self.isHidden = true + self.animationView.stop() + } + + + // MARK: Private func + + private func setupConstraints() { + + self.isHidden = true + + self.addSubview(self.backgroundView) + self.backgroundView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + self.backgroundView.addSubviews(self.animationView) + self.animationView.snp.makeConstraints { + $0.center.equalToSuperview() + } + } +} diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMNavigationBar/SOMNavigationBar.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMNavigationBar/SOMNavigationBar.swift index 947a2eb9..8dd36754 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMNavigationBar/SOMNavigationBar.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMNavigationBar/SOMNavigationBar.swift @@ -24,7 +24,7 @@ class SOMNavigationBar: UIView { } /// 네비게이션 바 높이 - static let height: CGFloat = 44 + static let height: CGFloat = 48 private let centerContainer = UIView() private let leftContainer = UIStackView().then { @@ -54,8 +54,8 @@ class SOMNavigationBar: UIView { /// 타이틀 (text == label / logo == image) let titleLabel = UILabel().then { - $0.textColor = .som.black - $0.typography = .som.body1WithBold + $0.textColor = .som.v2.black + $0.typography = .som.v2.title1 } var title: String? { set { self.titleLabel.text = newValue } @@ -72,26 +72,26 @@ class SOMNavigationBar: UIView { /// 네비게이션 바 뒤로가기 버튼 let backButton = SOMButton().then { - $0.image = .init(.icon(.outlined(.arrowBack))) - $0.foregroundColor = .som.black + $0.image = .init(.icon(.v2(.outlined(.left)))) + $0.foregroundColor = .som.v2.black } var hidesBackButton: Bool { set { self.backButton.isHidden = newValue } get { self.backButton.isHidden } } - var spacing: CGFloat = 20 { + var spacing: CGFloat = 12 { didSet { self.refreshConstraints() } } - var leftInset: CGFloat = 20 { + var leftInset: CGFloat = 16 { didSet { self.refreshConstraints() } } - var rightInset: CGFloat = 20 { + var rightInset: CGFloat = 16 { didSet { self.refreshConstraints() } diff --git a/SOOUM/SOOUM/DesignSystem/Components/SOMTags/SOMTag.swift b/SOOUM/SOOUM/DesignSystem/Components/SOMTags/SOMTag.swift index 3a38d615..14c01394 100644 --- a/SOOUM/SOOUM/DesignSystem/Components/SOMTags/SOMTag.swift +++ b/SOOUM/SOOUM/DesignSystem/Components/SOMTags/SOMTag.swift @@ -24,7 +24,7 @@ class SOMTag: UICollectionViewCell { weak var delegate: SOMTagDelegate? private lazy var removeButton = SOMButton().then { - $0.image = .init(.image(.cancelTag)) + $0.image = .init(.image(.defaultStyle(.cancelTag))) $0.layer.cornerRadius = 8 $0.clipsToBounds = true diff --git a/SOOUM/SOOUM/DesignSystem/Foundations/SooumStyle.swift b/SOOUM/SOOUM/DesignSystem/Foundations/SooumStyle.swift index b2f20934..396263ae 100644 --- a/SOOUM/SOOUM/DesignSystem/Foundations/SooumStyle.swift +++ b/SOOUM/SOOUM/DesignSystem/Foundations/SooumStyle.swift @@ -7,6 +7,7 @@ import Foundation + // MARK: Styles public protocol SOOUMStyleCompatible { @@ -19,3 +20,12 @@ public struct SOOUMStyle { } public extension SOOUMStyleCompatible { static var som: SOOUMStyle.Type { SOOUMStyle.self } } + + +// MARK: V2 + +public struct V2Style { } + +public extension SOOUMStyle { + static var v2: V2Style.Type { V2Style.self } +} diff --git a/SOOUM/SOOUM/DesignSystem/Foundations/Typography+SOOUM.swift b/SOOUM/SOOUM/DesignSystem/Foundations/Typography+SOOUM.swift index 77dea676..2ce38f6b 100644 --- a/SOOUM/SOOUM/DesignSystem/Foundations/Typography+SOOUM.swift +++ b/SOOUM/SOOUM/DesignSystem/Foundations/Typography+SOOUM.swift @@ -75,6 +75,9 @@ fileprivate extension UIFont { extension Typography: SOOUMStyleCompatible { } extension SOOUMStyle where Base == Typography { + + // MARK: v1 + // Pretendard static var head1WithBold: Typography = .init( fontContainer: BuiltInFont(size: 22, weight: .semibold), @@ -151,3 +154,108 @@ extension SOOUMStyle where Base == Typography { letterSpacing: -0.004 ) } + +extension V2Style where Base == Typography { + + + // MARK: v2 + + // Pretandard + + /// Size: 28, Line height: 39 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var head1: Typography = .init( + fontContainer: BuiltInFont(size: 28, weight: .bold), + lineHeight: 39, + letterSpacing: -0.025 + ) + /// Size: 24, Line height: 34 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var head2: Typography = .init( + fontContainer: BuiltInFont(size: 24, weight: .bold), + lineHeight: 34, + letterSpacing: -0.025 + ) + /// Size: 20, Line height: 28 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var head3: Typography = .init( + fontContainer: BuiltInFont(size: 20, weight: .bold), + lineHeight: 28, + letterSpacing: -0.025 + ) + /// Size: 18, Line height: 27 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var title1: Typography = .init( + fontContainer: BuiltInFont(size: 18, weight: .semibold), + lineHeight: 27, + letterSpacing: -0.025 + ) + /// Size: 16, Line height: 24 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var title2: Typography = .init( + fontContainer: BuiltInFont(size: 16, weight: .semibold), + lineHeight: 24, + letterSpacing: -0.025 + ) + /// Size: 16, Line height: 24 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var subtitle1: Typography = .init( + fontContainer: BuiltInFont(size: 16, weight: .medium), + lineHeight: 24, + letterSpacing: -0.025 + ) + /// Size: 14, Line height: 21 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var subtitle2: Typography = .init( + fontContainer: BuiltInFont(size: 14, weight: .semibold), + lineHeight: 21, + letterSpacing: -0.025 + ) + /// Size: 14, Line height: 21 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var body1: Typography = .init( + fontContainer: BuiltInFont(size: 14, weight: .medium), + lineHeight: 21, + letterSpacing: -0.025 + ) + /// Size: 14, Line height: 21 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var body2: Typography = .init( + fontContainer: BuiltInFont(size: 14, weight: .regular), + lineHeight: 21, + letterSpacing: -0.025 + ) + /// Size: 12, Line height: 18 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var caption1: Typography = .init( + fontContainer: BuiltInFont(size: 12, weight: .semibold), + lineHeight: 18, + letterSpacing: -0.025 + ) + /// Size: 12, Line height: 18 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var caption2: Typography = .init( + fontContainer: BuiltInFont(size: 12, weight: .medium), + lineHeight: 18, + letterSpacing: -0.025 + ) + /// Size: 10, Line height: 15 + /// + /// Weight: [Thin: 100, UltraLight: 200, Light: 300, Regular: 400, Medium: 500, SemiBold: 600, Bold: 700, Heavy: 800, Black: 900] + static var caption3: Typography = .init( + fontContainer: BuiltInFont(size: 10, weight: .medium), + lineHeight: 15, + letterSpacing: -0.025 + ) +} diff --git a/SOOUM/SOOUM/DesignSystem/Foundations/UIColor+SOOUM.swift b/SOOUM/SOOUM/DesignSystem/Foundations/UIColor+SOOUM.swift index 628e786c..11e83082 100644 --- a/SOOUM/SOOUM/DesignSystem/Foundations/UIColor+SOOUM.swift +++ b/SOOUM/SOOUM/DesignSystem/Foundations/UIColor+SOOUM.swift @@ -47,3 +47,37 @@ extension SOOUMStyle where Base == UIColor { // Dim static let dim = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) } + +extension V2Style where Base == UIColor { + + // Gray Scale + static let white = UIColor(hex: "#FFFFFF") + static let gray100 = UIColor(hex: "#F5F7FA") + static let gray200 = UIColor(hex: "#E4EAF1") + static let gray300 = UIColor(hex: "#BFC9D3") + static let gray400 = UIColor(hex: "#919DA9") + static let gray500 = UIColor(hex: "#5D6369") + static let gray600 = UIColor(hex: "#3A3F44") + static let black = UIColor(hex: "#212121") + + // Primary + static let pLight1 = UIColor(hex: "#D7F1F9") + static let pLight2 = UIColor(hex: "#8CE1F4") + static let pMain = UIColor(hex: "#20C6EC") + static let pDark = UIColor(hex: "#07ABD0") + + // Success + static let gLight = UIColor(hex: "#D3F5EB") + static let gMain = UIColor(hex: "#009262") + + // Warning + static let yLight = UIColor(hex: "#FFF0D7") + static let yMain = UIColor(hex: "#FFB240") + + // Danger + static let rLight = UIColor(hex: "#FFE1DF") + static let rMain = UIColor(hex: "#EE3A26") + + // Dim + static let dim = UIColor(r: 0, g: 0, b: 0, a: 0.6) +} diff --git a/SOOUM/SOOUM/DesignSystem/Foundations/UIImage+SOOUM.swift b/SOOUM/SOOUM/DesignSystem/Foundations/UIImage+SOOUM.swift index 93f6b851..e1a13059 100644 --- a/SOOUM/SOOUM/DesignSystem/Foundations/UIImage+SOOUM.swift +++ b/SOOUM/SOOUM/DesignSystem/Foundations/UIImage+SOOUM.swift @@ -12,11 +12,12 @@ extension UIImage { enum SOOUMType: Equatable { case icon(IconStyle) case image(ImageStyle) - case logo + case logo(LogoStyle) enum IconStyle { case filled(Filled) case outlined(Outlined) + case v2(V2IconStyle) enum Filled: String { case addCard @@ -64,29 +65,59 @@ extension UIImage { var imageName: String { switch self { - case .filled(let filled): + case let .filled(filled): return "\(filled.rawValue)_filled" - case .outlined(let outlined): + case let .outlined(outlined): return "\(outlined.rawValue)_outlined" + case let .v2(iconStyle): + return iconStyle.imageName } } } - enum ImageStyle: String { - case cancelTag - case errorTriangle - case login - case sooumLogo + enum ImageStyle { + case defaultStyle(DefaultStyle) + case v2(V2ImageStyle) + + enum DefaultStyle: String { + case cancelTag + case errorTriangle + case login + case sooumLogo + } + + var imageName: String { + switch self { + case let .defaultStyle(defaultStyle): + return defaultStyle.rawValue + case let .v2(imageStyle): + return imageStyle.rawValue + } + } + } + + enum LogoStyle { + case logo + case v2(V2LogoStyle) + + var imageName: String { + switch self { + case .logo: + return "logo" + case let .v2(logoStyle): + return logoStyle.rawValue + } + } } var imageName: String { switch self { - case .icon(let iconStyle): + case let .icon(iconStyle): return iconStyle.imageName - case .image(let imageStyle): - return imageStyle.rawValue - case .logo: - return "logo" + case let .image(imageStyle): + return imageStyle.imageName + case let .logo(logoStyle): + return logoStyle.imageName } } @@ -99,3 +130,84 @@ extension UIImage { self.init(named: som.imageName) } } + + +// MARK: V2 + +extension UIImage.SOOUMType { + + enum V2IconStyle { + case filled(Filled) + case outlined(Outlined) + + enum Filled: String { + case bell + case camera + case danger + case heart + case home + case image + case info + case location + case message_circle + case message_square + case settings + case star + case tag + case time + case trash + case user + case write + } + + enum Outlined: String { + case bell + case camera + case check + case danger + case delete + case down + case error + case heart + case home + case image + case left + case location + case message_circle + case message_square + case more + case plus + case right + case search + case settings + case star + case swap + case tag + case time + case trash + case up + case user + case write + } + + var imageName: String { + switch self { + case let .filled(filled): + return "\(filled.rawValue)_filled" + case let .outlined(outlined): + return "\(outlined.rawValue)_outlined" + } + } + } + + enum V2ImageStyle: String { + case onboarding + case onboarding_finish + case check_square_light + case profile + } + + enum V2LogoStyle: String { + case logo_white + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewController.swift index 13239661..3d2c2ea1 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewController.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewController.swift @@ -19,22 +19,16 @@ class LaunchScreenViewController: BaseViewController, View { enum Text { static let updateVerionTitle: String = "업데이트 안내" - static let updateVersionMessage: String = "안정적인 서비스 사용을 위해\n최신버전으로 업데이트해주세요" + static let updateVersionMessage: String = "새로운 버전이 출시되었습니다. 더 나은 사용을 위해, 서비스 업데이트 후 이용 바랍니다." static let testFlightStrUrl: String = "itms-beta://testflight.apple.com/v1/app" static let appStoreStrUrl: String = "itms-apps://itunes.apple.com/app/id" - static let exitActionTitle: String = "종료하기" - static let updateActionTitle: String = "업데이트" + static let updateActionTitle: String = "새로워진 숨 사용하기" } - let viewForAnimation = UIView().then { - $0.backgroundColor = UIColor(hex: "#A2E3FF") - } - - let imageView = UIImageView(image: .init(.logo)).then { + let imageView = UIImageView(image: .init(.logo(.v2(.logo_white)))).then { $0.contentMode = .scaleAspectFit - $0.tintColor = .som.white } override var preferredStatusBarStyle: UIStatusBarStyle { @@ -42,31 +36,22 @@ class LaunchScreenViewController: BaseViewController, View { } override func setupConstraints() { - self.view.backgroundColor = UIColor(hex: "#A2E3FF") + self.view.backgroundColor = .som.v2.pMain self.view.addSubview(self.imageView) self.imageView.snp.makeConstraints { $0.centerX.equalToSuperview() $0.centerY.equalTo(self.view.safeAreaLayoutGuide.snp.centerY) - $0.width.equalTo(235) - $0.height.equalTo(45) - } - - self.view.addSubview(self.viewForAnimation) - self.viewForAnimation.snp.makeConstraints { - $0.edges.equalTo(self.imageView) + $0.width.equalTo(200) + $0.height.equalTo(33) } } func bind(reactor: LaunchScreenViewReactor) { - // 애니메이션이 끝나면 launch action - self.rx.viewDidLayoutSubviews - .subscribe(with: self) { object, _ in - object.animate(to: 45) { _ in - reactor.action.onNext(.launch) - } - } + self.rx.viewDidLoad + .map { _ in Reactor.Action.launch } + .bind(to: reactor.action) .disposed(by: self.disposeBag) // 앱 버전 검사 @@ -75,18 +60,6 @@ class LaunchScreenViewController: BaseViewController, View { .filter { $0 } .subscribe(with: self) { object, _ in - let exitAction = SOMDialogAction( - title: Text.exitActionTitle, - style: .gray, - action: { - // 앱 종료 - // 자연스럽게 종료하기 위해 종료전, suspend 상태로 변경 후 종료 - UIApplication.shared.perform(#selector(NSXPCConnection.suspend)) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { - exit(0) - } - } - ) let updateAction = SOMDialogAction( title: Text.updateActionTitle, style: .primary, @@ -112,7 +85,8 @@ class LaunchScreenViewController: BaseViewController, View { SOMDialogViewController.show( title: Text.updateVerionTitle, message: Text.updateVersionMessage, - actions: [exitAction, updateAction] + textAlignment: .left, + actions: [updateAction] ) } .disposed(by: self.disposeBag) @@ -144,19 +118,3 @@ class LaunchScreenViewController: BaseViewController, View { .disposed(by: self.disposeBag) } } - -extension LaunchScreenViewController { - - private func animate(to height: CGFloat, completion: @escaping ((Bool) -> Void)) { - - UIView.animate( - withDuration: 0.5, - delay: 0.2, - options: [.beginFromCurrentState, .curveEaseOut], - animations: { - self.viewForAnimation.transform = .init(translationX: 0, y: height) - }, - completion: completion - ) - } -} diff --git a/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewReactor.swift index d1679f27..780fe4f3 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewReactor.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Launch/LaunchScreenViewReactor.swift @@ -65,8 +65,10 @@ class LaunchScreenViewReactor: Reactor { if isTransfered { self.provider.authManager.initializeAuthInfo() return .just(.updateIsRegistered(false)) + .delay(.milliseconds(500), scheduler: MainScheduler.instance) } else { return self.check() + .delay(.milliseconds(500), scheduler: MainScheduler.instance) } } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewController.swift new file mode 100644 index 00000000..491fd516 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewController.swift @@ -0,0 +1,98 @@ +// +// OnboardingCompletedViewController.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import ReactorKit + +import SnapKit +import Then + +class OnboardingCompletedViewController: BaseNavigationViewController, View { + + enum Text { + static let title: String = "가입 완료" + static let message: String = "숨에 오신 걸 환영해요" + + static let confirmButtonTitle: String = "확인" + } + + + // MARK: Views + + private let imageView = UIImageView().then { + $0.image = .init(.image(.v2(.onboarding_finish))) + $0.contentMode = .scaleAspectFit + } + + private let titleLabel = UILabel().then { + $0.text = Text.title + $0.textColor = .som.v2.pDark + $0.typography = .som.v2.title2 + } + + private let messageLabel = UILabel().then { + $0.text = Text.message + $0.textColor = .som.v2.black + $0.typography = .som.v2.head1 + } + + private let confirmButton = SOMButton().then { + $0.title = Text.confirmButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black + } + + + // MARK: Override func + + override func setupConstraints() { + super.setupConstraints() + + self.isNavigationBarHidden = true + + let container = UIStackView(arrangedSubviews: [ + self.imageView, + self.titleLabel, + self.messageLabel + ]).then { + $0.axis = .vertical + $0.alignment = .center + $0.setCustomSpacing(32, after: self.imageView) + $0.setCustomSpacing(4, after: self.titleLabel) + } + self.view.addSubview(container) + container.snp.makeConstraints { + $0.centerY.equalTo(self.view.safeAreaLayoutGuide.snp.centerY).offset(-56) + $0.centerX.equalToSuperview() + } + + self.view.addSubview(self.confirmButton) + self.confirmButton.snp.makeConstraints { + $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(56) + } + } + + func bind(reactor: OnboardingCompletedViewReactor) { + + // Action + self.confirmButton.rx.throttleTap + .subscribe(with: self) { object, _ in + let viewController = MainTabBarController() + viewController.reactor = reactor.reactorForMainTabBar() + let navigationController = UINavigationController( + rootViewController: viewController + ) + object.view.window?.rootViewController = navigationController + } + .disposed(by: self.disposeBag) + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewReactor.swift new file mode 100644 index 00000000..0c299b55 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Completed/OnboardingCompletedViewReactor.swift @@ -0,0 +1,31 @@ +// +// OnboardingCompletedViewReactor.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import ReactorKit + +class OnboardingCompletedViewReactor: Reactor { + + typealias Action = NoAction + typealias Mutation = NoMutation + + struct State { } + + var initialState: State { .init() } + + let provider: ManagerProviderType + + init(provider: ManagerProviderType) { + self.provider = provider + } +} + +extension OnboardingCompletedViewReactor { + + func reactorForMainTabBar() -> MainTabBarReactor { + MainTabBarReactor(provider: self.provider) + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewController.swift index e829bfa1..d2c88d32 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewController.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewController.swift @@ -53,57 +53,58 @@ class OnboardingNicknameSettingViewController: BaseNavigationViewController, Vie "코뿔소", "물소", "개구리", "거북이" ] - static let title: String = "반가워요!\n당신을 어떻게 부르면 될까요?" - static let message: String = "닉네임은 추후 변경이 가능해요" + static let navigationTitle: String = "회원가입" - static let placeholder: String = "닉네임을 입력해주세요" + static let title: String = "숨에서 사용할 닉네임을\n입력해주세요" + static let guideMessage: String = "최대 8자까지 입력할 수 있어요" - static let confirmButtonTitle: String = "확인" + static let nextButtonTitle: String = "다음" } // MARK: Views - private let guideMessageView = OnboardingGuideMessageView(title: Text.title, message: Text.message) + private let guideMessageView = OnboardingGuideMessageView(title: Text.title, currentNumber: 2) - private let nicknameTextField = OnboardingNicknameTextFieldView().then { - $0.placeholder = Text.placeholder - } + private let nicknameTextField = OnboardingNicknameTextFieldView() private let nextButton = SOMButton().then { - $0.title = Text.confirmButtonTitle - $0.typography = .som.body1WithBold - $0.foregroundColor = .som.gray600 - - $0.backgroundColor = .som.gray300 - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true + $0.title = Text.nextButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black } // MARK: Override func + override func setupNaviBar() { + super.setupNaviBar() + + self.navigationBar.title = Text.navigationTitle + } + override func setupConstraints() { self.view.addSubview(self.guideMessageView) self.guideMessageView.snp.makeConstraints { - $0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(28) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) + $0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(16) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } - self.view.addSubview(nicknameTextField) - nicknameTextField.snp.makeConstraints { - $0.top.equalTo(self.guideMessageView.snp.bottom).offset(24) + self.view.addSubview(self.nicknameTextField) + self.nicknameTextField.snp.makeConstraints { + $0.top.equalTo(self.guideMessageView.snp.bottom).offset(32) $0.leading.trailing.equalToSuperview() } self.view.addSubview(self.nextButton) self.nextButton.snp.makeConstraints { - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.bottom.equalTo(view.safeAreaLayoutGuide).offset(-12) - $0.height.equalTo(48) + $0.bottom.equalTo(view.safeAreaLayoutGuide) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(56) } } @@ -141,7 +142,7 @@ class OnboardingNicknameSettingViewController: BaseNavigationViewController, Vie self.nextButton.rx.tap .withLatestFrom(nickname) .subscribe(with: self) { object, nickname in - let profileImageVC = ProfileImageSettingViewController() + let profileImageVC = OnboardingProfileImageSettingViewController() profileImageVC.reactor = reactor.reactorForProfileImage(nickname: nickname) object.navigationPush(profileImageVC, animated: true) } @@ -150,16 +151,15 @@ class OnboardingNicknameSettingViewController: BaseNavigationViewController, Vie // State reactor.state.map(\.isValid) .distinctUntilChanged() - .subscribe(with: self, onNext: { object, isValid in - object.nextButton.foregroundColor = isValid ? .som.white : .som.gray600 - object.nextButton.backgroundColor = isValid ? .som.p300 : .som.gray300 - object.nextButton.isEnabled = isValid - }) + .bind(to: self.nextButton.rx.isEnabled) .disposed(by: disposeBag) reactor.state.map(\.errorMessage) .distinctUntilChanged() - .bind(to: self.nicknameTextField.rx.errorMessage) + .subscribe(with: self) { object, errorMessage in + object.nicknameTextField.guideMessage = errorMessage == nil ? Text.guideMessage : errorMessage + object.nicknameTextField.hasError = errorMessage != nil + } .disposed(by: self.disposeBag) } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewReactor.swift index 7fd2922a..e1506240 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewReactor.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/OnboardingNicknameSettingViewReactor.swift @@ -81,7 +81,7 @@ class OnboardingNicknameSettingViewReactor: Reactor { extension OnboardingNicknameSettingViewReactor { - func reactorForProfileImage(nickname: String) -> ProfileImageSettingViewReactor { - ProfileImageSettingViewReactor(provider: self.provider, nickname: nickname) + func reactorForProfileImage(nickname: String) -> OnboardingProfileImageSettingViewReactor { + OnboardingProfileImageSettingViewReactor(provider: self.provider, nickname: nickname) } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/Views/OnboardingNicknameTextFieldView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/Views/OnboardingNicknameTextFieldView.swift index 32641fbb..7a5fbd08 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/Views/OnboardingNicknameTextFieldView.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/NicknameSetting/Views/OnboardingNicknameTextFieldView.swift @@ -17,8 +17,8 @@ class OnboardingNicknameTextFieldView: UIView { // MARK: Views private lazy var textFieldBackgroundView = UIView().then { - $0.backgroundColor = .som.gray50 - $0.layer.cornerRadius = 12 + $0.backgroundColor = .som.v2.gray100 + $0.layer.cornerRadius = 10 let gestureRecognizer = UITapGestureRecognizer( target: self, @@ -30,9 +30,9 @@ class OnboardingNicknameTextFieldView: UIView { lazy var textField = UITextField().then { let paragraphStyle = NSMutableParagraphStyle() $0.defaultTextAttributes[.paragraphStyle] = paragraphStyle - $0.defaultTextAttributes[.foregroundColor] = UIColor.som.black - $0.defaultTextAttributes[.font] = Typography.som.body1WithRegular.font - $0.tintColor = .som.p300 + $0.defaultTextAttributes[.foregroundColor] = UIColor.som.v2.black + $0.defaultTextAttributes[.font] = Typography.som.v2.subtitle1.font + $0.tintColor = UIColor.som.v2.black $0.enablesReturnKeyAutomatically = true $0.returnKeyType = .go @@ -47,33 +47,26 @@ class OnboardingNicknameTextFieldView: UIView { $0.delegate = self } - private let errorMessageContainer = UIStackView().then { + private let guideMessageContainer = UIStackView().then { $0.axis = .horizontal $0.alignment = .center - $0.distribution = .equalSpacing - $0.spacing = 4 - - $0.isHidden = true + $0.spacing = 6 } private let errorImageView = UIImageView().then { - $0.image = .init(.image(.errorTriangle)) - $0.tintColor = .som.red - } - - private let errorMessageLabel = UILabel().then { - $0.textColor = .som.red - $0.typography = .som.body2WithBold + $0.image = .init(.icon(.v2(.outlined(.error)))) + $0.tintColor = .som.v2.rMain + $0.isHidden = true } - private let characterLabel = UILabel().then { - $0.textColor = .som.gray500 - $0.typography = .som.body1WithRegular + private let guideMessageLabel = UILabel().then { + $0.textColor = .som.v2.gray500 + $0.typography = .som.v2.caption2 } private lazy var clearButton = SOMButton().then { - $0.image = .init(.icon(.outlined(.cancel))) - $0.foregroundColor = .som.black + $0.image = .init(.icon(.v2(.outlined(.delete)))) + $0.foregroundColor = .som.v2.gray500 let gestureRecognizer = UITapGestureRecognizer( target: self, @@ -96,33 +89,22 @@ class OnboardingNicknameTextFieldView: UIView { } } - var placeholder: String? { + var guideMessage: String? { set { - if let string: String = newValue { - self.textField.attributedPlaceholder = NSAttributedString( - string: string, - attributes: [ - .foregroundColor: UIColor.som.gray500, - .font: Typography.som.body1WithRegular.font - ] - ) - } else { - self.textField.attributedPlaceholder = nil - } + self.guideMessageLabel.text = newValue } - get { - return self.textField.attributedPlaceholder?.string + return self.guideMessageLabel.text } } - var errorMessage: String? { + var hasError: Bool { set { - self.errorMessageContainer.isHidden = newValue == nil - self.errorMessageLabel.text = newValue + self.errorImageView.isHidden = newValue == false + self.guideMessageLabel.textColor = newValue == false ? .som.v2.gray500 : .som.v2.rMain } get { - return self.errorMessageLabel.text + self.errorImageView.isHidden == false } } @@ -185,43 +167,37 @@ class OnboardingNicknameTextFieldView: UIView { self.addSubview(self.textFieldBackgroundView) self.textFieldBackgroundView.snp.makeConstraints { $0.top.equalToSuperview() - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(52) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(54) } self.textFieldBackgroundView.addSubview(self.textField) self.textField.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().offset(12) + $0.leading.equalToSuperview().offset(24) } self.textFieldBackgroundView.addSubview(self.clearButton) self.clearButton.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalTo(self.textField.snp.trailing).offset(9) - $0.trailing.equalToSuperview().offset(-8) - $0.size.equalTo(32) + $0.leading.equalTo(self.textField.snp.trailing).offset(14) + $0.trailing.equalToSuperview().offset(-24) + $0.size.equalTo(24) } - self.addSubview(self.errorMessageContainer) - self.errorMessageContainer.snp.makeConstraints { - $0.top.equalTo(self.textFieldBackgroundView.snp.bottom).offset(10) + self.addSubview(self.guideMessageContainer) + self.guideMessageContainer.snp.makeConstraints { + $0.top.equalTo(self.textFieldBackgroundView.snp.bottom).offset(8) $0.bottom.equalToSuperview() - $0.leading.equalToSuperview().offset(20) - $0.height.equalTo(24) + $0.leading.equalToSuperview().offset(16) + $0.trailing.lessThanOrEqualToSuperview().offset(-16) + $0.height.equalTo(18) } - self.errorMessageContainer.addArrangedSubview(self.errorImageView) + self.guideMessageContainer.addArrangedSubview(self.errorImageView) self.errorImageView.snp.makeConstraints { - $0.size.equalTo(24) - } - self.errorMessageContainer.addArrangedSubview(self.errorMessageLabel) - - self.addSubview(self.characterLabel) - self.characterLabel.snp.makeConstraints { - $0.top.equalTo(self.textFieldBackgroundView.snp.bottom).offset(12) - $0.leading.greaterThanOrEqualTo(self.errorMessageContainer.snp.trailing).offset(20) - $0.trailing.equalToSuperview().offset(-20) + $0.size.equalTo(16) } + self.guideMessageContainer.addArrangedSubview(self.guideMessageLabel) } } @@ -248,13 +224,6 @@ extension OnboardingNicknameTextFieldView: UITextFieldDelegate { return newString.count < self.maxCharacter + 1 } - func textFieldDidChangeSelection(_ textField: UITextField) { - - let text = textField.text ?? "" - self.clearButton.isHidden = text.isEmpty - self.characterLabel.text = text.count.description + "/" + self.maxCharacter.description - } - func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewController.swift index 960cc018..4dd2800a 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewController.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewController.swift @@ -18,12 +18,23 @@ import Then class OnboardingViewController: BaseNavigationViewController, View { enum Text { - static let guideText: String = "당신의 소중한 이야기를\n익명의 친구들에게 들려주세요" - static let startButtonText: String = "숨 시작하기" - static let oldUserButtonText: String = "기존 계정이 있으신가요?" + static let guideTitle: String = "숨겨진 진심이 모이는 공간" + static let guideSubTitle: String = "당신의 이야기를 편하게 남겨요" - static let banUserDialogTitle: String = "기존 정지된 계정으로\n가입이 불가능 합니다." - static let resignDialogTitle: String = "최근 탈퇴한 이력이 있습니다." + static let firstGuideMessage: String = "숨은 가입 시 어떤 개인정보도 요구하지 않아요" + static let secondGuideMessage: String = "자동으로 추천되는 닉네임으로 5초면 가입해요" + static let thirdGuideMessage: String = "익명으로 솔직한 이야기를 나눠요" + + static let startButtonTitle: String = "숨 시작하기" + static let oldUserButtontitle: String = "기존 계정이 있으신가요?" + + static let banUserDialogTitle: String = "가입할 수 없는 계정이에요" + static let banUserDialogLeadingMessage: String = "이 계정은 정지된 이력이 있습니다. 새 계정은 " + + static let resignDialogTitle: String = "최근 탈퇴한 계정이에요" + static let resignDialogLeadingMessage: String = "탈퇴일로부터 7일 후 새 계정을 만들 수 있습니다. 새 계정은 " + + static let dialogTrailingMessage: String = "부터 만들 수 있습니다." static let confirmActionTitle: String = "확인" } @@ -31,50 +42,58 @@ class OnboardingViewController: BaseNavigationViewController, View { // MARK: Views - private let backgroundImageView = UIImageView().then { - $0.image = .init(.image(.login)) - $0.contentMode = .scaleAspectFill + private let guideTitleLabel = UILabel().then { + $0.text = Text.guideTitle + $0.textColor = .som.v2.black + $0.typography = .som.v2.head1 } - private let guideLabel = UILabel().then { - $0.text = Text.guideText - $0.textColor = .som.p300 - $0.typography = .init( - fontContainer: BuiltInFont(size: 22, weight: .semibold), - lineHeight: 35, - letterSpacing: 0.05, - alignment: .left - ) - $0.numberOfLines = 0 + private let guideSubTitleLabel = UILabel().then { + $0.text = Text.guideSubTitle + $0.textColor = .som.v2.gray500 + $0.typography = .som.v2.title2 + } + + private let onboardingImageView = UIImageView().then { + $0.image = .init(.image(.v2(.onboarding))) + $0.contentMode = .scaleAspectFit + } + + private let guideMessageContainer = UIStackView().then { + $0.axis = .vertical + $0.alignment = .fill + $0.distribution = .equalSpacing + $0.spacing = 6 } private let startButton = SOMButton().then { - $0.title = Text.startButtonText - $0.typography = .init( - fontContainer: BuiltInFont(size: 16, weight: .heavy), - lineHeight: 20, - letterSpacing: 0.05 - ) - $0.foregroundColor = .som.white - - $0.backgroundColor = .som.p300 - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true + $0.title = Text.startButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black } private let oldUserButton = SOMButton().then { - $0.title = Text.oldUserButtonText - $0.typography = .init( - fontContainer: BuiltInFont(size: 14, weight: .bold), - lineHeight: 20, - letterSpacing: 0.05 - ) - $0.foregroundColor = UIColor(hex: "#B4B4B4") + $0.title = Text.oldUserButtontitle + $0.typography = .som.v2.body1 + $0.foregroundColor = .som.v2.gray500 $0.hasUnderlined = true + $0.inset = .init(top: 6, left: 16, bottom: 6, right: 16) } + // MARK: Override func + override func viewDidLoad() { + super.viewDidLoad() + + self.setupGuideMessage([ + Text.firstGuideMessage, + Text.secondGuideMessage, + Text.thirdGuideMessage + ]) + } + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) @@ -84,31 +103,46 @@ class OnboardingViewController: BaseNavigationViewController, View { override func setupConstraints() { super.setupConstraints() - self.view.addSubview(self.backgroundImageView) - self.backgroundImageView.snp.makeConstraints { - $0.edges.equalToSuperview() + self.view.addSubview(self.guideTitleLabel) + self.guideTitleLabel.snp.makeConstraints { + $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(60) + $0.leading.equalToSuperview().offset(16) + $0.trailing.lessThanOrEqualToSuperview().offset(-16) } - self.view.addSubview(self.guideLabel) - self.guideLabel.snp.makeConstraints { - /// 실 기기 높이 * 0.6 - $0.top.equalToSuperview().offset(UIScreen.main.bounds.height * 0.6) - $0.leading.equalToSuperview().offset(20) + self.view.addSubview(self.guideSubTitleLabel) + self.guideSubTitleLabel.snp.makeConstraints { + $0.top.equalTo(self.guideTitleLabel.snp.bottom).offset(4) + $0.leading.equalToSuperview().offset(16) + $0.trailing.lessThanOrEqualToSuperview().offset(-16) } - self.view.addSubview(self.startButton) - self.startButton.snp.makeConstraints { - $0.bottom.equalToSuperview().offset(-128) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(56) + self.view.addSubview(self.onboardingImageView) + self.onboardingImageView.snp.makeConstraints { + $0.top.equalTo(self.guideSubTitleLabel.snp.bottom).offset(80) + $0.centerX.equalToSuperview() + } + + self.view.addSubview(self.guideMessageContainer) + self.guideMessageContainer.snp.makeConstraints { + $0.top.equalTo(self.onboardingImageView.snp.bottom).offset(60) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.oldUserButton) self.oldUserButton.snp.makeConstraints { - $0.top.equalTo(self.startButton.snp.bottom).offset(21) + $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(6) $0.centerX.equalToSuperview() } + + self.view.addSubview(self.startButton) + self.startButton.snp.makeConstraints { + $0.bottom.equalTo(self.oldUserButton.snp.top).offset(-14) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(56) + } } @@ -122,17 +156,27 @@ class OnboardingViewController: BaseNavigationViewController, View { .bind(to: reactor.action) .disposed(by: self.disposeBag) - self.rx.viewWillAppear - .map { _ in Reactor.Action.reset } - .bind(to: reactor.action) - .disposed(by: self.disposeBag) + let startButtonTapped = self.startButton.rx.tap.share() + let suspension = reactor.state.map(\.suspension).share() - // Navigation - self.startButton.rx.tap - .map { _ in Reactor.Action.check } - .bind(to: reactor.action) + startButtonTapped + .withLatestFrom(suspension) + .filter { $0 == nil } + .subscribe(with: self) { object, _ in + let termsOfServiceViewController = OnboardingTermsOfServiceViewController() + termsOfServiceViewController.reactor = reactor.reactorForTermsOfService() + object.navigationPush(termsOfServiceViewController, animated: true) + } .disposed(by: disposeBag) + startButtonTapped + .withLatestFrom(suspension) + .filterNil() + .subscribe(with: self) { object, suspension in + object.showDialog(suspension) + } + .disposed(by: self.disposeBag) + self.oldUserButton.rx.tap .subscribe(with: self) { object, _ in let enterMemberTransferViewController = EnterMemberTransferViewController() @@ -142,39 +186,15 @@ class OnboardingViewController: BaseNavigationViewController, View { .disposed(by: disposeBag) // State - reactor.state.map(\.suspension) + suspension .filterNil() + .take(1) .subscribe(with: self) { object, suspension in - let dialogMessageView = DialogMessageView( - isBanUser: suspension.isBanUser, - banDateString: suspension.untilBan.banEndFormatted - ) - - let confirmAction = SOMDialogAction( - title: Text.confirmActionTitle, - style: .primary, - action: { - UIApplication.topViewController?.dismiss(animated: true) - } - ) - - SOMDialogViewController.show( - title: suspension.isBanUser ? Text.banUserDialogTitle : Text.resignDialogTitle, - messageView: dialogMessageView, - actions: [confirmAction] - ) + object.showDialog(suspension) } .disposed(by: self.disposeBag) - reactor.state.map(\.shouldNavigate) - .filter { $0 } - .subscribe(with: self) { object, _ in - let termsOfServiceViewController = OnboardingTermsOfServiceViewController() - termsOfServiceViewController.reactor = reactor.reactorForTermsOfService() - object.navigationPush(termsOfServiceViewController, animated: true) - } - .disposed(by: self.disposeBag) - + reactor.state.map(\.shouldHideTransfer) .subscribe(with: self) { object, shouldHide in object.oldUserButton.isHidden = shouldHide @@ -182,3 +202,54 @@ class OnboardingViewController: BaseNavigationViewController, View { .disposed(by: self.disposeBag) } } + +extension OnboardingViewController { + + func showDialog(_ suspension: Suspension) { + let dialogLeadingMessage = suspension.isBanUser ? Text.banUserDialogLeadingMessage : Text.resignDialogLeadingMessage + let dialogMessage = dialogLeadingMessage + suspension.untilBan.banEndFormatted + Text.dialogTrailingMessage + + let confirmAction = SOMDialogAction( + title: Text.confirmActionTitle, + style: .primary, + action: { + UIApplication.topViewController?.dismiss(animated: true) + } + ) + + SOMDialogViewController.show( + title: suspension.isBanUser ? Text.banUserDialogTitle : Text.resignDialogTitle, + message: dialogMessage, + textAlignment: .left, + actions: [confirmAction] + ) + } + + func setupGuideMessage(_ messages: [String]) { + + messages.forEach { message in + + let imageView = UIImageView().then { + $0.image = .init(.image(.v2(.check_square_light))) + $0.setContentHuggingPriority(.defaultHigh, for: .horizontal) + } + + let label = UILabel().then { + $0.text = message + $0.textColor = .som.v2.gray400 + $0.typography = .som.v2.body1 + $0.textAlignment = .left + } + + let container = UIStackView(arrangedSubviews: [imageView, label]).then { + $0.axis = .horizontal + $0.spacing = 8 + } + container.snp.makeConstraints { + $0.height.equalTo(24) + } + + self.guideMessageContainer.addArrangedSubview(container) + } + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewReactor.swift index 2b263d4d..6acccee7 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewReactor.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/OnboardingViewReactor.swift @@ -12,19 +12,15 @@ class OnboardingViewReactor: Reactor { enum Action: Equatable { case landing - case reset - case check } enum Mutation { - case check(Suspension) - case shouldNavigate(Bool) + case check(Suspension?) } struct State { fileprivate(set) var suspension: Suspension? - fileprivate(set) var shouldNavigate: Bool = false fileprivate(set) var shouldHideTransfer: Bool } @@ -45,29 +41,18 @@ class OnboardingViewReactor: Reactor { return .concat([ self.check() - .compactMap(\.value) - .map(Mutation.check), + .compactMap(Mutation.check), self.provider.pushManager.switchNotification(on: true) .flatMapLatest { _ -> Observable in .empty() } ]) - case .reset: - - return .just(.shouldNavigate(false)) - case .check: - - return self.check() - .map { $0 == nil } - .map(Mutation.shouldNavigate) } } func reduce(state: State, mutation: Mutation) -> State { - var state = state + var newState = state switch mutation { case let .check(suspension): - state.suspension = suspension - case let .shouldNavigate(shouldNavigate): - state.shouldNavigate = shouldNavigate + newState.suspension = suspension } return state } @@ -92,7 +77,7 @@ extension OnboardingViewReactor { return object.provider.networkManager.request(SuspensionResponse.self, request: request) .map(\.suspension) } else { - return .empty() + return .just(nil) } } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/Views/DialogMessageView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/Views/DialogMessageView.swift deleted file mode 100644 index a11149c9..00000000 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Onboarding/Views/DialogMessageView.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// DialogMessageView.swift -// SOOUM -// -// Created by 오현식 on 1/18/25. -// - -import UIKit - -import SnapKit -import Then - - -class DialogMessageView: UIView { - - static var messageTypo: Typography = .som.body2WithBold - - enum Text { - static let dot: String = "•" - - static let banUserDialogFirstMessage: String = "해당 계정은 정지된 이력이 있는 탈퇴 계정 입니다." - static let resignDialogFirstMessage: String = "탈퇴 시점으로 부터 7일 경과 후 새로운 계정 생성이 가능합니다." - - static let dialogSecondLeftMessage: String = "새로운 계정 생성은 " - static let dialogSecondRightMessage: String = " 이후 가능합니다." - } - - - // MARK: Views - - private let firstDotLabel = UILabel().then { - $0.text = Text.dot - $0.textColor = .som.gray600 - $0.typography = .som.body2WithBold - - $0.setContentHuggingPriority(.defaultHigh, for: .horizontal) - } - private let firstMessageLabel = UILabel().then { - $0.textColor = .som.gray600 - $0.typography = .som.body2WithBold.withAlignment(.left) - $0.lineBreakMode = .byWordWrapping - $0.lineBreakStrategy = .hangulWordPriority - $0.numberOfLines = 0 - } - - private let secondDotLabel = UILabel().then { - $0.text = Text.dot - $0.textColor = .som.gray600 - $0.typography = .som.body2WithBold - - $0.setContentHuggingPriority(.defaultHigh, for: .horizontal) - } - private let secondMessageLabel = UILabel().then { - $0.textColor = .som.gray600 - $0.typography = .som.body2WithBold.withAlignment(.left) - $0.lineBreakMode = .byWordWrapping - $0.lineBreakStrategy = .hangulWordPriority - $0.numberOfLines = 0 - } - - - // MARK: Variables - - var firstMessage: String? { - set { - self.firstMessageLabel.text = newValue - self.firstMessageLabel.typography = Self.messageTypo.withAlignment(.left) - } - get { - return self.firstMessageLabel.text - } - } - - var secondMessage: String? { - set { - self.secondMessageLabel.text = newValue - self.secondMessageLabel.typography = Self.messageTypo.withAlignment(.left) - } - get { - return self.secondMessageLabel.text - } - } - - - // MARK: Initalization - - init(isBanUser: Bool, banDateString: String) { - super.init(frame: .zero) - - self.setupConstraints() - - self.firstMessage = isBanUser ? Text.banUserDialogFirstMessage : Text.resignDialogFirstMessage - self.secondMessage = Text.dialogSecondLeftMessage + banDateString + Text.dialogSecondRightMessage - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - - // MARK: Private Func - - private func setupConstraints() { - - self.addSubview(self.firstDotLabel) - self.firstDotLabel.snp.makeConstraints { - $0.top.leading.equalToSuperview() - } - - self.addSubview(self.firstMessageLabel) - self.firstMessageLabel.snp.makeConstraints { - $0.top.trailing.equalToSuperview() - $0.leading.equalTo(self.firstDotLabel.snp.trailing).offset(4) - } - - self.addSubview(self.secondDotLabel) - self.secondDotLabel.snp.makeConstraints { - $0.top.equalTo(self.firstMessageLabel.snp.bottom) - $0.leading.equalToSuperview() - } - - self.addSubview(self.secondMessageLabel) - self.secondMessageLabel.snp.makeConstraints { - $0.top.equalTo(self.firstMessageLabel.snp.bottom) - $0.bottom.trailing.equalToSuperview() - $0.leading.equalTo(self.secondDotLabel.snp.trailing).offset(4) - } - } -} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewController.swift new file mode 100644 index 00000000..93d42209 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewController.swift @@ -0,0 +1,283 @@ +// +// OnboardingProfileImageSettingViewController.swift +// SOOUM +// +// Created by JDeoks on 11/6/24. +// + +import UIKit + +import ReactorKit +import RxCocoa +import RxGesture +import RxSwift + +import SnapKit +import Then +import YPImagePicker +import SwiftEntryKit + +class OnboardingProfileImageSettingViewController: BaseNavigationViewController, View { + + enum Text { + static let navigationTitle: String = "회원가입" + + static let title: String = "숨에서 사용할 프로필 사진을\n등록해주세요" + + static let completeButtonTitle: String = "완료" + static let passButtonTitle: String = "건너뛰기" + + static let inappositeDialogTitle: String = "부적절한 사진으로 보여져요" + static let inappositeDialogMessage: String = "다른 사진으로 변경하거나 기본 이미지를 사용해 주세요." + static let inappositeDialogConfirmButtonTitle: String = "확인" + + static let selectProfileEntryName: String = "selectProfile" + + static let selectProfileFirstButtonTitle: String = "앨범에서 사진 선택" + static let selectProfileSecondButtonTitle: String = "사진 찍기" + static let selectProfileThirdButtonTitle: String = "기본 이미지 적용" + + static let selectPhotoFullScreenNextTitle: String = "다음" + static let selectPhotoFullScreenCancelTitle: String = "취소" + static let selectPhotoFullScreenSaveTitle: String = "저장" + static let selectPhotoFullScreenAlbumsTitle: String = "앨범" + static let selectPhotoFullScreenCameraTitle: String = "카메라" + static let selectPhotoFullScreenLibraryTitle: String = "갤러리" + static let selectPhotoFullScreenCropTitle: String = "자르기" + } + + + // MARK: Views + + private let guideMessageView = OnboardingGuideMessageView(title: Text.title, currentNumber: 3) + + private let profileImageView = UIImageView().then { + $0.image = .init(.image(.v2(.profile))) + $0.layer.cornerRadius = 120 * 0.5 + $0.clipsToBounds = true + } + private let cameraButton = SOMButton().then { + $0.image = .init(.icon(.v2(.filled(.camera)))) + $0.foregroundColor = .som.v2.gray400 + + $0.backgroundColor = .som.v2.white + $0.layer.borderColor = UIColor.som.v2.gray200.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 32 * 0.5 + } + + private let completeButton = SOMButton().then { + $0.title = Text.completeButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black + } + + private let passButton = SOMButton().then { + $0.title = Text.passButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.gray600 + $0.backgroundColor = .som.v2.gray100 + } + + + // MARK: Variables + + private var actions: [SelectProfileBottomFloatView.FloatAction] = [] + + + // MARK: Override func + + override func setupConstraints() { + super.setupConstraints() + + self.view.addSubview(self.guideMessageView) + self.guideMessageView.snp.makeConstraints { + $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(16) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + } + + self.view.addSubview(self.profileImageView) + self.profileImageView.snp.makeConstraints { + $0.top.equalTo(self.guideMessageView.snp.bottom).offset(32) + $0.centerX.equalToSuperview() + $0.size.equalTo(120) + } + self.view.addSubview(self.cameraButton) + self.cameraButton.snp.makeConstraints { + $0.bottom.equalTo(self.profileImageView.snp.bottom) + $0.trailing.equalTo(self.profileImageView.snp.trailing) + $0.size.equalTo(32) + } + + let container = UIStackView(arrangedSubviews: [self.passButton, self.completeButton]).then { + $0.axis = .horizontal + $0.spacing = 10 + } + self.view.addSubview(container) + container.snp.makeConstraints { + $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-6) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(56) + } + } + + + // MARK: ReactorKit - bind + + func bind(reactor: OnboardingProfileImageSettingViewReactor) { + + // Action + Observable.merge( + self.profileImageView.rx.tapGesture().when(.ended).map { _ in }, + self.cameraButton.rx.tap.asObservable() + ) + .subscribe(with: self) { object, _ in + let selectProfileBottomFloatView = SelectProfileBottomFloatView(actions: self.actions) + + var wrapper: SwiftEntryKitViewWrapper = selectProfileBottomFloatView.sek + wrapper.entryName = Text.selectProfileEntryName + wrapper.showBottomFloat(screenInteraction: .dismiss) + } + .disposed(by: self.disposeBag) + + self.completeButton.rx.tap + .map { _ in Reactor.Action.updateProfile } + .bind(to: reactor.action) + .disposed(by: self.disposeBag) + + self.passButton.rx.tap + .map { _ in Reactor.Action.updateProfile } + .bind(to: reactor.action) + .disposed(by: self.disposeBag) + + // State + reactor.state.map(\.isSuccess) + .distinctUntilChanged() + .filter { $0 } + .subscribe(with: self) { object, _ in + let viewController = OnboardingCompletedViewController() + viewController.reactor = reactor.reactorForCompleted() + object.navigationPush(viewController, animated: true) + } + .disposed(by: self.disposeBag) + + reactor.state.map(\.isLoading) + .distinctUntilChanged() + .subscribe(with: self.loadingIndicatorView) { loadingIndicatorView, isLoading in + if isLoading { + loadingIndicatorView.startAnimating() + } else { + loadingIndicatorView.stopAnimating() + } + } + .disposed(by: self.disposeBag) + + reactor.state.map(\.hasErrors) + .filter { $0 } + .subscribe(with: self) { object, _ in + + let actions: [SOMDialogAction] = [ + .init( + title: Text.inappositeDialogConfirmButtonTitle, + style: .primary, + action: { + UIApplication.topViewController?.dismiss(animated: true) + } + ) + ] + + SOMDialogViewController.show( + title: Text.inappositeDialogTitle, + message: Text.inappositeDialogMessage, + textAlignment: .left, + actions: actions + ) + } + .disposed(by: self.disposeBag) + + reactor.state.map(\.profileImage) + .distinctUntilChanged() + .subscribe(with: self) { object, profileImage in + object.profileImageView.image = profileImage ?? .init(.image(.v2(.profile))) + + var actions: [SelectProfileBottomFloatView.FloatAction] = [ + .init( + title: Text.selectProfileFirstButtonTitle, + action: { + SwiftEntryKit.dismiss(.specific(entryName: Text.selectProfileEntryName)) { + object.showPickerForLibrary(for: .library) + } + } + ), + .init( + title: Text.selectProfileSecondButtonTitle, + action: { + SwiftEntryKit.dismiss(.specific(entryName: Text.selectProfileEntryName)) { + object.showPickerForLibrary(for: .photo) + } + } + ) + ] + + if profileImage != nil { + actions.append(.init( + title: Text.selectProfileThirdButtonTitle, + action: { /* TODO: 기본 이미지 변경 API 붙이기 */ } + )) + } + + self.actions = actions + } + .disposed(by: self.disposeBag) + } + } + +extension OnboardingProfileImageSettingViewController { + + func showPickerForLibrary(for screen: YPPickerScreen) { + + var config = YPImagePickerConfiguration() + + config.library.options = nil + config.library.minWidthForItem = nil + config.showsCrop = .rectangle(ratio: 1.0) + config.showsPhotoFilters = false + config.library.preselectedItems = nil + config.screens = [screen] + config.startOnScreen = screen + config.shouldSaveNewPicturesToAlbum = false + + config.wordings.next = Text.selectPhotoFullScreenNextTitle + config.wordings.cancel = Text.selectPhotoFullScreenCancelTitle + config.wordings.save = Text.selectPhotoFullScreenSaveTitle + config.wordings.albumsTitle = Text.selectPhotoFullScreenAlbumsTitle + config.wordings.cameraTitle = Text.selectPhotoFullScreenCameraTitle + config.wordings.libraryTitle = Text.selectPhotoFullScreenLibraryTitle + config.wordings.crop = Text.selectPhotoFullScreenCropTitle + + let picker = YPImagePicker(configuration: config) + picker.didFinishPicking { [weak self] items, cancelled in + + guard let self = self, let reactor = self.reactor else { return } + + if cancelled { + Log.debug("Picker was canceled") + picker.dismiss(animated: true, completion: nil) + return + } + + if let image = items.singlePhoto?.image { + reactor.action.onNext(.updateImage(image)) + } else { + Log.error("Error occured while picking an image") + } + picker.dismiss(animated: true, completion: nil) + } + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + self.present(picker, animated: true, completion: nil) + } + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewReactor.swift similarity index 63% rename from SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewReactor.swift rename to SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewReactor.swift index 27a48d0f..433aa1c8 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewReactor.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/OnboardingProfileImageSettingViewReactor.swift @@ -1,5 +1,5 @@ // -// ProfileImageSettingViewReactor.swift +// OnboardingProfileImageSettingViewReactor.swift // SOOUM // // Created by JDeoks on 11/12/24. @@ -10,7 +10,7 @@ import ReactorKit import Alamofire -class ProfileImageSettingViewReactor: Reactor { +class OnboardingProfileImageSettingViewReactor: Reactor { enum Action { case updateImage(UIImage) @@ -20,11 +20,15 @@ class ProfileImageSettingViewReactor: Reactor { enum Mutation { case updateImage(UIImage) case updateIsSuccess(Bool) + case updateIsLoading(Bool) + case updateErrors(Bool) } struct State { var profileImage: UIImage? var isSuccess: Bool + var isLoading: Bool + var hasErrors: Bool } var nickname: String @@ -32,7 +36,9 @@ class ProfileImageSettingViewReactor: Reactor { var initialState: State = .init( profileImage: nil, - isSuccess: false + isSuccess: false, + isLoading: false, + hasErrors: true ) let provider: ManagerProviderType @@ -45,7 +51,12 @@ class ProfileImageSettingViewReactor: Reactor { func mutate(action: Action) -> Observable { switch action { case let .updateImage(image): - return self.updateImage(image) + return .concat([ + .just(.updateIsLoading(true)), + self.updateImage(image), + .just(.updateIsLoading(false)) + ]) + case .updateProfile: let trimedNickname = self.nickname.trimmingCharacters(in: .whitespacesAndNewlines) let request: JoinRequest = .registerUser(userName: trimedNickname, imageName: self.imageName) @@ -54,6 +65,7 @@ class ProfileImageSettingViewReactor: Reactor { .flatMapLatest { _ -> Observable in return .just(.updateIsSuccess(true)) } + .catch(self.catchClosure) } } @@ -64,12 +76,16 @@ class ProfileImageSettingViewReactor: Reactor { newState.profileImage = profileImage case let .updateIsSuccess(isSuccess): newState.isSuccess = isSuccess + case let .updateIsLoading(isLoading): + newState.isLoading = isLoading + case let .updateErrors(hasErrors): + newState.hasErrors = hasErrors } return newState } } -extension ProfileImageSettingViewReactor { +extension OnboardingProfileImageSettingViewReactor { private func updateImage(_ image: UIImage) -> Observable { return self.presignedURL() @@ -79,7 +95,10 @@ extension ProfileImageSettingViewReactor { let url = URL(string: presignedResponse.strUrl) { return object.provider.networkManager.upload(imageData, to: url) .flatMapLatest { _ -> Observable in - return .just(.updateImage(image)) + return .concat([ + .just(.updateImage(image)), + .just(.updateErrors(false)) + ]) } } else { return .empty() @@ -98,11 +117,26 @@ extension ProfileImageSettingViewReactor { return .just(result) } } + + private var catchClosure: ((Error) throws -> Observable ) { + return { error in + + let nsError = error as NSError + let endProcessing = Observable.concat([ + .just(.updateIsSuccess(false)), + .just(.updateIsLoading(false)), + // 부적절한 이미지 업로드 에러 코드 == 402 + .just(.updateErrors(nsError.code == 402)) + ]) + + return endProcessing + } + } } -extension ProfileImageSettingViewReactor { +extension OnboardingProfileImageSettingViewReactor { - func reactorForMainTabBar() -> MainTabBarReactor { - MainTabBarReactor(provider: self.provider) + func reactorForCompleted() -> OnboardingCompletedViewReactor { + OnboardingCompletedViewReactor(provider: self.provider) } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewController.swift deleted file mode 100644 index 3c950576..00000000 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/ProfileImageSettingViewController.swift +++ /dev/null @@ -1,203 +0,0 @@ -// -// ProfileImageSettingViewController.swift -// SOOUM -// -// Created by JDeoks on 11/6/24. -// - -import UIKit - -import ReactorKit -import RxCocoa -import RxGesture -import RxSwift - -import SnapKit -import Then -import YPImagePicker - -class ProfileImageSettingViewController: BaseNavigationViewController, View { - - enum Text { - static let title: String = "당신을 표현하는 사진을\n프로필로 등록해볼까요?" - static let message: String = "프로필 사진은 추후 변경이 가능해요" - - static let confirmButtonTitle: String = "확인" - static let passButtonTitle: String = "다음에 변경하기" - } - - - // MARK: Views - - private let guideMessageView = OnboardingGuideMessageView(title: Text.title, message: Text.message) - - private let profileImageView = UIImageView().then { - $0.image = .init(.image(.sooumLogo)) - $0.layer.cornerRadius = 128 * 0.5 - $0.clipsToBounds = true - } - private let cameraButton = SOMButton().then { - $0.image = .init(.icon(.outlined(.camera))) - $0.foregroundColor = .som.white - - $0.backgroundColor = .som.gray400 - $0.layer.cornerRadius = 32 * 0.5 - $0.clipsToBounds = true - } - - private let confirmButton = SOMButton().then { - $0.title = Text.confirmButtonTitle - $0.typography = .som.body1WithBold - $0.foregroundColor = .som.gray600 - - $0.backgroundColor = .som.gray300 - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true - } - - private let passButton = SOMButton().then { - $0.title = Text.passButtonTitle - $0.typography = .som.body3WithBold - $0.foregroundColor = .som.p300 - $0.hasUnderlined = true - } - - - // MARK: Override func - - override func setupConstraints() { - super.setupConstraints() - - self.view.addSubview(self.guideMessageView) - self.guideMessageView.snp.makeConstraints { - $0.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(28) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - } - - self.view.addSubview(self.profileImageView) - self.profileImageView.snp.makeConstraints { - $0.top.equalTo(self.guideMessageView.snp.bottom).offset(94) - $0.centerX.equalToSuperview() - $0.size.equalTo(128) - } - self.view.addSubview(self.cameraButton) - self.cameraButton.snp.makeConstraints { - $0.bottom.equalTo(self.profileImageView.snp.bottom).offset(-4) - $0.trailing.equalTo(self.profileImageView.snp.trailing).offset(-4) - $0.size.equalTo(32) - } - - self.view.addSubviews(self.passButton) - self.passButton.snp.makeConstraints { - $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-12) - $0.centerX.equalToSuperview() - } - - self.view.addSubview(self.confirmButton) - self.confirmButton.snp.makeConstraints { - $0.bottom.equalTo(passButton.snp.top).offset(-20) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(48) - } - } - - - // MARK: ReactorKit - bind - - func bind(reactor: ProfileImageSettingViewReactor) { - - // Action - self.cameraButton.rx.tap - .subscribe(with: self) { object, _ in - object.showPicker() - } - .disposed(by: self.disposeBag) - - self.confirmButton.rx.tap - .map { _ in Reactor.Action.updateProfile } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - self.passButton.rx.tap - .map { _ in Reactor.Action.updateProfile } - .bind(to: reactor.action) - .disposed(by: disposeBag) - - // State - reactor.state.map(\.isSuccess) - .distinctUntilChanged() - .filter { $0 } - .subscribe(with: self) { object, _ in - let viewController = MainTabBarController() - viewController.reactor = reactor.reactorForMainTabBar() - let navigationController = UINavigationController( - rootViewController: viewController - ) - object.view.window?.rootViewController = navigationController - } - .disposed(by: disposeBag) - - reactor.state.map(\.profileImage) - .map { $0 != nil } - .distinctUntilChanged() - .subscribe(with: self) { object, isUpdated in - object.confirmButton.isEnabled = isUpdated - object.confirmButton.foregroundColor = isUpdated ? .som.white : .som.gray600 - object.confirmButton.backgroundColor = isUpdated ? .som.p300 : .som.gray300 - } - .disposed(by: disposeBag) - } - } - -extension ProfileImageSettingViewController { - func showPicker() { - var config = YPImagePickerConfiguration() - - config.library.options = nil - config.library.onlySquare = false - config.library.isSquareByDefault = true - config.library.minWidthForItem = nil - config.library.mediaType = YPlibraryMediaType.photo - config.library.defaultMultipleSelection = false - config.library.maxNumberOfItems = 1 - config.library.minNumberOfItems = 1 - config.library.numberOfItemsInRow = 4 - config.library.spacingBetweenItems = 1.0 - config.showsCrop = .rectangle(ratio: 1) - config.showsPhotoFilters = false - config.library.skipSelectionsGallery = false - config.library.preselectedItems = nil - config.library.preSelectItemOnMultipleSelection = true - config.startOnScreen = .library - config.shouldSaveNewPicturesToAlbum = false - - config.wordings.next = "다음" - config.wordings.cancel = "취소" - config.wordings.save = "저장" - config.wordings.albumsTitle = "앨범" - config.wordings.cameraTitle = "카메라" - config.wordings.libraryTitle = "갤러리" - config.wordings.crop = "자르기" - - let picker = YPImagePicker(configuration: config) - picker.didFinishPicking { [weak self] items, cancelled in - - guard let self = self, let reactor = self.reactor else { return } - - if cancelled { - Log.error("Picker was canceled") - picker.dismiss(animated: true, completion: nil) - return - } - - if let image = items.singlePhoto?.image { - self.profileImageView.image = image - reactor.action.onNext(.updateImage(image)) - } - picker.dismiss(animated: true, completion: nil) - } - self.present(picker, animated: true, completion: nil) - } -} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/Views/SelectProfileBottomFloatView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/Views/SelectProfileBottomFloatView.swift new file mode 100644 index 00000000..5ee5d096 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/ProfileImageSetting/Views/SelectProfileBottomFloatView.swift @@ -0,0 +1,124 @@ +// +// SelectProfileBottomFloatView.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import SnapKit +import Then + +class SelectProfileBottomFloatView: UIView { + + + // MARK: Views + + private let container = UIStackView().then { + $0.axis = .vertical + } + + + // MARK: Variables + + private var actions: [FloatAction]? + + + // MARK: Initalization + + convenience init(actions: [FloatAction]) { + self.init(frame: .zero) + + self.actions = actions + self.setupActions(actions) + } + + override init(frame: CGRect) { + super.init(frame: frame) + + self.setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension SelectProfileBottomFloatView { + + func setupConstraints() { + + self.snp.makeConstraints { + $0.width.equalTo(UIScreen.main.bounds.width - 16 * 2) + } + + let handleView = UIView().then { + $0.backgroundColor = .som.v2.gray300 + $0.layer.cornerRadius = 2 + } + self.addSubview(handleView) + handleView.snp.makeConstraints { + $0.top.equalToSuperview().offset(14) + $0.centerX.equalToSuperview() + $0.width.equalTo(44) + $0.height.equalTo(4) + } + + self.addSubview(self.container) + self.container.snp.makeConstraints { + $0.top.equalTo(handleView.snp.bottom).offset(14) + $0.bottom.equalToSuperview().offset(-16) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + } + } + + func setupActions(_ actions: [FloatAction]) { + + self.container.arrangedSubviews.forEach { $0.removeFromSuperview() } + + actions.forEach { action in + + let button = SOMButton().then { + $0.title = action.title + $0.typography = .som.v2.subtitle1 + $0.foregroundColor = .som.v2.gray500 + $0.backgroundColor = .som.v2.white + $0.inset = .init(top: 12, left: 16, bottom: 12, right: 16) + + $0.contentHorizontalAlignment = .left + + $0.tag = action.tag + $0.addTarget(self, action: #selector(self.tap(_:)), for: .touchUpInside) + } + button.snp.makeConstraints { + $0.height.equalTo(48) + } + + self.container.addArrangedSubview(button) + } + } + + @objc + func tap(_ button: UIButton) { + if let action = self.actions?.first(where: { $0.tag == button.tag }) { + action.action() + } + } +} + +extension SelectProfileBottomFloatView { + + struct FloatAction { + let tag: Int + let title: String + let action: (() -> Void) + + init(title: String, action: @escaping (() -> Void)) { + self.tag = UUID().hashValue + self.title = title + self.action = action + } + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewController.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewController.swift index 6513e206..5acba2a9 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewController.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewController.swift @@ -19,15 +19,54 @@ import RxSwift class OnboardingTermsOfServiceViewController: BaseNavigationViewController, View { enum Text { - static let guideMessageTitle: String = "숨을 시작하기 위해서는\n약관 동의가 필요해요" + static let navigationTitle: String = "회원가입" - static let confirmButtonTitle: String = "확인" + static let guideMessageTitle: String = "숨 서비스 이용을 위해\n동의해주세요" + + static let termsOfSeviceUrlString: String = "https://mewing-space-6d3.notion.site/3f92380d536a4b569921d2809ed147ef?pvs=4" + static let locationServiceUrlString: String = "https://mewing-space-6d3.notion.site/45d151f68ba74b23b24483ad8b2662b4?pvs=4" + static let privacyPolicyUrlString: String = "https://mewing-space-6d3.notion.site/44e378c9d11d45159859492434b6b128?pvs=4" + + static let nextButtonTitle: String = "다음" + } + + enum TermsOfService: CaseIterable { + + case termsOfService + case locationService + case privacyPolicy + + var text: String { + switch self { + case .termsOfService: + "[필수] 서비스 이용 약관" + case .locationService: + "[필수] 위치정보 이용 약관" + case .privacyPolicy: + "[필수] 개인정보 처리 방침" + } + } + + var url: URL { + switch self { + case .termsOfService: + return URL(string: Text.termsOfSeviceUrlString)! + case .locationService: + return URL(string: Text.locationServiceUrlString)! + case .privacyPolicy: + return URL(string: Text.privacyPolicyUrlString)! + } + } } + // MARK: Views - private let guideMessageView = OnboardingGuideMessageView(title: Text.guideMessageTitle) + private let guideMessageView = OnboardingGuideMessageView( + title: Text.guideMessageTitle, + currentNumber: 1 + ) private let agreeAllButtonView = TermsOfServiceAgreeButtonView() @@ -36,60 +75,66 @@ class OnboardingTermsOfServiceViewController: BaseNavigationViewController, View private let privacyPolicyCellView = TermsOfServiceCellView(title: TermsOfService.privacyPolicy.text) private let nextButton = SOMButton().then { - $0.title = Text.confirmButtonTitle - $0.typography = .som.body1WithBold - $0.foregroundColor = .som.gray600 - - $0.backgroundColor = .som.gray300 - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true + $0.title = Text.nextButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black + $0.isEnabled = false } // MARK: Override func + + override func setupNaviBar() { + super.setupNaviBar() + + self.navigationBar.title = Text.navigationTitle + } override func setupConstraints() { super.setupConstraints() self.view.addSubview(self.guideMessageView) self.guideMessageView.snp.makeConstraints { - $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(28) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) + $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(16) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.agreeAllButtonView) self.agreeAllButtonView.snp.makeConstraints { - $0.top.equalTo(self.guideMessageView.snp.bottom).offset(44) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(60) + $0.top.equalTo(self.guideMessageView.snp.bottom).offset(32) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.termsOfServiceCellView) self.termsOfServiceCellView.snp.makeConstraints { - $0.top.equalTo(self.agreeAllButtonView.snp.bottom).offset(36) - $0.leading.trailing.equalToSuperview() + $0.top.equalTo(self.agreeAllButtonView.snp.bottom).offset(8) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.locationServiceCellView) self.locationServiceCellView.snp.makeConstraints { $0.top.equalTo(self.termsOfServiceCellView.snp.bottom) - $0.leading.trailing.equalToSuperview() + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.privacyPolicyCellView) self.privacyPolicyCellView.snp.makeConstraints { $0.top.equalTo(self.locationServiceCellView.snp.bottom) - $0.leading.trailing.equalToSuperview() + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } self.view.addSubview(self.nextButton) self.nextButton.snp.makeConstraints { - $0.bottom.equalTo(self.view.safeAreaLayoutGuide).offset(-12) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(48) + $0.bottom.equalTo(self.view.safeAreaLayoutGuide) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(56) } } @@ -99,8 +144,7 @@ class OnboardingTermsOfServiceViewController: BaseNavigationViewController, View func bind(reactor: OnboardingTermsOfServiceViewReactor) { // Action - self.agreeAllButtonView.rx.tapGesture() - .when(.recognized) + self.agreeAllButtonView.rx.didSelect .map { _ in Reactor.Action.allAgree } .bind(to: reactor.action) .disposed(by: disposeBag) @@ -175,10 +219,7 @@ class OnboardingTermsOfServiceViewController: BaseNavigationViewController, View reactor.state.map(\.isAllAgreed) .distinctUntilChanged() .subscribe(with: self) { object, isAllAgreed in - object.agreeAllButtonView.updateState(isAllAgreed) - - object.nextButton.foregroundColor = isAllAgreed ? .som.white : .som.gray600 - object.nextButton.backgroundColor = isAllAgreed ? .som.p300 : .som.gray300 + object.agreeAllButtonView.updateState(isAllAgreed, animated: false) object.nextButton.isEnabled = isAllAgreed } .disposed(by: self.disposeBag) @@ -186,21 +227,21 @@ class OnboardingTermsOfServiceViewController: BaseNavigationViewController, View reactor.state.map(\.isTermsOfServiceAgreed) .distinctUntilChanged() .subscribe(with: self) { object, isTermsOfServiceAgreed in - object.termsOfServiceCellView.updateState(isTermsOfServiceAgreed) + object.termsOfServiceCellView.updateState(isTermsOfServiceAgreed, animated: false) } .disposed(by: self.disposeBag) reactor.state.map(\.isLocationAgreed) .distinctUntilChanged() .subscribe(with: self) { object, isLocationAgreed in - object.locationServiceCellView.updateState(isLocationAgreed) + object.locationServiceCellView.updateState(isLocationAgreed, animated: false) } .disposed(by: self.disposeBag) reactor.state.map(\.isPrivacyPolicyAgreed) .distinctUntilChanged() .subscribe(with: self) { object, isPrivacyPolicyAgreed in - object.privacyPolicyCellView.updateState(isPrivacyPolicyAgreed) + object.privacyPolicyCellView.updateState(isPrivacyPolicyAgreed, animated: false) } .disposed(by: self.disposeBag) } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewReactor.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewReactor.swift index 7e4af8ff..a2e1b3d1 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewReactor.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/OnboardingTermsOfServiceViewReactor.swift @@ -10,42 +10,6 @@ import UIKit import ReactorKit import RxSwift - -enum TermsOfService: CaseIterable { - - enum Text { - static let termsOfSeviceUrlString: String = "https://mewing-space-6d3.notion.site/3f92380d536a4b569921d2809ed147ef?pvs=4" - static let locationServiceUrlString: String = "https://mewing-space-6d3.notion.site/45d151f68ba74b23b24483ad8b2662b4?pvs=4" - static let privacyPolicyUrlString: String = "https://mewing-space-6d3.notion.site/44e378c9d11d45159859492434b6b128?pvs=4" - } - - case termsOfService - case locationService - case privacyPolicy - - var text: String { - switch self { - case .termsOfService: - "[필수] 서비스 이용 약관" - case .locationService: - "[필수] 위치정보 이용 약관" - case .privacyPolicy: - "[필수] 개인정보 처리 방침" - } - } - - var url: URL { - switch self { - case .termsOfService: - return URL(string: Text.termsOfSeviceUrlString)! - case .locationService: - return URL(string: Text.locationServiceUrlString)! - case .privacyPolicy: - return URL(string: Text.privacyPolicyUrlString)! - } - } -} - class OnboardingTermsOfServiceViewReactor: Reactor { enum Action { diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView+Rx.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView+Rx.swift new file mode 100644 index 00000000..de386b69 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView+Rx.swift @@ -0,0 +1,17 @@ +// +// TermsOfServiceAgreeButtonView+Rx.swift +// SOOUM +// +// Created by 오현식 on 9/11/25. +// + +import RxCocoa +import RxSwift + + +extension Reactive where Base: TermsOfServiceAgreeButtonView { + + var didSelect: ControlEvent { + self.base.backgroundButton.rx.tap + } +} diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView.swift index 2b2a0c57..5382661a 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceAgreeButtonView.swift @@ -14,7 +14,7 @@ import Then class TermsOfServiceAgreeButtonView: UIView { enum Text { - static let title: String = "약관 전체 동의" + static let title: String = "전체 동의하기" } @@ -22,13 +22,17 @@ class TermsOfServiceAgreeButtonView: UIView { private let checkImageView = UIImageView().then { $0.image = .init(.icon(.outlined(.check))) - $0.tintColor = .som.gray600 + $0.tintColor = .som.v2.gray400 } private let titleLabel = UILabel().then { $0.text = Text.title - $0.textColor = .som.gray600 - $0.typography = .som.head2WithRegular + $0.textColor = .som.v2.gray600 + $0.typography = .som.v2.title1 + } + + let backgroundButton = SOMButton().then { + $0.backgroundColor = .som.v2.gray100 } @@ -49,21 +53,27 @@ class TermsOfServiceAgreeButtonView: UIView { private func setupConstraints() { - self.layer.borderColor = UIColor.som.gray300.cgColor - self.layer.borderWidth = 1 - self.layer.cornerRadius = 12 + self.snp.makeConstraints { + $0.width.equalTo(UIScreen.main.bounds.width) + $0.height.equalTo(56) + } + + self.addSubview(self.backgroundButton) + self.backgroundButton.snp.makeConstraints { + $0.edges.equalToSuperview() + } self.addSubview(self.checkImageView) self.checkImageView.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().offset(16) + $0.leading.equalToSuperview().offset(24) $0.size.equalTo(24) } self.addSubview(self.titleLabel) self.titleLabel.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalTo(self.checkImageView.snp.trailing).offset(6) + $0.leading.equalTo(self.checkImageView.snp.trailing).offset(8) $0.trailing.lessThanOrEqualToSuperview() } } @@ -76,9 +86,7 @@ class TermsOfServiceAgreeButtonView: UIView { let animationDuration: TimeInterval = animated ? 0.25 : 0 UIView.animate(withDuration: animationDuration) { - self.layer.borderColor = state ? UIColor.som.p300.cgColor : UIColor.som.gray300.cgColor - self.checkImageView.tintColor = state ? .som.p300 : .som.gray600 - self.titleLabel.textColor = state ? .som.p300 : .som.gray600 + self.checkImageView.tintColor = state ? .som.v2.pDark : .som.v2.gray400 } } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceCellView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceCellView.swift index b8bcc958..5aff7118 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceCellView.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/TermsOfService/Views/TermsOfServiceCellView.swift @@ -17,21 +17,21 @@ class TermsOfServiceCellView: UIView { // MARK: Views private let checkBoxImageView = UIImageView().then { - $0.image = .init(.icon(.outlined(.checkBox))) - $0.tintColor = .som.gray500 + $0.image = .init(.icon(.v2(.outlined(.check)))) + $0.tintColor = .som.v2.gray200 } private let titleLabel = UILabel().then { - $0.textColor = .som.gray500 - $0.typography = .som.body1WithRegular + $0.textColor = .som.v2.gray500 + $0.typography = .som.v2.subtitle1 } let nextButton = SOMButton().then { - $0.image = .init(.icon(.outlined(.next))) - $0.foregroundColor = .som.gray800 + $0.image = .init(.icon(.v2(.outlined(.right)))) + $0.foregroundColor = .som.v2.gray500 } - let backgroundButton = UIButton() + let backgroundButton = SOMButton() // MARK: Initalization @@ -59,35 +59,32 @@ class TermsOfServiceCellView: UIView { self.snp.makeConstraints { $0.width.equalTo(UIScreen.main.bounds.width) - $0.height.equalTo(44) + $0.height.equalTo(48) + } + + self.addSubview(self.backgroundButton) + self.backgroundButton.snp.makeConstraints { + $0.edges.equalToSuperview() } self.addSubview(self.checkBoxImageView) self.checkBoxImageView.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().offset(36) + $0.leading.equalToSuperview().offset(24) $0.size.equalTo(24) } self.addSubview(self.titleLabel) self.titleLabel.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalTo(self.checkBoxImageView.snp.trailing).offset(6) - } - - self.addSubview(self.backgroundButton) - self.backgroundButton.snp.makeConstraints { - $0.top.equalTo(self.checkBoxImageView.snp.top) - $0.bottom.equalTo(self.checkBoxImageView.snp.bottom) - $0.leading.equalTo(self.checkBoxImageView.snp.leading) - $0.trailing.equalTo(self.titleLabel.snp.trailing) + $0.leading.equalTo(self.checkBoxImageView.snp.trailing).offset(8) } self.addSubview(self.nextButton) self.nextButton.snp.makeConstraints { $0.centerY.trailing.equalToSuperview() - $0.leading.equalTo(self.titleLabel.snp.trailing).offset(6) - $0.trailing.equalToSuperview().offset(-30) + $0.leading.equalTo(self.titleLabel.snp.trailing).offset(12) + $0.trailing.equalToSuperview().offset(-20) $0.size.equalTo(32) } } @@ -100,12 +97,7 @@ class TermsOfServiceCellView: UIView { let animationDuration: TimeInterval = animated ? 0.25 : 0 UIView.animate(withDuration: animationDuration) { - self.checkBoxImageView.image = state ? .init(.icon(.filled(.checkBox))) : .init(.icon(.outlined(.checkBox))) - self.checkBoxImageView.tintColor = state ? .som.p300 : .som.gray600 - - self.titleLabel.textColor = state ? .som.p300 : .som.gray600 - - self.nextButton.foregroundColor = state ? .som.p300 : .som.gray600 + self.checkBoxImageView.tintColor = state ? .som.v2.pDark : .som.v2.gray200 } } } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingGuideMessageView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingGuideMessageView.swift index 9367ccdf..343c5d86 100644 --- a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingGuideMessageView.swift +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingGuideMessageView.swift @@ -21,19 +21,16 @@ class OnboardingGuideMessageView: UIView { // MARK: Views + private let numberingView = OnboardingNumberingView(numbers: [1, 2, 3]) + private let titleLabel = UILabel().then { - $0.textColor = .som.black - $0.typography = .som.head1WithRegular.withAlignment(.left) + $0.textColor = .som.v2.black + $0.typography = .som.v2.head2 $0.lineBreakMode = .byWordWrapping $0.lineBreakStrategy = .hangulWordPriority $0.numberOfLines = 0 } - private let messageLabel = UILabel().then { - $0.textColor = .som.gray500 - $0.typography = .som.body2WithRegular - } - // MARK: Variables @@ -46,24 +43,23 @@ class OnboardingGuideMessageView: UIView { } } - var message: String? { + var currentNumber: Int { set { - self.messageLabel.text = newValue - self.messageLabel.isHidden = newValue == nil + self.numberingView.currentNumber = newValue } get { - return self.messageLabel.text + self.numberingView.currentNumber ?? 0 } } // MARK: Initalization - convenience init(title: String, message: String? = nil) { + convenience init(title: String, currentNumber: Int) { self.init(frame: .zero) self.title = title - self.message = message + self.currentNumber = currentNumber } override init(frame: CGRect) { @@ -81,15 +77,15 @@ class OnboardingGuideMessageView: UIView { private func setupConstraints() { - self.addSubview(self.titleLabel) - self.titleLabel.snp.makeConstraints { + self.addSubview(self.numberingView) + self.numberingView.snp.makeConstraints { $0.top.leading.equalToSuperview() $0.trailing.lessThanOrEqualToSuperview() } - self.addSubview(self.messageLabel) - self.messageLabel.snp.makeConstraints { - $0.top.equalTo(self.titleLabel.snp.bottom).offset(16) + self.addSubview(self.titleLabel) + self.titleLabel.snp.makeConstraints { + $0.top.equalTo(self.numberingView.snp.bottom).offset(16) $0.bottom.leading.equalToSuperview() $0.trailing.lessThanOrEqualToSuperview() } diff --git a/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingNumberingView.swift b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingNumberingView.swift new file mode 100644 index 00000000..b323d0f7 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Intro/Onboarding/Views/OnboardingNumberingView.swift @@ -0,0 +1,104 @@ +// +// OnboardingNumberingView.swift +// SOOUM +// +// Created by 오현식 on 9/11/25. +// + +import UIKit + +import SnapKit +import Then + +class OnboardingNumberingView: UIView { + + enum Color { + static let selectedBackgroundColor: UIColor = .som.v2.pMain + static let selectedBorderColor: UIColor = .som.v2.pLight2 + static let defaultBackgroundColor: UIColor = .som.v2.gray300 + static let defaultBorderColor: UIColor = .som.v2.gray200 + } + + + // MARK: Views + + private let container = UIStackView().then { + $0.axis = .horizontal + $0.spacing = 8 + } + + + // MARK: Variables + + var currentNumber: Int? { + willSet { + self.container.subviews.forEach { view in + if view.tag <= newValue ?? 1 { + view.backgroundColor = Color.selectedBackgroundColor + view.layer.borderColor = Color.selectedBorderColor.cgColor + } + } + } + } + + + // MARK: Initalization + + convenience init(numbers: [Int]) { + self.init(frame: .zero) + + self.setupNumberView(numbers: numbers) + } + + override init(frame: CGRect) { + super.init(frame: frame) + + self.setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +private extension OnboardingNumberingView { + + func setupConstraints() { + + self.addSubview(self.container) + self.container.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + func setupNumberView(numbers: [Int]) { + + numbers.forEach { number in + + let backgroundView = UIView().then { + $0.backgroundColor = Color.defaultBackgroundColor + $0.layer.borderColor = Color.defaultBorderColor.cgColor + $0.layer.borderWidth = 1 + $0.layer.cornerRadius = 32 * 0.5 + $0.tag = number + } + + let label = UILabel().then { + $0.text = "\(number)" + $0.textColor = .white + $0.typography = .som.v2.subtitle2 + } + + backgroundView.addSubview(label) + label.snp.makeConstraints { + $0.center.equalToSuperview() + } + + backgroundView.snp.makeConstraints { + $0.size.equalTo(32) + } + + self.container.addArrangedSubview(backgroundView) + } + } +} diff --git a/SOOUM/SOOUM/Presentations/Main/Home/Detail/Cells/DetailViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Home/Detail/Cells/DetailViewCell.swift index 6101394a..2ba393e9 100644 --- a/SOOUM/SOOUM/Presentations/Main/Home/Detail/Cells/DetailViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Home/Detail/Cells/DetailViewCell.swift @@ -114,7 +114,7 @@ class DetailViewCell: UICollectionViewCell { if let strUrl = self.member.profileImgUrl?.url { self.memberImageView.setImage(strUrl: strUrl) } else { - self.memberImageView.image = .init(.image(.sooumLogo)) + self.memberImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.memberLabel.text = self.member.nickname } diff --git a/SOOUM/SOOUM/Presentations/Main/Home/MainHomeTabBarController.swift b/SOOUM/SOOUM/Presentations/Main/Home/MainHomeTabBarController.swift index 43292642..342eadb8 100644 --- a/SOOUM/SOOUM/Presentations/Main/Home/MainHomeTabBarController.swift +++ b/SOOUM/SOOUM/Presentations/Main/Home/MainHomeTabBarController.swift @@ -33,7 +33,7 @@ class MainHomeTabBarController: BaseNavigationViewController, View { // MARK: Set navigationBar Items private let logo = UIImageView().then { - $0.image = .init(.logo) + $0.image = .init(.logo(.logo)) $0.tintColor = .som.p300 $0.contentMode = .scaleAspectFit } diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Cells/MyProfileViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Cells/MyProfileViewCell.swift index 7b9a371e..a5d4a688 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Cells/MyProfileViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Cells/MyProfileViewCell.swift @@ -180,7 +180,7 @@ class MyProfileViewCell: UICollectionViewCell { if let profileImg = profile.profileImg { self.profileImageView.setImage(strUrl: profileImg.url) } else { - self.profileImageView.image = .init(.image(.sooumLogo)) + self.profileImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.totalCardCountLabel.text = profile.cardCnt self.totalFollowingCountLabel.text = profile.followingCnt diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Cells/OtherProfileViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Cells/OtherProfileViewCell.swift index 857701fb..6db75487 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Cells/OtherProfileViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Cells/OtherProfileViewCell.swift @@ -185,7 +185,7 @@ class OtherProfileViewCell: UICollectionViewCell { if let profileImg = profile.profileImg { self.profileImageView.setImage(strUrl: profileImg.url) } else { - self.profileImageView.image = .init(.image(.sooumLogo)) + self.profileImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.totalCardCountLabel.text = profile.cardCnt self.totalFollowingCountLabel.text = profile.followingCnt diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowerViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowerViewCell.swift index 4cc85bce..72ddae61 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowerViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowerViewCell.swift @@ -120,7 +120,7 @@ class MyFollowerViewCell: UITableViewCell { if let url = follow.backgroundImgURL?.url { self.profileImageView.setImage(strUrl: url) } else { - self.profileImageView.image = .init(.image(.sooumLogo)) + self.profileImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.profileNickname.text = follow.nickname } diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowingViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowingViewCell.swift index 43188c17..d674de2e6 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowingViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/MyFollowingViewCell.swift @@ -134,7 +134,7 @@ class MyFollowingViewCell: UITableViewCell { if let url = follow.backgroundImgURL?.url { self.profileImageView.setImage(strUrl: url) } else { - self.profileImageView.image = .init(.image(.sooumLogo)) + self.profileImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.profileNickname.text = follow.nickname } diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/OtherFollowViewCell.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/OtherFollowViewCell.swift index f36f62ba..7c32871d 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/OtherFollowViewCell.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Follow/Cells/OtherFollowViewCell.swift @@ -120,7 +120,7 @@ class OtherFollowViewCell: UITableViewCell { if let url = follow.backgroundImgURL?.url { self.profileImageView.setImage(strUrl: url) } else { - self.profileImageView.image = .init(.image(.sooumLogo)) + self.profileImageView.image = .init(.image(.defaultStyle(.sooumLogo))) } self.profileNickname.text = follow.nickname diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/EnterMemberTransferViewController.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/EnterMemberTransferViewController.swift index 210baf36..7068cc3d 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/EnterMemberTransferViewController.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/EnterMemberTransferViewController.swift @@ -18,132 +18,141 @@ import RxSwift class EnterMemberTransferViewController: BaseNavigationViewController, View { enum Text { - static let navigationTitle: String = "계정 이관 코드 입력" - static let transferEnterMessage: String = "발급받은 코드를 입력해주세요" - static let transferEnterButtonTitle: String = "계정 이관하기" - } - - private let transferEnterMessageLabel = UILabel().then { - $0.text = Text.transferEnterMessage - $0.textColor = .som.gray800 - $0.typography = .som.body1WithBold - } - - private lazy var textFieldBackgroundView = UIView().then { - $0.backgroundColor = .som.gray50 - $0.layer.borderColor = UIColor.som.p300.cgColor - $0.layer.borderWidth = 2 - $0.layer.cornerRadius = 12 - - let gestureRecognizer = UITapGestureRecognizer( - target: self, - action: #selector(self.touch) - ) - $0.addGestureRecognizer(gestureRecognizer) - } - private lazy var textField = UITextField().then { - let paragraphStyle = NSMutableParagraphStyle() - $0.defaultTextAttributes[.paragraphStyle] = paragraphStyle - $0.defaultTextAttributes[.foregroundColor] = UIColor.som.black - $0.defaultTextAttributes[.font] = Typography.som.body1WithRegular.font - $0.tintColor = .som.p300 + static let navigationTitle: String = "내 계정 가져오기" - $0.textAlignment = .center + static let title: String = "기존 계정이 있으신가요?" - $0.enablesReturnKeyAutomatically = true - $0.returnKeyType = .go + static let placeholderText: String = "코드 입력" + static let textfieldGuideMessage: String = "코드는 발급 후 24시간 동안 유효해요" - $0.autocapitalizationType = .none - $0.autocorrectionType = .no - $0.spellCheckingType = .no + static let guideTitle: String = "내 계정 가져오기 안내" + static let guideMessage: String = "기존 휴대폰의 숨 앱 [설정>내 계정 내보내기]에서 발급한 코드를 입력하면, 기존 계정을 현재 휴대폰에서 그대로 사용할 수 있어요" - $0.setContentHuggingPriority(.defaultLow, for: .horizontal) - $0.setContentCompressionResistancePriority(.defaultHigh + 1, for: .vertical) + static let dialogTitle: String = "유효하지 않은 코드예요" + static let dialogMessage: String = "코드를 확인한 뒤 다시 시도해주세요." + static let dialogConfirmButtonTitle: String = "확인" - $0.delegate = self + static let confirmButtonTitle: String = "확인" } - private let transferMemberButton = SOMButton().then { - $0.title = Text.transferEnterButtonTitle - $0.typography = .som.body1WithBold - $0.foregroundColor = .som.white - - $0.backgroundColor = .som.p300 - $0.layer.cornerRadius = 12 - $0.clipsToBounds = true + private let titleLabel = UILabel().then { + $0.text = Text.title + $0.textColor = .som.v2.black + $0.typography = .som.v2.head2 } + private let transferTextField = EnterMemberTransferTextFieldView().then { + $0.placeholder = Text.placeholderText + $0.guideMessage = Text.textfieldGuideMessage + } - // MARK: Override func + private let container = UIStackView().then { + $0.axis = .vertical + $0.spacing = 16 + } - @objc - private func touch(sender: UIGestureRecognizer) { - if !self.textField.isFirstResponder { - self.textField.becomeFirstResponder() - } + private let confirmButton = SOMButton().then { + $0.title = Text.confirmButtonTitle + $0.typography = .som.v2.title1 + $0.foregroundColor = .som.v2.white + $0.backgroundColor = .som.v2.black + $0.isEnabled = false } + + // MARK: Override func + override func setupNaviBar() { super.setupNaviBar() self.navigationBar.title = Text.navigationTitle } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - self.textField.becomeFirstResponder() - } - override func setupConstraints() { super.setupConstraints() - let transferBackgroundView = UIView().then { - $0.backgroundColor = .som.gray50 - $0.layer.cornerRadius = 22 - $0.clipsToBounds = true - } - self.view.addSubview(transferBackgroundView) - transferBackgroundView.snp.makeConstraints { - $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(149) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) + self.view.addSubview(self.titleLabel) + self.titleLabel.snp.makeConstraints { + $0.top.equalTo(self.view.safeAreaLayoutGuide.snp.top).offset(16) + $0.leading.equalToSuperview().offset(16) + $0.trailing.lessThanOrEqualToSuperview().offset(-16) } - transferBackgroundView.addSubview(self.transferEnterMessageLabel) - self.transferEnterMessageLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(44) - $0.centerX.equalToSuperview() + self.view.addSubview(self.transferTextField) + self.transferTextField.snp.makeConstraints { + $0.top.equalTo(self.titleLabel.snp.bottom).offset(32) + $0.leading.trailing.equalToSuperview() } - transferBackgroundView.addSubview(self.textFieldBackgroundView) - self.textFieldBackgroundView.snp.makeConstraints { - $0.top.equalTo(self.transferEnterMessageLabel.snp.bottom).offset(46) - $0.bottom.trailing.equalToSuperview().offset(-20) - $0.leading.equalToSuperview().offset(20) - $0.height.equalTo(64) + let guideTitleView = UIView() + let guideTitleImageView = UIImageView().then { + $0.image = .init(.icon(.v2(.filled(.info)))) + $0.tintColor = .som.v2.black + } + let guideTitleLabel = UILabel().then { + $0.text = Text.guideTitle + $0.textColor = .som.v2.black + $0.typography = .som.v2.subtitle2 } - self.textFieldBackgroundView.addSubview(self.textField) - self.textField.snp.makeConstraints { + guideTitleView.addSubview(guideTitleImageView) + guideTitleImageView.snp.makeConstraints { $0.centerY.equalToSuperview() - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) + $0.leading.equalToSuperview() + $0.size.equalTo(16) + } + guideTitleView.addSubview(guideTitleLabel) + guideTitleLabel.snp.makeConstraints { + $0.top.bottom.equalToSuperview() + $0.leading.equalTo(guideTitleImageView.snp.trailing).offset(6) + $0.trailing.lessThanOrEqualToSuperview() } - self.view.addSubview(self.transferMemberButton) - self.transferMemberButton.snp.makeConstraints { - $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-12) - $0.leading.equalToSuperview().offset(20) - $0.trailing.equalToSuperview().offset(-20) - $0.height.equalTo(48) + let guideMessageLabel = UILabel().then { + $0.text = Text.guideMessage + $0.textColor = .som.v2.gray500 + $0.typography = .som.v2.caption2 + $0.numberOfLines = 0 + $0.lineBreakMode = .byCharWrapping + } + + let guideView = UIView().then { + $0.backgroundColor = .som.v2.pLight1 + $0.layer.cornerRadius = 10 + } + guideView.addSubview(guideTitleView) + guideTitleView.snp.makeConstraints { + $0.top.equalToSuperview().offset(14) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + } + + guideView.addSubview(guideMessageLabel) + guideMessageLabel.snp.makeConstraints { + $0.top.equalTo(guideTitleView.snp.bottom).offset(4) + $0.bottom.equalToSuperview().offset(-14) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + } + self.container.addArrangedSubview(guideView) + + self.confirmButton.snp.makeConstraints { + $0.height.equalTo(56) + } + self.container.addArrangedSubview(self.confirmButton) + + self.view.addSubview(self.container) + self.container.snp.makeConstraints { + $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom) + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) } } override func updatedKeyboard(withoutBottomSafeInset height: CGFloat) { super.updatedKeyboard(withoutBottomSafeInset: height) - let margin: CGFloat = height + 24 - self.transferMemberButton.snp.updateConstraints { + let margin: CGFloat = height + 12 + self.container.snp.updateConstraints { $0.bottom.equalTo(self.view.safeAreaLayoutGuide.snp.bottom).offset(-margin) } } @@ -154,18 +163,13 @@ class EnterMemberTransferViewController: BaseNavigationViewController, View { func bind(reactor: EnterMemberTransferViewReactor) { // Action - let transferCode = self.textField.rx.text.orEmpty.distinctUntilChanged() + let transferCode = self.transferTextField.rx.text.orEmpty.distinctUntilChanged() transferCode - .map { $0.isEmpty } - .subscribe(with: self) { object, isEmpty in - - object.transferMemberButton.isEnabled = isEmpty == false - object.transferMemberButton.foregroundColor = isEmpty ? .som.gray600 : .som.white - object.transferMemberButton.backgroundColor = isEmpty ? .som.gray300 : .som.p300 - } + .map { $0.isEmpty == false } + .bind(to: self.confirmButton.rx.isEnabled) .disposed(by: self.disposeBag) - self.transferMemberButton.rx.throttleTap(.seconds(1)) + self.confirmButton.rx.throttleTap .withLatestFrom(transferCode) .map(Reactor.Action.enterTransferCode) .bind(to: reactor.action) @@ -177,8 +181,9 @@ class EnterMemberTransferViewController: BaseNavigationViewController, View { .bind(to: self.activityIndicatorView.rx.isAnimating) .disposed(by: self.disposeBag) - reactor.state.map(\.isSuccess) - .distinctUntilChanged() + let isSuccess = reactor.state.map(\.isSuccess).distinctUntilChanged().share() + + isSuccess .filter { $0 } .subscribe(with: self) { object, _ in let launchScreenViewController = LaunchScreenViewController() @@ -186,6 +191,27 @@ class EnterMemberTransferViewController: BaseNavigationViewController, View { object.view.window?.rootViewController = launchScreenViewController } .disposed(by: self.disposeBag) + + isSuccess + .filter { $0 == false } + .subscribe(with: self) { object, _ in + + let confirmAction = SOMDialogAction( + title: Text.dialogConfirmButtonTitle, + style: .primary, + action: { + UIApplication.topViewController?.dismiss(animated: true) + } + ) + + SOMDialogViewController.show( + title: Text.dialogTitle, + message: Text.dialogMessage, + textAlignment: .left, + actions: [confirmAction] + ) + } + .disposed(by: self.disposeBag) } } diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView+Rx.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView+Rx.swift new file mode 100644 index 00000000..07a846bc --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView+Rx.swift @@ -0,0 +1,19 @@ +// +// EnterMemberTransferTextFieldView+Rx.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import RxCocoa +import RxSwift + + +extension Reactive where Base: EnterMemberTransferTextFieldView { + + var text: ControlProperty { + self.base.textField.rx.text + } +} diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView.swift b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView.swift new file mode 100644 index 00000000..7f31ec98 --- /dev/null +++ b/SOOUM/SOOUM/Presentations/Main/Profile/Settings/MemberTransfer/Enter/Views/EnterMemberTransferTextFieldView.swift @@ -0,0 +1,175 @@ +// +// EnterMemberTransferTextFieldView.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import SnapKit +import Then + + +class EnterMemberTransferTextFieldView: UIView { + + + // MARK: Views + + private lazy var textFieldBackgroundView = UIView().then { + $0.backgroundColor = .som.v2.gray100 + $0.layer.cornerRadius = 10 + + let gestureRecognizer = UITapGestureRecognizer( + target: self, + action: #selector(self.touch) + ) + $0.addGestureRecognizer(gestureRecognizer) + } + + lazy var textField = UITextField().then { + let paragraphStyle = NSMutableParagraphStyle() + $0.defaultTextAttributes[.paragraphStyle] = paragraphStyle + $0.defaultTextAttributes[.foregroundColor] = UIColor.som.v2.black + $0.defaultTextAttributes[.font] = Typography.som.v2.subtitle1.font + $0.tintColor = UIColor.som.v2.black + + $0.enablesReturnKeyAutomatically = true + $0.returnKeyType = .go + + $0.autocapitalizationType = .none + $0.autocorrectionType = .no + $0.spellCheckingType = .no + + $0.setContentHuggingPriority(.defaultLow, for: .horizontal) + $0.setContentCompressionResistancePriority(.defaultHigh + 1, for: .vertical) + + $0.delegate = self + } + + private let guideMessageLabel = UILabel().then { + $0.textColor = .som.v2.gray500 + $0.typography = .som.v2.caption2 + } + + + // MARK: Variables + + var text: String? { + set { + self.textField.text = newValue + } + get { + return self.textField.text + } + } + + var placeholder: String? { + set { + if let string: String = newValue { + self.textField.attributedPlaceholder = NSAttributedString( + string: string, + attributes: [ + .foregroundColor: UIColor.som.v2.gray500, + .font: Typography.som.v2.subtitle1.font + ] + ) + } else { + self.textField.attributedPlaceholder = nil + } + } + + get { + return self.textField.attributedPlaceholder?.string + } + } + + var guideMessage: String? { + set { + self.guideMessageLabel.text = newValue + } + get { + return self.guideMessageLabel.text + } + } + + var isTextEmpty: Bool { + return self.text?.isEmpty ?? false + } + + + // MARK: Initalization + + override init(frame: CGRect) { + super.init(frame: frame) + + self.setupConstraints() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + // MARK: Override func + + override var isFirstResponder: Bool { + return self.textField.isFirstResponder + } + + @discardableResult + override func becomeFirstResponder() -> Bool { + return self.textField.becomeFirstResponder() + } + + @discardableResult + override func resignFirstResponder() -> Bool { + return self.textField.resignFirstResponder() + } + + + // MARK: Objc func + + @objc + private func touch(sender: UIGestureRecognizer) { + if !self.textField.isFirstResponder { + self.textField.becomeFirstResponder() + } + } + + + // MARK: Private func + + private func setupConstraints() { + + self.addSubview(self.textFieldBackgroundView) + self.textFieldBackgroundView.snp.makeConstraints { + $0.top.equalToSuperview() + $0.leading.equalToSuperview().offset(16) + $0.trailing.equalToSuperview().offset(-16) + $0.height.equalTo(54) + } + self.textFieldBackgroundView.addSubview(self.textField) + self.textField.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.leading.equalToSuperview().offset(24) + $0.trailing.equalToSuperview().offset(-20) + } + + self.addSubview(self.guideMessageLabel) + self.guideMessageLabel.snp.makeConstraints { + $0.top.equalTo(self.textFieldBackgroundView.snp.bottom).offset(8) + $0.bottom.equalToSuperview() + $0.leading.equalToSuperview().offset(16) + $0.trailing.lessThanOrEqualToSuperview().offset(-16) + } + } +} + +extension EnterMemberTransferTextFieldView: UITextFieldDelegate { + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() + return true + } +} diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/UpdateProfileViewController.swift b/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/UpdateProfileViewController.swift index 64b0ee05..a7577505 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/UpdateProfileViewController.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/UpdateProfileViewController.swift @@ -93,7 +93,7 @@ class UpdateProfileViewController: BaseNavigationViewController, View { func bind(reactor: UpdateProfileViewReactor) { KingfisherManager.shared.download(strUrl: reactor.profile.profileImg?.url) { [weak self] image in - self?.updateProfileView.image = image ?? .init(.image(.sooumLogo)) + self?.updateProfileView.image = image ?? .init(.image(.defaultStyle(.sooumLogo))) } self.updateProfileView.text = reactor.profile.nickname diff --git a/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/Views/UpdateProfileView.swift b/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/Views/UpdateProfileView.swift index 150ab34e..3dd6e800 100644 --- a/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/Views/UpdateProfileView.swift +++ b/SOOUM/SOOUM/Presentations/Main/Profile/UpdateProfile/Views/UpdateProfileView.swift @@ -19,7 +19,7 @@ class UpdateProfileView: UIView { } private let profileImageView = UIImageView().then { - $0.image = .init(.image(.sooumLogo)) + $0.image = .init(.image(.defaultStyle(.sooumLogo))) $0.layer.cornerRadius = 128 * 0.5 $0.clipsToBounds = true } @@ -81,7 +81,7 @@ class UpdateProfileView: UIView { } private let errorImageView = UIImageView().then { - $0.image = .init(.image(.errorTriangle)) + $0.image = .init(.image(.defaultStyle(.errorTriangle))) } private let errorMessageLabel = UILabel().then { diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/100.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/100.png index 4a35df96..44d76cd6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/100.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/100.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/1024.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/1024.png index e2b1b5b9..8e5ab540 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/1024.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/1024.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/114.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/114.png index 1b95e1a9..efa3aab9 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/114.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/114.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/120.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/120.png index 9c700c6f..7292ffa4 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/120.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/120.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/144.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/144.png index c5c24c75..0272ad78 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/144.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/144.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/152.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/152.png index 4dfab833..9af43eb6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/152.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/152.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/167.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/167.png index be1df57c..3f0db64f 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/167.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/167.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/180.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/180.png index 16b832d1..d0df52c7 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/180.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/180.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/20.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/20.png index f8922382..74e1923e 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/20.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/20.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/29.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/29.png index 4bf513c4..de76cd56 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/29.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/29.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/40.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/40.png index 69566787..d074c7a5 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/40.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/40.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/50.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/50.png index 7217a060..3ff7c180 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/50.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/50.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/57.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/57.png index cfa791f7..d0c93c9c 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/57.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/57.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/58.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/58.png index 1b55b774..68b30de5 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/58.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/58.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/60.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/60.png index 9cf48da5..09c208d6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/60.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/60.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/72.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/72.png index 3c46f748..1a077882 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/72.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/72.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/76.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/76.png index bda251ef..04731a3a 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/76.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/76.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/80.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/80.png index 5602cf8c..2e8c162f 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/80.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/80.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/87.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/87.png index 7239401d..946147a1 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/87.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon-Dev.appiconset/87.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/100.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/100.png index 4a35df96..44d76cd6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/100.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/100.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/1024.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/1024.png index e2b1b5b9..8e5ab540 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/1024.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/1024.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/114.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/114.png index 1b95e1a9..efa3aab9 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/114.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/114.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/120.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/120.png index 9c700c6f..7292ffa4 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/120.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/120.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/144.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/144.png index c5c24c75..0272ad78 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/144.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/144.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/152.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/152.png index 4dfab833..9af43eb6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/152.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/152.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/167.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/167.png index be1df57c..3f0db64f 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/167.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/167.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/180.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/180.png index 16b832d1..d0df52c7 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/180.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/180.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/20.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/20.png index f8922382..74e1923e 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/20.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/20.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/29.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/29.png index 4bf513c4..de76cd56 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/29.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/29.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/40.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/40.png index 69566787..d074c7a5 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/40.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/40.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/50.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/50.png index 7217a060..3ff7c180 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/50.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/50.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/57.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/57.png index cfa791f7..d0c93c9c 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/57.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/57.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/58.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/58.png index 1b55b774..68b30de5 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/58.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/58.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/60.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/60.png index 9cf48da5..09c208d6 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/60.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/60.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/72.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/72.png index 3c46f748..1a077882 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/72.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/72.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/76.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/76.png index bda251ef..04731a3a 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/76.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/76.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/80.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/80.png index 5602cf8c..2e8c162f 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/80.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/80.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/87.png b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/87.png index 7239401d..946147a1 100644 Binary files a/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/87.png and b/SOOUM/SOOUM/Resources/Assets.xcassets/AppIcon.appiconset/87.png differ diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/Contents.json new file mode 100644 index 00000000..4c288709 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "bell_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/bell_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/bell_filled.svg new file mode 100644 index 00000000..09495b53 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/bell_filled.imageset/bell_filled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/Contents.json new file mode 100644 index 00000000..9f1e6b16 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "camera_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/camera_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/camera_filled.svg new file mode 100644 index 00000000..f3e7e38f --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/camera_filled.imageset/camera_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/Contents.json new file mode 100644 index 00000000..80030d64 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "danger_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/danger_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/danger_filled.svg new file mode 100644 index 00000000..ab0afdff --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/danger_filled.imageset/danger_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/Contents.json new file mode 100644 index 00000000..0788c549 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "heart_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/heart_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/heart_filled.svg new file mode 100644 index 00000000..70efc3b8 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/heart_filled.imageset/heart_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/Contents.json new file mode 100644 index 00000000..2da6cbcb --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "home_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/home_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/home_filled.svg new file mode 100644 index 00000000..a9a8d688 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/home_filled.imageset/home_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/Contents.json new file mode 100644 index 00000000..d5813415 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "image_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/image_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/image_filled.svg new file mode 100644 index 00000000..666130cf --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/image_filled.imageset/image_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Contents.json new file mode 100644 index 00000000..29b2fb8e --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "Info_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Info_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Info_filled.svg new file mode 100644 index 00000000..2b426491 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/info_filled.imageset/Info_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/Contents.json new file mode 100644 index 00000000..3fc0069d --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "location_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/location_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/location_filled.svg new file mode 100644 index 00000000..e32e9ba2 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/location_filled.imageset/location_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/Contents.json new file mode 100644 index 00000000..93b3da70 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "message_circle_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/message_circle_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/message_circle_filled.svg new file mode 100644 index 00000000..8d30ff97 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_circle_filled.imageset/message_circle_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/Contents.json new file mode 100644 index 00000000..6d1069e1 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "message_square_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/message_square_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/message_square_filled.svg new file mode 100644 index 00000000..f0b849d4 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/message_square_filled.imageset/message_square_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/Contents.json new file mode 100644 index 00000000..671f5aed --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "settings_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/settings_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/settings_filled.svg new file mode 100644 index 00000000..0c58b0ee --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/settings_filled.imageset/settings_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/Contents.json new file mode 100644 index 00000000..9ea53472 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "star_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/star_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/star_filled.svg new file mode 100644 index 00000000..deee1483 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/star_filled.imageset/star_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/Contents.json new file mode 100644 index 00000000..aef7b5f8 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "tag_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/tag_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/tag_filled.svg new file mode 100644 index 00000000..d3093acd --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/tag_filled.imageset/tag_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/Contents.json new file mode 100644 index 00000000..4160db24 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "time_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/time_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/time_filled.svg new file mode 100644 index 00000000..d7352164 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/time_filled.imageset/time_filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/Contents.json new file mode 100644 index 00000000..c5bad132 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "trash_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/trash_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/trash_filled.svg new file mode 100644 index 00000000..e030089b --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/trash_filled.imageset/trash_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/Contents.json new file mode 100644 index 00000000..032e3249 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "user_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/user_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/user_filled.svg new file mode 100644 index 00000000..72e3cee5 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/user_filled.imageset/user_filled.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/Contents.json new file mode 100644 index 00000000..4295b2a5 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "write_filled.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/write_filled.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/write_filled.svg new file mode 100644 index 00000000..d4ada833 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Filled/write_filled.imageset/write_filled.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/Contents.json new file mode 100644 index 00000000..ffad4de9 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "bell_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/bell_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/bell_outlined.svg new file mode 100644 index 00000000..586c2bba --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/bell_outlined.imageset/bell_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/Contents.json new file mode 100644 index 00000000..9d466ff4 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "camera_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/camera_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/camera_outlined.svg new file mode 100644 index 00000000..73afffa0 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/camera_outlined.imageset/camera_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/Contents.json new file mode 100644 index 00000000..8ea481f6 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "check_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/check_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/check_outlined.svg new file mode 100644 index 00000000..d940ee8e --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/check_outlined.imageset/check_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/Contents.json new file mode 100644 index 00000000..76f2f52d --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "danger_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/danger_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/danger_outlined.svg new file mode 100644 index 00000000..e6022bed --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/danger_outlined.imageset/danger_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/Contents.json new file mode 100644 index 00000000..0616df60 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "delete_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/delete_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/delete_outlined.svg new file mode 100644 index 00000000..c6186d2f --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/delete_outlined.imageset/delete_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/Contents.json new file mode 100644 index 00000000..13f6239e --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "down_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/down_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/down_outlined.svg new file mode 100644 index 00000000..989a805f --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/down_outlined.imageset/down_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/Contents.json new file mode 100644 index 00000000..c7cae5ea --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "error_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/error_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/error_outlined.svg new file mode 100644 index 00000000..5bd5874a --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/error_outlined.imageset/error_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/Contents.json new file mode 100644 index 00000000..cf085279 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "heart_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/heart_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/heart_outlined.svg new file mode 100644 index 00000000..693e0556 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/heart_outlined.imageset/heart_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/Contents.json new file mode 100644 index 00000000..858581e7 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "home_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/home_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/home_outlined.svg new file mode 100644 index 00000000..8c2152ac --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/home_outlined.imageset/home_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/Contents.json new file mode 100644 index 00000000..09d24c07 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "image_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/image_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/image_outlined.svg new file mode 100644 index 00000000..e13eb67c --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/image_outlined.imageset/image_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/Contents.json new file mode 100644 index 00000000..9dbd3c2c --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "left_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/left_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/left_outlined.svg new file mode 100644 index 00000000..abe68d69 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/left_outlined.imageset/left_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/Contents.json new file mode 100644 index 00000000..29d82ed7 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "location_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/location_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/location_outlined.svg new file mode 100644 index 00000000..37fe871e --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/location_outlined.imageset/location_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/Contents.json new file mode 100644 index 00000000..465a538f --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "message_circle_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/message_circle_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/message_circle_outlined.svg new file mode 100644 index 00000000..4d32a4fc --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_circle_outlined.imageset/message_circle_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/Contents.json new file mode 100644 index 00000000..4edcf321 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "message_square_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/message_square_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/message_square_outlined.svg new file mode 100644 index 00000000..8cd29b43 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/message_square_outlined.imageset/message_square_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/Contents.json new file mode 100644 index 00000000..ab571461 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "more_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/more_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/more_outlined.svg new file mode 100644 index 00000000..472c2047 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/more_outlined.imageset/more_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/Contents.json new file mode 100644 index 00000000..3f77fb15 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "plus_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/plus_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/plus_outlined.svg new file mode 100644 index 00000000..f28f1c62 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/plus_outlined.imageset/plus_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/Contents.json new file mode 100644 index 00000000..711cb869 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "right_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/right_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/right_outlined.svg new file mode 100644 index 00000000..5acef760 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/right_outlined.imageset/right_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/Contents.json new file mode 100644 index 00000000..f667080b --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "search_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/search_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/search_outlined.svg new file mode 100644 index 00000000..79467171 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/search_outlined.imageset/search_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/Contents.json new file mode 100644 index 00000000..3023f1a2 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "settings_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/settings_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/settings_outlined.svg new file mode 100644 index 00000000..655a31e2 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/settings_outlined.imageset/settings_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/Contents.json new file mode 100644 index 00000000..6ef99b3b --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "star_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/star_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/star_outlined.svg new file mode 100644 index 00000000..e1d88da9 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/star_outlined.imageset/star_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/Contents.json new file mode 100644 index 00000000..861d0d59 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "swap_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/swap_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/swap_outlined.svg new file mode 100644 index 00000000..61b64fcc --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/swap_outlined.imageset/swap_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/Contents.json new file mode 100644 index 00000000..0760205b --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "tag_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/tag_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/tag_outlined.svg new file mode 100644 index 00000000..7d69d7d0 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/tag_outlined.imageset/tag_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/Contents.json new file mode 100644 index 00000000..e6d5843a --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "time_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/time_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/time_outlined.svg new file mode 100644 index 00000000..e7b1e124 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/time_outlined.imageset/time_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/Contents.json new file mode 100644 index 00000000..f7490657 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "trash_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/trash_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/trash_outlined.svg new file mode 100644 index 00000000..8e652075 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/trash_outlined.imageset/trash_outlined.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/Contents.json new file mode 100644 index 00000000..a379f110 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "up_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/up_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/up_outlined.svg new file mode 100644 index 00000000..b1e4f4e3 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/up_outlined.imageset/up_outlined.svg @@ -0,0 +1,3 @@ + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/Contents.json new file mode 100644 index 00000000..32ae4010 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "user_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/user_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/user_outlined.svg new file mode 100644 index 00000000..58bfe2d2 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/user_outlined.imageset/user_outlined.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/Contents.json new file mode 100644 index 00000000..50bf40af --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "write_outlined.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/write_outlined.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/write_outlined.svg new file mode 100644 index 00000000..a33731db --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Icons/Outlined/write_outlined.imageset/write_outlined.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/Contents.json new file mode 100644 index 00000000..455aa1f2 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "check_square_light.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/check_square_light.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/check_square_light.svg new file mode 100644 index 00000000..71c2689f --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/check_square_light.imageset/check_square_light.svg @@ -0,0 +1,4 @@ + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/Contents.json new file mode 100644 index 00000000..9042d343 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "onboarding.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/onboarding.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/onboarding.svg new file mode 100644 index 00000000..84c304e7 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding.imageset/onboarding.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/Contents.json new file mode 100644 index 00000000..1ef0aae8 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "onboarding_finish.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/onboarding_finish.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/onboarding_finish.svg new file mode 100644 index 00000000..eecb62f3 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/onboarding_finish.imageset/onboarding_finish.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/Contents.json new file mode 100644 index 00000000..257a53bb --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "profile.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/profile.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/profile.svg new file mode 100644 index 00000000..7affdc14 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Images/profile.imageset/profile.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/Contents.json b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/Contents.json new file mode 100644 index 00000000..c25e3ab6 --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "logo_white.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "original" + } +} diff --git a/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/logo_white.svg b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/logo_white.svg new file mode 100644 index 00000000..e9ed230c --- /dev/null +++ b/SOOUM/SOOUM/Resources/Assets.xcassets/DesignSystem/V2/Logos/logo_white.imageset/logo_white.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/SOOUM/SOOUM/Resources/loading_indicator_lottie.json b/SOOUM/SOOUM/Resources/loading_indicator_lottie.json new file mode 100644 index 00000000..d97517db --- /dev/null +++ b/SOOUM/SOOUM/Resources/loading_indicator_lottie.json @@ -0,0 +1 @@ +{"nm":"Main Scene","ddd":0,"h":24,"w":24,"meta":{"g":"@lottiefiles/creator 1.47.2"},"layers":[{"ty":4,"nm":"Shape Layer 2","sr":1,"st":0,"op":300,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[-22.637,19.301,0],"ix":1},"s":{"a":0,"k":[4.000000000000001,4.000000000000001,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[12.002480000000002,12.000000000000004,0],"ix":2},"r":{"a":1,"k":[{"o":{"x":0.472,"y":0.326},"i":{"x":0.526,"y":0.673},"s":[0],"t":0},{"s":[183],"t":60}],"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Ellipse 1","ix":1,"cix":2,"np":3,"it":[{"ty":"el","bm":0,"hd":false,"mn":"ADBE Vector Shape - Ellipse","nm":"Ellipse Path 1","d":1,"p":{"a":0,"k":[0,0],"ix":3},"s":{"a":0,"k":[368.602,368.602],"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":2,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":49,"ix":5},"c":{"a":0,"k":[0.1255,0.7765,0.9255],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[-22.699,19.301],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Trim","nm":"Trim Paths 1","ix":2,"e":{"a":1,"k":[{"o":{"x":0.559,"y":0},"i":{"x":0.504,"y":1},"s":[1],"t":0},{"s":[50],"t":30}],"ix":2},"o":{"a":0,"k":0,"ix":3},"s":{"a":1,"k":[{"o":{"x":0.579,"y":0},"i":{"x":0.438,"y":1},"s":[0],"t":30},{"s":[49],"t":60}],"ix":1},"m":1}],"ind":1}],"v":"5.7.0","fr":45,"op":59,"ip":0,"assets":[]} \ No newline at end of file diff --git a/SOOUM/SOOUM/Utilities/Alamofire/Alamofire_constants.swift b/SOOUM/SOOUM/Utilities/Alamofire/Alamofire_constants.swift index 06e12a11..5bc67984 100644 --- a/SOOUM/SOOUM/Utilities/Alamofire/Alamofire_constants.swift +++ b/SOOUM/SOOUM/Utilities/Alamofire/Alamofire_constants.swift @@ -15,11 +15,7 @@ struct Constants { } static var endpoint: String { - #if DEVELOP - return self.serverEndpoint(scheme: "http://") - #elseif PRODUCTION return self.serverEndpoint(scheme: "https://") - #endif } enum HTTPHeader: String { diff --git a/SOOUM/SOOUM/Utilities/SwiftEntryKit/SwiftEntryKit.swift b/SOOUM/SOOUM/Utilities/SwiftEntryKit/SwiftEntryKit.swift new file mode 100644 index 00000000..3c010817 --- /dev/null +++ b/SOOUM/SOOUM/Utilities/SwiftEntryKit/SwiftEntryKit.swift @@ -0,0 +1,36 @@ +// +// SwiftEntryKit.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import SwiftEntryKit + +protocol SwiftEntryKitExtension { + + var entryName: String? { get } + + /// *주의 : 반드시 display 직전에 올바른 entryName을 지정해야 함 + func show(with attributes: EKAttributes) + + func dismiss(_ completion: (() -> Void)?) + static func dismiss(_ completion: (() -> Void)?) +} + +extension SwiftEntryKitExtension { + + func dismiss(_ completion: (() -> Void)? = nil) { + if let entryName = self.entryName { + SwiftEntryKit.dismiss(.specific(entryName: entryName), with: completion) + } else { + Self.dismiss(completion) + } + } + + static func dismiss(_ completion: (() -> Void)? = nil) { + SwiftEntryKit.dismiss(.displayed, with: completion) + } +} diff --git a/SOOUM/SOOUM/Utilities/SwiftEntryKit/View+SwiftEntryKit.swift b/SOOUM/SOOUM/Utilities/SwiftEntryKit/View+SwiftEntryKit.swift new file mode 100644 index 00000000..a08f14ed --- /dev/null +++ b/SOOUM/SOOUM/Utilities/SwiftEntryKit/View+SwiftEntryKit.swift @@ -0,0 +1,93 @@ +// +// View+SwiftEntryKit.swift +// SOOUM +// +// Created by 오현식 on 9/12/25. +// + +import UIKit + +import SwiftEntryKit + +protocol SwiftEntryKitViewExtension: SwiftEntryKitExtension { + var afterView: () -> UIView? { get } +} + +protocol SwiftEntryKitViewBridge { + associatedtype Base + var sek: SwiftEntryKitViewWrapper { get } +} + +struct SwiftEntryKitViewWrapper: SwiftEntryKitViewExtension { + + var afterView: () -> UIView? + var entryName: String? + + init(closure: @escaping () -> UIView?) { + self.afterView = closure + } +} + +extension SwiftEntryKitViewExtension { + + func show(with attributes: EKAttributes) { + guard let view = self.afterView() else { return } + var attributes: EKAttributes = attributes + attributes.name = self.entryName + DispatchQueue.main.async { + SwiftEntryKit.display(entry: view, using: attributes) + } + } +} + +extension UIView: SwiftEntryKitViewBridge { + + var sek: SwiftEntryKitViewWrapper { + return .init { [weak self] in self } + } +} + +extension SwiftEntryKitViewWrapper where Base == UIView { + + func showBottomFloat( + screenColor: UIColor? = .som.v2.dim, + screenInteraction: EKAttributes.UserInteraction, + useSafeArea: Bool = true, + hasHandleBar: Bool = true, + workAtWillAppear: (() -> Void)? = nil, + completion: (() -> Void)? = nil + ) { + var attributes: EKAttributes = .bottomFloat + + if useSafeArea { + attributes.positionConstraints.safeArea = .overridden + } + + if let screenColor: UIColor = screenColor { + attributes.screenBackground = .color(color: .init(screenColor)) + } else { + attributes.screenBackground = .clear + } + + if hasHandleBar { + attributes.scroll = .edgeCrossingDisabled(swipeable: true) + } + + attributes.roundCorners = .all(radius: 20) + attributes.positionConstraints.verticalOffset = 34 + + attributes.entryBackground = .color(color: .init(.som.v2.white)) + + attributes.displayDuration = .infinity + attributes.entranceAnimation = .init(translate: .init(duration: 0.25)) + attributes.exitAnimation = .init(translate: .init(duration: 0.25)) + + attributes.entryInteraction = .forward + attributes.screenInteraction = screenInteraction + + attributes.lifecycleEvents.willAppear = workAtWillAppear + attributes.lifecycleEvents.willDisappear = completion + + self.show(with: attributes) + } +}