diff --git a/Pods/Pods.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
index 556f49b..0ea8545 100644
--- a/Pods/Pods.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/Pods/Pods.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -88,6 +88,42 @@
orderHint
11
+ KakaoSDKAuth.xcscheme
+
+ isShown
+
+ orderHint
+ 26
+
+ KakaoSDKAuth.xcscheme_^#shared#^_
+
+ orderHint
+ 26
+
+ KakaoSDKCommon.xcscheme
+
+ isShown
+
+ orderHint
+ 27
+
+ KakaoSDKCommon.xcscheme_^#shared#^_
+
+ orderHint
+ 27
+
+ KakaoSDKUser.xcscheme
+
+ isShown
+
+ orderHint
+ 28
+
+ KakaoSDKUser.xcscheme_^#shared#^_
+
+ orderHint
+ 28
+
Kingfisher.xcscheme
isShown
diff --git a/README.md b/README.md
index b45a0c3..4f78f18 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,17 @@
-# Thirty-iOS
\ No newline at end of file
+
+
+
+
+30일 챌린지 기록하기
+
+
+
+
+
+
+
+
diff --git a/Thirty.xcodeproj/project.pbxproj b/Thirty.xcodeproj/project.pbxproj
index c59c02c..2a1c370 100644
--- a/Thirty.xcodeproj/project.pbxproj
+++ b/Thirty.xcodeproj/project.pbxproj
@@ -30,6 +30,7 @@
753B078D286BC82200B62F35 /* CommunityAllVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753B078C286BC82200B62F35 /* CommunityAllVC.swift */; };
753B078F286BC84500B62F35 /* FindFriendVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753B078E286BC84500B62F35 /* FindFriendVC.swift */; };
753EB1DB27EB65A300D20579 /* MyInfoVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753EB1DA27EB65A300D20579 /* MyInfoVC.swift */; };
+ 7549DEB62993C4C7004045EA /* UILabel+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7549DEB52993C4C7004045EA /* UILabel+Extension.swift */; };
7562CB35287656960004EC99 /* CreateChallengeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7562CB34287656960004EC99 /* CreateChallengeVC.swift */; };
75771D3D292C506D00706881 /* MyFriendManageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75771D3C292C506D00706881 /* MyFriendManageVC.swift */; };
75771D3F292C51B100706881 /* MyFriendManageReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75771D3E292C51B100706881 /* MyFriendManageReactor.swift */; };
@@ -109,10 +110,11 @@
F98C9AE628C4C225003A25CD /* ExploreVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F98C9AE528C4C225003A25CD /* ExploreVC.swift */; };
F98C9AE828C4CC66003A25CD /* BucketAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F98C9AE728C4CC66003A25CD /* BucketAPI.swift */; };
F98C9AEA28C4CEC9003A25CD /* Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = F98C9AE928C4CEC9003A25CD /* Token.swift */; };
+ F99B69E4298627A8001F6003 /* SelectChallengeThemeNewVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F99B69E3298627A8001F6003 /* SelectChallengeThemeNewVC.swift */; };
+ F99B69E629863CB5001F6003 /* SelectChallengeThemeNewReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = F99B69E529863CB5001F6003 /* SelectChallengeThemeNewReactor.swift */; };
F99C6FD128F3195B00F5F1DD /* CommunityAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F99C6FD028F3195B00F5F1DD /* CommunityAPI.swift */; };
F9A65627288D02B300544D83 /* CommunityListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A65626288D02B300544D83 /* CommunityListCell.swift */; };
F9A65629288D07AB00544D83 /* Community.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A65628288D07AB00544D83 /* Community.swift */; };
- F9A6562B288D08CF00544D83 /* CommunityListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9A6562A288D08CF00544D83 /* CommunityListViewModel.swift */; };
F9B0D46527EF654A0092F2B8 /* TabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B0D46427EF654A0092F2B8 /* TabBarController.swift */; };
F9B0D46827EF67210092F2B8 /* CommunityNC.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B0D46727EF67210092F2B8 /* CommunityNC.swift */; };
F9B4859427FC8926003A129B /* Challenge.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9B4859327FC8926003A129B /* Challenge.swift */; };
@@ -160,6 +162,7 @@
753B078C286BC82200B62F35 /* CommunityAllVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityAllVC.swift; sourceTree = ""; };
753B078E286BC84500B62F35 /* FindFriendVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindFriendVC.swift; sourceTree = ""; };
753EB1DA27EB65A300D20579 /* MyInfoVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyInfoVC.swift; sourceTree = ""; };
+ 7549DEB52993C4C7004045EA /* UILabel+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UILabel+Extension.swift"; sourceTree = ""; };
7562CB34287656960004EC99 /* CreateChallengeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateChallengeVC.swift; sourceTree = ""; };
75771D3C292C506D00706881 /* MyFriendManageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyFriendManageVC.swift; sourceTree = ""; };
75771D3E292C51B100706881 /* MyFriendManageReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyFriendManageReactor.swift; sourceTree = ""; };
@@ -243,10 +246,11 @@
F98C9AE528C4C225003A25CD /* ExploreVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExploreVC.swift; sourceTree = ""; };
F98C9AE728C4CC66003A25CD /* BucketAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BucketAPI.swift; sourceTree = ""; };
F98C9AE928C4CEC9003A25CD /* Token.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Token.swift; sourceTree = ""; };
+ F99B69E3298627A8001F6003 /* SelectChallengeThemeNewVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectChallengeThemeNewVC.swift; sourceTree = ""; };
+ F99B69E529863CB5001F6003 /* SelectChallengeThemeNewReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectChallengeThemeNewReactor.swift; sourceTree = ""; };
F99C6FD028F3195B00F5F1DD /* CommunityAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityAPI.swift; sourceTree = ""; };
F9A65626288D02B300544D83 /* CommunityListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListCell.swift; sourceTree = ""; };
F9A65628288D07AB00544D83 /* Community.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Community.swift; sourceTree = ""; };
- F9A6562A288D08CF00544D83 /* CommunityListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityListViewModel.swift; sourceTree = ""; };
F9B0D46427EF654A0092F2B8 /* TabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarController.swift; sourceTree = ""; };
F9B0D46727EF67210092F2B8 /* CommunityNC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommunityNC.swift; sourceTree = ""; };
F9B4859327FC8926003A129B /* Challenge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Challenge.swift; sourceTree = ""; };
@@ -318,6 +322,8 @@
isa = PBXGroup;
children = (
757D45AF28DBD837004DBC5A /* SplashVC.swift */,
+ F99B69E3298627A8001F6003 /* SelectChallengeThemeNewVC.swift */,
+ F99B69E529863CB5001F6003 /* SelectChallengeThemeNewReactor.swift */,
757D66C82874FEDF00E3C5DE /* SelectChallengeThemeVC.swift */,
757D66CA2874FEFB00E3C5DE /* SelectChallengeVC.swift */,
F9C6504828B9F49D0026405A /* SelectChallengeReactor.swift */,
@@ -419,7 +425,6 @@
isa = PBXGroup;
children = (
759D328227C8933700A88C02 /* Community.storyboard */,
- F9A6562A288D08CF00544D83 /* CommunityListViewModel.swift */,
F9BF9EDF28F3AB6900F95CE5 /* CommunityReactor.swift */,
753B078C286BC82200B62F35 /* CommunityAllVC.swift */,
753B078A286BC80200B62F35 /* CommunityFriendVC.swift */,
@@ -509,6 +514,7 @@
75A7741A28DD2C5000B7775C /* Date+Extension.swift */,
75A7741C28DD2D0600B7775C /* UIImageView+Extension.swift */,
758B0F082900C47800FEDBEF /* UICollectionView+Extension.swift */,
+ 7549DEB52993C4C7004045EA /* UILabel+Extension.swift */,
);
path = Extension;
sourceTree = "";
@@ -736,16 +742,19 @@
F9BC339D27EC9FB600F0C722 /* MyAlertVC.swift in Sources */,
757D66CD2875048900E3C5DE /* WelcomeVC.swift in Sources */,
7504D90B28F70EF30033A27F /* Announcement.swift in Sources */,
+ F99B69E629863CB5001F6003 /* SelectChallengeThemeNewReactor.swift in Sources */,
F9E01FC128CE1A7D00649EC7 /* WelcomePopupVC.swift in Sources */,
75C586C827E307D50022B5D8 /* ExploreListVC.swift in Sources */,
F9BC33A327EC9FFD00F0C722 /* MyNoticeVC.swift in Sources */,
F9BC33A027EC9FD700F0C722 /* MyShareSettingVC.swift in Sources */,
7562CB35287656960004EC99 /* CreateChallengeVC.swift in Sources */,
+ 7549DEB62993C4C7004045EA /* UILabel+Extension.swift in Sources */,
F96EBBBC28D5B59800FECD00 /* TokenManager.swift in Sources */,
75A7741B28DD2C5000B7775C /* Date+Extension.swift in Sources */,
757C96822863E169005CCBA3 /* ChallengeExportVC.swift in Sources */,
759D328B27C8A45000A88C02 /* ChallengeVC.swift in Sources */,
751A19F427E8A8890025812D /* UIColor+Extension.swift in Sources */,
+ F99B69E4298627A8001F6003 /* SelectChallengeThemeNewVC.swift in Sources */,
75B6B3C128EEF2E10081AA36 /* ChallengeExportReactor.swift in Sources */,
75073B1C280F8080008814EE /* ChallengeAPI.swift in Sources */,
F98C9AEA28C4CEC9003A25CD /* Token.swift in Sources */,
@@ -760,7 +769,6 @@
F94CCC2A28F46B01002B05F5 /* LoginReactor.swift in Sources */,
7537C2732953D2700031C4FE /* CompleteChallengeDetailReactor.swift in Sources */,
7501A4FC27E239B500EB4EB0 /* MyNC.swift in Sources */,
- F9A6562B288D08CF00544D83 /* CommunityListViewModel.swift in Sources */,
F960391A2915F7E100F296DA /* WelcomeSignUpReactor.swift in Sources */,
F96EBBC228D5BDE000FECD00 /* MyBadgeReactor.swift in Sources */,
757C96782863E080005CCBA3 /* ChallengeDetailImageVC.swift in Sources */,
@@ -976,8 +984,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Thirty/Thirty.entitlements;
- CODE_SIGN_IDENTITY = "iPhone Distribution";
- CODE_SIGN_STYLE = Manual;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 2YT3299DFQ;
INFOPLIST_FILE = Thirty/Info.plist;
@@ -986,10 +994,10 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.0.8;
+ MARKETING_VERSION = 1.0.9;
PRODUCT_BUNDLE_IDENTIFIER = com.sookmyung.thirty;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "Thirty Distribution";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
@@ -1002,8 +1010,8 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = Thirty/Thirty.entitlements;
- CODE_SIGN_IDENTITY = "iPhone Distribution";
- CODE_SIGN_STYLE = Manual;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 2YT3299DFQ;
INFOPLIST_FILE = Thirty/Info.plist;
@@ -1012,10 +1020,10 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 1.0.8;
+ MARKETING_VERSION = 1.0.9;
PRODUCT_BUNDLE_IDENTIFIER = com.sookmyung.thirty;
PRODUCT_NAME = "$(TARGET_NAME)";
- PROVISIONING_PROFILE_SPECIFIER = "Thirty Distribution";
+ PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 1;
};
diff --git a/Thirty.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist b/Thirty.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
index 3cf5b70..12afd4c 100644
--- a/Thirty.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/Thirty.xcodeproj/xcuserdata/hakyung.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -7,7 +7,7 @@
Thirty.xcscheme_^#shared#^_
orderHint
- 26
+ 29
diff --git a/Thirty.xcworkspace/xcuserdata/hakyung.xcuserdatad/UserInterfaceState.xcuserstate b/Thirty.xcworkspace/xcuserdata/hakyung.xcuserdatad/UserInterfaceState.xcuserstate
index b86382f..cc691e8 100644
Binary files a/Thirty.xcworkspace/xcuserdata/hakyung.xcuserdatad/UserInterfaceState.xcuserstate and b/Thirty.xcworkspace/xcuserdata/hakyung.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/Thirty.xcworkspace/xcuserdata/mobile.xcuserdatad/UserInterfaceState.xcuserstate b/Thirty.xcworkspace/xcuserdata/mobile.xcuserdatad/UserInterfaceState.xcuserstate
index 0028537..fa3a562 100644
Binary files a/Thirty.xcworkspace/xcuserdata/mobile.xcuserdatad/UserInterfaceState.xcuserstate and b/Thirty.xcworkspace/xcuserdata/mobile.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/Contents.json b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/Contents.json
similarity index 71%
rename from Thirty/App/Asset/Assets.xcassets/samplecat.imageset/Contents.json
rename to Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/Contents.json
index dc194a4..10fefdd 100644
--- a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/Contents.json
+++ b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/Contents.json
@@ -1,17 +1,16 @@
{
"images" : [
{
- "filename" : "IMG_1992.JPG",
+ "filename" : "minus.png",
"idiom" : "universal",
"scale" : "1x"
},
{
- "filename" : "IMG_1992-1.JPG",
+ "filename" : "minus@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
- "filename" : "IMG_1992-2.JPG",
"idiom" : "universal",
"scale" : "3x"
}
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus.png b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus.png
new file mode 100644
index 0000000..6f4c66f
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus@2x.png b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus@2x.png
new file mode 100644
index 0000000..ce69e04
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Common/icon_image_x_black.imageset/minus@2x.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Contents.json b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Contents.json
new file mode 100644
index 0000000..001ba33
--- /dev/null
+++ b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "filename" : "Union-1.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Union@2x-1.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union-1.png b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union-1.png
new file mode 100644
index 0000000..b0a3424
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union-1.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union@2x-1.png b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union@2x-1.png
new file mode 100644
index 0000000..c9b10fc
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Community/comment.imageset/Union@2x-1.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Contents.json b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Contents.json
new file mode 100644
index 0000000..0060388
--- /dev/null
+++ b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Contents.json
@@ -0,0 +1,22 @@
+{
+ "images" : [
+ {
+ "filename" : "Union.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Union@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union.png b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union.png
new file mode 100644
index 0000000..0b6a055
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union@2x.png b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union@2x.png
new file mode 100644
index 0000000..0e7f277
Binary files /dev/null and b/Thirty/App/Asset/Assets.xcassets/App/Community/like.imageset/Union@2x.png differ
diff --git a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-1.JPG b/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-1.JPG
deleted file mode 100644
index d5832da..0000000
Binary files a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-1.JPG and /dev/null differ
diff --git a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-2.JPG b/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-2.JPG
deleted file mode 100644
index d5832da..0000000
Binary files a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992-2.JPG and /dev/null differ
diff --git a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992.JPG b/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992.JPG
deleted file mode 100644
index d5832da..0000000
Binary files a/Thirty/App/Asset/Assets.xcassets/samplecat.imageset/IMG_1992.JPG and /dev/null differ
diff --git a/Thirty/App/Asset/Base.lproj/Main.storyboard b/Thirty/App/Asset/Base.lproj/Main.storyboard
index 36ee208..1da2ceb 100644
--- a/Thirty/App/Asset/Base.lproj/Main.storyboard
+++ b/Thirty/App/Asset/Base.lproj/Main.storyboard
@@ -1,9 +1,9 @@
-
+
-
+
@@ -11,6 +11,9 @@
+
+ BlatantRegular
+
Pretendard-Bold
@@ -107,7 +110,7 @@
-
+
@@ -483,7 +479,7 @@
-
+
@@ -492,12 +488,12 @@
-
+
-
-
-
-
+
+
+
+
@@ -507,26 +503,70 @@
+
+
+
-
+
+
-
+
+
-
+
+
+
+
+
-
-
+
+
-
@@ -566,7 +606,7 @@
@@ -1303,8 +1300,9 @@
-
-
+
+
+
@@ -1338,7 +1336,7 @@
-
+
비밀번호 재설정 메일을 보냈어요
확인해보세요!
diff --git a/Thirty/App/UI/My/SendEmailPopupVC.swift b/Thirty/App/UI/My/SendEmailPopupVC.swift
index 22369e3..4983137 100644
--- a/Thirty/App/UI/My/SendEmailPopupVC.swift
+++ b/Thirty/App/UI/My/SendEmailPopupVC.swift
@@ -13,6 +13,7 @@ class SendEmailPopupVC: UIViewController {
}
@IBAction func backButtonAction(_ sender: Any) {
- self.dismiss(animated: true, completion: nil)
+ self.presentingViewController?
+ .presentingViewController?.dismiss(animated: false, completion: nil)
}
}
diff --git a/Thirty/App/UI/Onboarding/SelectChallengeReactor.swift b/Thirty/App/UI/Onboarding/SelectChallengeReactor.swift
index 9c22005..f02b5f8 100644
--- a/Thirty/App/UI/Onboarding/SelectChallengeReactor.swift
+++ b/Thirty/App/UI/Onboarding/SelectChallengeReactor.swift
@@ -19,12 +19,14 @@ class SelectChallengeReactor: Reactor {
enum Mutation {
case setChallengeList([Challenge])
case getToken(Token)
+ case addSuccessed(Bool)
}
struct State {
var selectedTheme: String = ""
var challengeList: [Challenge] = []
var selectedIndex: IndexPath = IndexPath(row: 0, section: 0)
+ var addChallengeResponse: Bool = false
}
var challengeObservable = BehaviorRelay<[Challenge]>(value: [])
@@ -50,6 +52,8 @@ class SelectChallengeReactor: Reactor {
case .getToken(let token):
try? TokenManager.shared.saveAccessToken(token.access_token ?? "")
try? TokenManager.shared.saveRefreshToken(token.refresh_token ?? "")
+ case .addSuccessed(let flag):
+ newState.addChallengeResponse = flag
}
return newState
}
@@ -83,6 +87,11 @@ class SelectChallengeReactor: Reactor {
let str = String(decoding: response.data, as: UTF8.self)
print(str)
let result = try? response.map(Token.self)
+ if 200 ..< 300 ~= response.statusCode {
+ observer.onNext(.addSuccessed(true))
+ } else {
+ observer.onNext(.addSuccessed(false))
+ }
observer.onNext(Mutation.getToken(result ?? Token()))
observer.onCompleted()
case let .failure(error):
diff --git a/Thirty/App/UI/Onboarding/SelectChallengeThemeNewReactor.swift b/Thirty/App/UI/Onboarding/SelectChallengeThemeNewReactor.swift
new file mode 100644
index 0000000..7c513cc
--- /dev/null
+++ b/Thirty/App/UI/Onboarding/SelectChallengeThemeNewReactor.swift
@@ -0,0 +1,68 @@
+//
+// SelectChallengeThemeNewReactor.swift
+// Thirty
+//
+// Created by 송하경 on 2023/01/29.
+//
+
+import ReactorKit
+import Moya
+import RxRelay
+
+class SelectChallengeThemeNewReactor: Reactor {
+ enum Action {
+ case viewDidLoad
+ case selectCategory(Int)
+ }
+
+ enum Mutation {
+ case setCategoryList([Category])
+ case selectedCategory(Int)
+ }
+
+ struct State {
+ var categoryList: [Category] = []
+ var selectedCategory: Category?
+ }
+
+ var initialState: State = State()
+
+ func mutate(action: Action) -> Observable {
+ switch action {
+ case .viewDidLoad:
+ return requestCategoryListRx()
+ case let .selectCategory(index):
+ return Observable.just(.selectedCategory(index))
+ }
+ }
+
+ func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case let .setCategoryList(categoryList):
+ newState.categoryList = categoryList
+ case let .selectedCategory(index):
+ newState.selectedCategory = newState.categoryList[index]
+ print("인덱스22", index)
+ }
+ return newState
+ }
+
+ private func requestCategoryListRx() -> Observable {
+ let response = Observable.create { observer in
+ let provider = MoyaProvider()
+ provider.request(.categoryList) { result in
+ switch result {
+ case let .success(response):
+ let result = try? response.map([Category].self)
+ observer.onNext(.setCategoryList(result ?? []))
+ observer.onCompleted()
+ case let .failure(error):
+ observer.onError(error)
+ }
+ }
+ return Disposables.create()
+ }
+ return response
+ }
+}
diff --git a/Thirty/App/UI/Onboarding/SelectChallengeThemeNewVC.swift b/Thirty/App/UI/Onboarding/SelectChallengeThemeNewVC.swift
new file mode 100644
index 0000000..9dc445b
--- /dev/null
+++ b/Thirty/App/UI/Onboarding/SelectChallengeThemeNewVC.swift
@@ -0,0 +1,104 @@
+//
+// SelectChallengeThemeNewVC.swift
+// Thirty
+//
+// Created by 송하경 on 2023/01/29.
+//
+
+import UIKit
+import ReactorKit
+
+class SelectChallengeThemeNewVC: UIViewController, StoryboardView {
+ typealias Reactor = SelectChallengeThemeNewReactor
+ var disposeBag = DisposeBag()
+ var selectedCategory: Category?
+
+ @IBOutlet weak var backButton: UIButton!
+ @IBOutlet weak var nextButton: UIButton!
+ @IBOutlet weak var categoryCollectionView: UICollectionView!
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+ self.reactor = SelectChallengeThemeNewReactor()
+ reactor?.action.onNext(.viewDidLoad)
+ categoryCollectionView.rx.setDelegate(self).disposed(by: disposeBag)
+ }
+
+ override func viewWillAppear(_ animated: Bool) {
+ super.viewWillAppear(animated)
+ }
+
+ func bind(reactor: SelectChallengeThemeNewReactor) {
+ bindAction(reactor)
+ bindState(reactor)
+ }
+
+ private func bindAction(_ reactor: SelectChallengeThemeNewReactor) {
+ backButton.rx.tap
+ .bind {
+ self.navigationController?.popViewController(animated: true)
+ }.disposed(by: disposeBag)
+
+ nextButton.rx.tap
+ .bind {
+ let selectChallengeVC = self.storyboard?.instantiateViewController(withIdentifier: "SelectChallengeVC") as! SelectChallengeVC
+ selectChallengeVC.selectedCategory = self.selectedCategory
+
+ self.navigationController?.pushViewController(selectChallengeVC, animated: true)
+ }.disposed(by: disposeBag)
+
+ Observable.zip(categoryCollectionView.rx.modelSelected(Category.self), categoryCollectionView.rx.itemSelected)
+ .bind { [weak self] (category, indexPath) in
+ self?.nextButton.setTitleColor(.white, for: .normal)
+ self?.nextButton.isEnabled = true
+
+ self?.categoryCollectionView.visibleCells.forEach {
+ let cell = $0 as! SelectChallengeCollectionViewCell
+
+ cell.contentView.backgroundColor = .gray700
+ cell.nameEng.textColor = .gray600
+ cell.nameKor.textColor = .gray600
+ }
+
+ let cell = self?.categoryCollectionView.cellForItem(at: indexPath) as! SelectChallengeCollectionViewCell
+ cell.contentView.backgroundColor = .white
+ cell.nameEng.textColor = .white
+ cell.nameKor.textColor = .white
+
+ self?.selectedCategory = category
+ }
+ .disposed(by: disposeBag)
+
+ }
+
+ private func bindState(_ reactor: SelectChallengeThemeNewReactor) {
+ reactor.state
+ .map { $0.categoryList }
+ .bind(to: categoryCollectionView.rx.items(cellIdentifier: SelectChallengeCollectionViewCell.identifier, cellType: SelectChallengeCollectionViewCell.self)) { _, item, cell in
+ cell.nameKor.text = item.name
+ cell.nameEng.text = korNameOfCategory(item.name)
+ }
+ .disposed(by: disposeBag)
+ }
+}
+
+extension SelectChallengeThemeNewVC: UICollectionViewDelegateFlowLayout {
+ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
+ let width: CGFloat = (collectionView.bounds.width - 10) / 2
+ let height: CGFloat = 89
+
+ return CGSize(width: width, height: height)
+ }
+
+ func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+ return 10
+ }
+}
+
+class SelectChallengeCollectionViewCell: UICollectionViewCell {
+ @IBOutlet weak var backViewAsBorder: UIView!
+ @IBOutlet weak var nameEng: UILabel!
+ @IBOutlet weak var nameKor: UILabel!
+
+ static var identifier = "SelectChallengeCollectionViewCell"
+}
diff --git a/Thirty/App/UI/Onboarding/SelectChallengeThemeVC.swift b/Thirty/App/UI/Onboarding/SelectChallengeThemeVC.swift
index bbaced3..1aca993 100644
--- a/Thirty/App/UI/Onboarding/SelectChallengeThemeVC.swift
+++ b/Thirty/App/UI/Onboarding/SelectChallengeThemeVC.swift
@@ -63,7 +63,7 @@ class SelectChallengeThemeVC: UIViewController {
extension SelectChallengeThemeVC {
@IBAction func nextButtonTouchUpInside(_ sender: UIButton) {
let selectChallengeVC = self.storyboard?.instantiateViewController(withIdentifier: "SelectChallengeVC") as! SelectChallengeVC
- selectChallengeVC.selectedItem = selectedItem
+// selectChallengeVC.selectedItem = selectedItem
let selectChallengeReactor = SelectChallengeReactor()
selectChallengeReactor.selectedTheme = selectedItem
diff --git a/Thirty/App/UI/Onboarding/SelectChallengeVC.swift b/Thirty/App/UI/Onboarding/SelectChallengeVC.swift
index 4e13747..45d33d1 100644
--- a/Thirty/App/UI/Onboarding/SelectChallengeVC.swift
+++ b/Thirty/App/UI/Onboarding/SelectChallengeVC.swift
@@ -12,7 +12,7 @@ import ReactorKit
class SelectChallengeVC: UIViewController, StoryboardView {
typealias Reactor = SelectChallengeReactor
- var selectedItem = BehaviorRelay(value: "")
+ var selectedCategory: Category?
var disposeBag = DisposeBag()
var selectedChallenge: Challenge?
var challgeList: [Challenge]?
@@ -31,7 +31,7 @@ class SelectChallengeVC: UIViewController, StoryboardView {
}
override func viewWillAppear(_ animated: Bool) {
- reactor?.action.onNext(.setChallengeByTheme(selectedItem.value))
+ reactor?.action.onNext(.setChallengeByTheme(selectedCategory?.name ?? ""))
}
func bind(reactor: SelectChallengeReactor) {
@@ -58,12 +58,22 @@ class SelectChallengeVC: UIViewController, StoryboardView {
.subscribe(onNext: { challengeList in
self.challgeList = challengeList
}).disposed(by: disposeBag)
+
+ reactor.state
+ .map { $0.addChallengeResponse }
+ .subscribe(onNext: { responseSucceed in
+ if responseSucceed {
+ self.performSegue(withIdentifier: "goMain", sender: self)
+ let viewControllers = self.navigationController?.viewControllers
+ self.navigationController?.popToViewController((viewControllers?[viewControllers!.count - 3])!, animated: true)
+ UserDefaults.standard.setValue(true, forKey: "launched")
+ }
+ }).disposed(by: disposeBag)
}
func bindAction(_ reactor: SelectChallengeReactor) {
collectionView.rx.modelSelected(Challenge.self)
.subscribe(onNext: { challenge in
- print(challenge)
self.selectedChallenge = challenge
})
.disposed(by: disposeBag)
@@ -72,24 +82,16 @@ class SelectChallengeVC: UIViewController, StoryboardView {
.subscribe(onNext: { [weak self] indexPath in
self?.collectionView.visibleCells.forEach {
let onboardingCell = $0 as! OnboardingCollectionViewCell
- onboardingCell.colorView.backgroundColor = .gray600
+ onboardingCell.contentView.backgroundColor = .gray800
}
let cell = self?.collectionView.cellForItem(at: indexPath) as! OnboardingCollectionViewCell
- cell.colorView?.backgroundColor = .white
-
+ cell.contentView.backgroundColor = .white
}).disposed(by: disposeBag)
nextButton.rx.tap
.subscribe(onNext: {
reactor.action.onNext(.selectChallenge(self.selectedChallenge?.id ?? 0))
- // response success오면 넘어가도록 처리해야함
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) {
- self.performSegue(withIdentifier: "goMain", sender: self)
- let viewControllers = self.navigationController?.viewControllers
- self.navigationController?.popToViewController((viewControllers?[viewControllers!.count - 3])!, animated: true)
- UserDefaults.standard.setValue(true, forKey: "launched")
- }
})
.disposed(by: disposeBag)
}
@@ -97,7 +99,7 @@ class SelectChallengeVC: UIViewController, StoryboardView {
extension SelectChallengeVC {
@IBAction func backButtonTouchUpInside(_ sender: UIButton) {
- self.navigationController?.popViewController(animated: false)
+ self.navigationController?.popViewController(animated: true)
}
}
diff --git a/Thirty/App/UI/Onboarding/WelcomeLoginVC.swift b/Thirty/App/UI/Onboarding/WelcomeLoginVC.swift
index 122be47..6a6eaee 100644
--- a/Thirty/App/UI/Onboarding/WelcomeLoginVC.swift
+++ b/Thirty/App/UI/Onboarding/WelcomeLoginVC.swift
@@ -63,15 +63,23 @@ class WelcomeLoginVC: UIViewController, StoryboardView {
self.navigationController?.popViewController(animated: true)
}.disposed(by: disposeBag)
+ let email = emailTextField.rx.text.orEmpty
+ let pwd = pwdTextField.rx.text.orEmpty
+ let observerCombined = Observable.combineLatest(email, pwd)
+
loginButton.rx.tap
+ .withLatestFrom(observerCombined)
+ .subscribe(onNext: { [weak self] (email, pwd) in
+ self?.view.endEditing(true)
+ self?.reactor?.action.onNext(.loginButtonTapped(email, pwd))
+ }).disposed(by: disposeBag)
+
+ findPwdButton.rx.tap
.bind {
- self.view.endEditing(true)
-
- let email = self.emailTextField.text ?? ""
- let pwd = self.pwdTextField.text ?? ""
-
- self.reactor?.action.onNext(.loginButtonTapped(email, pwd))
-
+ guard let findPwdVC = self.storyboard?.instantiateViewController(withIdentifier: "FindPwdVC") as? FindPwdVC else { return }
+ findPwdVC.modalTransitionStyle = .crossDissolve
+ findPwdVC.modalPresentationStyle = .fullScreen
+ self.present(findPwdVC, animated: true, completion: nil)
}.disposed(by: disposeBag)
}
}
diff --git a/Thirty/App/UI/Onboarding/WelcomeVC.swift b/Thirty/App/UI/Onboarding/WelcomeVC.swift
index d907d4f..d63c2dc 100644
--- a/Thirty/App/UI/Onboarding/WelcomeVC.swift
+++ b/Thirty/App/UI/Onboarding/WelcomeVC.swift
@@ -13,7 +13,6 @@ class WelcomeVC: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
-
}
override func viewWillAppear(_ animated: Bool) {
@@ -35,7 +34,7 @@ class WelcomeVC: UIViewController {
}
@IBAction func guestButtonTouchUpInside(_ sender: Any) {
- let selectChallengeVC = self.storyboard?.instantiateViewController(withIdentifier: "SelectChallengeThemeVC") as! SelectChallengeThemeVC
+ let selectChallengeVC = self.storyboard?.instantiateViewController(withIdentifier: "SelectChallengeThemeNewVC") as! SelectChallengeThemeNewVC
self.navigationController?.pushViewController(selectChallengeVC, animated: false)
}
diff --git a/Thirty/Util/Extension/UILabel+Extension.swift b/Thirty/Util/Extension/UILabel+Extension.swift
new file mode 100644
index 0000000..81739d0
--- /dev/null
+++ b/Thirty/Util/Extension/UILabel+Extension.swift
@@ -0,0 +1,74 @@
+//
+// UILabel+Extension.swift
+// Thirty
+//
+// Created by hakyung on 2023/02/08.
+//
+
+import Foundation
+import UIKit
+extension UILabel {
+ func addTrailing(with trailingText: String, moreText: String, moreTextFont: UIFont, moreTextColor: UIColor) {
+ let readMoreText: String = trailingText + moreText
+
+ if self.visibleTextLength == 0 { return }
+
+ let lengthForVisibleString: Int = self.visibleTextLength
+
+ if let myText = self.text {
+
+ let mutableString: String = myText
+
+ let trimmedString: String? = (mutableString as NSString).replacingCharacters(in: NSRange(location: lengthForVisibleString, length: myText.count - lengthForVisibleString), with: "")
+
+ let readMoreLength: Int = (readMoreText.count)
+
+ guard let safeTrimmedString = trimmedString else { return }
+
+ if safeTrimmedString.count <= readMoreLength { return }
+
+ let trimmedForReadMore: String = (safeTrimmedString as NSString).replacingCharacters(in: NSRange(location: safeTrimmedString.count - readMoreLength, length: readMoreLength), with: "") + trailingText
+
+ let answerAttributed = NSMutableAttributedString(string: trimmedForReadMore, attributes: [NSAttributedString.Key.font: self.font])
+ let readMoreAttributed = NSMutableAttributedString(string: moreText, attributes: [NSAttributedString.Key.font: moreTextFont, NSAttributedString.Key.foregroundColor: moreTextColor])
+ answerAttributed.append(readMoreAttributed)
+ self.attributedText = answerAttributed
+ }
+ }
+
+ var visibleTextLength: Int {
+ let font: UIFont = self.font
+ let mode: NSLineBreakMode = self.lineBreakMode
+ let labelWidth: CGFloat = self.frame.size.width
+ let labelHeight: CGFloat = self.frame.size.height
+ let sizeConstraint = CGSize(width: labelWidth, height: CGFloat.greatestFiniteMagnitude)
+
+ if let myText = self.text {
+
+ let attributes: [AnyHashable: Any] = [NSAttributedString.Key.font: font]
+ let attributedText = NSAttributedString(string: myText, attributes: attributes as? [NSAttributedString.Key: Any])
+ let boundingRect: CGRect = attributedText.boundingRect(with: sizeConstraint, options: .usesLineFragmentOrigin, context: nil)
+
+ if boundingRect.size.height > labelHeight {
+ var index: Int = 0
+ var prev: Int = 0
+ let characterSet = CharacterSet.whitespacesAndNewlines
+ repeat {
+ prev = index
+ if mode == NSLineBreakMode.byCharWrapping {
+ index += 1
+ } else {
+ index = (myText as NSString).rangeOfCharacter(from: characterSet, options: [], range: NSRange(location: index + 1, length: myText.count - index - 1)).location
+ }
+ } while index != NSNotFound && index < myText.count && (myText as NSString).substring(to: index).boundingRect(with: sizeConstraint, options: .usesLineFragmentOrigin, attributes: attributes as? [NSAttributedString.Key: Any], context: nil).size.height <= labelHeight
+ return prev
+ }
+ }
+
+ if self.text == nil {
+ return 0
+ } else {
+ return self.text!.count
+ }
+ }
+}