diff --git a/.DS_Store b/.DS_Store index 5515be0..248036f 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index b8662ee..3865499 100644 --- a/.gitignore +++ b/.gitignore @@ -109,6 +109,5 @@ iOSInjectionProject/ **/xcshareddata/WorkspaceSettings.xcsettings # End of https://www.gitignore.io/api/xcode,swift,cocoapods -Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/abc.xcuserdatad/UserInterfaceState.xcuserstate -*.xcuserstate -*.xcuserstate + +.DS_Store diff --git a/Better-me-iOS.xcodeproj/project.pbxproj b/Better-me-iOS.xcodeproj/project.pbxproj index dc8c267..3c16e74 100644 --- a/Better-me-iOS.xcodeproj/project.pbxproj +++ b/Better-me-iOS.xcodeproj/project.pbxproj @@ -7,40 +7,69 @@ objects = { /* Begin PBXBuildFile section */ - 280F5E5A2983B25F000A30B3 /* HeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E552983B25E000A30B3 /* HeaderView.swift */; }; + 1ADA5F372994DFD900FE90AD /* LoginFirstViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F292994DFD900FE90AD /* LoginFirstViewController.swift */; }; + 1ADA5F382994DFD900FE90AD /* UIColorExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2A2994DFD900FE90AD /* UIColorExtension.swift */; }; + 1ADA5F392994DFD900FE90AD /* JoinViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2B2994DFD900FE90AD /* JoinViewController.swift */; }; + 1ADA5F3A2994DFD900FE90AD /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2C2994DFD900FE90AD /* MainViewController.swift */; }; + 1ADA5F3B2994DFD900FE90AD /* passwordFindViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2D2994DFD900FE90AD /* passwordFindViewController.swift */; }; + 1ADA5F3C2994DFD900FE90AD /* nicknameViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2E2994DFD900FE90AD /* nicknameViewController.swift */; }; + 1ADA5F3D2994DFD900FE90AD /* wordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F2F2994DFD900FE90AD /* wordViewController.swift */; }; + 1ADA5F3E2994DFD900FE90AD /* ResponseModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F312994DFD900FE90AD /* ResponseModel.swift */; }; + 1ADA5F3F2994DFD900FE90AD /* LoginModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F322994DFD900FE90AD /* LoginModel.swift */; }; + 1ADA5F402994DFD900FE90AD /* PostDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F332994DFD900FE90AD /* PostDataManager.swift */; }; + 1ADA5F412994DFD900FE90AD /* UserDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F342994DFD900FE90AD /* UserDataModel.swift */; }; + 1ADA5F422994DFD900FE90AD /* GetUserIdxModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F352994DFD900FE90AD /* GetUserIdxModel.swift */; }; + 1ADA5F432994DFD900FE90AD /* GetMsgDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA5F362994DFD900FE90AD /* GetMsgDataManager.swift */; }; + 280F5E5A2983B25F000A30B3 /* MyPageTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E552983B25E000A30B3 /* MyPageTableHeaderView.swift */; }; 280F5E5B2983B25F000A30B3 /* MyPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E562983B25E000A30B3 /* MyPageViewController.swift */; }; 280F5E5C2983B25F000A30B3 /* MyPageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E572983B25F000A30B3 /* MyPageCell.swift */; }; 280F5E5D2983B25F000A30B3 /* ProfileEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E582983B25F000A30B3 /* ProfileEditController.swift */; }; 280F5E5E2983B25F000A30B3 /* PWEditController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 280F5E592983B25F000A30B3 /* PWEditController.swift */; }; - 3B7049EC298FCE5E0054096A /* PersonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B7049EA298FCE5E0054096A /* PersonModel.swift */; }; - 3B7049ED298FCE5E0054096A /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B7049EB298FCE5E0054096A /* Person.swift */; }; - 3BA12292298A94EA000E38A8 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BA12291298A94EA000E38A8 /* SwiftUIView.swift */; }; - 3BA12295298A967B000E38A8 /* PopupView in Frameworks */ = {isa = PBXBuildFile; productRef = 3BA12294298A967B000E38A8 /* PopupView */; }; - 3BA122E3298AA5E9000E38A8 /* SocialViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BA122E2298AA5E9000E38A8 /* SocialViewController.swift */; }; - 3BE30E58299535A9004B3F23 /* Request_FriendModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E40299535A7004B3F23 /* Request_FriendModel.swift */; }; - 3BE30E59299535A9004B3F23 /* Request_Friend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E41299535A8004B3F23 /* Request_Friend.swift */; }; - 3BE30E5A299535A9004B3F23 /* RequestStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E42299535A8004B3F23 /* RequestStatus.swift */; }; - 3BE30E5B299535A9004B3F23 /* SearchEmailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E43299535A8004B3F23 /* SearchEmailModel.swift */; }; - 3BE30E5C299535A9004B3F23 /* HabitAgree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E44299535A8004B3F23 /* HabitAgree.swift */; }; - 3BE30E5D299535A9004B3F23 /* SearchName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E45299535A8004B3F23 /* SearchName.swift */; }; - 3BE30E5E299535A9004B3F23 /* AgreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E46299535A8004B3F23 /* AgreeModel.swift */; }; - 3BE30E5F299535A9004B3F23 /* SearchNameModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E47299535A8004B3F23 /* SearchNameModel.swift */; }; - 3BE30E60299535A9004B3F23 /* Agree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E48299535A8004B3F23 /* Agree.swift */; }; - 3BE30E61299535A9004B3F23 /* SearchEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E49299535A8004B3F23 /* SearchEmail.swift */; }; - 3BE30E62299535A9004B3F23 /* RequestStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4A299535A8004B3F23 /* RequestStatusModel.swift */; }; - 3BE30E63299535A9004B3F23 /* Request_Friend_Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4B299535A8004B3F23 /* Request_Friend_Post.swift */; }; - 3BE30E64299535A9004B3F23 /* FriendDelete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4C299535A8004B3F23 /* FriendDelete.swift */; }; - 3BE30E65299535A9004B3F23 /* FriendDeleteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4D299535A8004B3F23 /* FriendDeleteModel.swift */; }; - 3BE30E66299535A9004B3F23 /* HabitDisagreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4E299535A8004B3F23 /* HabitDisagreeModel.swift */; }; - 3BE30E67299535A9004B3F23 /* InviteHabit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E4F299535A8004B3F23 /* InviteHabit.swift */; }; - 3BE30E68299535A9004B3F23 /* HabitAgreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E50299535A8004B3F23 /* HabitAgreeModel.swift */; }; - 3BE30E69299535A9004B3F23 /* InviteHabitPost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E51299535A8004B3F23 /* InviteHabitPost.swift */; }; - 3BE30E6A299535A9004B3F23 /* NewPersonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E52299535A8004B3F23 /* NewPersonModel.swift */; }; - 3BE30E6B299535A9004B3F23 /* InviteHabitPostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E53299535A8004B3F23 /* InviteHabitPostModel.swift */; }; - 3BE30E6C299535A9004B3F23 /* InviteHabitModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E54299535A8004B3F23 /* InviteHabitModel.swift */; }; - 3BE30E6D299535A9004B3F23 /* HabitDisagree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E55299535A9004B3F23 /* HabitDisagree.swift */; }; - 3BE30E6E299535A9004B3F23 /* NewPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E56299535A9004B3F23 /* NewPerson.swift */; }; - 3BE30E6F299535A9004B3F23 /* Request_Friend_PostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BE30E57299535A9004B3F23 /* Request_Friend_PostModel.swift */; }; + 282C4690299548F4006E1E13 /* PopupView in Frameworks */ = {isa = PBXBuildFile; productRef = 282C468F299548F4006E1E13 /* PopupView */; }; + 282C46942997F62A006E1E13 /* ResponseStruct.swift in Sources */ = {isa = PBXBuildFile; fileRef = 282C46932997F62A006E1E13 /* ResponseStruct.swift */; }; + 286F6ABC298EBD8C0089936D /* TipsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 286F6ABB298EBD8C0089936D /* TipsData.swift */; }; + 2871C4FE299D00D400D02A2E /* NotificationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2871C4FD299D00D400D02A2E /* NotificationManager.swift */; }; + 2871C501299D33DB00D02A2E /* SearchManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2871C500299D33DB00D02A2E /* SearchManager.swift */; }; + 28AAB1FF298FCBF900B58C12 /* UserDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AAB1FE298FCBF900B58C12 /* UserDataManager.swift */; }; + 28AAB2012992D9CB00B58C12 /* CustomTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AAB2002992D9CB00B58C12 /* CustomTableCellView.swift */; }; + 28AAB203299395E800B58C12 /* GoodHabitTipsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28AAB202299395E800B58C12 /* GoodHabitTipsViewController.swift */; }; + 28BFE250298B83A700176731 /* TipsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28BFE24F298B83A700176731 /* TipsCell.swift */; }; + 28BFE25A298BA9CF00176731 /* BadHabitTipsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28BFE259298BA6AA00176731 /* BadHabitTipsViewController.swift */; }; + 28E5ABC2299906CE009EB65C /* ProfileImageDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28E5ABC1299906CE009EB65C /* ProfileImageDataManager.swift */; }; + 28E5ABFF299958B1009EB65C /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 28AAB1FC298FC78400B58C12 /* Alamofire */; }; + 28EFD4892987AE140092E210 /* MyPageTableFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFD4882987AE140092E210 /* MyPageTableFooterView.swift */; }; + 28EFD48B2987B5190092E210 /* FeedBackController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFD48A2987B5190092E210 /* FeedBackController.swift */; }; + 28EFD48D298A3ABE0092E210 /* WithdrawalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFD48C298A3ABE0092E210 /* WithdrawalViewController.swift */; }; + 28EFD496298AA2FC0092E210 /* PushNotiViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFD495298AA2FC0092E210 /* PushNotiViewController.swift */; }; + 28EFD498298AAB620092E210 /* AlertTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28EFD497298AAB620092E210 /* AlertTableViewCell.swift */; }; + 3B77F39E299CC957001F7BB3 /* HabitDisagreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F386299CC956001F7BB3 /* HabitDisagreeModel.swift */; }; + 3B77F39F299CC957001F7BB3 /* NewPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F387299CC956001F7BB3 /* NewPerson.swift */; }; + 3B77F3A0299CC957001F7BB3 /* NewPersonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F388299CC956001F7BB3 /* NewPersonModel.swift */; }; + 3B77F3A1299CC957001F7BB3 /* Request_Friend_PostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F389299CC956001F7BB3 /* Request_Friend_PostModel.swift */; }; + 3B77F3A2299CC957001F7BB3 /* FriendDelete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38A299CC957001F7BB3 /* FriendDelete.swift */; }; + 3B77F3A3299CC957001F7BB3 /* Request_Friend_Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38B299CC957001F7BB3 /* Request_Friend_Post.swift */; }; + 3B77F3A4299CC957001F7BB3 /* Request_FriendModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38C299CC957001F7BB3 /* Request_FriendModel.swift */; }; + 3B77F3A5299CC957001F7BB3 /* SearchEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38D299CC957001F7BB3 /* SearchEmail.swift */; }; + 3B77F3A6299CC957001F7BB3 /* Agree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38E299CC957001F7BB3 /* Agree.swift */; }; + 3B77F3A7299CC957001F7BB3 /* RequestStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F38F299CC957001F7BB3 /* RequestStatusModel.swift */; }; + 3B77F3A8299CC957001F7BB3 /* SearchName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F390299CC957001F7BB3 /* SearchName.swift */; }; + 3B77F3A9299CC957001F7BB3 /* SearchEmailModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F391299CC957001F7BB3 /* SearchEmailModel.swift */; }; + 3B77F3AA299CC957001F7BB3 /* InviteHabitPost.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F392299CC957001F7BB3 /* InviteHabitPost.swift */; }; + 3B77F3AB299CC957001F7BB3 /* HabitAgree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F393299CC957001F7BB3 /* HabitAgree.swift */; }; + 3B77F3AC299CC957001F7BB3 /* AgreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F394299CC957001F7BB3 /* AgreeModel.swift */; }; + 3B77F3AD299CC957001F7BB3 /* SearchNameModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F395299CC957001F7BB3 /* SearchNameModel.swift */; }; + 3B77F3AE299CC957001F7BB3 /* InviteHabit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F396299CC957001F7BB3 /* InviteHabit.swift */; }; + 3B77F3AF299CC957001F7BB3 /* InviteHabitModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F397299CC957001F7BB3 /* InviteHabitModel.swift */; }; + 3B77F3B0299CC957001F7BB3 /* Request_Friend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F398299CC957001F7BB3 /* Request_Friend.swift */; }; + 3B77F3B1299CC957001F7BB3 /* FriendDeleteModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F399299CC957001F7BB3 /* FriendDeleteModel.swift */; }; + 3B77F3B2299CC957001F7BB3 /* RequestStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F39A299CC957001F7BB3 /* RequestStatus.swift */; }; + 3B77F3B3299CC957001F7BB3 /* HabitAgreeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F39B299CC957001F7BB3 /* HabitAgreeModel.swift */; }; + 3B77F3B4299CC957001F7BB3 /* InviteHabitPostModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F39C299CC957001F7BB3 /* InviteHabitPostModel.swift */; }; + 3B77F3B5299CC957001F7BB3 /* HabitDisagree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F39D299CC957001F7BB3 /* HabitDisagree.swift */; }; + 3B77F3B8299CC965001F7BB3 /* Person.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F3B6299CC965001F7BB3 /* Person.swift */; }; + 3B77F3B9299CC965001F7BB3 /* PersonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F3B7299CC965001F7BB3 /* PersonModel.swift */; }; + 3B77F3BB299CC971001F7BB3 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F3BA299CC971001F7BB3 /* SwiftUIView.swift */; }; + 3B77F3BD299CCB70001F7BB3 /* SocialViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B77F3BC299CCB70001F7BB3 /* SocialViewController.swift */; }; BE26CD08297805A900E97A05 /* AlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE26CD07297805A900E97A05 /* AlertViewController.swift */; }; BE532E742975A41800DDA6EA /* BadHabitDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE532E732975A41800DDA6EA /* BadHabitDetailViewController.swift */; }; BE5F4EC2296D8F640064A93C /* RemoveBadHabitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE5F4EC1296D8F640064A93C /* RemoveBadHabitViewController.swift */; }; @@ -48,6 +77,7 @@ BE5F4EC6296E7CC90064A93C /* SearchFriendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE5F4EC5296E7CC90064A93C /* SearchFriendViewController.swift */; }; BE6AF7F0296ED4EF00C236F8 /* FriendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6AF7EF296ED4EF00C236F8 /* FriendCell.swift */; }; BE6AF7F2296ED62400C236F8 /* Friend.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6AF7F1296ED62400C236F8 /* Friend.swift */; }; + BE82D333298D191A003EFE44 /* EditViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE82D332298D191A003EFE44 /* EditViewController.swift */; }; BECC4B39296C3AB60037807F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECC4B38296C3AB60037807F /* AppDelegate.swift */; }; BECC4B3B296C3AB60037807F /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECC4B3A296C3AB60037807F /* SceneDelegate.swift */; }; BECC4B3D296C3AB60037807F /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECC4B3C296C3AB60037807F /* HomeViewController.swift */; }; @@ -60,42 +90,77 @@ BEF940BE2972827900D0F1FD /* Habit.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF940BD2972827900D0F1FD /* Habit.swift */; }; BEF940C029753F8500D0F1FD /* GoodHabitDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF940BF29753F8500D0F1FD /* GoodHabitDetailViewController.swift */; }; BEF940C2297561FB00D0F1FD /* BadHabitCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEF940C1297561FB00D0F1FD /* BadHabitCell.swift */; }; + D9EBCD222E907382D1A2D0FD /* Pods_Better_me_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8A9CB66B1A0BF0FB3839524B /* Pods_Better_me_iOS.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 280F5E552983B25E000A30B3 /* HeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderView.swift; sourceTree = ""; }; + 06B307C46D7BBE790ECF1FAC /* Pods-Better-me-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Better-me-iOS.release.xcconfig"; path = "Target Support Files/Pods-Better-me-iOS/Pods-Better-me-iOS.release.xcconfig"; sourceTree = ""; }; + 1ADA5F292994DFD900FE90AD /* LoginFirstViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginFirstViewController.swift; sourceTree = ""; }; + 1ADA5F2A2994DFD900FE90AD /* UIColorExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIColorExtension.swift; sourceTree = ""; }; + 1ADA5F2B2994DFD900FE90AD /* JoinViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JoinViewController.swift; sourceTree = ""; }; + 1ADA5F2C2994DFD900FE90AD /* MainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 1ADA5F2D2994DFD900FE90AD /* passwordFindViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = passwordFindViewController.swift; sourceTree = ""; }; + 1ADA5F2E2994DFD900FE90AD /* nicknameViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = nicknameViewController.swift; sourceTree = ""; }; + 1ADA5F2F2994DFD900FE90AD /* wordViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = wordViewController.swift; sourceTree = ""; }; + 1ADA5F312994DFD900FE90AD /* ResponseModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResponseModel.swift; sourceTree = ""; }; + 1ADA5F322994DFD900FE90AD /* LoginModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginModel.swift; sourceTree = ""; }; + 1ADA5F332994DFD900FE90AD /* PostDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostDataManager.swift; sourceTree = ""; }; + 1ADA5F342994DFD900FE90AD /* UserDataModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDataModel.swift; sourceTree = ""; }; + 1ADA5F352994DFD900FE90AD /* GetUserIdxModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetUserIdxModel.swift; sourceTree = ""; }; + 1ADA5F362994DFD900FE90AD /* GetMsgDataManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GetMsgDataManager.swift; sourceTree = ""; }; + 280F5E552983B25E000A30B3 /* MyPageTableHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageTableHeaderView.swift; sourceTree = ""; }; 280F5E562983B25E000A30B3 /* MyPageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageViewController.swift; sourceTree = ""; }; 280F5E572983B25F000A30B3 /* MyPageCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MyPageCell.swift; sourceTree = ""; }; 280F5E582983B25F000A30B3 /* ProfileEditController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileEditController.swift; sourceTree = ""; }; 280F5E592983B25F000A30B3 /* PWEditController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PWEditController.swift; sourceTree = ""; }; - 3B7049EA298FCE5E0054096A /* PersonModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersonModel.swift; sourceTree = ""; }; - 3B7049EB298FCE5E0054096A /* Person.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; - 3BA12291298A94EA000E38A8 /* SwiftUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = ""; }; - 3BA122E2298AA5E9000E38A8 /* SocialViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SocialViewController.swift; sourceTree = ""; }; - 3BE30E40299535A7004B3F23 /* Request_FriendModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_FriendModel.swift; sourceTree = ""; }; - 3BE30E41299535A8004B3F23 /* Request_Friend.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend.swift; sourceTree = ""; }; - 3BE30E42299535A8004B3F23 /* RequestStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestStatus.swift; sourceTree = ""; }; - 3BE30E43299535A8004B3F23 /* SearchEmailModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEmailModel.swift; sourceTree = ""; }; - 3BE30E44299535A8004B3F23 /* HabitAgree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitAgree.swift; sourceTree = ""; }; - 3BE30E45299535A8004B3F23 /* SearchName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchName.swift; sourceTree = ""; }; - 3BE30E46299535A8004B3F23 /* AgreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AgreeModel.swift; sourceTree = ""; }; - 3BE30E47299535A8004B3F23 /* SearchNameModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchNameModel.swift; sourceTree = ""; }; - 3BE30E48299535A8004B3F23 /* Agree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Agree.swift; sourceTree = ""; }; - 3BE30E49299535A8004B3F23 /* SearchEmail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEmail.swift; sourceTree = ""; }; - 3BE30E4A299535A8004B3F23 /* RequestStatusModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestStatusModel.swift; sourceTree = ""; }; - 3BE30E4B299535A8004B3F23 /* Request_Friend_Post.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend_Post.swift; sourceTree = ""; }; - 3BE30E4C299535A8004B3F23 /* FriendDelete.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendDelete.swift; sourceTree = ""; }; - 3BE30E4D299535A8004B3F23 /* FriendDeleteModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendDeleteModel.swift; sourceTree = ""; }; - 3BE30E4E299535A8004B3F23 /* HabitDisagreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitDisagreeModel.swift; sourceTree = ""; }; - 3BE30E4F299535A8004B3F23 /* InviteHabit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabit.swift; sourceTree = ""; }; - 3BE30E50299535A8004B3F23 /* HabitAgreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitAgreeModel.swift; sourceTree = ""; }; - 3BE30E51299535A8004B3F23 /* InviteHabitPost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitPost.swift; sourceTree = ""; }; - 3BE30E52299535A8004B3F23 /* NewPersonModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewPersonModel.swift; sourceTree = ""; }; - 3BE30E53299535A8004B3F23 /* InviteHabitPostModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitPostModel.swift; sourceTree = ""; }; - 3BE30E54299535A8004B3F23 /* InviteHabitModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitModel.swift; sourceTree = ""; }; - 3BE30E55299535A9004B3F23 /* HabitDisagree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitDisagree.swift; sourceTree = ""; }; - 3BE30E56299535A9004B3F23 /* NewPerson.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewPerson.swift; sourceTree = ""; }; - 3BE30E57299535A9004B3F23 /* Request_Friend_PostModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend_PostModel.swift; sourceTree = ""; }; + 282C46932997F62A006E1E13 /* ResponseStruct.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResponseStruct.swift; sourceTree = ""; }; + 286F6ABB298EBD8C0089936D /* TipsData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipsData.swift; sourceTree = ""; }; + 2871C4FD299D00D400D02A2E /* NotificationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationManager.swift; sourceTree = ""; }; + 2871C500299D33DB00D02A2E /* SearchManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchManager.swift; sourceTree = ""; }; + 28AAB1FE298FCBF900B58C12 /* UserDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDataManager.swift; sourceTree = ""; }; + 28AAB2002992D9CB00B58C12 /* CustomTableCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTableCellView.swift; sourceTree = ""; }; + 28AAB202299395E800B58C12 /* GoodHabitTipsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoodHabitTipsViewController.swift; sourceTree = ""; }; + 28BFE24F298B83A700176731 /* TipsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipsCell.swift; sourceTree = ""; }; + 28BFE259298BA6AA00176731 /* BadHabitTipsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadHabitTipsViewController.swift; sourceTree = ""; }; + 28E5ABC1299906CE009EB65C /* ProfileImageDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileImageDataManager.swift; sourceTree = ""; }; + 28EFD4882987AE140092E210 /* MyPageTableFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyPageTableFooterView.swift; sourceTree = ""; }; + 28EFD48A2987B5190092E210 /* FeedBackController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedBackController.swift; sourceTree = ""; }; + 28EFD48C298A3ABE0092E210 /* WithdrawalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WithdrawalViewController.swift; sourceTree = ""; }; + 28EFD490298A9A930092E210 /* Better-me-iOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Better-me-iOS.entitlements"; sourceTree = ""; }; + 28EFD491298A9D850092E210 /* first.apn */ = {isa = PBXFileReference; lastKnownFileType = text; path = first.apn; sourceTree = ""; }; + 28EFD493298A9FD50092E210 /* second.apn */ = {isa = PBXFileReference; lastKnownFileType = text; path = second.apn; sourceTree = ""; }; + 28EFD495298AA2FC0092E210 /* PushNotiViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushNotiViewController.swift; sourceTree = ""; }; + 28EFD497298AAB620092E210 /* AlertTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertTableViewCell.swift; sourceTree = ""; }; + 3B77F386299CC956001F7BB3 /* HabitDisagreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitDisagreeModel.swift; sourceTree = ""; }; + 3B77F387299CC956001F7BB3 /* NewPerson.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewPerson.swift; sourceTree = ""; }; + 3B77F388299CC956001F7BB3 /* NewPersonModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewPersonModel.swift; sourceTree = ""; }; + 3B77F389299CC956001F7BB3 /* Request_Friend_PostModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend_PostModel.swift; sourceTree = ""; }; + 3B77F38A299CC957001F7BB3 /* FriendDelete.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendDelete.swift; sourceTree = ""; }; + 3B77F38B299CC957001F7BB3 /* Request_Friend_Post.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend_Post.swift; sourceTree = ""; }; + 3B77F38C299CC957001F7BB3 /* Request_FriendModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_FriendModel.swift; sourceTree = ""; }; + 3B77F38D299CC957001F7BB3 /* SearchEmail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEmail.swift; sourceTree = ""; }; + 3B77F38E299CC957001F7BB3 /* Agree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Agree.swift; sourceTree = ""; }; + 3B77F38F299CC957001F7BB3 /* RequestStatusModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestStatusModel.swift; sourceTree = ""; }; + 3B77F390299CC957001F7BB3 /* SearchName.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchName.swift; sourceTree = ""; }; + 3B77F391299CC957001F7BB3 /* SearchEmailModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchEmailModel.swift; sourceTree = ""; }; + 3B77F392299CC957001F7BB3 /* InviteHabitPost.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitPost.swift; sourceTree = ""; }; + 3B77F393299CC957001F7BB3 /* HabitAgree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitAgree.swift; sourceTree = ""; }; + 3B77F394299CC957001F7BB3 /* AgreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AgreeModel.swift; sourceTree = ""; }; + 3B77F395299CC957001F7BB3 /* SearchNameModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchNameModel.swift; sourceTree = ""; }; + 3B77F396299CC957001F7BB3 /* InviteHabit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabit.swift; sourceTree = ""; }; + 3B77F397299CC957001F7BB3 /* InviteHabitModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitModel.swift; sourceTree = ""; }; + 3B77F398299CC957001F7BB3 /* Request_Friend.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Request_Friend.swift; sourceTree = ""; }; + 3B77F399299CC957001F7BB3 /* FriendDeleteModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FriendDeleteModel.swift; sourceTree = ""; }; + 3B77F39A299CC957001F7BB3 /* RequestStatus.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RequestStatus.swift; sourceTree = ""; }; + 3B77F39B299CC957001F7BB3 /* HabitAgreeModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitAgreeModel.swift; sourceTree = ""; }; + 3B77F39C299CC957001F7BB3 /* InviteHabitPostModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteHabitPostModel.swift; sourceTree = ""; }; + 3B77F39D299CC957001F7BB3 /* HabitDisagree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HabitDisagree.swift; sourceTree = ""; }; + 3B77F3B6299CC965001F7BB3 /* Person.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Person.swift; sourceTree = ""; }; + 3B77F3B7299CC965001F7BB3 /* PersonModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersonModel.swift; sourceTree = ""; }; + 3B77F3BA299CC971001F7BB3 /* SwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = ""; }; + 3B77F3BC299CCB70001F7BB3 /* SocialViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SocialViewController.swift; sourceTree = ""; }; + 6868E3C3CEFCFABB0444CD2D /* Pods-Better-me-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Better-me-iOS.debug.xcconfig"; path = "Target Support Files/Pods-Better-me-iOS/Pods-Better-me-iOS.debug.xcconfig"; sourceTree = ""; }; + 8A9CB66B1A0BF0FB3839524B /* Pods_Better_me_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Better_me_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BE26CD07297805A900E97A05 /* AlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertViewController.swift; sourceTree = ""; }; BE532E732975A41800DDA6EA /* BadHabitDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadHabitDetailViewController.swift; sourceTree = ""; }; BE5F4EC1296D8F640064A93C /* RemoveBadHabitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveBadHabitViewController.swift; sourceTree = ""; }; @@ -103,6 +168,7 @@ BE5F4EC5296E7CC90064A93C /* SearchFriendViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchFriendViewController.swift; sourceTree = ""; }; BE6AF7EF296ED4EF00C236F8 /* FriendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendCell.swift; sourceTree = ""; }; BE6AF7F1296ED62400C236F8 /* Friend.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Friend.swift; sourceTree = ""; }; + BE82D332298D191A003EFE44 /* EditViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditViewController.swift; sourceTree = ""; }; BECC4B35296C3AB60037807F /* Better-me-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Better-me-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; BECC4B38296C3AB60037807F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; BECC4B3A296C3AB60037807F /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; @@ -124,66 +190,146 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3BA12295298A967B000E38A8 /* PopupView in Frameworks */, + 28E5ABFF299958B1009EB65C /* Alamofire in Frameworks */, + 282C4690299548F4006E1E13 /* PopupView in Frameworks */, + D9EBCD222E907382D1A2D0FD /* Pods_Better_me_iOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1ADA5F282994DFD900FE90AD /* Login */ = { + isa = PBXGroup; + children = ( + 1ADA5F292994DFD900FE90AD /* LoginFirstViewController.swift */, + 1ADA5F2A2994DFD900FE90AD /* UIColorExtension.swift */, + 1ADA5F2B2994DFD900FE90AD /* JoinViewController.swift */, + 1ADA5F2C2994DFD900FE90AD /* MainViewController.swift */, + 1ADA5F2D2994DFD900FE90AD /* passwordFindViewController.swift */, + 1ADA5F2E2994DFD900FE90AD /* nicknameViewController.swift */, + 1ADA5F2F2994DFD900FE90AD /* wordViewController.swift */, + 1ADA5F302994DFD900FE90AD /* DataModel */, + ); + path = Login; + sourceTree = ""; + }; + 1ADA5F302994DFD900FE90AD /* DataModel */ = { + isa = PBXGroup; + children = ( + 1ADA5F312994DFD900FE90AD /* ResponseModel.swift */, + 1ADA5F322994DFD900FE90AD /* LoginModel.swift */, + 1ADA5F332994DFD900FE90AD /* PostDataManager.swift */, + 1ADA5F342994DFD900FE90AD /* UserDataModel.swift */, + 1ADA5F352994DFD900FE90AD /* GetUserIdxModel.swift */, + 1ADA5F362994DFD900FE90AD /* GetMsgDataManager.swift */, + ); + path = DataModel; + sourceTree = ""; + }; 280F5E542983B23A000A30B3 /* MyPage */ = { isa = PBXGroup; children = ( - 280F5E552983B25E000A30B3 /* HeaderView.swift */, - 280F5E572983B25F000A30B3 /* MyPageCell.swift */, 280F5E562983B25E000A30B3 /* MyPageViewController.swift */, + 28E5ABC1299906CE009EB65C /* ProfileImageDataManager.swift */, + 282C46932997F62A006E1E13 /* ResponseStruct.swift */, + 28AAB1FE298FCBF900B58C12 /* UserDataManager.swift */, + 28BFE253298BA58000176731 /* MypageTableView */, + 28BFE255298BA5FE00176731 /* HabitTips */, 280F5E582983B25F000A30B3 /* ProfileEditController.swift */, 280F5E592983B25F000A30B3 /* PWEditController.swift */, + 28EFD48A2987B5190092E210 /* FeedBackController.swift */, + 28EFD48C298A3ABE0092E210 /* WithdrawalViewController.swift */, + 28E5AC02299AD454009EB65C /* PushNotification */, + 28EFD493298A9FD50092E210 /* second.apn */, + 28EFD491298A9D850092E210 /* first.apn */, ); path = MyPage; sourceTree = ""; }; - 3B9BDDF3298FC2EA00CC0C45 /* Data */ = { + 2871C4FF299D339500D02A2E /* NetWorking */ = { isa = PBXGroup; children = ( - 3B7049EB298FCE5E0054096A /* Person.swift */, - 3B7049EA298FCE5E0054096A /* PersonModel.swift */, - 3BE30E48299535A8004B3F23 /* Agree.swift */, - 3BE30E46299535A8004B3F23 /* AgreeModel.swift */, - 3BE30E4C299535A8004B3F23 /* FriendDelete.swift */, - 3BE30E4D299535A8004B3F23 /* FriendDeleteModel.swift */, - 3BE30E44299535A8004B3F23 /* HabitAgree.swift */, - 3BE30E50299535A8004B3F23 /* HabitAgreeModel.swift */, - 3BE30E55299535A9004B3F23 /* HabitDisagree.swift */, - 3BE30E4E299535A8004B3F23 /* HabitDisagreeModel.swift */, - 3BE30E4F299535A8004B3F23 /* InviteHabit.swift */, - 3BE30E54299535A8004B3F23 /* InviteHabitModel.swift */, - 3BE30E51299535A8004B3F23 /* InviteHabitPost.swift */, - 3BE30E53299535A8004B3F23 /* InviteHabitPostModel.swift */, - 3BE30E56299535A9004B3F23 /* NewPerson.swift */, - 3BE30E52299535A8004B3F23 /* NewPersonModel.swift */, - 3BE30E4B299535A8004B3F23 /* Request_Friend_Post.swift */, - 3BE30E57299535A9004B3F23 /* Request_Friend_PostModel.swift */, - 3BE30E41299535A8004B3F23 /* Request_Friend.swift */, - 3BE30E40299535A7004B3F23 /* Request_FriendModel.swift */, - 3BE30E42299535A8004B3F23 /* RequestStatus.swift */, - 3BE30E4A299535A8004B3F23 /* RequestStatusModel.swift */, - 3BE30E49299535A8004B3F23 /* SearchEmail.swift */, - 3BE30E43299535A8004B3F23 /* SearchEmailModel.swift */, - 3BE30E45299535A8004B3F23 /* SearchName.swift */, - 3BE30E47299535A8004B3F23 /* SearchNameModel.swift */, + 2871C500299D33DB00D02A2E /* SearchManager.swift */, ); - path = Data; + name = NetWorking; + sourceTree = ""; + }; + 28BFE253298BA58000176731 /* MypageTableView */ = { + isa = PBXGroup; + children = ( + 280F5E552983B25E000A30B3 /* MyPageTableHeaderView.swift */, + 280F5E572983B25F000A30B3 /* MyPageCell.swift */, + 28EFD4882987AE140092E210 /* MyPageTableFooterView.swift */, + ); + path = MypageTableView; sourceTree = ""; }; - 3BA12278298A9340000E38A8 /* Social */ = { + 28BFE255298BA5FE00176731 /* HabitTips */ = { isa = PBXGroup; children = ( - 3B9BDDF3298FC2EA00CC0C45 /* Data */, - 3BA122E2298AA5E9000E38A8 /* SocialViewController.swift */, - 3BA12291298A94EA000E38A8 /* SwiftUIView.swift */, + 28AAB2002992D9CB00B58C12 /* CustomTableCellView.swift */, + 286F6ABB298EBD8C0089936D /* TipsData.swift */, + 28BFE24F298B83A700176731 /* TipsCell.swift */, + 28AAB202299395E800B58C12 /* GoodHabitTipsViewController.swift */, + 28BFE259298BA6AA00176731 /* BadHabitTipsViewController.swift */, ); - path = Social; + path = HabitTips; + sourceTree = ""; + }; + 28E5AC02299AD454009EB65C /* PushNotification */ = { + isa = PBXGroup; + children = ( + 28EFD495298AA2FC0092E210 /* PushNotiViewController.swift */, + 28EFD497298AAB620092E210 /* AlertTableViewCell.swift */, + 2871C4FD299D00D400D02A2E /* NotificationManager.swift */, + ); + path = PushNotification; + sourceTree = ""; + }; + 3B77F384299CC747001F7BB3 /* Social */ = { + isa = PBXGroup; + children = ( + 2871C4FF299D339500D02A2E /* NetWorking */, + 3B77F3BC299CCB70001F7BB3 /* SocialViewController.swift */, + 3B77F3BA299CC971001F7BB3 /* SwiftUIView.swift */, + 3B77F385299CC7A0001F7BB3 /* Data */, + ); + name = Social; + path = ..; + sourceTree = ""; + }; + 3B77F385299CC7A0001F7BB3 /* Data */ = { + isa = PBXGroup; + children = ( + 3B77F3B6299CC965001F7BB3 /* Person.swift */, + 3B77F3B7299CC965001F7BB3 /* PersonModel.swift */, + 3B77F38E299CC957001F7BB3 /* Agree.swift */, + 3B77F394299CC957001F7BB3 /* AgreeModel.swift */, + 3B77F38A299CC957001F7BB3 /* FriendDelete.swift */, + 3B77F399299CC957001F7BB3 /* FriendDeleteModel.swift */, + 3B77F393299CC957001F7BB3 /* HabitAgree.swift */, + 3B77F39B299CC957001F7BB3 /* HabitAgreeModel.swift */, + 3B77F39D299CC957001F7BB3 /* HabitDisagree.swift */, + 3B77F386299CC956001F7BB3 /* HabitDisagreeModel.swift */, + 3B77F396299CC957001F7BB3 /* InviteHabit.swift */, + 3B77F397299CC957001F7BB3 /* InviteHabitModel.swift */, + 3B77F392299CC957001F7BB3 /* InviteHabitPost.swift */, + 3B77F39C299CC957001F7BB3 /* InviteHabitPostModel.swift */, + 3B77F387299CC956001F7BB3 /* NewPerson.swift */, + 3B77F388299CC956001F7BB3 /* NewPersonModel.swift */, + 3B77F38B299CC957001F7BB3 /* Request_Friend_Post.swift */, + 3B77F389299CC956001F7BB3 /* Request_Friend_PostModel.swift */, + 3B77F398299CC957001F7BB3 /* Request_Friend.swift */, + 3B77F38C299CC957001F7BB3 /* Request_FriendModel.swift */, + 3B77F39A299CC957001F7BB3 /* RequestStatus.swift */, + 3B77F38F299CC957001F7BB3 /* RequestStatusModel.swift */, + 3B77F38D299CC957001F7BB3 /* SearchEmail.swift */, + 3B77F391299CC957001F7BB3 /* SearchEmailModel.swift */, + 3B77F390299CC957001F7BB3 /* SearchName.swift */, + 3B77F395299CC957001F7BB3 /* SearchNameModel.swift */, + ); + path = Data; sourceTree = ""; }; BECC4B2C296C3AB60037807F = { @@ -191,6 +337,8 @@ children = ( BECC4B37296C3AB60037807F /* Better-me-iOS */, BECC4B36296C3AB60037807F /* Products */, + E64412815AF12B933831F217 /* Pods */, + D1D6417B6D6B9C4E0EFC0DB9 /* Frameworks */, ); sourceTree = ""; }; @@ -205,6 +353,9 @@ BECC4B37296C3AB60037807F /* Better-me-iOS */ = { isa = PBXGroup; children = ( + 3B77F384299CC747001F7BB3 /* Social */, + 1ADA5F282994DFD900FE90AD /* Login */, + 28EFD490298A9A930092E210 /* Better-me-iOS.entitlements */, BECC4B38296C3AB60037807F /* AppDelegate.swift */, BECC4B3A296C3AB60037807F /* SceneDelegate.swift */, BECC4B3C296C3AB60037807F /* HomeViewController.swift */, @@ -225,12 +376,29 @@ BEF940BD2972827900D0F1FD /* Habit.swift */, BEF940C1297561FB00D0F1FD /* BadHabitCell.swift */, BE26CD07297805A900E97A05 /* AlertViewController.swift */, - 3BA12278298A9340000E38A8 /* Social */, + BE82D332298D191A003EFE44 /* EditViewController.swift */, 280F5E542983B23A000A30B3 /* MyPage */, ); path = "Better-me-iOS"; sourceTree = ""; }; + D1D6417B6D6B9C4E0EFC0DB9 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 8A9CB66B1A0BF0FB3839524B /* Pods_Better_me_iOS.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + E64412815AF12B933831F217 /* Pods */ = { + isa = PBXGroup; + children = ( + 6868E3C3CEFCFABB0444CD2D /* Pods-Better-me-iOS.debug.xcconfig */, + 06B307C46D7BBE790ECF1FAC /* Pods-Better-me-iOS.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -238,9 +406,11 @@ isa = PBXNativeTarget; buildConfigurationList = BECC4B49296C3AB80037807F /* Build configuration list for PBXNativeTarget "Better-me-iOS" */; buildPhases = ( + ADA67A91C94D266823103EBE /* [CP] Check Pods Manifest.lock */, BECC4B31296C3AB60037807F /* Sources */, BECC4B32296C3AB60037807F /* Frameworks */, BECC4B33296C3AB60037807F /* Resources */, + 900A6873AD64F1C771BEB467 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -248,7 +418,8 @@ ); name = "Better-me-iOS"; packageProductDependencies = ( - 3BA12294298A967B000E38A8 /* PopupView */, + 28AAB1FC298FC78400B58C12 /* Alamofire */, + 282C468F299548F4006E1E13 /* PopupView */, ); productName = "Better-me-iOS"; productReference = BECC4B35296C3AB60037807F /* Better-me-iOS.app */; @@ -279,7 +450,8 @@ ); mainGroup = BECC4B2C296C3AB60037807F; packageReferences = ( - 3BA12293298A967B000E38A8 /* XCRemoteSwiftPackageReference "PopupView" */, + 28AAB1FB298FC78400B58C12 /* XCRemoteSwiftPackageReference "Alamofire" */, + 282C468E299548F4006E1E13 /* XCRemoteSwiftPackageReference "PopupView" */, ); productRefGroup = BECC4B36296C3AB60037807F /* Products */; projectDirPath = ""; @@ -303,59 +475,130 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 900A6873AD64F1C771BEB467 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Better-me-iOS/Pods-Better-me-iOS-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Better-me-iOS/Pods-Better-me-iOS-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Better-me-iOS/Pods-Better-me-iOS-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + ADA67A91C94D266823103EBE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Better-me-iOS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ BECC4B31296C3AB60037807F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3BE30E64299535A9004B3F23 /* FriendDelete.swift in Sources */, - 3BE30E5E299535A9004B3F23 /* AgreeModel.swift in Sources */, - 3BE30E65299535A9004B3F23 /* FriendDeleteModel.swift in Sources */, - 3BE30E6D299535A9004B3F23 /* HabitDisagree.swift in Sources */, - 3BE30E67299535A9004B3F23 /* InviteHabit.swift in Sources */, + 3B77F3A9299CC957001F7BB3 /* SearchEmailModel.swift in Sources */, + 28EFD498298AAB620092E210 /* AlertTableViewCell.swift in Sources */, + 3B77F3B1299CC957001F7BB3 /* FriendDeleteModel.swift in Sources */, + 28E5ABC2299906CE009EB65C /* ProfileImageDataManager.swift in Sources */, + 2871C4FE299D00D400D02A2E /* NotificationManager.swift in Sources */, + 1ADA5F3F2994DFD900FE90AD /* LoginModel.swift in Sources */, BE5F4EC6296E7CC90064A93C /* SearchFriendViewController.swift in Sources */, + 28BFE25A298BA9CF00176731 /* BadHabitTipsViewController.swift in Sources */, + 28BFE250298B83A700176731 /* TipsCell.swift in Sources */, 280F5E5E2983B25F000A30B3 /* PWEditController.swift in Sources */, - 3BA12292298A94EA000E38A8 /* SwiftUIView.swift in Sources */, - 3BE30E5D299535A9004B3F23 /* SearchName.swift in Sources */, - 3BE30E62299535A9004B3F23 /* RequestStatusModel.swift in Sources */, 280F5E5B2983B25F000A30B3 /* MyPageViewController.swift in Sources */, - 3BE30E6E299535A9004B3F23 /* NewPerson.swift in Sources */, + 3B77F3A6299CC957001F7BB3 /* Agree.swift in Sources */, 280F5E5C2983B25F000A30B3 /* MyPageCell.swift in Sources */, + 1ADA5F402994DFD900FE90AD /* PostDataManager.swift in Sources */, + 3B77F3AC299CC957001F7BB3 /* AgreeModel.swift in Sources */, + 3B77F3A5299CC957001F7BB3 /* SearchEmail.swift in Sources */, BEF940C029753F8500D0F1FD /* GoodHabitDetailViewController.swift in Sources */, - 3BE30E59299535A9004B3F23 /* Request_Friend.swift in Sources */, - 3BE30E6B299535A9004B3F23 /* InviteHabitPostModel.swift in Sources */, - 3BE30E5C299535A9004B3F23 /* HabitAgree.swift in Sources */, + 28AAB1FF298FCBF900B58C12 /* UserDataManager.swift in Sources */, + 28AAB203299395E800B58C12 /* GoodHabitTipsViewController.swift in Sources */, + 1ADA5F432994DFD900FE90AD /* GetMsgDataManager.swift in Sources */, + 3B77F3B3299CC957001F7BB3 /* HabitAgreeModel.swift in Sources */, BECC4B4D296C3E1F0037807F /* AddGoodHabitViewController.swift in Sources */, + 28AAB2012992D9CB00B58C12 /* CustomTableCellView.swift in Sources */, 280F5E5D2983B25F000A30B3 /* ProfileEditController.swift in Sources */, + 1ADA5F372994DFD900FE90AD /* LoginFirstViewController.swift in Sources */, + 28EFD48D298A3ABE0092E210 /* WithdrawalViewController.swift in Sources */, + 3B77F3B4299CC957001F7BB3 /* InviteHabitPostModel.swift in Sources */, + 3B77F3BB299CC971001F7BB3 /* SwiftUIView.swift in Sources */, + 3B77F3A0299CC957001F7BB3 /* NewPersonModel.swift in Sources */, BECC4B3D296C3AB60037807F /* HomeViewController.swift in Sources */, - 3BE30E66299535A9004B3F23 /* HabitDisagreeModel.swift in Sources */, BE26CD08297805A900E97A05 /* AlertViewController.swift in Sources */, - 3BE30E68299535A9004B3F23 /* HabitAgreeModel.swift in Sources */, - 3BE30E60299535A9004B3F23 /* Agree.swift in Sources */, BECC4B39296C3AB60037807F /* AppDelegate.swift in Sources */, - 280F5E5A2983B25F000A30B3 /* HeaderView.swift in Sources */, - 3B7049ED298FCE5E0054096A /* Person.swift in Sources */, - 3BE30E6F299535A9004B3F23 /* Request_Friend_PostModel.swift in Sources */, + 1ADA5F412994DFD900FE90AD /* UserDataModel.swift in Sources */, + 3B77F3A8299CC957001F7BB3 /* SearchName.swift in Sources */, + 3B77F3AA299CC957001F7BB3 /* InviteHabitPost.swift in Sources */, + 3B77F3AE299CC957001F7BB3 /* InviteHabit.swift in Sources */, + 280F5E5A2983B25F000A30B3 /* MyPageTableHeaderView.swift in Sources */, + 3B77F3B8299CC965001F7BB3 /* Person.swift in Sources */, BEF940BC29727FC600D0F1FD /* GoodHabitCell.swift in Sources */, - 3BE30E69299535A9004B3F23 /* InviteHabitPost.swift in Sources */, - 3BA122E3298AA5E9000E38A8 /* SocialViewController.swift in Sources */, + 3B77F3AB299CC957001F7BB3 /* HabitAgree.swift in Sources */, + 1ADA5F3C2994DFD900FE90AD /* nicknameViewController.swift in Sources */, + 3B77F3A3299CC957001F7BB3 /* Request_Friend_Post.swift in Sources */, + 1ADA5F3B2994DFD900FE90AD /* passwordFindViewController.swift in Sources */, BE6AF7F0296ED4EF00C236F8 /* FriendCell.swift in Sources */, - 3BE30E6C299535A9004B3F23 /* InviteHabitModel.swift in Sources */, - 3BE30E5F299535A9004B3F23 /* SearchNameModel.swift in Sources */, - 3B7049EC298FCE5E0054096A /* PersonModel.swift in Sources */, + 3B77F3B9299CC965001F7BB3 /* PersonModel.swift in Sources */, + 1ADA5F422994DFD900FE90AD /* GetUserIdxModel.swift in Sources */, + 1ADA5F3A2994DFD900FE90AD /* MainViewController.swift in Sources */, + 3B77F3A1299CC957001F7BB3 /* Request_Friend_PostModel.swift in Sources */, + 28EFD496298AA2FC0092E210 /* PushNotiViewController.swift in Sources */, + 1ADA5F392994DFD900FE90AD /* JoinViewController.swift in Sources */, + 1ADA5F382994DFD900FE90AD /* UIColorExtension.swift in Sources */, BEF940BE2972827900D0F1FD /* Habit.swift in Sources */, - 3BE30E63299535A9004B3F23 /* Request_Friend_Post.swift in Sources */, + 3B77F3BD299CCB70001F7BB3 /* SocialViewController.swift in Sources */, BE5F4EC2296D8F640064A93C /* RemoveBadHabitViewController.swift in Sources */, + 3B77F39F299CC957001F7BB3 /* NewPerson.swift in Sources */, BECC4B3B296C3AB60037807F /* SceneDelegate.swift in Sources */, + 1ADA5F3E2994DFD900FE90AD /* ResponseModel.swift in Sources */, + 1ADA5F3D2994DFD900FE90AD /* wordViewController.swift in Sources */, BEF940C2297561FB00D0F1FD /* BadHabitCell.swift in Sources */, - 3BE30E58299535A9004B3F23 /* Request_FriendModel.swift in Sources */, - 3BE30E5A299535A9004B3F23 /* RequestStatus.swift in Sources */, + 3B77F39E299CC957001F7BB3 /* HabitDisagreeModel.swift in Sources */, + 282C46942997F62A006E1E13 /* ResponseStruct.swift in Sources */, BE6AF7F2296ED62400C236F8 /* Friend.swift in Sources */, BE5F4EC4296D9E090064A93C /* Quote.swift in Sources */, - 3BE30E61299535A9004B3F23 /* SearchEmail.swift in Sources */, + 2871C501299D33DB00D02A2E /* SearchManager.swift in Sources */, + 28EFD4892987AE140092E210 /* MyPageTableFooterView.swift in Sources */, BE532E742975A41800DDA6EA /* BadHabitDetailViewController.swift in Sources */, - 3BE30E6A299535A9004B3F23 /* NewPersonModel.swift in Sources */, - 3BE30E5B299535A9004B3F23 /* SearchEmailModel.swift in Sources */, + 3B77F3AD299CC957001F7BB3 /* SearchNameModel.swift in Sources */, + 3B77F3A2299CC957001F7BB3 /* FriendDelete.swift in Sources */, + 3B77F3A4299CC957001F7BB3 /* Request_FriendModel.swift in Sources */, + 3B77F3A7299CC957001F7BB3 /* RequestStatusModel.swift in Sources */, + BE82D333298D191A003EFE44 /* EditViewController.swift in Sources */, + 28EFD48B2987B5190092E210 /* FeedBackController.swift in Sources */, + 3B77F3B5299CC957001F7BB3 /* HabitDisagree.swift in Sources */, + 3B77F3B2299CC957001F7BB3 /* RequestStatus.swift in Sources */, + 3B77F3B0299CC957001F7BB3 /* Request_Friend.swift in Sources */, + 3B77F3AF299CC957001F7BB3 /* InviteHabitModel.swift in Sources */, + 286F6ABC298EBD8C0089936D /* TipsData.swift in Sources */, BECC4B62296C6B010037807F /* EmojiTextField.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -498,14 +741,18 @@ }; BECC4B4A296C3AB80037807F /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6868E3C3CEFCFABB0444CD2D /* Pods-Better-me-iOS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Better-me-iOS/Better-me-iOS.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = 9S44MNK86W; + DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Better-me-iOS/Info.plist"; + INFOPLIST_KEY_NSCameraUsageDescription = "프로필 사진 변경을 위해 카메라 접근 권한이 필요합니다. 허용 하시겠습니까?"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "프로필 사진 변경을 위해 앨범 접근 권한이 필요합니다. 허용 하시겠습니까?"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; @@ -526,14 +773,18 @@ }; BECC4B4B296C3AB80037807F /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 06B307C46D7BBE790ECF1FAC /* Pods-Better-me-iOS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "Better-me-iOS/Better-me-iOS.entitlements"; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 9S44MNK86W; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = "Better-me-iOS/Info.plist"; + INFOPLIST_KEY_NSCameraUsageDescription = "프로필 사진 변경을 위해 카메라 접근 권한이 필요합니다. 허용 하시겠습니까?"; + INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "프로필 사진 변경을 위해 앨범 접근 권한이 필요합니다. 허용 하시겠습니까?"; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; INFOPLIST_KEY_UIMainStoryboardFile = Main; @@ -576,22 +827,35 @@ /* End XCConfigurationList section */ /* Begin XCRemoteSwiftPackageReference section */ - 3BA12293298A967B000E38A8 /* XCRemoteSwiftPackageReference "PopupView" */ = { + 282C468E299548F4006E1E13 /* XCRemoteSwiftPackageReference "PopupView" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/exyte/PopupView.git"; requirement = { - branch = master; - kind = branch; + kind = upToNextMajorVersion; + minimumVersion = 2.0.0; + }; + }; + 28AAB1FB298FC78400B58C12 /* XCRemoteSwiftPackageReference "Alamofire" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Alamofire/Alamofire"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ - 3BA12294298A967B000E38A8 /* PopupView */ = { + 282C468F299548F4006E1E13 /* PopupView */ = { isa = XCSwiftPackageProductDependency; - package = 3BA12293298A967B000E38A8 /* XCRemoteSwiftPackageReference "PopupView" */; + package = 282C468E299548F4006E1E13 /* XCRemoteSwiftPackageReference "PopupView" */; productName = PopupView; }; + 28AAB1FC298FC78400B58C12 /* Alamofire */ = { + isa = XCSwiftPackageProductDependency; + package = 28AAB1FB298FC78400B58C12 /* XCRemoteSwiftPackageReference "Alamofire" */; + productName = Alamofire; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = BECC4B2D296C3AB60037807F /* Project object */; diff --git a/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/abc.xcuserdatad/UserInterfaceState.xcuserstate b/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/abc.xcuserdatad/UserInterfaceState.xcuserstate index b8db7c9..21342b5 100644 Binary files a/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/abc.xcuserdatad/UserInterfaceState.xcuserstate and b/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/abc.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/jeongtaewoo.xcuserdatad/UserInterfaceState.xcuserstate b/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/jeongtaewoo.xcuserdatad/UserInterfaceState.xcuserstate index b753d13..726fb51 100644 Binary files a/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/jeongtaewoo.xcuserdatad/UserInterfaceState.xcuserstate and b/Better-me-iOS.xcodeproj/project.xcworkspace/xcuserdata/jeongtaewoo.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Better-me-iOS.xcodeproj/xcuserdata/jeongtaewoo.xcuserdatad/xcschemes/xcschememanagement.plist b/Better-me-iOS.xcodeproj/xcuserdata/jeongtaewoo.xcuserdatad/xcschemes/xcschememanagement.plist index 314f52e..7ffd81c 100644 --- a/Better-me-iOS.xcodeproj/xcuserdata/jeongtaewoo.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Better-me-iOS.xcodeproj/xcuserdata/jeongtaewoo.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ Better-me-iOS.xcscheme_^#shared#^_ orderHint - 0 + 2 diff --git a/Better-me-iOS.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Better-me-iOS.xcworkspace/xcshareddata/swiftpm/Package.resolved index dc06702..1777284 100644 --- a/Better-me-iOS.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Better-me-iOS.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,12 +1,21 @@ { "pins" : [ + { + "identity" : "alamofire", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Alamofire/Alamofire.git", + "state" : { + "revision" : "78424be314842833c04bc3bef5b72e85fff99204", + "version" : "5.6.4" + } + }, { "identity" : "popupview", "kind" : "remoteSourceControl", "location" : "https://github.com/exyte/PopupView.git", "state" : { - "branch" : "master", - "revision" : "ee306aede532d941c05ff8c63b3b0f3b8cc208cc" + "revision" : "ee306aede532d941c05ff8c63b3b0f3b8cc208cc", + "version" : "2.0.1" } } ], diff --git a/Better-me-iOS/.DS_Store b/Better-me-iOS/.DS_Store index 01da1c6..f9f4c4a 100644 Binary files a/Better-me-iOS/.DS_Store and b/Better-me-iOS/.DS_Store differ diff --git a/Better-me-iOS/AddGoodHabitViewController.swift b/Better-me-iOS/AddGoodHabitViewController.swift index 4a4aa9d..0577cfb 100644 --- a/Better-me-iOS/AddGoodHabitViewController.swift +++ b/Better-me-iOS/AddGoodHabitViewController.swift @@ -112,7 +112,7 @@ class AddGoodHabitViewController: UIViewController { @IBAction func tapSearchButton(_ sender: UIButton) { guard let modalViewController = self.storyboard?.instantiateViewController(identifier: "SearchFriendViewController") as? SearchFriendViewController else { return } modalViewController.definesPresentationContext = true - modalViewController.modalPresentationStyle = .overCurrentContext + modalViewController.modalPresentationStyle = .overFullScreen modalViewController.inviteText = self.inviteTextField.text ?? "" navigationController?.present(modalViewController, animated: true, completion: nil) diff --git a/Better-me-iOS/AlertViewController.swift b/Better-me-iOS/AlertViewController.swift index 82802e1..58c668f 100644 --- a/Better-me-iOS/AlertViewController.swift +++ b/Better-me-iOS/AlertViewController.swift @@ -8,7 +8,7 @@ import UIKit protocol AlertViewControllerDelegate: AnyObject { - func didSelectDelete(isDelete: Bool) + func didSelectDelete() } class AlertViewController: UIViewController{ @@ -19,7 +19,6 @@ class AlertViewController: UIViewController{ @IBOutlet weak var contentsLabel: UILabel! @IBOutlet weak var cancelButton: UIButton! @IBOutlet weak var confirmButton: UIButton! - weak var delegate: AlertViewControllerDelegate? override func viewDidLoad() { @@ -58,13 +57,11 @@ class AlertViewController: UIViewController{ } @IBAction func tapCancelButton(_ sender: UIButton) { - self.dismiss(animated: false) + self.dismiss(animated: true) } @IBAction func tapConfirmButton(_ sender: UIButton) { - self.delegate?.didSelectDelete(isDelete: true) - self.dismiss(animated: false) + self.delegate?.didSelectDelete() + self.dismiss(animated: true) } - - } diff --git a/Better-me-iOS/AppDelegate.swift b/Better-me-iOS/AppDelegate.swift index 77a77f3..01ac0c3 100644 --- a/Better-me-iOS/AppDelegate.swift +++ b/Better-me-iOS/AppDelegate.swift @@ -21,6 +21,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { //바꾸고 싶은 색으로 backgroundColor를 설정 UITabBar.appearance().backgroundColor = UIColor(red: 249/255, green: 249/255, blue: 250/250, alpha: 1.0) } + registerForPushNotifications() + sleep(1) return true } @@ -37,6 +39,35 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. // Use this method to release any resources that were specific to the discarded scenes, as they will not return. } + func registerForPushNotifications() { + // 1 - UNUserNotificationCenter는 푸시 알림을 포함하여 앱의 모든 알림 관련 활동을 처리합니다. + UNUserNotificationCenter.current() + // 2 -알림을 표시하기 위한 승인을 요청합니다. 전달된 옵션은 앱에서 사용하려는 알림 유형을 나타냅니다. 여기에서 알림(alert), 소리(sound) 및 배지(badge)를 요청합니다. + .requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in + // 3 - 완료 핸들러는 인증이 성공했는지 여부를 나타내는 Bool을 수신합니다. 인증 결과를 표시합니다. + print("Permission granted: \(granted)") + // 추가 + guard granted else { return } + self.getNotificationSettings() + } + } + func getNotificationSettings() { + UNUserNotificationCenter.current().getNotificationSettings { settings in + print("Notification settings: \(settings)") + guard settings.authorizationStatus == .authorized else { return } + DispatchQueue.main.async { + UIApplication.shared.registerForRemoteNotifications() + } + } + } + func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { + let tokenParts = deviceToken.map { data in String(format: "%02.2hhx", data) } + let token = tokenParts.joined() + print("Device Token: \(token)") + } + func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { + print("Failed to register: \(error)") + } } diff --git a/Better-me-iOS/Assets.xcassets/.DS_Store b/Better-me-iOS/Assets.xcassets/.DS_Store index 532bd4e..e930db7 100644 Binary files a/Better-me-iOS/Assets.xcassets/.DS_Store and b/Better-me-iOS/Assets.xcassets/.DS_Store differ diff --git a/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Contents.json new file mode 100644 index 0000000..c8cb149 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "Group 13.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 13-2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 13-3.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-2.png b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-2.png new file mode 100644 index 0000000..08529d7 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-2.png differ diff --git a/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-3.png b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-3.png new file mode 100644 index 0000000..4ad3dc3 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13-3.png differ diff --git a/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13.png b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13.png new file mode 100644 index 0000000..a5b6643 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/FriendButton.fill.imageset/Group 13.png differ diff --git a/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Contents.json new file mode 100644 index 0000000..3227f0e --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 51.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 51-2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 51-3.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-2.png b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-2.png new file mode 100644 index 0000000..9b938af Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-2.png differ diff --git a/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-3.png b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-3.png new file mode 100644 index 0000000..3ccfe9c Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51-3.png differ diff --git a/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51.png b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51.png new file mode 100644 index 0000000..678f8b9 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/InviteButton.imageset/Group 51.png differ diff --git a/Better-me-iOS/Assets.xcassets/RequestButton.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/Contents.json new file mode 100644 index 0000000..570f26b --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "요청됨 (1).png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "요청됨 (2).png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "요청됨 (3).png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (1).png" "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (1).png" new file mode 100644 index 0000000..ebca5cd Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (1).png" differ diff --git "a/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (2).png" "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (2).png" new file mode 100644 index 0000000..7b939b8 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (2).png" differ diff --git "a/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (3).png" "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (3).png" new file mode 100644 index 0000000..378c015 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/RequestButton.imageset/\354\232\224\354\262\255\353\220\250 (3).png" differ diff --git a/Better-me-iOS/Assets.xcassets/image 6.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/Vector.imageset/Contents.json similarity index 71% rename from Better-me-iOS/Assets.xcassets/image 6.imageset/Contents.json rename to Better-me-iOS/Assets.xcassets/Vector.imageset/Contents.json index b110fd8..446d6be 100644 --- a/Better-me-iOS/Assets.xcassets/image 6.imageset/Contents.json +++ b/Better-me-iOS/Assets.xcassets/Vector.imageset/Contents.json @@ -1,17 +1,15 @@ { "images" : [ { - "filename" : "image 6.png", + "filename" : "Vector.png", "idiom" : "universal", "scale" : "1x" }, { - "filename" : "image 6@2x.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "image 6@3x.png", "idiom" : "universal", "scale" : "3x" } diff --git a/Better-me-iOS/Assets.xcassets/Vector.imageset/Vector.png b/Better-me-iOS/Assets.xcassets/Vector.imageset/Vector.png new file mode 100644 index 0000000..a4b0ec8 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/Vector.imageset/Vector.png differ diff --git a/Better-me-iOS/Assets.xcassets/Vector2.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/Vector2.imageset/Contents.json new file mode 100644 index 0000000..d1869ce --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/Vector2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Vector2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/Vector2.imageset/Vector2.png b/Better-me-iOS/Assets.xcassets/Vector2.imageset/Vector2.png new file mode 100644 index 0000000..6c4caea Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/Vector2.imageset/Vector2.png differ diff --git a/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Contents.json new file mode 100644 index 0000000..09e07a9 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "filename" : "Group 12.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 12-2.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 12-3.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "original" + } +} diff --git a/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-2.png b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-2.png new file mode 100644 index 0000000..c79d9c3 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-2.png differ diff --git a/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-3.png b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-3.png new file mode 100644 index 0000000..9eb71ef Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12-3.png differ diff --git a/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12.png b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12.png new file mode 100644 index 0000000..f577746 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/WorldButton.fill.imageset/Group 12.png differ diff --git a/Better-me-iOS/Assets.xcassets/comment.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/comment.imageset/Contents.json new file mode 100644 index 0000000..e8bf892 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/comment.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 3.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 3@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 3@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/comment.imageset/image 3.png b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3.png new file mode 100644 index 0000000..37b7b1d Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3.png differ diff --git a/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@2x.png b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@2x.png new file mode 100644 index 0000000..6a5fb4e Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@3x.png b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@3x.png new file mode 100644 index 0000000..cc7594e Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/comment.imageset/image 3@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/custom_gray.colorset/Contents.json b/Better-me-iOS/Assets.xcassets/custom_gray.colorset/Contents.json new file mode 100644 index 0000000..30e0f31 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/custom_gray.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.906", + "green" : "0.906", + "red" : "0.906" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/custom_red.colorset/Contents.json b/Better-me-iOS/Assets.xcassets/custom_red.colorset/Contents.json new file mode 100644 index 0000000..39925e2 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/custom_red.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.001", + "green" : "0.073", + "red" : "0.933" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/Contents.json new file mode 100644 index 0000000..dee9f85 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "스크린샷 2023-02-14 오후 4.45.23 1.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "스크린샷 2023-02-14 오후 4.45.23 3.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "스크린샷 2023-02-14 오후 4.45.23.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 1.png" "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 1.png" new file mode 100644 index 0000000..12b8da7 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 1.png" differ diff --git "a/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 3.png" "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 3.png" new file mode 100644 index 0000000..12b8da7 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23 3.png" differ diff --git "a/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23.png" "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23.png" new file mode 100644 index 0000000..12b8da7 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/defaultPhoto.imageset/\354\212\244\355\201\254\353\246\260\354\203\267 2023-02-14 \354\230\244\355\233\204 4.45.23.png" differ diff --git a/Better-me-iOS/Assets.xcassets/google.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/google.imageset/Contents.json new file mode 100644 index 0000000..fa4ebb2 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/google.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 4.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 4@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 4@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/google.imageset/image 4.png b/Better-me-iOS/Assets.xcassets/google.imageset/image 4.png new file mode 100644 index 0000000..cd2fdd8 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/google.imageset/image 4.png differ diff --git a/Better-me-iOS/Assets.xcassets/google.imageset/image 4@2x.png b/Better-me-iOS/Assets.xcassets/google.imageset/image 4@2x.png new file mode 100644 index 0000000..f3ff755 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/google.imageset/image 4@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/google.imageset/image 4@3x.png b/Better-me-iOS/Assets.xcassets/google.imageset/image 4@3x.png new file mode 100644 index 0000000..5827f6b Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/google.imageset/image 4@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 101.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/image 101.imageset/Contents.json new file mode 100644 index 0000000..8300308 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/image 101.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 101.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 101@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 101@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101.png b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101.png new file mode 100644 index 0000000..891815a Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@2x.png b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@2x.png new file mode 100644 index 0000000..34000a8 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@3x.png b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@3x.png new file mode 100644 index 0000000..a20b6fe Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 101.imageset/image 101@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 121.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/image 121.imageset/Contents.json new file mode 100644 index 0000000..8a957ba --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/image 121.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 121.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 121@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 121@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121.png b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121.png new file mode 100644 index 0000000..6fc8177 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@2x.png b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@2x.png new file mode 100644 index 0000000..9fdcea0 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@3x.png b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@3x.png new file mode 100644 index 0000000..3c0ea96 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 121.imageset/image 121@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 122.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/image 122.imageset/Contents.json new file mode 100644 index 0000000..8a957ba --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/image 122.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 121.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 121@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 121@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121.png b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121.png new file mode 100644 index 0000000..0dbd3e7 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@2x.png b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@2x.png new file mode 100644 index 0000000..1aa5719 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@3x.png b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@3x.png new file mode 100644 index 0000000..3c2dbf9 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 122.imageset/image 121@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 123.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/image 123.imageset/Contents.json new file mode 100644 index 0000000..5d65ebc --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/image 123.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 123.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 123@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 123@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123.png b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123.png new file mode 100644 index 0000000..18fff45 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@2x.png b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@2x.png new file mode 100644 index 0000000..987f335 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@3x.png b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@3x.png new file mode 100644 index 0000000..787384e Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/image 123.imageset/image 123@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6.png b/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6.png deleted file mode 100644 index af8e9c4..0000000 Binary files a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6.png and /dev/null differ diff --git a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@2x.png b/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@2x.png deleted file mode 100644 index 6cf8c9e..0000000 Binary files a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@2x.png and /dev/null differ diff --git a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@3x.png b/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@3x.png deleted file mode 100644 index 2ecc89a..0000000 Binary files a/Better-me-iOS/Assets.xcassets/image 6.imageset/image 6@3x.png and /dev/null differ diff --git a/Better-me-iOS/Assets.xcassets/joinComment.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/joinComment.imageset/Contents.json new file mode 100644 index 0000000..d7f8518 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/joinComment.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "반가워요! 이메일로 회원가입해주세요..png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "반가워요! 이메일로 회원가입해주세요.@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "반가워요! 이메일로 회원가입해주세요.@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224..png" "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224..png" new file mode 100644 index 0000000..f0a70f6 Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224..png" differ diff --git "a/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@2x.png" "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@2x.png" new file mode 100644 index 0000000..2163abb Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@2x.png" differ diff --git "a/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@3x.png" "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@3x.png" new file mode 100644 index 0000000..8e38a9c Binary files /dev/null and "b/Better-me-iOS/Assets.xcassets/joinComment.imageset/\353\260\230\352\260\200\354\233\214\354\232\224! \354\235\264\353\251\224\354\235\274\353\241\234 \355\232\214\354\233\220\352\260\200\354\236\205\355\225\264\354\243\274\354\204\270\354\232\224.@3x.png" differ diff --git a/Better-me-iOS/Assets.xcassets/kakao.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/kakao.imageset/Contents.json new file mode 100644 index 0000000..da34e3b --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/kakao.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "image 5.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "image 5@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "image 5@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5.png b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5.png new file mode 100644 index 0000000..dddaf90 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5.png differ diff --git a/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@2x.png b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@2x.png new file mode 100644 index 0000000..80f8b8b Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@3x.png b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@3x.png new file mode 100644 index 0000000..cd45be3 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/kakao.imageset/image 5@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/line.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/line.imageset/Contents.json new file mode 100644 index 0000000..47b5f52 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/line.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Line 19.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Line 19@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Line 19@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/line.imageset/Line 19.png b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19.png new file mode 100644 index 0000000..f518fff Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19.png differ diff --git a/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@2x.png b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@2x.png new file mode 100644 index 0000000..367f612 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@3x.png b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@3x.png new file mode 100644 index 0000000..856d6ad Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/line.imageset/Line 19@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/logo.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/logo.imageset/Contents.json new file mode 100644 index 0000000..1536631 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/logo.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame-2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame-2@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame-2@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2.png b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2.png new file mode 100644 index 0000000..3832c83 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2.png differ diff --git a/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@2x.png b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@2x.png new file mode 100644 index 0000000..feee48f Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@3x.png b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@3x.png new file mode 100644 index 0000000..f78bc1f Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/logo.imageset/Frame-2@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/naver.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/naver.imageset/Contents.json new file mode 100644 index 0000000..4b7bf60 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/naver.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Frame.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Frame@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Frame@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/naver.imageset/Frame.png b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame.png new file mode 100644 index 0000000..3a2486b Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame.png differ diff --git a/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@2x.png b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@2x.png new file mode 100644 index 0000000..631bd87 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@3x.png b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@3x.png new file mode 100644 index 0000000..ff000f0 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/naver.imageset/Frame@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/save.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/save.imageset/Contents.json new file mode 100644 index 0000000..c7301af --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/save.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "Group 82.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "Group 82@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "Group 82@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/save.imageset/Group 82.png b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82.png new file mode 100644 index 0000000..68a2e4f Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82.png differ diff --git a/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@2x.png b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@2x.png new file mode 100644 index 0000000..89c3501 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@2x.png differ diff --git a/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@3x.png b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@3x.png new file mode 100644 index 0000000..8c89191 Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/save.imageset/Group 82@3x.png differ diff --git a/Better-me-iOS/Assets.xcassets/so-trashred.imageset/Contents.json b/Better-me-iOS/Assets.xcassets/so-trashred.imageset/Contents.json new file mode 100644 index 0000000..ff2ea14 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/so-trashred.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "so-trash.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/Assets.xcassets/so-trashred.imageset/so-trash.png b/Better-me-iOS/Assets.xcassets/so-trashred.imageset/so-trash.png new file mode 100644 index 0000000..8ea932f Binary files /dev/null and b/Better-me-iOS/Assets.xcassets/so-trashred.imageset/so-trash.png differ diff --git a/Better-me-iOS/Assets.xcassets/text_color.colorset/Contents.json b/Better-me-iOS/Assets.xcassets/text_color.colorset/Contents.json new file mode 100644 index 0000000..a5e7743 --- /dev/null +++ b/Better-me-iOS/Assets.xcassets/text_color.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.388", + "green" : "0.388", + "red" : "0.388" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Better-me-iOS/BadHabitDetailViewController.swift b/Better-me-iOS/BadHabitDetailViewController.swift index 011aa62..6b0c0ae 100644 --- a/Better-me-iOS/BadHabitDetailViewController.swift +++ b/Better-me-iOS/BadHabitDetailViewController.swift @@ -19,8 +19,8 @@ class BadHabitDetailViewController: UIViewController { @IBOutlet weak var titleTextField: UITextField! @IBOutlet weak var contentsTextView: UITextView! @IBOutlet weak var inviteTextField: UITextField! - @IBOutlet weak var deleteButton: UIButton! - @IBOutlet weak var editButton: UIBarButtonItem! + + @IBOutlet weak var editButton: UIButton! weak var delegate: BadHabitDetailViewDelegate? var habit: Habit? @@ -35,7 +35,6 @@ class BadHabitDetailViewController: UIViewController { self.configureTitleTextField() self.configureContentsTextView() self.configureInviteTextField() - self.configureDeleteButton() self.emojiTextField.delegate = self self.navigationController?.navigationBar.tintColor = .black NotificationCenter.default.addObserver( @@ -89,19 +88,6 @@ class BadHabitDetailViewController: UIViewController { self.inviteTextField.layer.cornerRadius = 5.0 } - private func configureInputField() { - self.titleTextField.addTarget(self, action: #selector(titleTextFieldDidChange(_:)), for: .editingChanged) - } - - private func configureDeleteButton() { - self.deleteButton.tintColor = .black - self.deleteButton.layer.addBorder([.top], color: UIColor(red: 237/255, green: 237/255, blue: 237/255, alpha: 1.0), width: 1.0) - } - - - @objc private func titleTextFieldDidChange(_ textField: UITextField) { - self.validateInputField() - } @objc private func textDidChange(_ notification: Notification) { if let textField = notification.object as? UITextField { @@ -124,42 +110,21 @@ class BadHabitDetailViewController: UIViewController { self.view.endEditing(true) self.contentsTextView.resignFirstResponder() } - - private func validateInputField() { - self.editButton.isEnabled = !(self.titleTextField.text?.isEmpty ?? true) && !(self.contentsTextView.text?.isEmpty ?? true) && !(self.emojiTextField.text?.isEmpty ?? true) - } - - - @IBAction func tapDeleteButton(_ sender: UIButton) { - guard let alertViewController = self.storyboard?.instantiateViewController(withIdentifier: "AlertViewController") as? AlertViewController else { return } - alertViewController.alertName = "앗!" - alertViewController.habitName = self.titleTextField.text ?? "" - alertViewController.contents = "습관을 삭제하시겠습니까?" - alertViewController.delegate = self - alertViewController.definesPresentationContext = true - alertViewController.modalPresentationStyle = .overCurrentContext - navigationController?.present(alertViewController, animated: false, completion: nil) - } - - - @IBAction func tapEditButton(_ sender: UIButton) { - guard let indexPath = self.indexPath else { return } - guard let title = self.titleTextField.text else { return } - guard let emoji = self.emojiTextField.text else { return } - guard let contents = self.contentsTextView.text else { return } - guard let hNum = self.hNum else { return } - guard let isCheck = self.isCheck else { return } - guard let date = self.date else { return } - let habit = Habit(title: title, emoji: emoji, contents: contents, hNum: hNum, isCheck: isCheck, date: date) - self.delegate?.didBadSelectEdit(indexPath: indexPath, habit: habit) - self.navigationController?.popViewController(animated: true) + @IBAction func tapButton(_ sender: UIButton) { + self.editButton.setImage(UIImage(named: "EditButton.fill"), for: .normal) + guard let editViewController = self.storyboard?.instantiateViewController(withIdentifier: "EditViewController") as? EditViewController else { return } + editViewController.definesPresentationContext = true + editViewController.modalPresentationStyle = .overFullScreen + editViewController.hidesBottomBarWhenPushed = true + editViewController.habitTitle = self.titleTextField.text + editViewController.delegate = self + navigationController?.present(editViewController, animated: true, completion: nil) } - @IBAction func tapSearchButton(_ sender: UIButton) { guard let modalViewController = self.storyboard?.instantiateViewController(identifier: "SearchFriendViewController") as? SearchFriendViewController else { return } modalViewController.definesPresentationContext = true - modalViewController.modalPresentationStyle = .overCurrentContext + modalViewController.modalPresentationStyle = .overFullScreen modalViewController.inviteText = self.inviteTextField.text ?? "" navigationController?.present(modalViewController, animated: true, completion: nil) } @@ -180,9 +145,6 @@ extension BadHabitDetailViewController: UITextViewDelegate { self.contentsTextView.textColor = UIColor.black } } - func textViewDidChange(_ textView: UITextView) { - self.validateInputField() - } } extension BadHabitDetailViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { @@ -199,15 +161,45 @@ extension BadHabitDetailViewController: UITextFieldDelegate { } } } - func textFieldDidChangeSelection(_ textField: UITextField) { - self.validateInputField() - } } extension BadHabitDetailViewController: AlertViewControllerDelegate { - func didSelectDelete(isDelete: Bool) { + func didSelectDelete() { guard let indexPath = self.indexPath else { return } self.delegate?.didBadSelectDelete(indexPath: indexPath) self.navigationController?.popViewController(animated: true) } } + + +extension BadHabitDetailViewController: EditViewDelegate { + func didCheckDelete() { + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { + guard let alertViewController = self.storyboard?.instantiateViewController(withIdentifier: "AlertViewController") as? AlertViewController else { return } + alertViewController.alertName = "앗!" + alertViewController.habitName = self.titleTextField.text ?? "" + alertViewController.contents = "습관을 삭제하시겠습니까?" + alertViewController.delegate = self + alertViewController.definesPresentationContext = true + alertViewController.modalPresentationStyle = .overFullScreen + alertViewController.modalTransitionStyle = .crossDissolve + self.present(alertViewController, animated: true, completion: nil) + } + self.editButton.setImage(UIImage(named: "EditButton"), for: .normal) + } + func didCancel() { + self.editButton.setImage(UIImage(named: "EditButton"), for: .normal) + } + func didCheckEdit() { + guard let indexPath = self.indexPath else { return } + guard let title = self.titleTextField.text else { return } + guard let emoji = self.emojiTextField.text else { return } + guard let contents = self.contentsTextView.text else { return } + guard let hNum = self.hNum else { return } + guard let isCheck = self.isCheck else { return } + guard let date = self.date else { return } + let habit = Habit(title: title, emoji: emoji, contents: contents, hNum: hNum, isCheck: isCheck, date: date) + self.delegate?.didBadSelectEdit(indexPath: indexPath, habit: habit) + self.navigationController?.popViewController(animated: true) + } +} diff --git a/Better-me-iOS/Base.lproj/LaunchScreen.storyboard b/Better-me-iOS/Base.lproj/LaunchScreen.storyboard index 865e932..64f0c6e 100644 --- a/Better-me-iOS/Base.lproj/LaunchScreen.storyboard +++ b/Better-me-iOS/Base.lproj/LaunchScreen.storyboard @@ -1,8 +1,10 @@ - - + + + - + + @@ -11,10 +13,32 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + @@ -22,4 +46,11 @@ + + + + + + + diff --git a/Better-me-iOS/Base.lproj/Main.storyboard b/Better-me-iOS/Base.lproj/Main.storyboard index b1ed38b..651d1a6 100644 --- a/Better-me-iOS/Base.lproj/Main.storyboard +++ b/Better-me-iOS/Base.lproj/Main.storyboard @@ -1,8 +1,10 @@ - + - + + + @@ -12,7 +14,7 @@ - + @@ -26,7 +28,7 @@ - + @@ -474,7 +476,7 @@ - + @@ -840,49 +842,34 @@ - + - + - + - - + + - - - - - - - - - - - - - - - - + - + @@ -893,13 +880,13 @@ - + - + @@ -1053,13 +1040,22 @@ - + - + + + + + + + + + + @@ -1067,7 +1063,15 @@ - + + + + + + + + + @@ -1162,7 +1166,7 @@ - + + + + + + + + - - - + + + + + - - - - - - - - - - - + + + + + + + + + - + - - - - + - + + - + - + - + @@ -1505,7 +1492,7 @@ - + @@ -1611,13 +1598,315 @@ + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1627,103 +1916,871 @@ + + - - + + - + - + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + + - + + - + - - - - - - - - - - - - - - - - - - + + + + + + + - - - + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + - - + + + + + + + + + + + + + + diff --git a/Better-me-iOS/Better-me-iOS.entitlements b/Better-me-iOS/Better-me-iOS.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/Better-me-iOS/Better-me-iOS.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/Better-me-iOS/EditViewController.swift b/Better-me-iOS/EditViewController.swift new file mode 100644 index 0000000..b4be09e --- /dev/null +++ b/Better-me-iOS/EditViewController.swift @@ -0,0 +1,71 @@ +// +// EditViewController.swift +// Better-me-iOS +// +// Created by 정태우 on 2023/02/03. +// + +import UIKit + +protocol EditViewDelegate: AnyObject { + func didCheckDelete() + func didCheckEdit() + func didCancel() +} + +class EditViewController: UIViewController { + + + @IBOutlet weak var editView: UIView! + @IBOutlet weak var editButton: UIButton! + @IBOutlet weak var deleteButton: UIButton! + @IBOutlet weak var cancelButton: UIButton! + weak var delegate: EditViewDelegate? + + var habitTitle: String? + override func viewDidLoad() { + super.viewDidLoad() + self.configureButton() + self.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.0) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) { + self.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + } + } + private func configureButton() { + self.editView.backgroundColor = .white + self.editView.layer.cornerRadius = 27.0 + self.editButton.layer.cornerRadius = 22.0 + self.deleteButton.layer.cornerRadius = 22.0 + self.editButton.layer.borderWidth = 1.5 + self.editButton.layer.borderColor = UIColor(red: 251/255, green: 20/255, blue: 0/255, alpha: 1.0).cgColor + self.cancelButton.layer.addBorder([.top], color: UIColor(red: 237/255, green: 237/255, blue: 237/255, alpha: 1.0), width: 1.0) + } + + @IBAction func tapEditButton(_ sender: UIButton) { + self.delegate?.didCheckEdit() + self.dismiss(animated: true) + } + + + @IBAction func tapBackButton(_ sender: UIButton) { + self.delegate?.didCancel() + self.dismiss(animated: true) + } + + @IBAction func tapDeleteButton(_ sender: UIButton) { + self.delegate?.didCheckDelete() + self.dismiss(animated: true) + } + + @IBAction func tapCancelButton(_ sender: UIButton) { + self.delegate?.didCancel() + self.dismiss(animated: true) + } +} + +extension EditViewController: AlertViewControllerDelegate { + func didSelectDelete() { + self.delegate?.didCheckDelete() + self.navigationController?.popViewController(animated: true) + } +} diff --git a/Better-me-iOS/FriendCell.swift b/Better-me-iOS/FriendCell.swift index 707c445..075f442 100644 --- a/Better-me-iOS/FriendCell.swift +++ b/Better-me-iOS/FriendCell.swift @@ -12,7 +12,9 @@ class FriendCell: UICollectionViewCell { @IBOutlet weak var profileImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! @IBOutlet weak var hNumLabel: UILabel! - @IBOutlet weak var friendCellView: UIView! - + @IBOutlet weak var inviteButton: UIButton! + @IBAction func tapInviteButton(_ sender: UIButton) { + self.inviteButton.setImage(UIImage(named: "RequestButton"), for: .normal) + } } diff --git a/Better-me-iOS/GoodHabitDetailViewController.swift b/Better-me-iOS/GoodHabitDetailViewController.swift index 9e6a2be..709cadb 100644 --- a/Better-me-iOS/GoodHabitDetailViewController.swift +++ b/Better-me-iOS/GoodHabitDetailViewController.swift @@ -13,15 +13,12 @@ protocol GoodHabitDetailViewDelegate: AnyObject { } class GoodHabitDetailViewController: UIViewController { - - - @IBOutlet weak var emojiTextField: EmojiTextField! @IBOutlet weak var titleTextField: UITextField! @IBOutlet weak var contentsTextView: UITextView! @IBOutlet weak var inviteTextField: UITextField! - @IBOutlet weak var deleteButton: UIButton! - @IBOutlet weak var editButton: UIBarButtonItem! + @IBOutlet weak var editButton: UIButton! + weak var delegate: GoodHabitDetailViewDelegate? var habit: Habit? var indexPath: IndexPath? @@ -35,7 +32,6 @@ class GoodHabitDetailViewController: UIViewController { self.configureTitleTextField() self.configureContentsTextView() self.configureInviteTextField() - self.configureDeleteButton() self.emojiTextField.delegate = self self.navigationController?.navigationBar.tintColor = .black } @@ -87,10 +83,6 @@ class GoodHabitDetailViewController: UIViewController { private func configureInputField() { self.titleTextField.addTarget(self, action: #selector(titleTextFieldDidChange(_:)), for: .editingChanged) } - private func configureDeleteButton() { - self.deleteButton.tintColor = .black - self.deleteButton.layer.addBorder([.top], color: UIColor(red: 237/255, green: 237/255, blue: 237/255, alpha: 1.0), width: 1.0) - } @objc private func titleTextFieldDidChange(_ textField: UITextField) { @@ -124,35 +116,22 @@ class GoodHabitDetailViewController: UIViewController { } - @IBAction func tapDeleteButton(_ sender: UIButton) { - guard let alertViewController = self.storyboard?.instantiateViewController(withIdentifier: "AlertViewController") as? AlertViewController else { return } - alertViewController.alertName = "앗!" - alertViewController.habitName = self.titleTextField.text ?? "" - alertViewController.contents = "습관을 삭제하시겠습니까?" - alertViewController.delegate = self - alertViewController.definesPresentationContext = true - alertViewController.modalPresentationStyle = .overCurrentContext - navigationController?.present(alertViewController, animated: false, completion: nil) + @IBAction func tapButton(_ sender: UIButton) { + self.editButton.setImage(UIImage(named: "EditButton.fill"), for: .normal) + guard let editViewController = self.storyboard?.instantiateViewController(withIdentifier: "EditViewController") as? EditViewController else { return } + editViewController.definesPresentationContext = true + editViewController.modalPresentationStyle = .overFullScreen + editViewController.hidesBottomBarWhenPushed = true + editViewController.habitTitle = self.titleTextField.text + editViewController.delegate = self + navigationController?.present(editViewController, animated: true, completion: nil) } - @IBAction func tapEditButton(_ sender: UIButton) { - guard let indexPath = self.indexPath else { return } - guard let title = self.titleTextField.text else { return } - guard let emoji = self.emojiTextField.text else { return } - guard let contents = self.contentsTextView.text else { return } - guard let hNum = self.hNum else { return } - guard let isCheck = self.isCheck else { return } - guard let date = self.date else { return } - let habit = Habit(title: title, emoji: emoji, contents: contents, hNum: hNum, isCheck: isCheck, date: date) - self.delegate?.didSelectEdit(indexPath: indexPath, habit: habit) - self.navigationController?.popViewController(animated: true) - } - @IBAction func tapSearchButton(_ sender: UIButton) { guard let modalViewController = self.storyboard?.instantiateViewController(identifier: "SearchFriendViewController") as? SearchFriendViewController else { return } modalViewController.definesPresentationContext = true - modalViewController.modalPresentationStyle = .overCurrentContext + modalViewController.modalPresentationStyle = .overFullScreen modalViewController.inviteText = self.inviteTextField.text ?? "" navigationController?.present(modalViewController, animated: true, completion: nil) } @@ -197,9 +176,42 @@ extension GoodHabitDetailViewController: UITextFieldDelegate { } } extension GoodHabitDetailViewController: AlertViewControllerDelegate { - func didSelectDelete(isDelete: Bool) { + func didSelectDelete() { + print("hi") guard let indexPath = self.indexPath else { return } self.delegate?.didSelectDelete(indexPath: indexPath) self.navigationController?.popViewController(animated: true) } } + +extension GoodHabitDetailViewController: EditViewDelegate { + func didCheckDelete() { + self.editButton.setImage(UIImage(named: "EditButton"), for: .normal) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) { + guard let alertViewController = self.storyboard?.instantiateViewController(withIdentifier: "AlertViewController") as? AlertViewController else { return } + alertViewController.alertName = "앗!" + alertViewController.habitName = self.titleTextField.text ?? "" + alertViewController.contents = "습관을 삭제하시겠습니까?" + alertViewController.delegate = self + alertViewController.definesPresentationContext = true + alertViewController.modalPresentationStyle = .overFullScreen + alertViewController.modalTransitionStyle = .crossDissolve + self.present(alertViewController, animated: true, completion: nil) + } + } + func didCancel() { + self.editButton.setImage(UIImage(named: "EditButton"), for: .normal) + } + func didCheckEdit() { + guard let indexPath = self.indexPath else { return } + guard let title = self.titleTextField.text else { return } + guard let emoji = self.emojiTextField.text else { return } + guard let contents = self.contentsTextView.text else { return } + guard let hNum = self.hNum else { return } + guard let isCheck = self.isCheck else { return } + guard let date = self.date else { return } + let habit = Habit(title: title, emoji: emoji, contents: contents, hNum: hNum, isCheck: isCheck, date: date) + self.delegate?.didSelectEdit(indexPath: indexPath, habit: habit) + self.navigationController?.popViewController(animated: true) + } +} diff --git a/Better-me-iOS/HomeViewController.swift b/Better-me-iOS/HomeViewController.swift index d6773c0..16816e9 100644 --- a/Better-me-iOS/HomeViewController.swift +++ b/Better-me-iOS/HomeViewController.swift @@ -6,7 +6,6 @@ // import UIKit -import SwiftUI class HomeViewController: UIViewController { diff --git a/Better-me-iOS/Login/DataModel/GetMsgDataManager.swift b/Better-me-iOS/Login/DataModel/GetMsgDataManager.swift new file mode 100644 index 0000000..d13f2b0 --- /dev/null +++ b/Better-me-iOS/Login/DataModel/GetMsgDataManager.swift @@ -0,0 +1,130 @@ +// +// GetMsgData.swift +// Better me +// +// Created by 심윤주 on 2023/01/25. +// + +import Foundation +import Alamofire +import UIKit + +struct GetMsgDataManager { + func duplicateEmail(checkEmail: String, viewController: JoinViewController ) { + let url = "http://54.180.13.219:3000/app/users/checkEmail?email=\(checkEmail)" + + AF.request(url, + method: .get, + parameters: nil, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json"]) + .validate() + .responseDecodable(of: ResponseModel.self) { response in + switch response.result { + case .success(let response): + + if response.code == 3001 { //이메일 중복인 경우 + viewController.EmailDuplicateMsg = response.message + viewController.checkDuplicate = true + } else { //중복 아닌경우 + viewController.checkDuplicate = false + print(response.message) + } + + case .failure(let error): + print(error) + viewController.serverCheck = true + } + + } + } + + func checkIdx(userEmail: String, viewController: passwordFindViewController) { + let url = "http://54.180.13.219:3000/app/users/get_email/\(userEmail)" + + AF.request(url, + method: .get, + parameters: nil, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json"]) + .validate() + .responseDecodable(of: GetUserIdxModel.self) { response in + switch response.result { + case .success(let response): + + if let userIdx = response.result?.userIdx { + print(userIdx) + sendedPwd(userIdx: userIdx, email: userEmail, viewController: viewController) + } else { + print("값 없음") + let alert = UIAlertController(title: "알림", message: "존재하지 않는 이메일입니다. \n이메일을 다시 확인해 주세요.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "확인", style: .default) { action in + }) + viewController.present(alert, animated: true, completion: nil) + } + + case .failure(let error): + print(error) + let alert = UIAlertController(title: "알림", message: "존재하지 않는 이메일입니다. \n이메일을 다시 확인해 주세요.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "확인", style: .default) { action in + }) + viewController.present(alert, animated: true, completion: nil) + + } + + } + } + + func sendedPwd(userIdx: Int, email: String, viewController: passwordFindViewController) { + let url = "http://54.180.13.219:3000/app/users/issuedPw/\(userIdx)" + + let params = ["userEmail": email] as Dictionary + + AF.request(url, + method: .patch, + parameters: params, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json"]) + .validate() + .responseDecodable(of: ResponseModel.self) { response in + switch response.result { + case .success(let response): + print(response.message) + let alert = UIAlertController(title: "알림", message: "비밀번호가 전송되었습니다.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "확인", style: .default) { action in + }) + viewController.present(alert, animated: true, completion: nil) + + case .failure(let error): + print(error) + + } + + } + } + + + func autoLogin() { + let url = "http://54.180.13.219:3000/app/auth/auto-login" + + let token = UserDefaults.standard.string(forKey: "token") + + AF.request(url, + method: .get, + parameters: nil, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": "\(token!)"]) + .validate() + .responseDecodable(of: ResponseModel.self) { response in + switch response.result { + case .success(let response): + print(response.message) + + case .failure(let error): + print(error) + + } + + } + } +} diff --git a/Better-me-iOS/Login/DataModel/GetUserIdxModel.swift b/Better-me-iOS/Login/DataModel/GetUserIdxModel.swift new file mode 100644 index 0000000..ed8aefe --- /dev/null +++ b/Better-me-iOS/Login/DataModel/GetUserIdxModel.swift @@ -0,0 +1,21 @@ +// +// GetUserInxModel.swift +// Better me +// +// Created by 심윤주 on 2023/02/01. +// + +import Foundation + +struct GetUserIdxModel: Codable { + let isSuccess: Bool + let code: Int + let message: String + let result: UserIndex? +} + +// MARK: - Result +struct UserIndex: Codable { + let userIdx: Int + let email, nickName: String +} diff --git a/Better-me-iOS/Login/DataModel/LoginModel.swift b/Better-me-iOS/Login/DataModel/LoginModel.swift new file mode 100644 index 0000000..7dfc8c2 --- /dev/null +++ b/Better-me-iOS/Login/DataModel/LoginModel.swift @@ -0,0 +1,26 @@ +// +// LoginModel.swift +// Better me +// +// Created by 심윤주 on 2023/02/01. +// + +import Foundation + +struct LoginModel: Codable { + let isSuccess: Bool + let code: Int + let message: String + let result: Result? +} + +// MARK: - Result +struct Result: Codable { + let userID: Int + let jwt: String + + enum CodingKeys: String, CodingKey { + case userID = "userId" + case jwt + } +} diff --git a/Better-me-iOS/Login/DataModel/PostDataManager.swift b/Better-me-iOS/Login/DataModel/PostDataManager.swift new file mode 100644 index 0000000..30326d8 --- /dev/null +++ b/Better-me-iOS/Login/DataModel/PostDataManager.swift @@ -0,0 +1,90 @@ +// +// PostDataManager.swift +// Better me +// +// Created by 심윤주 on 2023/01/25. +// + +import Foundation +import Alamofire +import UIKit + +struct PostDataManager { + func PostUserData(email: String, password: String, nickName: String, promise: String, viewController: wordViewController) { + let url = "http://54.180.13.219:3000/app/auth/register" + + let params = ["email": email, "password": password, "nickName": nickName, "promise": promise] as Dictionary + + AF.request(url, + method: .post, + parameters: params, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json"]) + .validate() + .responseDecodable(of: ResponseModel.self) { response in + switch response.result { + case .success(let response): + print(response.message) + let pushVC = viewController.storyboard?.instantiateViewController(withIdentifier: "MainViewController") + viewController.navigationController?.pushViewController(pushVC!, animated: true) + + case .failure(let error): + print("서버오류") + print(error) + let alert = UIAlertController(title: "알림", message: "서버가 불안정합니다. \n잠시후 시도해주세요.", preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "확인", style: .default) { action in + }) + viewController.present(alert, animated: true, completion: nil) + + } + + } + } + + func PostLogin(email: String, password: String, viewController: LoginFirstViewController) { + let url = "http://54.180.13.219:3000/app/auth/login" + + let params = ["email": email, "password": password] + + AF.request(url, + method: .post, + parameters: params, + encoding: JSONEncoding.default, + headers: ["Content-Type":"application/json", "Accept":"application/json"]) + .validate() + .responseDecodable(of: LoginModel.self) { response in + switch response.result { + case .success(let response): + let userIdx = response.result?.userID + UserDefaults.standard.set(userIdx, forKey: "userIdx")// 폴 : 유저 아이디를 위해 추가했습니다! + if let jwt = response.result?.jwt { + viewController.loginCheck = true + + let pushVC = viewController.storyboard?.instantiateViewController(withIdentifier: "TabBar") + viewController.navigationController?.pushViewController(pushVC!, animated: true) + viewController.navigationController?.isNavigationBarHidden = true + UserDefaults.standard.set(jwt, forKey: "token") + GetMsgDataManager().autoLogin() + + } else { + print(response.code) + + viewController.alertLabel.isHidden = false + viewController.alertLabel.text = response.message + viewController.loginBtn.isEnabled = false + viewController.loginBtn.configuration?.background.backgroundColor = .OriginBtnColor + viewController.loginBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + viewController.loginCheck = false + } + case .failure(let error): + print("서버오류") + print(error) + } + + } + } + + + + +} diff --git a/Better-me-iOS/Login/DataModel/ResponseModel.swift b/Better-me-iOS/Login/DataModel/ResponseModel.swift new file mode 100644 index 0000000..95fc01f --- /dev/null +++ b/Better-me-iOS/Login/DataModel/ResponseModel.swift @@ -0,0 +1,14 @@ +// +// registerModel.swift +// Better me +// +// Created by 심윤주 on 2023/01/24. +// + +import Foundation + +struct ResponseModel: Codable { + let isSuccess: Bool + let code: Int + let message: String +} diff --git a/Better-me-iOS/Login/DataModel/UserDataModel.swift b/Better-me-iOS/Login/DataModel/UserDataModel.swift new file mode 100644 index 0000000..37ef7d4 --- /dev/null +++ b/Better-me-iOS/Login/DataModel/UserDataModel.swift @@ -0,0 +1,18 @@ +// +// UserDataModel.swift +// Better me +// +// Created by 심윤주 on 2023/01/22. +// + +import Foundation + +class UserInfo { + private init() { } + static let shared = UserInfo() + + var email: String? + var password: String? + var nickName: String? + var promise: String? +} diff --git a/Better-me-iOS/Login/JoinViewController.swift b/Better-me-iOS/Login/JoinViewController.swift new file mode 100644 index 0000000..f6928a6 --- /dev/null +++ b/Better-me-iOS/Login/JoinViewController.swift @@ -0,0 +1,278 @@ +// +// JoinViewController.swift +// login +// +// Created by 심윤주 on 2023/01/11. +// + +import UIKit +import SwiftUI + +class JoinViewController: UIViewController, UITextFieldDelegate { + var EmailDuplicateMsg: String = "" + var checkDuplicate: Bool = false + var serverCheck: Bool = false + + @IBOutlet weak var joinComment: UILabel! + @IBOutlet weak var emailField: UITextField! + @IBOutlet weak var passwordField: UITextField! + @IBOutlet weak var passwordCheckField: UITextField! + @IBOutlet weak var checkLabel: UILabel! { + didSet { + checkLabel.isHidden = true + } + } + + @IBOutlet weak var okBtn: UIButton!{ + didSet { + okBtn.isEnabled = false + } + } + + override func viewDidLoad() { + super.viewDidLoad() + + //back 지움 + self.navigationController?.navigationBar.topItem?.title = "" + self.navigationItem.title = "" + self.navigationController?.navigationBar.tintColor = .black + + self.hideKeyboardWhenTappedAround() + + emailField.borderAttribute() + passwordField.borderAttribute() + passwordCheckField.borderAttribute() + + emailField.addLeftPadding() + passwordField.addLeftPadding() + passwordCheckField.addLeftPadding() + + //텍스트필드 delegate설정으로 return시 키보드 내려가도록 설정 + emailField.delegate = self + passwordField.delegate = self + passwordCheckField.delegate = self + + //string password 관련 + + passwordField.textContentType = .newPassword + passwordCheckField.textContentType = .newPassword + + + //행간 + let attrString = NSMutableAttributedString(string: joinComment.text!) + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 10 + attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attrString.length)) + joinComment.attributedText = attrString + + //텍스트 입력 감지 + self.emailField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + self.passwordField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + self.passwordCheckField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + + NotificationCenter.default.addObserver(self, + selector: #selector(textDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: emailField) + NotificationCenter.default.addObserver(self, + selector: #selector(PasswordTextDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: passwordField) + NotificationCenter.default.addObserver(self, + selector: #selector(PasswordTextDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: passwordCheckField) + self.navigationController?.isNavigationBarHidden = false + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //noti등록 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillshow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + //noti해제 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + self.navigationController?.isNavigationBarHidden = true + } + + @IBAction func okBtn_next(_ sender: Any) { + + if checkDuplicate { + print("중복입니다") //test + checkLabel.isHidden = false + checkLabel.text = EmailDuplicateMsg + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + } else { + let user = UserInfo.shared + user.email = emailField.text + user.password = passwordField.text + + checkLabel.isHidden = true + okBtn.isEnabled = true + okBtn.configuration?.background.backgroundColor = .BtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "nicknameViewController") + self.navigationController?.pushViewController(pushVC!, animated: true) + } + if serverCheck { + print("서버 오류입니다.") + } + } + + //유효성 검사 + func isSameBoth(_ first: UITextField, _ second: UITextField) -> Bool { //비번 일치 확인 + if(first.text == second.text) { + return true + } else { + return false + } + } + + @objc func TextFieldChange (_ sender: UITextField) { //버튼 활성화, 비활성화 설정 + + if (isValidPassword(str: passwordField.text!)) && (isSameBoth(passwordField, passwordCheckField)) && (isValidEmail(testStr: emailField.text!)) && emailField.text!.count < 31 && passwordField.text!.count < 21 { //비밀번호, 이메일 확인되면 버튼 활성화 + + okBtn.isEnabled = true + okBtn.configuration?.background.backgroundColor = .BtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + + let email = emailField.text! + //이메일 중복검사 + GetMsgDataManager().duplicateEmail(checkEmail: email, viewController: self) + + } else { + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + } + } + + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if textField == passwordField { + passwordField.isSecureTextEntry = true + passwordField.textContentType = .newPassword + } + + else if textField == passwordCheckField { + passwordCheckField.isSecureTextEntry = true + passwordCheckField.textContentType = .newPassword + } + return true + } + + func isValidEmail(testStr:String) -> Bool { + let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,30}" + let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) + return emailTest.evaluate(with: testStr) + } + + func isValidPassword(str:String) -> Bool { //비밀번호 유효성 검사 + let passwordEx = "^[A-Za-z0-9.-]{6,20}$" + return NSPredicate(format: "SELF MATCHES %@", passwordEx).evaluate(with: str) + } + + @objc private func textDidChange(_ notification: Notification) { + let maxLength = 30 + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + checkLabel.isHidden = false + checkLabel.text = "이메일은 30자리 미만으로 입력해주세요." + } + + else if !isValidEmail(testStr: emailField.text!) { + checkLabel.isHidden = false + checkLabel.text = "이메일 형식을 지켜주세요." + } + else { + checkLabel.isHidden = true + } + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + + checkLabel.isHidden = false + checkLabel.text = "비밀번호는 20자 미만으로 입력해주세요." + } + + else if !isSameBoth(passwordField, passwordCheckField) { //비번 불일치 + checkLabel.isHidden = false + checkLabel.text = "비밀번호와 비밀번호 재입력이 일치하지 않습니다." + } + else if !isValidPassword(str: passwordField.text!) { //비번 유효성 + checkLabel.text = "비밀번호 규칙을 확인해주세요." + checkLabel.isHidden = false + } + else if !(isValidPassword(str: passwordField.text!)) && !(isSameBoth(passwordField, passwordCheckField)){ //비번 유효성, 불일치 틀릴 경우 + checkLabel.text = "비밀번호 규칙을 확인해주세요." + checkLabel.isHidden = false + } + else if !isValidEmail(testStr: emailField.text!) && isSameBoth(passwordField, passwordCheckField) { + checkLabel.text = "이메일 형식을 지켜주세요." + checkLabel.isHidden = false + } + else { + checkLabel.isHidden = true + } + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + @objc func keyboardWillshow(notification: NSNotification) { + //키보드 값 가져오기 (옵셔널 값) + if self.view.frame.origin.y == 0 { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue { + + if(keyboardSize.height < okBtn.frame.origin.y) { //키보드가 버튼을 덮는 경우 화면 올릴 값을 구함(distance) + let distance = keyboardSize.height - (okBtn.frame.height + 10) + self.view.frame.origin.y -= distance + + //distance만큼만 올리면 너무 위로 올라가기 때문에 버튼 height만큼 더해줘서 올라가는 값을 줄여준다 + } + } + } + + } + + @objc func keyboardWillHide() { + if self.view.frame.origin.y != 0 { + self.view.frame.origin.y = 0 + } + } + + +} diff --git a/Better-me-iOS/Login/LoginFirstViewController.swift b/Better-me-iOS/Login/LoginFirstViewController.swift new file mode 100644 index 0000000..bd453ac --- /dev/null +++ b/Better-me-iOS/Login/LoginFirstViewController.swift @@ -0,0 +1,237 @@ +// +// LoginFirstViewController.swift +// login +// +// Created by 심윤주 on 2023/01/10. +// + +import UIKit +import Alamofire + +extension UITextField { //textFeild padding + func addLeftPadding() { + self.leftView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 30.0, height: self.frame.height)) + self.leftViewMode = .always + } + + func borderAttribute() { //굵기 설정 + self.layer.cornerRadius = 30 + self.layer.borderWidth = 1.5 + self.layer.borderColor = UIColor(red: 0.679, green: 0.679, blue: 0.679, alpha: 1).cgColor + } +} + +extension UIViewController { //화면 터치시 키보드 내려감 + func hideKeyboardWhenTappedAround() { + let tap = UITapGestureRecognizer(target: self, action: #selector(UIViewController.dismissKeyboard)) + tap.cancelsTouchesInView = false + view.addGestureRecognizer(tap) + } + + @objc func dismissKeyboard() { + view.endEditing(true) + } +} + +class LoginFirstViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet weak var alertLabel: UILabel! { + didSet { + alertLabel.isHidden = true + } + } + @IBOutlet weak var emailField: UITextField! + @IBOutlet weak var passwordField: UITextField! + @IBOutlet weak var loginBtn: UIButton! + + var loginCheck : Bool = false + var emailCk : Bool = false + var pwdCk : Bool = true + + override func viewDidLoad() { + super.viewDidLoad() + self.hideKeyboardWhenTappedAround() //키보드 메소드 호출 + + //back title 지우기 + self.navigationController?.navigationBar.topItem?.title = "" + self.navigationItem.title = "" + self.navigationController?.navigationBar.tintColor = .black + + emailField.borderAttribute() + passwordField.borderAttribute() + + emailField.addLeftPadding() + passwordField.addLeftPadding() + + //텍스트필드 delegate설정으로 return시 키보드 내려가도록 설정 + emailField.delegate = self + passwordField.delegate = self + + self.passwordField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + self.emailField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + + NotificationCenter.default.addObserver(self, + selector: #selector(textDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: emailField) + NotificationCenter.default.addObserver(self, + selector: #selector(PasswordTextDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: passwordField) + + self.navigationController?.isNavigationBarHidden = false + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //noti등록 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillshow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + //noti해제 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + } + + @IBAction func loginBtn(_ sender: Any) { + let email = emailField.text! + let password = passwordField.text! + + PostDataManager().PostLogin(email: email, password: password, viewController: self) + } + + @IBAction func passwordFindBtn(_ sender: Any) { + let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "passwordFindViewController") + self.navigationController?.pushViewController(pushVC!, animated: true) + } + + @objc private func textDidChange(_ notification: Notification) { + let maxLength = 30 + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + alertLabel.isHidden = false + alertLabel.text = "이메일은 30자리 미만으로 입력해주세요." + emailCk = false + } + else if text.count == 0 { + alertLabel.isHidden = false + alertLabel.text = "이메일을 입력해주세요." + emailCk = false + } + else if text.count != 0 && passwordField.text?.count == 0 { + alertLabel.isHidden = false + alertLabel.text = "비밀번호를 입력해주세요." + emailCk = false + } else { + alertLabel.isHidden = true + emailCk = true + pwdCk = true + alertLabel.isHidden = true + loginBtn.isEnabled = true + loginBtn.configuration?.background.backgroundColor = .BtnColor + loginBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + } + + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + alertLabel.isHidden = false + alertLabel.text = "비밀번호는 6~20자리를 입력해주세요." + pwdCk = false + } + else if text.count == 0 { + alertLabel.isHidden = false + alertLabel.text = "비밀번호를 입력해주세요." + pwdCk = false + } + else if text.count != 0 && emailField.text?.count == 0 { + alertLabel.isHidden = false + alertLabel.text = "이메일을 입력해주세요." + pwdCk = false + } + else { + alertLabel.isHidden = true + emailCk = true + pwdCk = true + alertLabel.isHidden = true + loginBtn.isEnabled = true + loginBtn.configuration?.background.backgroundColor = .BtnColor + loginBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + } + + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + + @objc func keyboardWillshow(notification: NSNotification) { + //키보드 값 가져오기 (옵셔널 값) + if self.view.frame.origin.y == 0 { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue { + + if(keyboardSize.height < loginBtn.frame.origin.y) { //키보드가 버튼을 덮는 경우 화면 올릴 값을 구함(distance) + let distance = keyboardSize.height - loginBtn.frame.height + self.view.frame.origin.y -= distance + } + } + } + + } + + @objc func keyboardWillHide() { + if self.view.frame.origin.y != 0 { + self.view.frame.origin.y = 0 + } + } + + +} + diff --git a/Better-me-iOS/Login/MainViewController.swift b/Better-me-iOS/Login/MainViewController.swift new file mode 100644 index 0000000..1ce4665 --- /dev/null +++ b/Better-me-iOS/Login/MainViewController.swift @@ -0,0 +1,41 @@ +// +// ViewController.swift +// login +// +// Created by 심윤주 on 2023/01/09. +// + +import UIKit +import Alamofire + + +class MainViewController: UIViewController { + + @IBOutlet weak var joinBtn: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + joinBtn.layer.borderWidth = 2 + joinBtn.layer.cornerRadius = 25 + joinBtn.layer.borderColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1).cgColor + self.navigationController?.isNavigationBarHidden = true + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.isNavigationBarHidden = true + } + + @IBAction func LoginBtn(_ sender: Any) { + let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "LoginFirstViewController") + self.navigationController?.pushViewController(pushVC!, animated: true) + } + + @IBAction func JoinBtn(_ sender: Any) { + let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "JoinViewController") + self.navigationController?.pushViewController(pushVC!, animated: true) + } + + + +} + diff --git a/Better-me-iOS/Login/UIColorExtension.swift b/Better-me-iOS/Login/UIColorExtension.swift new file mode 100644 index 0000000..b202b21 --- /dev/null +++ b/Better-me-iOS/Login/UIColorExtension.swift @@ -0,0 +1,25 @@ +// +// UIColorExtension.swift +// Better me +// +// Created by 심윤주 on 2023/01/25. +// + +import Foundation +import UIKit + +extension UIColor { + @nonobjc class var BtnColor: UIColor { + return UIColor(named: "custom_red")! + } + @nonobjc class var TextColor: UIColor { + return UIColor(named: "text_color")! + } + @nonobjc class var OriginBtnColor: UIColor { + return UIColor(named: "custom_gray")! + } + @nonobjc class var WhiteTextColor: UIColor { + return UIColor.white + } +} + diff --git a/Better-me-iOS/Login/nicknameViewController.swift b/Better-me-iOS/Login/nicknameViewController.swift new file mode 100644 index 0000000..705c01f --- /dev/null +++ b/Better-me-iOS/Login/nicknameViewController.swift @@ -0,0 +1,140 @@ +// +// nicknameViewController.swift +// login +// +// Created by 심윤주 on 2023/01/16. +// + +import UIKit + +class nicknameViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet weak var okBtn: UIButton!{ + didSet { + okBtn.isEnabled = false + } + } + + @IBOutlet weak var checkLabel: UILabel!{ + didSet { + checkLabel.isHidden = true + } + } + + @IBOutlet weak var nickName: UITextField! + + override func viewDidLoad() { + super.viewDidLoad() + + nickName.borderAttribute() + nickName.addLeftPadding() + + self.hideKeyboardWhenTappedAround() + + self.navigationController?.navigationBar.topItem?.title = "" + self.navigationItem.title = "" + self.navigationController?.navigationBar.tintColor = .black + + nickName.delegate = self + + NotificationCenter.default.addObserver(self, + selector: #selector(textDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: nickName) + self.navigationController?.isNavigationBarHidden = false + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //noti등록 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillshow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) + self.navigationController?.isNavigationBarHidden = false + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + //noti해제 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + } + + @IBAction func NextViewOkBtn(_ sender: Any) { + let user = UserInfo.shared + user.nickName = nickName.text + let pushVC = self.storyboard?.instantiateViewController(withIdentifier: "wordViewController") + self.navigationController?.pushViewController(pushVC!, animated: true) + } + + + @objc private func textDidChange(_ notification: Notification) { + let maxLength = 20 + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + checkLabel.isHidden = false + checkLabel.text = "닉네임은 최대 20자리를 입력해주세요." + okBtn.isEnabled = false + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + } + else if text.count == 0 { + checkLabel.isHidden = false + checkLabel.text = "닉네임을 입력해주세요." + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + } + else if !text.isEmpty && text.count < 21 { //닉네임 비어있지 않고 21자 미만이면 + okBtn.isEnabled = true + checkLabel.isHidden = true + okBtn.configuration?.background.backgroundColor = .BtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + } else { + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + checkLabel.isHidden = true + } + + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + @objc func keyboardWillshow(notification: NSNotification) { + //키보드 값 가져오기 (옵셔널 값) + if self.view.frame.origin.y == 0 { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue { + + if(keyboardSize.height < okBtn.frame.origin.y) { //키보드가 버튼을 덮는 경우 화면 올릴 값을 구함(distance) + let distance = keyboardSize.height - okBtn.frame.height + self.view.frame.origin.y -= distance + + //distance만큼만 올리면 너무 위로 올라가기 때문에 버튼 height만큼 더해줘서 올라가는 값을 줄여준다 + } + } + } + } + + @objc func keyboardWillHide() { + if self.view.frame.origin.y != 0 { + self.view.frame.origin.y = 0 + } + } + + +} diff --git a/Better-me-iOS/Login/passwordFindViewController.swift b/Better-me-iOS/Login/passwordFindViewController.swift new file mode 100644 index 0000000..60a7940 --- /dev/null +++ b/Better-me-iOS/Login/passwordFindViewController.swift @@ -0,0 +1,153 @@ +// +// passwordFindViewController.swift +// login +// +// Created by 심윤주 on 2023/01/12. +// + +import UIKit + +class passwordFindViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet weak var comment: UILabel! + @IBOutlet weak var emailField: UITextField! + @IBOutlet weak var sendPasswordBtn: UIButton! + + override func viewDidLoad() { + super.viewDidLoad() + + self.navigationController?.navigationBar.topItem?.title = "" + self.navigationItem.title = "" + self.navigationController?.navigationBar.tintColor = .black + //행간 + let attrString = NSMutableAttributedString(string: comment.text!) + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 10 + attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attrString.length)) + comment.attributedText = attrString + + emailField.borderAttribute() + emailField.addLeftPadding() + + self.hideKeyboardWhenTappedAround() //키보드 내리기 + + emailField.delegate = self + self.emailField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //noti등록 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillshow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + //noti해제 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + } + + @IBAction func sendAction(_ sender: Any) { + let emailValue = emailField.text! + GetMsgDataManager().checkIdx(userEmail: emailValue, viewController: self) + + } + + private func addNaviBar() { + // safe area + var statusBarHeight: CGFloat = 0 + statusBarHeight = UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0 + + // navigationBar + let naviBar = UINavigationBar(frame: .init(x: 0, y: statusBarHeight, width: view.frame.width, height: statusBarHeight)) + naviBar.isTranslucent = false + naviBar.backgroundColor = .clear + naviBar.shadowImage = UIImage() + naviBar.tintColor = .black + + let naviItem = UINavigationItem(title: "") + + //우선 이미지로 대체 + let customImage = UIImage(named: "backIcon") + let newWidth = 13 + let newHeight = 20 + let newImageRect = CGRect(x: 0, y: 0, width: newWidth, height: newHeight) + UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) + customImage?.draw(in: newImageRect) + let newImage = UIGraphicsGetImageFromCurrentImageContext()?.withRenderingMode(.alwaysOriginal) + UIGraphicsEndImageContext() + + naviItem.leftBarButtonItem = UIBarButtonItem(image: newImage, style: UIBarButtonItem.Style.plain, target: self, action: #selector(didTapDoneButton)) + naviBar.items = [naviItem] + view.addSubview(naviBar) + } + + @objc func didTapDoneButton() { + self.presentingViewController?.dismiss(animated: true) + } + + func swipeRecognizer() { + let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(self.respondToSwipeGesture(_:))) + swipeRight.direction = UISwipeGestureRecognizer.Direction.right + self.view.addGestureRecognizer(swipeRight) + } + + @objc func respondToSwipeGesture(_ gesture: UIGestureRecognizer){ + if let swipeGesture = gesture as? UISwipeGestureRecognizer { + switch swipeGesture.direction{ + case UISwipeGestureRecognizer.Direction.right: + // 스와이프 시, 원하는 기능 구현. + self.dismiss(animated: true, completion: nil) + default: break + } + } + } + + + @objc func TextFieldChange (_ sender: UITextField) { //버튼 활성화, 비활성화 설정 + + if !(emailField.text!.isEmpty) { //이메일 확인되면 버튼 활성화 + + sendPasswordBtn.isEnabled = true + sendPasswordBtn.configuration?.background.backgroundColor = .BtnColor + sendPasswordBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + + } else { + sendPasswordBtn.isEnabled = false + sendPasswordBtn.configuration?.background.backgroundColor = .OriginBtnColor + sendPasswordBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + } + } + + + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + @objc func keyboardWillshow(notification: NSNotification) { + //키보드 값 가져오기 (옵셔널 값) + if self.view.frame.origin.y == 0 { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue { + + if(keyboardSize.height < sendPasswordBtn.frame.origin.y) { //키보드가 버튼을 덮는 경우 화면 올릴 값을 구함(distance) + let distance = keyboardSize.height - sendPasswordBtn.frame.height + self.view.frame.origin.y -= distance + + //distance만큼만 올리면 너무 위로 올라가기 때문에 버튼 height만큼 더해줘서 올라가는 값을 줄여준다 + } + } + } + } + + @objc func keyboardWillHide() { + if self.view.frame.origin.y != 0 { + self.view.frame.origin.y = 0 + } + } + +} diff --git a/Better-me-iOS/Login/wordViewController.swift b/Better-me-iOS/Login/wordViewController.swift new file mode 100644 index 0000000..f4576c5 --- /dev/null +++ b/Better-me-iOS/Login/wordViewController.swift @@ -0,0 +1,156 @@ +// +// wordViewController.swift +// login +// +// Created by 심윤주 on 2023/01/17. +// + +import UIKit + +class wordViewController: UIViewController, UITextFieldDelegate { + + @IBOutlet weak var wordLabel: UILabel! + @IBOutlet weak var wordField: UITextField! + @IBOutlet weak var okBtn: UIButton!{ + didSet { + okBtn.isEnabled = false + } + } + @IBOutlet weak var checkLabel: UILabel!{ + didSet { + checkLabel.isHidden = true + } + } + + + override func viewDidLoad() { + super.viewDidLoad() + + wordField.borderAttribute() + wordField.addLeftPadding() + + self.hideKeyboardWhenTappedAround() + + self.navigationController?.navigationBar.topItem?.title = "" + self.navigationItem.title = "" + self.navigationController?.navigationBar.tintColor = .black + + wordField.delegate = self + + //행간 + let attrString = NSMutableAttributedString(string: wordLabel.text!) + let paragraphStyle = NSMutableParagraphStyle() + paragraphStyle.lineSpacing = 10 + attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRange(0, attrString.length)) + wordLabel.attributedText = attrString + + NotificationCenter.default.addObserver(self, + selector: #selector(textDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: wordField) + + } + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //noti등록 + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillshow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil) + + } + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + + //noti해제 + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillShowNotification, object: nil) + NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil) + self.navigationController?.isNavigationBarHidden = true + } + + @IBAction func nextViewBtn(_ sender: Any) { + let user = UserInfo.shared + user.promise = wordField.text + if let email = user.email, let password = user.password, let nickname = user.nickName, let promise = user.promise { + PostDataManager().PostUserData(email: email, password: password, nickName: nickname, promise: promise, viewController: self) + } else { + print("data is nil") + + } + + /*sns로그인 관련 포스트할 정보들 + if let email = SnsUser.email + */ + } + + @objc private func textDidChange(_ notification: Notification) { + let maxLength = 30 + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + // 8글자 넘어가면 자동으로 키보드 내려감 + checkLabel.isHidden = false + checkLabel.text = "한줄다짐은 최대 30자 이내로 입력해주세요." + okBtn.isEnabled = false + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + } + else if text.count == 0 { + checkLabel.isHidden = false + checkLabel.text = "한줄다짐을 입력해주세요." + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + } + else if !text.isEmpty && text.count < 30 { //비어있지 않고 21자 미만이면 + okBtn.isEnabled = true + checkLabel.isHidden = true + okBtn.configuration?.background.backgroundColor = .BtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .WhiteTextColor + } else { + okBtn.configuration?.background.backgroundColor = .OriginBtnColor + okBtn.configuration?.attributedTitle?.foregroundColor = .TextColor + okBtn.isEnabled = false + checkLabel.isHidden = true + } + + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + @objc func keyboardWillshow(notification: NSNotification) { + //키보드 값 가져오기 (옵셔널 값) + if self.view.frame.origin.y == 0 { + if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey]as? NSValue)?.cgRectValue { + + if(keyboardSize.height < okBtn.frame.origin.y) { //키보드가 버튼을 덮는 경우 화면 올릴 값을 구함(distance) + let distance = keyboardSize.height - okBtn.frame.height + self.view.frame.origin.y -= distance + + //distance만큼만 올리면 너무 위로 올라가기 때문에 버튼 height만큼 더해줘서 올라가는 값을 줄여준다 + } + } + } + + } + + @objc func keyboardWillHide() { + if self.view.frame.origin.y != 0 { + self.view.frame.origin.y = 0 + } + } + +} diff --git a/Better-me-iOS/MyPage/FeedBackController.swift b/Better-me-iOS/MyPage/FeedBackController.swift new file mode 100644 index 0000000..84f60b3 --- /dev/null +++ b/Better-me-iOS/MyPage/FeedBackController.swift @@ -0,0 +1,112 @@ +// +// FeedBackController.swift +// Better-me-iOS +// +// Created by Phil on 2023/01/30. +// + +import UIKit + +class FeedBackController: UIViewController { + + //MARK: - Properties + + @IBOutlet weak var titleTextField: UITextField! + @IBOutlet weak var contentTextField: UITextField! + + + + lazy var button : UIButton = { + let view = UIButton() + view.backgroundColor = .white + view.layer.cornerRadius = 22 + + view.layer.borderWidth = 1.5 + view.layer.borderColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1).cgColor + + view.setTitle("보내기", for: .normal) + view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) + view.setTitleColor(UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1), for: .normal) + + view.addTarget(self, action: #selector(postFeedback), for: .touchUpInside) + + return view + }() + + //MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + navigationBarUI() + configureButtonUI() + + titleTextField.clearsOnBeginEditing = true + contentTextField.clearsOnBeginEditing = true + } + //MARK: - Helpers + + func navigationBarUI() { + self.navigationController?.navigationBar.tintColor = .black + self.navigationController?.navigationBar.topItem?.title = "" + self.title = "피드백 작성하기" + } + + func configureButtonUI() { + view.addSubview(button) + button.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: (view.frame.height/7) * -1), + button.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 18), + button.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -18), + button.heightAnchor.constraint(equalToConstant: 43)]) + } + + //MARK: - PostAPI + @objc func postFeedback() { + + let userIdx = UserDefaults.standard.string(forKey: "userIdx") + let feedback = PostFeedback(title: self.titleTextField.text ?? "", content: self.contentTextField.text ?? "") + guard let uploadData = try? JSONEncoder().encode(feedback) + else {return} + let token = UserDefaults.standard.string(forKey: "token") + let header = ["x-access-token": token ?? ""] + let url = URL(string: "http://54.180.13.219:3000/app/feedback/\(userIdx ?? "")") + var request = URLRequest(url: url!) + request.httpMethod = "POST" + request.allHTTPHeaderFields = header + + // URLSession 객체를 통해 전송, 응답값 처리 + let task = URLSession.shared.uploadTask(with: request, from: uploadData) { (data, response, error) in + + if let e = error { + NSLog("An error has occured: \(e.localizedDescription)") + return + } + // 응답 처리 로직 + print("feedback post success") + } + // POST 전송 + task.resume() + let alert = UIAlertController(title: "접수완료", message: "피드백이 성공적으로 접수되었습니다!", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default){_ in + self.titleTextField.text = "" + self.contentTextField.text = "" + } + + alert.addAction(ok) + + + self.present(alert, animated: false) + + } + +} + +struct PostFeedback: Codable { + let title: String + let content: String + + enum CodingKeys: String, CodingKey { + case title, content + } +} + + diff --git a/Better-me-iOS/MyPage/HabitTips/BadHabitTipsViewController.swift b/Better-me-iOS/MyPage/HabitTips/BadHabitTipsViewController.swift new file mode 100644 index 0000000..2f28eb5 --- /dev/null +++ b/Better-me-iOS/MyPage/HabitTips/BadHabitTipsViewController.swift @@ -0,0 +1,72 @@ +// +// GoodHabitTipsViewController.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/01. +// + +import UIKit + +class BadHabitTipsViewController: UIViewController { + + + //MARK: - Properties + let tipsDB = TipsData() + + //MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + navigationBarUI() + + } + //MARK: - Helpers + + func navigationBarUI() { + self.navigationController?.navigationBar.tintColor = .black + self.navigationController?.navigationBar.topItem?.title = "" + self.title = "나쁜습관 쉽게 없애는 법" + } + + +} +extension BadHabitTipsViewController : UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return BConstants.tipsTitle.count + } + + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + + } + + func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return CGFloat(tipsDB.getBadTipsNum(index: indexPath.row) * 70) + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "TipsCell", for: indexPath) as? TipsCell else { return UITableViewCell() } + + cell.setUI(with: indexPath.row, 2) + return cell + + } + + + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + UIView.animate(withDuration: 0.3) { + tableView.performBatchUpdates(nil) + } + } + func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { + if tableView.cellForRow(at: indexPath) is TipsCell { + + } + } +} +enum BConstants { + static let tipsTitle = ["Tip 1 : 보이지 않게 만들어라", + "Tip 2 : 매력적이지 않게 만들어라", + "Tip 3 : 하기 어렵게 만들어라", + "Tip 4 : 불만족스러운 것으로 만들어라"] +} diff --git a/Better-me-iOS/MyPage/HabitTips/CustomTableCellView.swift b/Better-me-iOS/MyPage/HabitTips/CustomTableCellView.swift new file mode 100644 index 0000000..957b99a --- /dev/null +++ b/Better-me-iOS/MyPage/HabitTips/CustomTableCellView.swift @@ -0,0 +1,93 @@ +// +// File.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/08. +// + +import UIKit + +final class CustomTableCellView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + + commonInit() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + let title = UILabel() + private let imageView = UIImageView() + let btnImageView = UIImageView() + + func setUI(with string: String, image: UIImage, btn:UIImage) { + title.text = string + title.textColor = .gray + title.textAlignment = .left + title.font = UIFont(name: "AppleSDGothicNeo-SemiBold", size: 15) + title.numberOfLines = 1 + imageView.image = image + btnImageView.image = btn + btnImageView.tintColor = .black + } + + func commonInit() { + addSubview(title) + addSubview(imageView) + addSubview(btnImageView) + + imageView.widthAnchor.constraint(equalToConstant: 21).isActive = true + imageView.heightAnchor.constraint(equalToConstant: 21).isActive = true + btnImageView.widthAnchor.constraint(equalToConstant: 16).isActive = true + btnImageView.heightAnchor.constraint(equalToConstant: 16).isActive = true + + title.translatesAutoresizingMaskIntoConstraints = false + imageView.translatesAutoresizingMaskIntoConstraints = false + btnImageView.translatesAutoresizingMaskIntoConstraints = false + + imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true + imageView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 30).isActive = true + imageView.trailingAnchor.constraint(equalTo: title.leadingAnchor, constant: -10).isActive = true + + btnImageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 15).isActive = true + btnImageView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -30).isActive = true + + + title.leadingAnchor.constraint(equalTo: title.trailingAnchor).isActive = true + title.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true + title.topAnchor.constraint(equalTo: self.topAnchor,constant: 15).isActive = true + } +} + +final class CustomTableDetailView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + private let title = UILabel() + + func setUI(with string: String) { + title.text = string + title.textAlignment = .left + title.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 13) + title.numberOfLines = 15 + title.backgroundColor = UIColor(red: 0.929, green: 0.929, blue: 0.929, alpha: 1) + } + + func commonInit() { + addSubview(title) + + title.translatesAutoresizingMaskIntoConstraints = false + title.topAnchor.constraint(equalTo: self.topAnchor,constant: 50).isActive = true + title.leadingAnchor.constraint(equalTo: self.leadingAnchor,constant: 30).isActive = true + title.trailingAnchor.constraint(equalTo: self.trailingAnchor,constant: -30).isActive = true + title.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true + } +} diff --git a/Better-me-iOS/MyPage/HabitTips/GoodHabitTipsViewController.swift b/Better-me-iOS/MyPage/HabitTips/GoodHabitTipsViewController.swift new file mode 100644 index 0000000..8dd90da --- /dev/null +++ b/Better-me-iOS/MyPage/HabitTips/GoodHabitTipsViewController.swift @@ -0,0 +1,69 @@ +// +// GoodHabitTipsViewController.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/01. +// + +import UIKit + +class GoodHabitTipsViewController: UIViewController { + + + //MARK: - Properties + let tipsDB = TipsData() + + //MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + navigationBarUI() + + } + //MARK: - Helpers + + func navigationBarUI() { + self.navigationController?.navigationBar.tintColor = .black + self.navigationController?.navigationBar.topItem?.title = "" + self.title = "좋은습관 쉽게 만드는 법" + } + + +} +extension GoodHabitTipsViewController : UITableViewDelegate,UITableViewDataSource { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return GConstants.tipsTitle.count + } + + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + return UITableView.automaticDimension + // return CGFloat(tipsDB.getNum(index: indexPath.row) * 70) + } + + func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { + return CGFloat(tipsDB.getGoodTipsNum(index: indexPath.row) * 70) + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + guard let cell = tableView.dequeueReusableCell(withIdentifier: "TipsCell", for: indexPath) as? TipsCell else { return UITableViewCell() } + + cell.setUI(with: indexPath.row,1) + return cell + + } + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + UIView.animate(withDuration: 0.3) { + tableView.performBatchUpdates(nil) + } + } + func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { + if let cell = tableView.cellForRow(at: indexPath) as? TipsCell { + cell.hideDetailView() + } + } +} +enum GConstants { + static let tipsTitle = ["Tip 1 : 분명하게 만들어라", + "Tip 2 : 매력적으로 만들어라", + "Tip 3 : 하기 쉽게 만들어라", + "Tip 4 : 만족스럽게 만들어라"] +} diff --git a/Better-me-iOS/MyPage/HabitTips/TipsCell.swift b/Better-me-iOS/MyPage/HabitTips/TipsCell.swift new file mode 100644 index 0000000..bb535a1 --- /dev/null +++ b/Better-me-iOS/MyPage/HabitTips/TipsCell.swift @@ -0,0 +1,93 @@ +// +// GoodTipsCell.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/02. +// + +import UIKit + +class TipsCell: UITableViewCell { + private let containerView = UIStackView() + private let cellView = CustomTableCellView() + private let detailView = CustomTableDetailView() + let TDB = TipsData() + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + commonInit() + } + + func setUI(with index: Int,_ tag: Int) { + + if tag == 1 { + cellView.setUI(with: GConstants.tipsTitle[index], + image: UIImage(named: "YellowStar") ?? UIImage(), + btn: UIImage(systemName: "arrowtriangle.down.fill") ?? UIImage()) + detailView.setUI(with: TDB.getGoodTips(index: index)) + } + else { + cellView.setUI(with: BConstants.tipsTitle[index], + image: UIImage(named: "YellowStar") ?? UIImage(), + btn: UIImage(systemName: "arrowtriangle.down.fill") ?? UIImage()) + detailView.setUI(with: TDB.getBadTips(index: index)) + } + + + } + + func commonInit() { + selectionStyle = .none + detailView.isHidden = true + + + containerView.axis = .vertical + + contentView.addSubview(containerView) + containerView.addArrangedSubview(cellView) + containerView.addArrangedSubview(detailView) + + containerView.translatesAutoresizingMaskIntoConstraints = false + cellView.translatesAutoresizingMaskIntoConstraints = false + detailView.translatesAutoresizingMaskIntoConstraints = false + + containerView.leadingAnchor.constraint(equalTo: self.contentView.leadingAnchor).isActive = true + containerView.trailingAnchor.constraint(equalTo: self.contentView.trailingAnchor).isActive = true + containerView.topAnchor.constraint(equalTo: self.contentView.topAnchor).isActive = true + containerView.bottomAnchor.constraint(equalTo: self.contentView.bottomAnchor).isActive = true + } +} + +extension TipsCell { + var isDetailViewHidden: Bool { + return detailView.isHidden + } + + func showDetailView() { + detailView.isHidden = false + cellView.title.textColor = .black + cellView.btnImageView.tintColor = .black + } + + func hideDetailView() { + detailView.isHidden = true + cellView.title.textColor = .gray + cellView.btnImageView.tintColor = .gray + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + if isDetailViewHidden, selected { + showDetailView() + } else { + hideDetailView() + } + } +} + + + + + + diff --git a/Better-me-iOS/MyPage/HabitTips/TipsData.swift b/Better-me-iOS/MyPage/HabitTips/TipsData.swift new file mode 100644 index 0000000..f47770b --- /dev/null +++ b/Better-me-iOS/MyPage/HabitTips/TipsData.swift @@ -0,0 +1,136 @@ +// +// TipsList.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/05. +// + +import Foundation + +class TipsData { + + let goodTips1 = [ + " 1. 습관 점수표를 활용하라, 현재 습관을 써보고 \n 그것들을 인식하라.", + " 2. 실행 의도를 이용하라. ‘나는 [언제] [어디서]\n [어떤 행동]을 할 것이다.’ ", + " 3. 습관 쌓기를 이용하라. ‘[현재의 습관]을 하고 나서 \n [새로운 습관]을 할 것이다.’ ", + " 4. 환경을 디자인하라. 좋은 습관의 신호를 분명하게, \n 눈에 보이게 만들어라."] + let goodTips2 = [ + " 1. 유혹의 묶기를 이용하라. ‘하고 싶은 행동’을 \n ‘해야 하는 행동'과 짝지어라.", + " 2. 당신이 원하는 행동이 일반적인 집단에 들어가라.", + " 3. 동기부여 의식을 만들어라. 어려운 습관을 행동으로 \n 옮기기 직전에 좋아하는 뭔가를 하라."] + + let goodTips3 = [ + " 1. 마찰을 줄여라. 당신과 좋은 습관 사이의 단계를\n 줄여라.", + " 2. 환경을 갖춰라. 좋은 습관이 더 일어나기 쉽게 \n 환경을 준비하라.", + " 3. 결정적 순간을 완전히 체득하라. 거대한 영향을 \n 가져올 작은 선택들을 강화하라.", + " 4. 2분 규칙을 이용하라. 2분 또는 그 이하로 실행\n 할 수 있을 때까지 습관을 축소하라.", + " 5. 습관을 자동화하라. 미래 행동을 이끌어내는 기술\n 과 장치에 투자하라."] + let goodTips4 = [ + " 1. 강화 요인을 이용하라. 습관을 완수하면 즉시\n 스스로 보상하라.", + " 2. ‘아무것도 하지 않는 것'을 즐겨라. 나쁜 습관을\n 피할 수 있는 방법을 고안하라.", + " 3. 습관 추적을 하라. 습관 추적을 계속하고 흐름을\n 깨뜨리지 마라.", + " 4. 두번 거르지 마라. 한 번 걸렀을 때 즉시 궤도로\n 돌아가라."] + + let badTips1 = [ + " 1. 습관 점수표를 활용하라, 현재 습관을 써보고\n 그것들을 인식하라."] + let badTips2 = [ + " 1. 마인드세트를 재구축하라. 나쁜 습관을 피했을 때\n 얻을 이득에 초점을 맞춰라."] + let badTips3 = [ + " 1. 마찰을 증가시켜라. 당신과 나쁜 습관 사이의 단계\n 들을 늘려라.", + " 2. 이행 장치를 이용하라. 당신에게 이득이 될 습관으로\n 미래 선택들을 제한하라."] + let badTips4 = [ + " 1. 책임감 있는 파트너를 찾아라. 누군가에게 당신의\n 행동을 감시해달라고 부탁하라.", + " 2. 습관 계약을 하라. 나쁜 습관의 대가를 공적이고\n 고통스러운 것으로 만들어라."] + + + + + func getGoodTips (index : Int) -> String { + var str = "\n" + switch index { + case 0: + for string in goodTips1 { + str += string + "\n\n" + } + return str + case 1: + for string in goodTips2 { + str += string + "\n\n" + } + return str + case 2: + for string in goodTips3 { + str += string + "\n\n" + } + return str + case 3: + for string in goodTips4 { + str += string + "\n\n" + } + return str + default: + return str + } + } + + func getGoodTipsNum(index : Int) -> Int { + switch index { + case 0: + return goodTips1.count + case 1: + return goodTips2.count + case 2: + return goodTips3.count + case 3: + return goodTips4.count + default: + return 4 + } + } + + + func getBadTips (index : Int) -> String { + var str = "\n" + switch index { + case 0: + for string in badTips1 { + str += string + "\n\n" + } + return str + case 1: + for string in badTips2 { + str += string + "\n\n" + } + return str + case 2: + for string in badTips3 { + str += string + "\n\n" + } + return str + case 3: + for string in badTips4 { + str += string + "\n\n" + } + return str + default: + return str + } + } + + func getBadTipsNum(index : Int) -> Int { + switch index { + case 0: + return badTips1.count + case 1: + return badTips2.count + case 2: + return badTips3.count + case 3: + return badTips4.count + default: + return 4 + } + } + + +} diff --git a/Better-me-iOS/MyPage/MyPageViewController.swift b/Better-me-iOS/MyPage/MyPageViewController.swift index 210efcc..d316f5b 100644 --- a/Better-me-iOS/MyPage/MyPageViewController.swift +++ b/Better-me-iOS/MyPage/MyPageViewController.swift @@ -7,14 +7,15 @@ import UIKit -private let cellID = "Cell" class MyPageViewController: UIViewController { // MARK: - Properties @IBOutlet weak var titleImageView: UIImageView! @IBOutlet weak var profileView: UIView! - @IBOutlet weak var profileImageView: UIView! + @IBOutlet weak var photoImageView: UIImageView! + @IBOutlet weak var nickName: UILabel! + @IBOutlet weak var promise: UILabel! @IBAction func ProfileEditBtn(_ sender: Any) { if let controller = self.storyboard?.instantiateViewController(withIdentifier: "ProfileEditController"){ @@ -23,40 +24,49 @@ class MyPageViewController: UIViewController { } } - @IBOutlet weak var tapView: UIView! - - let tableView = UITableView(frame: .zero, style: .grouped) - let myPageMenu = ["비밀번호 변경", "이용 가이드","자주 묻는 질문","1:1 문의","푸시알림 설정"] - + private let tableView = UITableView(frame: .zero, style: .grouped) + private let cellID = "Cell" + private let myPageMenu = ["비밀번호 변경","피드백 작성하기","푸시알림 설정","회원탈퇴"] + //MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. + configureNaviBar() configureProfileViewUI() configureTableViewUI() + print(UserDefaults.standard.string(forKey: "userIdx")!) + print(UserDefaults.standard.string(forKey: "token")!) } - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - navigationController?.setNavigationBarHidden(true, animated: animated) + UserDataManager().getUserInfoData() + configureUserInfo() } - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - navigationController?.setNavigationBarHidden(false, animated: animated) + //MARK: - Helpers + private func dateToString(date: Date) -> String{ + let formmater = DateFormatter() + formmater.dateFormat = "M월 d일 E요일" + formmater.locale = Locale(identifier: "ko-KR") + return formmater.string(from: date) } - //MARK: - Helpers - func configureProfileViewUI() { + private func configureNaviBar() { + let image = UIImage(named: "BetterMeLogo") + let date = dateToString(date: Date()) + navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: nil, action: nil) + navigationItem.rightBarButtonItem = UIBarButtonItem(title: date, style: .plain, target: nil, action: nil) + navigationItem.rightBarButtonItem?.tintColor = .black + } + + private func configureProfileViewUI() { profileView.layer.cornerRadius = 18 shadowing(view: profileView) - profileImageView.layer.cornerRadius = profileImageView.frame.width/2 - shadowing(view: profileImageView) + photoImageView.layer.cornerRadius = photoImageView.frame.width/2 + shadowing(view: photoImageView) + configureUserInfo() } - func configureTableViewUI() { - + private func configureTableViewUI() { tableView.backgroundColor = .white view.addSubview(tableView) tableView.translatesAutoresizingMaskIntoConstraints = false @@ -64,13 +74,62 @@ class MyPageViewController: UIViewController { tableView.dataSource = self tableView.register(MyPageCell.self, forCellReuseIdentifier: cellID) - NSLayoutConstraint.activate([tableView.topAnchor.constraint(equalTo: profileView.bottomAnchor, constant: 28), + NSLayoutConstraint.activate([tableView.topAnchor.constraint(equalTo: profileView.bottomAnchor, constant: 28), tableView.leftAnchor.constraint(equalTo: view.leftAnchor), tableView.rightAnchor.constraint(equalTo: view.rightAnchor), tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor)]) + } + private func configureUserInfo () { + self.nickName.text = (UserDefaults.standard.string(forKey: "nickName") ?? " ") + " 님" + self.promise.text = UserDefaults.standard.string(forKey: "promise") + if UserDefaults.standard.string(forKey: "photo") == "server x" { + self.photoImageView.image = UIImage(named: "defaultPhoto") + } + else { + guard let photoURL = URL(string: UserDefaults.standard.string(forKey: "photo") ?? "") else { return } + DispatchQueue.global().async { + if let photoData = try? Data(contentsOf: photoURL) { + if let image = UIImage(data: photoData) { + DispatchQueue.main.async { + self.photoImageView.image = image + } + } + } + } + } } - + + @objc func btn1Clicked(_ sender: UIButton) { + + if let controller = self.storyboard?.instantiateViewController(withIdentifier: "GoodHabitTipsViewController"){ + self.navigationController?.pushViewController(controller, animated: true) + } + } + @objc func btn2Clicked(_ sender: UIButton) { + + if let controller = self.storyboard?.instantiateViewController(withIdentifier: "BadHabitTipsViewController"){ + self.navigationController?.pushViewController(controller, animated: true) + } + } + + @objc func logOutButtonClicked(_ sender: UIButton) { + let alert = UIAlertController(title: "로그아웃", message: "로그아웃 하시겠습니까?", preferredStyle: .alert) + let yes = UIAlertAction(title: "확인", style: .default) { UIAlertAction in + for key in UserDefaults.standard.dictionaryRepresentation().keys { + UserDefaults.standard.removeObject(forKey: key.description) + } + let mainController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "main") + self.view.window?.rootViewController = mainController + self.view.window?.makeKeyAndVisible() + } + let no = UIAlertAction(title: "취소", style: UIAlertAction.Style.cancel, handler: nil) + alert.addAction(yes) + alert.addAction(no) + + self.present(alert, animated: false) + + } } extension MyPageViewController: UITableViewDataSource { @@ -79,7 +138,6 @@ extension MyPageViewController: UITableViewDataSource { } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! MyPageCell - cell.menuLabel.text = myPageMenu[indexPath.row] cell.accessoryType = .disclosureIndicator return cell @@ -87,30 +145,52 @@ extension MyPageViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 57 } - } extension MyPageViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let header = HeaderView() - + let header = MyPageTableHeaderView() + header.button1.addTarget(self, action: #selector(btn1Clicked), for: .touchUpInside) + header.button2.addTarget(self, action: #selector(btn2Clicked), for: .touchUpInside) return header } + func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { + let footer = MyPageTableFooterView() + footer.button.addTarget(self, action: #selector(logOutButtonClicked), for: .touchUpInside) + return footer + } + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 176 } + func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + return 70 + } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { tableView.deselectRow(at: indexPath, animated: true) switch indexPath.row { + case 0: if let controller = self.storyboard?.instantiateViewController(withIdentifier: "PWEditController"){ - self.navigationController?.pushViewController(controller, animated: true) + self.navigationController?.pushViewController(controller, animated: true) } + case 1: + if let controller = self.storyboard?.instantiateViewController(withIdentifier: "FeedBackController"){ + self.navigationController?.pushViewController(controller, animated: true) + } + + case 2: + if let controller = self.storyboard?.instantiateViewController(withIdentifier: "PushNotiViewController"){ + self.navigationController?.pushViewController(controller, animated: true) + } + case 3: + if let controller = self.storyboard?.instantiateViewController(withIdentifier: "WithdrawalViewController"){ + self.navigationController?.pushViewController(controller, animated: true) + } default: - return - } } } @@ -121,3 +201,4 @@ func shadowing(view : UIView) { view.layer.shadowRadius = 5 view.layer.shadowOffset = CGSize(width: 1, height: 1) } + diff --git a/Better-me-iOS/MyPage/MyPageCell.swift b/Better-me-iOS/MyPage/MypageTableView/MyPageCell.swift similarity index 97% rename from Better-me-iOS/MyPage/MyPageCell.swift rename to Better-me-iOS/MyPage/MypageTableView/MyPageCell.swift index b3633d9..6321ff4 100644 --- a/Better-me-iOS/MyPage/MyPageCell.swift +++ b/Better-me-iOS/MyPage/MypageTableView/MyPageCell.swift @@ -43,7 +43,4 @@ class MyPageCell: UITableViewCell { menuLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 19)]) } - - // MARK: - Lifecycle - } diff --git a/Better-me-iOS/MyPage/MypageTableView/MyPageTableFooterView.swift b/Better-me-iOS/MyPage/MypageTableView/MyPageTableFooterView.swift new file mode 100644 index 0000000..585ca1d --- /dev/null +++ b/Better-me-iOS/MyPage/MypageTableView/MyPageTableFooterView.swift @@ -0,0 +1,51 @@ + +// Created by Phil on 2023/01/15. +// + +import UIKit + +class MyPageTableFooterView: UIView { + + //MARK: - Properties + + let button : UIButton = { + let view = UIButton() + view.backgroundColor = .white + view.layer.cornerRadius = 22 + + view.layer.borderWidth = 1.5 + view.layer.borderColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1).cgColor + + view.setTitle("로그아웃", for: .normal) + view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) + view.setTitleColor(UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1), for: .normal) + + + + return view + }() + + //MARK: - Lifecycle + override init(frame: CGRect) { + super.init(frame: frame) + configureUI() + } + required init?(coder:NSCoder) { + fatalError("init?(coder:) has not been implemented") + } + + //MARK: - Helpers + + func configureUI() { + + addSubview(button) + button.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([button.topAnchor.constraint(equalTo: topAnchor, constant: 13), + button.leftAnchor.constraint(equalTo: leftAnchor, constant: 18), + button.rightAnchor.constraint(equalTo: rightAnchor, constant: -18), + button.heightAnchor.constraint(equalToConstant: 43)]) + } + + + +} diff --git a/Better-me-iOS/MyPage/HeaderView.swift b/Better-me-iOS/MyPage/MypageTableView/MyPageTableHeaderView.swift similarity index 86% rename from Better-me-iOS/MyPage/HeaderView.swift rename to Better-me-iOS/MyPage/MypageTableView/MyPageTableHeaderView.swift index 734f788..1aaa5ce 100644 --- a/Better-me-iOS/MyPage/HeaderView.swift +++ b/Better-me-iOS/MyPage/MypageTableView/MyPageTableHeaderView.swift @@ -7,8 +7,9 @@ import UIKit -class HeaderView: UIView { +class MyPageTableHeaderView: UIView { + //MARK: - Properties let headLabel : UILabel = { let view = UILabel() @@ -20,22 +21,27 @@ class HeaderView: UIView { }() - let button1 : UIButton = { + lazy var button1 : UIButton = { let view = UIButton() view.backgroundColor = UIColor(red: 1, green: 0.925, blue: 0.921, alpha: 1) view.layer.cornerRadius = 23 - view.setTitle("좋은 습관 잘 만드는 법", for: .normal) + view.setTitle("좋은 습관 \n잘 만드는 법", for: .normal) + view.titleLabel?.textAlignment = .center + view.titleLabel?.numberOfLines = 2 view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) view.setTitleColor(.black, for: .normal) return view }() + let button2 : UIButton = { let view = UIButton() view.backgroundColor = UIColor(red: 1, green: 0.925, blue: 0.921, alpha: 1) view.layer.cornerRadius = 23 - view.setTitle("나쁜습관 쉽게 없애는 법", for: .normal) + view.setTitle("나쁜습관 \n쉽게 없애는 법", for: .normal) + view.titleLabel?.textAlignment = .center + view.titleLabel?.numberOfLines = 2 view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) view.setTitleColor(.black, for: .normal) return view @@ -53,15 +59,17 @@ class HeaderView: UIView { } //MARK: - Helpers - func configureLabel() { + func configureLabel() { + addSubview(headLabel) headLabel.translatesAutoresizingMaskIntoConstraints = false headLabel.topAnchor.constraint(equalTo: topAnchor, constant: 14).isActive = true headLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 19).isActive = true - + } func configureButton() { + addSubview(button1) button1.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([button1.topAnchor.constraint(equalTo: headLabel.bottomAnchor, constant: 22), @@ -69,6 +77,7 @@ class HeaderView: UIView { button1.widthAnchor.constraint(equalToConstant: 155), button1.heightAnchor.constraint(equalToConstant: 90)]) + addSubview(button2) button2.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([button2.topAnchor.constraint(equalTo: headLabel.bottomAnchor, constant: 22), @@ -76,6 +85,5 @@ class HeaderView: UIView { button2.widthAnchor.constraint(equalToConstant: 155), button2.heightAnchor.constraint(equalToConstant: 90)]) } - } diff --git a/Better-me-iOS/MyPage/PWEditController.swift b/Better-me-iOS/MyPage/PWEditController.swift index a70090b..c07a463 100644 --- a/Better-me-iOS/MyPage/PWEditController.swift +++ b/Better-me-iOS/MyPage/PWEditController.swift @@ -8,14 +8,19 @@ import UIKit class PWEditController: UIViewController{ + //MARK: - Properties - @IBOutlet weak var oldPWTextField: UITextField! - @IBOutlet weak var newPWTextField: UITextField! - @IBOutlet weak var newPWTextField2: UITextField! + @IBOutlet weak var passwordField: UITextField! + @IBOutlet weak var passwordCheckField: UITextField! + @IBOutlet weak var checkLabel: UILabel! { + didSet { + checkLabel.isHidden = true + } + } let saveBtn : UIBarButtonItem = { let view = UIButton() - view.backgroundColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1) + view.backgroundColor = UIColor(red: 0.906, green: 0.906, blue: 0.906, alpha: 1) view.layer.cornerRadius = 15 view.setTitle("저장", for: .normal) view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) @@ -24,32 +29,147 @@ class PWEditController: UIViewController{ view.widthAnchor.constraint(equalToConstant: 55), view.heightAnchor.constraint(equalToConstant: 31)]) - + view.addTarget(self, action: #selector(saveBtnClicked), for: .touchUpInside) return UIBarButtonItem(customView: view) }() + //MARK: - LifeCycle override func viewDidLoad() { super.viewDidLoad() + navigationBarUI() + textFieldCustom(textField:passwordField) + textFieldCustom(textField:passwordCheckField) + + + + passwordField.textContentType = .newPassword + passwordCheckField.textContentType = .newPassword + + self.passwordField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + self.passwordCheckField.addTarget(self, action: #selector(self.TextFieldChange(_:)), for: .editingChanged) + + NotificationCenter.default.addObserver(self, + selector: #selector(PasswordTextDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: passwordField) + NotificationCenter.default.addObserver(self, + selector: #selector(PasswordTextDidChange(_:)), + name: UITextField.textDidChangeNotification, + object: passwordCheckField) + + } + + + //MARK: - Helpers + func navigationBarUI() { self.navigationController?.navigationBar.tintColor = .black self.navigationController?.navigationBar.topItem?.title = "" self.title = "비밀번호 변경" - self.navigationItem.rightBarButtonItem = self.saveBtn - textFieldCustom(textField:oldPWTextField) - textFieldCustom(textField:newPWTextField) - textFieldCustom(textField:newPWTextField2) + self.navigationItem.rightBarButtonItem?.isEnabled = false + } func textFieldCustom (textField: UITextField) { - + textField.layer.cornerRadius = 17 textField.layer.borderWidth = 1 textField.layer.borderColor = UIColor(red: 0.679, green: 0.679, blue: 0.679, alpha: 1).cgColor + textField.textAlignment = .center } override func touchesBegan(_ touches: Set, with event: UIEvent?){ - - self.view.endEditing(true) - + + self.view.endEditing(true) + + } + + + @objc func saveBtnClicked(_sender: UIButton) { + UserDataManager().patchPassword(password: passwordField.text!, viewController: self) + + passwordField.text = "" + passwordCheckField.text = "" + } + + func isSameBoth(_ first: UITextField, _ second: UITextField) -> Bool { //비번 일치 확인 + if(first.text == second.text) { + return true + } else { + return false + } + } + + func isValidPassword(str:String) -> Bool { + let passwordEx = "^[A-Za-z0-9.-]{6,20}$" + return NSPredicate(format: "SELF MATCHES %@", passwordEx).evaluate(with: str) + } + + @objc func TextFieldChange (_ sender: UITextField) { //버튼 활성화, 비활성화 설정 + + if (isValidPassword(str: passwordField.text!)) && (isSameBoth(passwordField, passwordCheckField)) && passwordField.text!.count < 21 { //비밀번호, 이메일 확인되면 버튼 활성화 + + saveBtn.isEnabled = true + saveBtn.customView?.backgroundColor = .BtnColor + saveBtn.customView?.tintColor = .WhiteTextColor + + } } + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { + if textField == passwordField { + passwordField.isSecureTextEntry = true + passwordField.textContentType = .newPassword + } + + else if textField == passwordCheckField { + passwordCheckField.isSecureTextEntry = true + passwordCheckField.textContentType = .newPassword + } + return true + } + + @objc private func PasswordTextDidChange(_ notification: Notification) { + let maxLength = 20 + if let textField = notification.object as? UITextField { + if let text = textField.text { + + if text.count > maxLength { + + checkLabel.isHidden = false + checkLabel.text = "비밀번호는 20자 미만으로 입력해주세요." + } + + else if !isSameBoth(passwordField, passwordCheckField) { //비번 불일치 + checkLabel.isHidden = false + checkLabel.text = "비밀번호와 비밀번호 재입력이 일치하지 않습니다." + } + else if !isValidPassword(str: passwordField.text!) { //비번 유효성 + checkLabel.text = "비밀번호 규칙을 확인해주세요." + checkLabel.isHidden = false + } + else if !(isValidPassword(str: passwordField.text!)) && !(isSameBoth(passwordField, passwordCheckField)){ //비번 유효성, 불일치 틀릴 경우 + checkLabel.text = "비밀번호 규칙을 확인해주세요." + checkLabel.isHidden = false + } + + else { + checkLabel.isHidden = true + } + if text.count >= maxLength { + let index = text.index(text.startIndex, offsetBy: maxLength) + let newString = text[text.startIndex.. Bool { + textField.resignFirstResponder() // TextField 비활성화 + return true + } + + } diff --git a/Better-me-iOS/MyPage/ProfileEditController.swift b/Better-me-iOS/MyPage/ProfileEditController.swift index 987a3fe..f126d14 100644 --- a/Better-me-iOS/MyPage/ProfileEditController.swift +++ b/Better-me-iOS/MyPage/ProfileEditController.swift @@ -9,20 +9,17 @@ import UIKit import AVFoundation import Photos - - - class ProfileEditController: UIViewController{ //MARK: - Properties - + @IBOutlet weak var profileView: UIView! @IBAction func editBtn(_ sender: Any) { self.present(alertController, animated: true, completion: nil) } - @IBOutlet weak var userCommentImageView: UIImageView! + @IBOutlet weak var photoImageView: UIImageView! @IBOutlet weak var nameTextField: UITextField! @@ -31,23 +28,25 @@ class ProfileEditController: UIViewController{ let imagePickerController = UIImagePickerController() let alertController = UIAlertController(title: "올릴 방식을 선택하세요", message: "사진 찍기 또는 앨범에서 선택", preferredStyle: .actionSheet) - - let saveBtn : UIBarButtonItem = { + + lazy var saveBtn : UIBarButtonItem = { let view = UIButton() view.backgroundColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1) view.layer.cornerRadius = 15 - view.setTitle("저장", for: .normal) -// view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) + view.setTitle("완료", for: .normal) + view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-SemiBold", size: 15) view.setTitleColor(.white, for: .normal) NSLayoutConstraint.activate([ view.widthAnchor.constraint(equalToConstant: 55), view.heightAnchor.constraint(equalToConstant: 31)]) + view.addTarget(self, action: #selector(clickedSavedBtn), for: .touchUpInside) + return UIBarButtonItem(customView: view) }() - + //MARK: - Lifecycle override func viewDidLoad() { super.viewDidLoad() @@ -56,95 +55,118 @@ class ProfileEditController: UIViewController{ self.imagePickerController.delegate = self navigationBarUI() - shadowing(view: profileView) - profileView.layer.cornerRadius = profileView.frame.height/2 + configureProfileUI() - userCommentImageView.layer.cornerRadius = userCommentImageView.frame.height/2 - userCommentImageView.layer.borderWidth = 1 - userCommentImageView.clipsToBounds = true - userCommentImageView.layer.borderColor = UIColor.clear.cgColor - userCommentImageView.clipsToBounds = true - textFieldCustom(textField: nameTextField) textFieldCustom(textField: messageTextField) enrollAlertEvent() } //MARK: - Helpers + @objc func clickedSavedBtn(_ sender: UIButton) { + + guard let newImageData = photoImageView.image!.pngData() else{return} + print(newImageData) + ProfileImageDataManager().patchProfilePhoto(imgData: newImageData) + UserDataManager().patchUserData(nickName: self.nameTextField.text ?? "", promise: self.messageTextField.text ?? "",viewController: self) + + } + + func navigationBarUI() { self.navigationController?.navigationBar.tintColor = .black self.navigationController?.navigationBar.topItem?.title = "" self.title = "프로필 수정" self.navigationItem.rightBarButtonItem = self.saveBtn } + + func configureProfileUI(){ + shadowing(view: profileView) + profileView.layer.cornerRadius = profileView.frame.height/2 + photoImageView.layer.cornerRadius = photoImageView.frame.height/2 + photoImageView.layer.borderWidth = 1 + photoImageView.clipsToBounds = true + photoImageView.layer.borderColor = UIColor.clear.cgColor + configureUserInfo() + } func textFieldCustom (textField: UITextField) { - textField.clearsOnBeginEditing = true + textField.clearsOnBeginEditing = false textField.layer.cornerRadius = 5 textField.layer.borderWidth = 1 textField.layer.borderColor = UIColor(red: 0.679, green: 0.679, blue: 0.679, alpha: 1).cgColor } + + func configureUserInfo() { + self.nameTextField.text = UserDefaults.standard.string(forKey: "nickName") + self.messageTextField.text = UserDefaults.standard.string(forKey: "promise") + + if UserDefaults.standard.string(forKey: "photo") == "server x" { + self.photoImageView.image = UIImage(named: "defaultPhoto") + } + else { + guard let photoURL = URL(string: UserDefaults.standard.string(forKey: "photo") ?? "") else { return } + DispatchQueue.global().async { + if let photoData = try? Data(contentsOf: photoURL) { + if let image = UIImage(data: photoData) { + DispatchQueue.main.async { + self.photoImageView.image = image + } + } + } + } + } + } + override func touchesBegan(_ touches: Set, with event: UIEvent?){ - - self.view.endEditing(true) - + + self.view.endEditing(true) + } //MARK: - Camera func enrollAlertEvent() { - let photoLibraryAlertAction = UIAlertAction(title: "사진 앨범", style: .default) { - (action) in - self.openAlbum() - } - let cameraAlertAction = UIAlertAction(title: "카메라", style: .default) {(action) in - self.openCamera() - } - let cancelAlertAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) - self.alertController.addAction(photoLibraryAlertAction) - self.alertController.addAction(cameraAlertAction) - self.alertController.addAction(cancelAlertAction) - guard let alertControllerPopoverPresentationController - = alertController.popoverPresentationController - else {return} - prepareForPopoverPresentation(alertControllerPopoverPresentationController) + let photoLibraryAlertAction = UIAlertAction(title: "사진 앨범", style: .default) { + (action) in + self.openAlbum() + } + let cameraAlertAction = UIAlertAction(title: "카메라", style: .default) {(action) in + self.openCamera() + } + let cancelAlertAction = UIAlertAction(title: "취소", style: .cancel, handler: nil) + self.alertController.addAction(photoLibraryAlertAction) + self.alertController.addAction(cameraAlertAction) + self.alertController.addAction(cancelAlertAction) + guard let alertControllerPopoverPresentationController + = alertController.popoverPresentationController + else {return} + prepareForPopoverPresentation(alertControllerPopoverPresentationController) } - + func openAlbum() { - self.imagePickerController.sourceType = .photoLibrary - present(self.imagePickerController, animated: false, completion: nil) + self.imagePickerController.sourceType = .photoLibrary + present(self.imagePickerController, animated: false, completion: nil) } func openCamera() { - if (UIImagePickerController.isSourceTypeAvailable(.camera)) { - self.imagePickerController.sourceType = .camera - present(self.imagePickerController, animated: false, completion: nil) - } - else { - print ("Camera's not available as for now.") - } + if (UIImagePickerController.isSourceTypeAvailable(.camera)) { + self.imagePickerController.sourceType = .camera + present(self.imagePickerController, animated: false, completion: nil) } - + else { + print ("Camera's not available as for now.") + } + } + - //이미지를 탭해서 프로필사진을 변경할 경우 -// func addGestureRecognizer() { -// let tapGestureRecognizer -// = UITapGestureRecognizer(target: self, -// action: #selector(self.tappedUIImageView(_:))) -// self.userCommentImageView.addGestureRecognizer(tapGestureRecognizer) -// self.userCommentImageView.isUserInteractionEnabled = true -// } - -// @objc func tappedUIImageView(_ gesture: UITapGestureRecognizer) { -// self.present(alertController, animated: true, completion: nil) -// } } extension ProfileEditController: UIPopoverPresentationControllerDelegate { func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) { if let popoverPresentationController = - self.alertController.popoverPresentationController { + self.alertController.popoverPresentationController { popoverPresentationController.sourceView = self.view popoverPresentationController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0) @@ -166,11 +188,9 @@ extension ProfileEditController: UIImagePickerControllerDelegate, UINavigationCo } else { print("error detected in didFinishPickinMediaWithInfo method") } + self.photoImageView.image = newImage - self.userCommentImageView.image = newImage // 받아온 이미지를 update picker.dismiss(animated: true, completion: nil) // picker를 닫아줌 - } - } diff --git a/Better-me-iOS/MyPage/ProfileImageDataManager.swift b/Better-me-iOS/MyPage/ProfileImageDataManager.swift new file mode 100644 index 0000000..9068d5e --- /dev/null +++ b/Better-me-iOS/MyPage/ProfileImageDataManager.swift @@ -0,0 +1,41 @@ +// +// ProfileImageDataManager.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/12. +// +import Foundation +import Alamofire +import UIKit + +class ProfileImageDataManager { + + let token = UserDefaults.standard.string(forKey: "token") + let userIdx = UserDefaults.standard.string(forKey: "userIdx") + + func patchProfilePhoto(imgData: Data) { + guard let url = URL(string: "http://54.180.13.219:3000/app/users/upload/\(userIdx ?? "")") else {return} + + let header: HTTPHeaders = [ + "Content-Type" : "multipart/form-data", "Accept":"application/json", "x-access-token": token ?? ""] + + + AF.upload(multipartFormData: { multipartFormData in + multipartFormData.append(imgData, withName: "profile", fileName: "photo.png", mimeType: "image/png") + }, to: url, method: .patch, headers: header) + .validate() + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(let result): + if result.isSuccess{ + print("Photo 서버 디렉토리 저장") + } else { + print(result.message) + } + case .failure(let error): + print(error.localizedDescription) + } + } + } + +} diff --git a/Better-me-iOS/MyPage/PushNotification/AlertTableViewCell.swift b/Better-me-iOS/MyPage/PushNotification/AlertTableViewCell.swift new file mode 100644 index 0000000..94cde0f --- /dev/null +++ b/Better-me-iOS/MyPage/PushNotification/AlertTableViewCell.swift @@ -0,0 +1,72 @@ +// +// AlertTableViewCell.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/01. +// + +import UIKit + +class AlertTableViewCell: UITableViewCell { + + @IBOutlet weak var alertTitleLabel: UILabel! + + @IBOutlet weak var alertSubTitleLabel: UILabel! + + @IBOutlet weak var switchView: UISwitch! + + var index:Int? + + override func awakeFromNib() { + super.awakeFromNib() + switchView.isOn = false + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + + + @IBAction func switchChanged(_ sender: UISwitch) { + let switchTag = self.index + let switchState = sender.isOn + + switch switchTag { + case 0: + if switchState { + print("Switch 1 is on") + NotificationManager().patchHabitCheckOn() + } else { + print("Switch 1 is off") + NotificationManager().patchHabitCheckOff() + } + case 1: + if switchState { + print("Switch 2 is on") + NotificationManager().patchHabitInviteCheckOn() + } else { + print("Switch 2 is off") + NotificationManager().patchHabitInviteCheckOff() + } + case 2: + if switchState { + print("Switch 3 is on") + } else { + print("Switch 3 is off") + } + case 3: + if switchState { + print("Switch 4 is on") + } else { + print("Switch 4 is off") + } + // add more cases for each switch + default: + break + } + + } +} diff --git a/Better-me-iOS/MyPage/PushNotification/NotificationManager.swift b/Better-me-iOS/MyPage/PushNotification/NotificationManager.swift new file mode 100644 index 0000000..052090f --- /dev/null +++ b/Better-me-iOS/MyPage/PushNotification/NotificationManager.swift @@ -0,0 +1,95 @@ +// +// NotificationManager.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/15. +// + +import Foundation +import Alamofire + +class NotificationManager { + let token = UserDefaults.standard.string(forKey: "token") + let userIdx = UserDefaults.standard.string(forKey: "userIdx") + + func patchHabitCheckOn() { + + guard let url = URL(string: "http://54.180.13.219:3000/app/alarm/habitCheck/on/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(url, + method: .patch, + parameters: nil, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(let message): + print(message) + case .failure(let error): + print(error) + + } + } + } + func patchHabitCheckOff() { + + guard let url = URL(string: "http://54.180.13.219:3000/app/alarm/habitCheck/off/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(url, + method: .patch, + parameters: nil, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(let message): + print(message) + case .failure(let error): + print(error) + + } + } + } + func patchHabitInviteCheckOn() { + + guard let url = URL(string: "http://54.180.13.219:3000/app/alarm/habitInvite/on/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(url, + method: .patch, + parameters: nil, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(let message): + print(message) + case .failure(let error): + print(error) + + } + } + } + func patchHabitInviteCheckOff() { + + guard let url = URL(string: "http://54.180.13.219:3000/app/alarm/habitInvite/off/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(url, + method: .patch, + parameters: nil, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(let message): + print(message) + case .failure(let error): + print(error) + + } + } + } +} diff --git a/Better-me-iOS/MyPage/PushNotification/PushNotiViewController.swift b/Better-me-iOS/MyPage/PushNotification/PushNotiViewController.swift new file mode 100644 index 0000000..42acb5a --- /dev/null +++ b/Better-me-iOS/MyPage/PushNotification/PushNotiViewController.swift @@ -0,0 +1,95 @@ +// +// PushNotiViewController.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/01. +// + +import UIKit + +class PushNotiViewController: UIViewController { + + private let alertTitle = ["매일 습관 체크 알림","습관 초대 알림","친구 요청 알림","친구 어워드 알림"] + private let alertSubTitle = ["매일 정해진 시간에 습관 체크 알림을 보냅니다", + "습관 초대를 받을경우 알림을 보냅니다", + "친구 요청을 수신하거나 \n보낸 친구 요청이 수락되었을 때 알림을 보냅니다", + "친구가 어워드를 획득할 경우 알림을 보냅니다"] + + var isExpanded = false + var selectedTime: String? + + override func viewDidLoad() { + super.viewDidLoad() + navigationBarUI() + } + + func navigationBarUI() { + self.navigationController?.navigationBar.tintColor = .black + self.navigationController?.navigationBar.topItem?.title = "" + self.title = "푸시알림 설정" + } + + + @IBAction func notificationTime(_ sender: UIDatePicker) { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH:mm" + selectedTime = dateFormatter.string(from: sender.date) + } + + + @IBAction func notificationTimeSaved(_ sender: UIButton) { + print(selectedTime ?? "") + let alret = UIAlertController(title: "저장!", message: "습관체크 알림 시간이 저장 되었습니다.", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default, handler: nil) + alret.addAction(ok) + self.present(alret, animated: true, completion: nil) + } + + + +} + + +extension PushNotiViewController: UITableViewDataSource , UITableViewDelegate{ + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return alertTitle.count + } + + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + if indexPath.row == 0 && isExpanded { + return 150 + } else { + return 94 + } + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if indexPath.row == 0 { + isExpanded = true + UIView.animate(withDuration: 0.3) { + tableView.performBatchUpdates(nil) + } + } + } + func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { + if indexPath.row == 0 { + isExpanded = false + UIView.animate(withDuration: 0.3) { + tableView.performBatchUpdates(nil) + } + } + } + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + + guard let cell = tableView.dequeueReusableCell(withIdentifier: "AlertTableViewCell", for: indexPath) as? AlertTableViewCell else { return UITableViewCell() } + cell.alertTitleLabel.text = alertTitle[indexPath.row] + cell.alertSubTitleLabel.text = alertSubTitle[indexPath.row] + cell.selectionStyle = .none + + cell.index = indexPath.row + + return cell + } + +} + diff --git a/Better-me-iOS/MyPage/ResponseStruct.swift b/Better-me-iOS/MyPage/ResponseStruct.swift new file mode 100644 index 0000000..f28e4bc --- /dev/null +++ b/Better-me-iOS/MyPage/ResponseStruct.swift @@ -0,0 +1,39 @@ +// +// ResponseData.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/12. +// + +import Foundation + +// MARK: - Struct +struct getUserResponseStruct: Codable { + let isSuccess: Bool + let code: Int + let message : String + let result: User +} + +struct patchUserResponseStruct: Codable { + let message : String + let code: Int + let isSuccess: Bool + +} + +// MARK: - Person +struct User: Codable { + let userIdx : Int + let nickName : String + let photo : String + let promise : String +} + +enum NetworkResult { + case success(T) + case requestErr(T) + case pathErr + case serverErr + case networkFail +} diff --git a/Better-me-iOS/MyPage/UserDataManager.swift b/Better-me-iOS/MyPage/UserDataManager.swift new file mode 100644 index 0000000..b441f17 --- /dev/null +++ b/Better-me-iOS/MyPage/UserDataManager.swift @@ -0,0 +1,158 @@ +// +// GetPersonDataService.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/05. +// + +import Foundation +import Alamofire +import UIKit + + +class UserDataManager { + + let token = UserDefaults.standard.string(forKey: "token") + let userIdx = UserDefaults.standard.string(forKey: "userIdx") + + + func getUserInfoData() { + + guard let url = URL(string: "http://54.180.13.219:3000/app/users/getMyPage/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(url, + method: .get, + parameters: nil, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: getUserResponseStruct.self) { response in + switch response.result { + case .success(let response): + print(response.result.nickName) + print(response.result.promise) + print(response.result.photo) + UserDefaults.standard.setValue(response.result.nickName, forKey: "nickName") + UserDefaults.standard.setValue(response.result.promise, forKey: "promise") + UserDefaults.standard.setValue(response.result.photo, forKey: "photo") + + case .failure(let error): + UserDefaults.standard.setValue("회원", forKey: "nickName") + UserDefaults.standard.setValue("나의 다짐을 적어 보아요!", forKey: "promise") + UserDefaults.standard.setValue("server x", forKey: "photo") + + print(error) + + } + } + } + + func patchUserData(nickName: String, promise: String, viewController: ProfileEditController) { + + guard let url = URL(string: "http://54.180.13.219:3000/app/users/changeN/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + let params = ["nickName": nickName] as Dictionary + + AF.request(url, + method: .patch, + parameters: params, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(_): + + self.patchPromise(promise: promise,viewController: viewController) + UserDefaults.standard.setValue(nickName, forKey: "nickName") + UserDefaults.standard.setValue(promise, forKey: "promise") + + case .failure(let error): + print(error) + + } + } + } + + func patchPromise(promise: String, viewController: ProfileEditController) { + + guard let url = URL(string: "http://54.180.13.219:3000/app/users/changePm/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + let params = ["promise": promise] as Dictionary + + AF.request(url, + method: .patch, + parameters: params, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(_): + + let alret = UIAlertController(title: "저장!", message: "프로필이 수정되었습니다.", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default, handler: nil) + alret.addAction(ok) + viewController.present(alret, animated: true, completion: nil) + + case .failure(let error): + print(error) + + } + } + } + func patchPassword(password: String, viewController: PWEditController) { + + guard let url = URL(string: "http://54.180.13.219:3000/app/users/changePw/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + let params = ["password": password] as Dictionary + + AF.request(url, + method: .patch, + parameters: params, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(_): + + let alret = UIAlertController(title: "비밀번호 변경완료!", message: "비밀번호가 변경되었습니다.", preferredStyle: .alert) + let ok = UIAlertAction(title: "확인", style: .default, handler: nil) + alret.addAction(ok) + viewController.present(alret, animated: true, completion: nil) + + case .failure(let error): + print(error) + + } + } + } + func deleteAccount(viewController: WithdrawalViewController) { + + guard let url = URL(string: "http://54.180.13.219:3000/app/auth/unregister/\(userIdx ?? "")") else {return} + let header : HTTPHeaders = ["x-access-token": token ?? ""] + + AF.request(url, + method: .delete, + encoding: JSONEncoding.default, + headers: header) + .responseDecodable(of: patchUserResponseStruct.self) { response in + switch response.result { + case .success(_): + for key in UserDefaults.standard.dictionaryRepresentation().keys { + UserDefaults.standard.removeObject(forKey: key.description) + } + let mainController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "main") + viewController.view.window?.rootViewController = mainController + viewController.view.window?.makeKeyAndVisible() + print("회원탈퇴 완료") + case .failure(let error): + print(error) + + } + } + } + + +} + + + diff --git a/Better-me-iOS/MyPage/WithdrawalViewController.swift b/Better-me-iOS/MyPage/WithdrawalViewController.swift new file mode 100644 index 0000000..479e217 --- /dev/null +++ b/Better-me-iOS/MyPage/WithdrawalViewController.swift @@ -0,0 +1,125 @@ +// +// WithdrawalViewController.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/01. +// + +import UIKit + + +class WithdrawalViewController: UIViewController { + + //MARK: - Properties + + let handImageView : UIImageView = { + let aImageView = UIImageView() + aImageView.image = UIImage(named: "image 123") + + return aImageView + }() + + let label = UILabel() + + let yesButton : UIButton = { + let view = UIButton() + view.backgroundColor = .red + view.layer.cornerRadius = 22 + + view.layer.borderWidth = 1.5 + view.layer.borderColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1).cgColor + + view.setTitle("네! 다음에 봐요", for: .normal) + view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) + view.setTitleColor(.white, for: .normal) + + view.addTarget(self, action: #selector(yesClicked), for: .touchUpInside) + + return view + }() + + let noButton : UIButton = { + let view = UIButton() + view.backgroundColor = .white + view.layer.cornerRadius = 22 + + view.layer.borderWidth = 1.5 + view.layer.borderColor = UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1).cgColor + + view.setTitle("아니요, 계속 사용할래요", for: .normal) + view.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Medium", size: 15) + view.setTitleColor(UIColor(red: 0.984, green: 0.078, blue: 0, alpha: 1), for: .normal) + + view.addTarget(self, action: #selector(noClicked), for: .touchUpInside) + + return view + }() + + //MARK: - LifeCycle + override func viewDidLoad() { + super.viewDidLoad() + navigationBarUI() + configureUI() + configureButtonUI() + + } + //MARK: - Helpers + + func navigationBarUI() { + self.navigationController?.navigationBar.tintColor = .black + self.navigationController?.navigationBar.topItem?.title = "" + self.title = "회원탈퇴" + } + + func configureUI() { + view.addSubview(handImageView) + handImageView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([handImageView.topAnchor.constraint(equalTo: view.topAnchor, constant: 178), + handImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor), + handImageView.widthAnchor.constraint(equalToConstant: 71), + handImageView.heightAnchor.constraint(equalToConstant: 71)]) + + + label.text = " 이때까지 정말로 감사했어요! \n정말로 회원탈퇴 하시겠습니까?" + label.numberOfLines = 2 + label.textAlignment = .center + label.font = UIFont(name: "AppleSDGothicNeo-SemiBold", size: 18) + view.addSubview(label) + label.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([label.centerYAnchor.constraint(equalTo: view.centerYAnchor), + label.centerXAnchor.constraint(equalTo: view.centerXAnchor), + label.widthAnchor.constraint(equalToConstant: 257), + label.heightAnchor.constraint(equalToConstant: 50),]) + } + + func configureButtonUI() { + view.addSubview(yesButton) + yesButton.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([yesButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -186), + yesButton.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 18), + yesButton.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -18), + yesButton.heightAnchor.constraint(equalToConstant: 43)]) + + view.addSubview(noButton) + noButton.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([noButton.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -104), + noButton.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 18), + noButton.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -18), + noButton.heightAnchor.constraint(equalToConstant: 43)]) + } + @objc func yesClicked ( _ sender : UIButton) { + UserDataManager().deleteAccount(viewController: self) + + + } + @objc func noClicked ( _ sender : UIButton) { + navigationController?.popViewController(animated: true) + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?){ + + self.view.endEditing(true) + + } + +} diff --git a/Better-me-iOS/MyPage/first.apn b/Better-me-iOS/MyPage/first.apn new file mode 100644 index 0000000..44d8c1e --- /dev/null +++ b/Better-me-iOS/MyPage/first.apn @@ -0,0 +1,10 @@ +{ + "aps": { + "alert" : { + "title" : "습관체크 알림", + "body" : "비타민C 먹기 시간입니다!" + }, + "sound": "default" + }, + "link_url": "https://www.lipsum.com/" +} diff --git a/Better-me-iOS/MyPage/second.apn b/Better-me-iOS/MyPage/second.apn new file mode 100644 index 0000000..5b74c5d --- /dev/null +++ b/Better-me-iOS/MyPage/second.apn @@ -0,0 +1,10 @@ +{ + "aps": { + "alert" : { + "title" : "습관 초대 알림", + "body" : "폴 이 습관초대를 보냈습니다" + }, + "sound": "default" + }, + "image-url": "http://54.180.13.219:3000/images/photo1676464391965.png" +} diff --git a/Better-me-iOS/RemoveBadHabitViewController.swift b/Better-me-iOS/RemoveBadHabitViewController.swift index 0b370ea..95c9290 100644 --- a/Better-me-iOS/RemoveBadHabitViewController.swift +++ b/Better-me-iOS/RemoveBadHabitViewController.swift @@ -113,12 +113,10 @@ class RemoveBadHabitViewController: UIViewController { @IBAction func tapSearchButton(_ sender: UIButton) { guard let modalViewController = self.storyboard?.instantiateViewController(identifier: "SearchFriendViewController") as? SearchFriendViewController else { return } modalViewController.definesPresentationContext = true - modalViewController.modalPresentationStyle = .overCurrentContext + modalViewController.modalPresentationStyle = .overFullScreen modalViewController.inviteText = self.inviteTextField.text ?? "" navigationController?.present(modalViewController, animated: true, completion: nil) - } - @IBAction func tapConfirmButton(_ sender: UIBarButtonItem) { guard let title = self.titleTextField.text else { return } guard let contents = self.contentsTextView.text else { return } diff --git a/Better-me-iOS/SceneDelegate.swift b/Better-me-iOS/SceneDelegate.swift index 66c1d48..0255c4e 100644 --- a/Better-me-iOS/SceneDelegate.swift +++ b/Better-me-iOS/SceneDelegate.swift @@ -16,6 +16,25 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). + + guard let scene = (scene as? UIWindowScene) else { return } + + if hasJwtToken() { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + let vc = storyboard.instantiateViewController(withIdentifier: "TabBar") + let rootViewController = UINavigationController(rootViewController: vc) + rootViewController.isNavigationBarHidden = true + self.window = UIWindow(windowScene: scene) + self.window?.rootViewController = rootViewController + self.window?.makeKeyAndVisible() + } else { + let storyboard = UIStoryboard(name: "Main", bundle: nil) + let vc = storyboard.instantiateViewController(withIdentifier: "MainViewController") + let rootViewController = UINavigationController(rootViewController: vc) + self.window = UIWindow(windowScene: scene) + self.window?.rootViewController = rootViewController + self.window?.makeKeyAndVisible() + } guard let _ = (scene as? UIWindowScene) else { return } } @@ -47,6 +66,9 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // to restore the scene back to its current state. } + private func hasJwtToken() -> Bool { + return UserDefaults.standard.object(forKey: "token") != nil + } } diff --git a/Better-me-iOS/SearchFriendViewController.swift b/Better-me-iOS/SearchFriendViewController.swift index c87f4dc..61d173c 100644 --- a/Better-me-iOS/SearchFriendViewController.swift +++ b/Better-me-iOS/SearchFriendViewController.swift @@ -37,7 +37,10 @@ class SearchFriendViewController: UIViewController { self.configureSFView() self.configureSearchView() - view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.0) + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) { + self.view.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + } self.configureSFView() self.configureCollectionView() } diff --git a/Better-me-iOS/Social/Data/HabitAgreeModel.swift b/Better-me-iOS/Social/Data/HabitAgreeModel.swift deleted file mode 100644 index 94c4a79..0000000 --- a/Better-me-iOS/Social/Data/HabitAgreeModel.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// RandomUserViewModel.swift -// RandomUserApi -// -// Created by 황인성 on 2023/02/03. -// - -import Foundation -import Combine -import Alamofire - -class HabitAgreeModel: ObservableObject{ - - var subscripttion = Set() - - var baseUrl = "http://54.180.13.219:3000/app/invite/accept/:userIdx/:habitIdx" - - var param = ["followee": [20, 33]] - - init(){ - print(#fileID, #function, #line, "") -// fetchRandomUsers() - } - - - func Patch(completionHandler: @escaping (Result<[HabitAgreeResponse], Error>) -> Void){ - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .patch).response { response in - switch response.result { - case .success: - completionHandler(.success([HabitAgreeResponse(isSuccess: true, code: 201, message: "습관 초대 수락 성공")])) - case .failure(let error): - completionHandler(.failure(error)) - } - } - } -} diff --git a/Better-me-iOS/Social/Data/HabitDisagreeModel.swift b/Better-me-iOS/Social/Data/HabitDisagreeModel.swift deleted file mode 100644 index e80c063..0000000 --- a/Better-me-iOS/Social/Data/HabitDisagreeModel.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// RandomUserViewModel.swift -// RandomUserApi -// -// Created by 황인성 on 2023/02/03. -// - -import Foundation -import Combine -import Alamofire - -class HabitDisagreeModel: ObservableObject{ - - var subscripttion = Set() - - var baseUrl = "http://54.180.13.219:3000/app/invite/accpet/:userIdx/:habitIdx" - - var param = ["followee": [20, 33]] - - init(){ - print(#fileID, #function, #line, "") -// fetchRandomUsers() - } - - func Patch(completionHandler: @escaping (Result<[HabitDisagreeResponse], Error>) -> Void){ - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .patch).response { response in - switch response.result { - case .success: - completionHandler(.success([HabitDisagreeResponse(isSuccess: true, code: 201, message: "습관 초대 거절 성공")])) - case .failure(let error): - completionHandler(.failure(error)) - } - } - } -} diff --git a/Better-me-iOS/Social/Data/InviteHabitPostModel.swift b/Better-me-iOS/Social/Data/InviteHabitPostModel.swift deleted file mode 100644 index 7003e64..0000000 --- a/Better-me-iOS/Social/Data/InviteHabitPostModel.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// RandomUserViewModel.swift -// RandomUserApi -// -// Created by 황인성 on 2023/02/03. -// - -import Foundation -import Combine -import Alamofire - -class InviteHabitPostModel: ObservableObject{ - - var subscripttion = Set() - - var baseUrl = "http://54.180.13.219:3000/app/invite/1" - - var param = ["habitIdx": 1, "receiverIdx": 2] - - init(){ - print(#fileID, #function, #line, "") -// fetchRandomUsers() - } - -// func fetchRandomUsers(){ -// print(#fileID, #function, #line, "") -// AF.request(baseUrl, method: .patch).publishDecodable(type: AgreeResponse.self) -// .compactMap{ $0.value } -// .map{ $0.result } -// .sink(receiveCompletion: { completion in -// print("데이터스트림 완료") -// }, receiveValue: { receivedValue in -// print("받은 값 : \(receivedValue.count)") -// self.SearchNames = receivedValue -// }).store(in: &subscripttion) -// } - func Delete(completionHandler: @escaping (Result<[InviteHabitPostResponse], Error>) -> Void){ - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .post).response { response in - switch response.result { - case .success: - completionHandler(.success([InviteHabitPostResponse(isSuccess: true, code: 201, message: "습관 초대 성공")])) - case .failure(let error): - completionHandler(.failure(error)) - } - } - } -} diff --git a/Better-me-iOS/Social/Data/SearchNameModel.swift b/Better-me-iOS/Social/Data/SearchNameModel.swift deleted file mode 100644 index 41053b8..0000000 --- a/Better-me-iOS/Social/Data/SearchNameModel.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// RandomUserViewModel.swift -// RandomUserApi -// -// Created by 황인성 on 2023/02/03. -// - -import Foundation -import Combine -import Alamofire - -class SearchNameModel: ObservableObject{ - - var subscripttion = Set() - - @Published var SearchNames = [SearchName]() - - var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] - - var baseUrl = "http://54.180.13.219:3000/app/follow/searchN/1" - - var param: Parameters = ["nickName": "포"] - - init(){ - print(#fileID, #function, #line, "") - fetchRandomUsers() - } - - func fetchRandomUsers(){ - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .get, parameters: param, headers: token).publishDecodable(type: SearchNameResponse.self) - .compactMap{ $0.value } - .map{ $0.result } - .sink(receiveCompletion: { completion in - print("데이터스트림 완료") - }, receiveValue: { receivedValue in - print("받은 값 : \(receivedValue.count)") - self.SearchNames = receivedValue - }).store(in: &subscripttion) - } - -} diff --git a/Better-me-iOS/Social/SocialViewController.swift b/Better-me-iOS/Social/SocialViewController.swift deleted file mode 100644 index b7d14e0..0000000 --- a/Better-me-iOS/Social/SocialViewController.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// SocialViewController.swift -// Better-me-iOS -// -// Created by 황인성 on 2023/02/01. -// - -import UIKit -import SwiftUI - -class SocialViewController: UIViewController { - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - - navigationController?.setNavigationBarHidden(true, animated: animated) - } - - override func viewDidLoad() { - super.viewDidLoad() - - // Do any additional setup after loading the view. - } - - - @IBSegueAction func addSwiftUIView(_ coder: NSCoder) -> UIViewController? { - return UIHostingController(coder: coder, rootView: ContentView()) - } - - - /* - // MARK: - Navigation - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - // Get the new view controller using segue.destination. - // Pass the selected object to the new view controller. - } - */ - -} diff --git a/Better-me-iOS/Social/Data/Agree.swift b/Data/Agree.swift similarity index 100% rename from Better-me-iOS/Social/Data/Agree.swift rename to Data/Agree.swift diff --git a/Better-me-iOS/Social/Data/AgreeModel.swift b/Data/AgreeModel.swift similarity index 91% rename from Better-me-iOS/Social/Data/AgreeModel.swift rename to Data/AgreeModel.swift index cfabbcd..e8d2c94 100644 --- a/Better-me-iOS/Social/Data/AgreeModel.swift +++ b/Data/AgreeModel.swift @@ -17,7 +17,7 @@ class AgreeModel: ObservableObject{ var baseUrl = "http://54.180.13.219:3000/app/follow/accept/1/2" - var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] // var param = ["nickName": "김"] diff --git a/Better-me-iOS/Social/Data/FriendDelete.swift b/Data/FriendDelete.swift similarity index 100% rename from Better-me-iOS/Social/Data/FriendDelete.swift rename to Data/FriendDelete.swift diff --git a/Better-me-iOS/Social/Data/FriendDeleteModel.swift b/Data/FriendDeleteModel.swift similarity index 58% rename from Better-me-iOS/Social/Data/FriendDeleteModel.swift rename to Data/FriendDeleteModel.swift index d7b9876..22734f4 100644 --- a/Better-me-iOS/Social/Data/FriendDeleteModel.swift +++ b/Data/FriendDeleteModel.swift @@ -15,7 +15,7 @@ class FriendDeleteModel: ObservableObject{ var baseUrl = "http://54.180.13.219:3000/app/follow/accept/1/2" - var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] var param = ["followee": [20, 33]] @@ -36,17 +36,17 @@ class FriendDeleteModel: ObservableObject{ // self.SearchNames = receivedValue // }).store(in: &subscripttion) // } - func Delete(completionHandler: @escaping (Result<[FriendDeleteResponse], Error>) -> Void){ -// func fetchRandomUsers(){ - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .delete, headers: token).response { response in - switch response.result { - case .success: - completionHandler(.success([FriendDeleteResponse(isSuccess: true, code: 1000, message: "성공")])) - case .failure(let error): - completionHandler(.failure(error)) - } - } -// } - } +// func Delete(completionHandler: @escaping (Result<[FriendDeleteResponse], Error>) -> Void){ +//// func fetchRandomUsers(){ +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .delete, headers: token).response { response in +// switch response.result { +// case .success: +// completionHandler(.success([FriendDeleteResponse(isSuccess: true, code: 1000, message: "성공")])) +// case .failure(let error): +// completionHandler(.failure(error)) +// } +// } +//// } +// } } diff --git a/Better-me-iOS/Social/Data/HabitAgree.swift b/Data/HabitAgree.swift similarity index 100% rename from Better-me-iOS/Social/Data/HabitAgree.swift rename to Data/HabitAgree.swift diff --git a/Data/HabitAgreeModel.swift b/Data/HabitAgreeModel.swift new file mode 100644 index 0000000..d75fed7 --- /dev/null +++ b/Data/HabitAgreeModel.swift @@ -0,0 +1,52 @@ +// +// RandomUserViewModel.swift +// RandomUserApi +// +// Created by 황인성 on 2023/02/03. +// + +import Foundation +import Combine +import Alamofire + +class HabitAgreeModel: ObservableObject{ + + var subscripttion = Set() + + var baseUrl = "http://54.180.13.219:3000/app/invite/accept/1/1" + + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] + +// var param = ["followee": [20, 33]] + + init(){ + print(#fileID, #function, #line, "") +// fetchRandomUsers() + } + + func fetchRandomUsers(){ + print(#fileID, #function, #line, "") + AF.request(baseUrl, headers: token).publishDecodable(type: HabitAgreeResponse.self) + .compactMap{ $0.value } +// .map{ $0.result } + .sink(receiveCompletion: { completion in + print("데이터스트림 완료") + }, receiveValue: { receivedValue in + print("받은 값 : \(receivedValue)") +// self.InviteHabits = receivedValue + }).store(in: &subscripttion) + } + + +// func Patch(completionHandler: @escaping (Result<[HabitAgreeResponse], Error>) -> Void){ +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .patch).response { response in +// switch response.result { +// case .success: +// completionHandler(.success([HabitAgreeResponse(isSuccess: true, code: 201, message: "습관 초대 수락 성공")])) +// case .failure(let error): +// completionHandler(.failure(error)) +// } +// } +// } +} diff --git a/Better-me-iOS/Social/Data/HabitDisagree.swift b/Data/HabitDisagree.swift similarity index 100% rename from Better-me-iOS/Social/Data/HabitDisagree.swift rename to Data/HabitDisagree.swift diff --git a/Data/HabitDisagreeModel.swift b/Data/HabitDisagreeModel.swift new file mode 100644 index 0000000..d1cead8 --- /dev/null +++ b/Data/HabitDisagreeModel.swift @@ -0,0 +1,50 @@ +// +// RandomUserViewModel.swift +// RandomUserApi +// +// Created by 황인성 on 2023/02/03. +// + +import Foundation +import Combine +import Alamofire + +class HabitDisagreeModel: ObservableObject{ + + var subscripttion = Set() + + var baseUrl = "http://54.180.13.219:3000/app/invite/accpet/1/1" + + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] + + init(){ + print(#fileID, #function, #line, "") +// fetchRandomUsers() + } + + + func fetchRandomUsers(){ + print(#fileID, #function, #line, "") + AF.request(baseUrl, headers: token).publishDecodable(type: HabitDisagreeResponse.self) + .compactMap{ $0.value } +// .map{ $0.result } + .sink(receiveCompletion: { completion in + print("데이터스트림 완료") + }, receiveValue: { receivedValue in + print("받은 값 : \(receivedValue)") +// self.InviteHabits = receivedValue + }).store(in: &subscripttion) + } + +// func Patch(completionHandler: @escaping (Result<[HabitDisagreeResponse], Error>) -> Void){ +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .patch).response { response in +// switch response.result { +// case .success: +// completionHandler(.success([HabitDisagreeResponse(isSuccess: true, code: 201, message: "습관 초대 거절 성공")])) +// case .failure(let error): +// completionHandler(.failure(error)) +// } +// } +// } +} diff --git a/Better-me-iOS/Social/Data/InviteHabit.swift b/Data/InviteHabit.swift similarity index 100% rename from Better-me-iOS/Social/Data/InviteHabit.swift rename to Data/InviteHabit.swift diff --git a/Better-me-iOS/Social/Data/InviteHabitModel.swift b/Data/InviteHabitModel.swift similarity index 69% rename from Better-me-iOS/Social/Data/InviteHabitModel.swift rename to Data/InviteHabitModel.swift index 5807312..d2200ab 100644 --- a/Better-me-iOS/Social/Data/InviteHabitModel.swift +++ b/Data/InviteHabitModel.swift @@ -15,7 +15,9 @@ class InviteHabitModel: ObservableObject{ @Published var InviteHabits = [InviteHabit]() - var baseUrl = "http://54.180.13.219:3000/app/invite/2" + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] + + var baseUrl = "http://54.180.13.219:3000/app/invite/1" init(){ print(#fileID, #function, #line, "") @@ -24,7 +26,7 @@ class InviteHabitModel: ObservableObject{ func fetchRandomUsers(){ print(#fileID, #function, #line, "") - AF.request(baseUrl).publishDecodable(type: InviteHabitResponse.self) + AF.request(baseUrl, headers: token).publishDecodable(type: InviteHabitResponse.self) .compactMap{ $0.value } .map{ $0.result } .sink(receiveCompletion: { completion in diff --git a/Better-me-iOS/Social/Data/InviteHabitPost.swift b/Data/InviteHabitPost.swift similarity index 100% rename from Better-me-iOS/Social/Data/InviteHabitPost.swift rename to Data/InviteHabitPost.swift diff --git a/Data/InviteHabitPostModel.swift b/Data/InviteHabitPostModel.swift new file mode 100644 index 0000000..7ea58a5 --- /dev/null +++ b/Data/InviteHabitPostModel.swift @@ -0,0 +1,50 @@ +// +// RandomUserViewModel.swift +// RandomUserApi +// +// Created by 황인성 on 2023/02/03. +// + +import Foundation +import Combine +import Alamofire + +class InviteHabitPostModel: ObservableObject{ + + var subscripttion = Set() + + var baseUrl = "http://54.180.13.219:3000/app/invite/1" + + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] + + var param = ["habitIdx": 1, "receiverIdx": 2] + + init(){ + print(#fileID, #function, #line, "") +// fetchRandomUsers() + } + +// func fetchRandomUsers(){ +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .post, parameters: param, encoding: URLEncoding.default, headers: token).publishDecodable(type: InviteHabitPostResponse.self) +// .compactMap{ $0.value } +// .map{ $0.result } +// .sink(receiveCompletion: { completion in +// print("데이터스트림 완료") +// }, receiveValue: { receivedValue in +// print("받은 값 : \(receivedValue.count)") +// self.SearchNames = receivedValue +// }).store(in: &subscripttion) +// } +// func Delete(completionHandler: @escaping (Result<[InviteHabitPostResponse], Error>) -> Void){ +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .post).response { response in +// switch response.result { +// case .success: +// completionHandler(.success([InviteHabitPostResponse(isSuccess: true, code: 201, message: "습관 초대 성공")])) +// case .failure(let error): +// completionHandler(.failure(error)) +// } +// } +// } +} diff --git a/Better-me-iOS/Social/Data/NewPerson.swift b/Data/NewPerson.swift similarity index 100% rename from Better-me-iOS/Social/Data/NewPerson.swift rename to Data/NewPerson.swift diff --git a/Better-me-iOS/Social/Data/NewPersonModel.swift b/Data/NewPersonModel.swift similarity index 88% rename from Better-me-iOS/Social/Data/NewPersonModel.swift rename to Data/NewPersonModel.swift index 3cdaad7..ecd62a4 100644 --- a/Better-me-iOS/Social/Data/NewPersonModel.swift +++ b/Data/NewPersonModel.swift @@ -18,7 +18,7 @@ class NewPersonModel: ObservableObject{ @Published var nickNameArray = [String]() - var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoyMiwiaWF0IjoxNjc2MzMwNzc0LCJleHAiOjE2NzY0MTcxNzQsInN1YiI6InVzZXJJbmZvIn0.koGlzegZNzX4NsFD2QV8giVjYKBAeVE2GpAsrB-P9sU"] var baseUrl = "http://54.180.13.219:3000/app/follow/1" diff --git a/Better-me-iOS/Social/Data/Person.swift b/Data/Person.swift similarity index 85% rename from Better-me-iOS/Social/Data/Person.swift rename to Data/Person.swift index 4b49dcb..9da481e 100644 --- a/Better-me-iOS/Social/Data/Person.swift +++ b/Data/Person.swift @@ -7,7 +7,7 @@ import Foundation -struct Person: Identifiable{ +struct Person: Identifiable, Hashable{ var id = UUID() var name = "" diff --git a/Better-me-iOS/Social/Data/PersonModel.swift b/Data/PersonModel.swift similarity index 100% rename from Better-me-iOS/Social/Data/PersonModel.swift rename to Data/PersonModel.swift diff --git a/Better-me-iOS/Social/Data/RequestStatus.swift b/Data/RequestStatus.swift similarity index 100% rename from Better-me-iOS/Social/Data/RequestStatus.swift rename to Data/RequestStatus.swift diff --git a/Better-me-iOS/Social/Data/RequestStatusModel.swift b/Data/RequestStatusModel.swift similarity index 100% rename from Better-me-iOS/Social/Data/RequestStatusModel.swift rename to Data/RequestStatusModel.swift diff --git a/Better-me-iOS/Social/Data/Request_Friend.swift b/Data/Request_Friend.swift similarity index 100% rename from Better-me-iOS/Social/Data/Request_Friend.swift rename to Data/Request_Friend.swift diff --git a/Better-me-iOS/Social/Data/Request_FriendModel.swift b/Data/Request_FriendModel.swift similarity index 88% rename from Better-me-iOS/Social/Data/Request_FriendModel.swift rename to Data/Request_FriendModel.swift index 458d802..3ca6f0d 100644 --- a/Better-me-iOS/Social/Data/Request_FriendModel.swift +++ b/Data/Request_FriendModel.swift @@ -15,7 +15,7 @@ class Request_FriendModel: ObservableObject{ @Published var RequestFriends = [RequestFriend]() - var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzU5MTgyNjksImV4cCI6MTY3NjAwNDY2OSwic3ViIjoidXNlckluZm8ifQ.PyrzZVmeAAJ2KggsvNbYh1Qp9tC-0Swd_MULrN9Gmbs"] + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxLCJpYXQiOjE2NzYxODk3OTQsImV4cCI6MTY3NjI3NjE5NCwic3ViIjoidXNlckluZm8ifQ.-Y5SClfOe9Jq5TEmpnWQtEaQ3Qg6mhuKQZ2AGUQGacg"] var param = [ "followee": [20, 33] ] diff --git a/Better-me-iOS/Social/Data/Request_Friend_Post.swift b/Data/Request_Friend_Post.swift similarity index 100% rename from Better-me-iOS/Social/Data/Request_Friend_Post.swift rename to Data/Request_Friend_Post.swift diff --git a/Better-me-iOS/Social/Data/Request_Friend_PostModel.swift b/Data/Request_Friend_PostModel.swift similarity index 55% rename from Better-me-iOS/Social/Data/Request_Friend_PostModel.swift rename to Data/Request_Friend_PostModel.swift index 60b8b73..ae8206f 100644 --- a/Better-me-iOS/Social/Data/Request_Friend_PostModel.swift +++ b/Data/Request_Friend_PostModel.swift @@ -23,15 +23,15 @@ class Request_Friend_PostModel: ObservableObject{ } - func Post(completionHandler: @escaping (Result<[Request_Friend_PostResponse], Error>) -> Void) { - print(#fileID, #function, #line, "") - AF.request(baseUrl, method: .post, headers: token).response { response in - switch response.result { - case .success: - completionHandler(.success([Request_Friend_PostResponse(isSuccess: true, code: 1000, message: "성공")])) - case .failure(let error): - completionHandler(.failure(error)) - } - } - } +// func Post(completionHandler: @escaping (Result<[Request_Friend_PostResponse], Error>) -> Void) { +// print(#fileID, #function, #line, "") +// AF.request(baseUrl, method: .post, headers: token).response { response in +// switch response.result { +// case .success: +// completionHandler(.success([Request_Friend_PostResponse(isSuccess: true, code: 1000, message: "성공")])) +// case .failure(let error): +// completionHandler(.failure(error)) +// } +// } +// } } diff --git a/Better-me-iOS/Social/Data/SearchEmail.swift b/Data/SearchEmail.swift similarity index 100% rename from Better-me-iOS/Social/Data/SearchEmail.swift rename to Data/SearchEmail.swift diff --git a/Better-me-iOS/Social/Data/SearchEmailModel.swift b/Data/SearchEmailModel.swift similarity index 100% rename from Better-me-iOS/Social/Data/SearchEmailModel.swift rename to Data/SearchEmailModel.swift diff --git a/Better-me-iOS/Social/Data/SearchName.swift b/Data/SearchName.swift similarity index 56% rename from Better-me-iOS/Social/Data/SearchName.swift rename to Data/SearchName.swift index e40ff47..e570699 100644 --- a/Better-me-iOS/Social/Data/SearchName.swift +++ b/Data/SearchName.swift @@ -8,17 +8,17 @@ import Foundation struct SearchName: Codable, Hashable{ - var followee: Int - var nickName: String + let followee: Int + let nickName: String // var photo: String - var stars: Int + let stars: Int } struct SearchNameResponse: Codable{ - var result: [SearchName] - var isSuccess: Bool - var code: Int - var message: String + let isSuccess: Bool + let result: [SearchName] + let code: Int + let message: String } diff --git a/Data/SearchNameModel.swift b/Data/SearchNameModel.swift new file mode 100644 index 0000000..8ca27d5 --- /dev/null +++ b/Data/SearchNameModel.swift @@ -0,0 +1,70 @@ +// +// RandomUserViewModel.swift +// RandomUserApi +// +// Created by 황인성 on 2023/02/03. +// + +import Foundation +import Combine +import Alamofire +//import SwiftyJSON + +class SearchNameModel: ObservableObject{ + + var subscripttion = Set() + // var param = ["nickName": "포"] as Dictionary + let param: [String: Any] = ["nickName": "포"] + @Published var SearchNames = [SearchName]() + + @Published var name = "" + + var token: HTTPHeaders = ["x-access-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWR4IjoxNSwiaWF0IjoxNjc2NDQ1MjExLCJleHAiOjE2NzY1MzE2MTEsInN1YiI6InVzZXJJbmZvIn0.FVP6kVmjA-D8cC1e4Za0-vt6xwifx_k54N_UwTLwafg"] + + var baseUrl = "http://54.180.13.219:3000/app/follow/searchN/15" + + + + init(){ + print(#fileID, #function, #line, "") + // fetchRandomUsers() + } + + + func fetchRandomUsers(){ + + // var name = self.name + print(#fileID, #function, #line, "") + AF.request(baseUrl, method: .get, parameters: param, encoding: URLEncoding.default, headers: token).publishDecodable(type: SearchNameResponse.self) + .compactMap{ $0.value } + .map{ $0.result } + .sink(receiveCompletion: { completion in + print("데이터스트림 완료3") + }, receiveValue: { receivedValue in + print("hello") + self.SearchNames = receivedValue + }).store(in: &subscripttion) + } + func getUserInfoData() { + + // guard let url = URL(string: "http://54.180.13.219:3000/app/users/getMyPage/\(userIdx ?? "")") else {return} + // let header : HTTPHeaders = ["Content-Type":"application/json", "Accept":"application/json", "x-access-token": token ?? ""] + + AF.request(baseUrl, + method: .get, + parameters: param, + encoding: JSONEncoding.default, + headers: token) + .responseDecodable(of: SearchNameResponse.self) { response in + switch response.result { + case .success(let response): + print(response.message) + + case .failure(let error): + print("sd") + print(error) + + } + } + } +} diff --git a/Podfile b/Podfile new file mode 100644 index 0000000..cf042a4 --- /dev/null +++ b/Podfile @@ -0,0 +1,11 @@ +# Uncomment the next line to define a global platform for your project +# platform :ios, '9.0' + +target 'Better-me-iOS' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! +pod 'Alamofire' + + # Pods for Better-me-iOS + +end diff --git a/Podfile.lock b/Podfile.lock new file mode 100644 index 0000000..4c43b8f --- /dev/null +++ b/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - Alamofire (5.6.4) + +DEPENDENCIES: + - Alamofire + +SPEC REPOS: + trunk: + - Alamofire + +SPEC CHECKSUMS: + Alamofire: 4e95d97098eacb88856099c4fc79b526a299e48c + +PODFILE CHECKSUM: 68a37abcae5aa039eca3abf506dc1dab2d5a3d4e + +COCOAPODS: 1.11.3 diff --git a/SearchManager.swift b/SearchManager.swift new file mode 100644 index 0000000..c967fc0 --- /dev/null +++ b/SearchManager.swift @@ -0,0 +1,65 @@ +// +// SearchManager.swift +// Better-me-iOS +// +// Created by Phil on 2023/02/16. +// + +import Foundation + +class SearchManager { + let token = UserDefaults.standard.string(forKey: "token") + let userIdx = UserDefaults.standard.string(forKey: "userIdx") + + + func getSearchName(searchNameText: String) { + var components = URLComponents(string: "http://54.180.13.219:3000/app//follow/searchN/\(userIdx ?? "")")! + guard let url = components.url else {return} + components.queryItems = [URLQueryItem(name: "nickName", value: searchNameText)] + let header = ["x-access-token": token ?? ""] + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.allHTTPHeaderFields = header + let task = URLSession.shared.dataTask(with: request) { (data, response, error) in + if let error = error { + print("Error: \(error)") + } else if let data = data { + do { + let decoder = JSONDecoder() + let searchNameResponse = try decoder.decode(SearchNameResponse.self, from: data) + for searchName in searchNameResponse.result { + print("Name: \(searchName.nickName)") + } + } catch let error { + print("Error decoding response: \(error)") + } + } + } + task.resume() + } + func getSearchEmail(searchEmailText : String) { + var components = URLComponents(string: "http://54.180.13.219:3000/app//follow/searchN/\(userIdx ?? "")")! + guard let url = components.url else { return } + components.queryItems = [URLQueryItem(name: "nickName", value: searchEmailText)] + let header = ["x-access-token": token ?? ""] + var request = URLRequest(url: url) + request.httpMethod = "GET" + request.allHTTPHeaderFields = header + let task = URLSession.shared.dataTask(with: request) { (data, response, error) in + if let error = error { + print("Error: \(error)") + } else if let data = data { + do { + let decoder = JSONDecoder() + let searchNameResponse = try decoder.decode(SearchEmailResponse.self, from: data) + for searchName in searchNameResponse.result { + print("Name: \(searchName.nickName)") + } + } catch let error { + print("Error decoding response: \(error)") + } + } + } + task.resume() + } +} diff --git a/SocialViewController.swift b/SocialViewController.swift new file mode 100644 index 0000000..b95f6b0 --- /dev/null +++ b/SocialViewController.swift @@ -0,0 +1,51 @@ +// +// SocialViewController.swift +// Better-me-iOS +// +// Created by 황인성 on 2023/02/01. +// + +import UIKit +import SwiftUI + +class SocialViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + configureNaviBar() + // Do any additional setup after loading the view. + } + + + @IBSegueAction func addSwiftUIView(_ coder: NSCoder) -> UIViewController? { + return UIHostingController(coder: coder, rootView: ContentView()) + } + +// @IBSegueAction func addSwiftUIView(_ coder: NSCoder) -> UIViewController? { +// return UIHostingController(coder: coder, rootView: ContentView()) +// } + private func dateToString(date: Date) -> String{ + let formmater = DateFormatter() + formmater.dateFormat = "M월 d일 E요일" + formmater.locale = Locale(identifier: "ko-KR") + return formmater.string(from: date) + } + + private func configureNaviBar() { + let image = UIImage(named: "BetterMeLogo") + let date = dateToString(date: Date()) + navigationItem.leftBarButtonItem = UIBarButtonItem(image: image, style: .plain, target: nil, action: nil) + navigationItem.rightBarButtonItem = UIBarButtonItem(title: date, style: .plain, target: nil, action: nil) + navigationItem.rightBarButtonItem?.tintColor = .black + } + + /* + // MARK: - Navigation + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/Better-me-iOS/Social/SwiftUIView.swift b/SwiftUIView.swift similarity index 77% rename from Better-me-iOS/Social/SwiftUIView.swift rename to SwiftUIView.swift index c64f3d9..bee100a 100644 --- a/Better-me-iOS/Social/SwiftUIView.swift +++ b/SwiftUIView.swift @@ -7,6 +7,7 @@ import SwiftUI import PopupView +import Alamofire struct NewSearchBar: View { @@ -20,12 +21,6 @@ struct NewSearchBar: View { .underlineTextField() .foregroundColor(.primary) - Button(action: { - searchText = text - print(searchText) - }, label: { - Image(systemName: "magnifyingglass") - }) if !text.isEmpty { Button(action: { self.text = "" @@ -35,6 +30,14 @@ struct NewSearchBar: View { } else { EmptyView() } + + Button(action: { + self.searchText = self.text + print(searchText) + }, label: { + Image(systemName: "magnifyingglass") + }) + } .padding(EdgeInsets(top: 4, leading: 8, bottom: 4, trailing: 8)) .foregroundColor(.secondary) @@ -47,7 +50,7 @@ struct FriendSearchView: View { @Environment(\.presentationMode) private var presentationMode - @ObservedObject var data = SearchNameModel() + @ObservedObject var data = SearchEmailModel() @State var array = ["신디", "리미", "매버릭", "범", "벨라", "폴", "피딕", "주니", "포디", "혀니", "asd", "asd","asd","Asd"] @@ -59,9 +62,7 @@ struct FriendSearchView: View { NewSearchBar(text: $searchText) .padding(EdgeInsets(top: 10, leading: 0, bottom: 10, trailing: 0)) - List(data.SearchNames, id: \.self) { searchText in - // ForEach(array.filter{$0.hasPrefix(searchText) || searchText == ""}, id:\.self) {searchText in - + List(data.SearchEmails, id: \.self) { searchText in ZStack(alignment: .leading) { Rectangle().fill(Color(red: 0.5, green: 0.5, blue: 0.5, opacity: 0.30)).cornerRadius(8).frame(height: 55) @@ -78,34 +79,18 @@ struct FriendSearchView: View { .onTapGesture { hideKeyboard() } + .navigationBarBackButtonHidden(true) .navigationBarItems(leading: Button(action: { self.presentationMode.wrappedValue.dismiss() }, label: { - Image(systemName: "x.circle") + Image("Vector2") }) ) } } -//} -//struct homeView: View { -// var body: some View { -// -//// NavigationView{ -// Button(action: { -// print("Floating Button Click") -// }, label: { -// NavigationLink(destination: SearchView()) { -// Image("Group 65").frame(width: 51, height: 51, alignment: .bottomTrailing) -// } -// }) -//// } -// -// } -//} - extension View { func underlineTextField() -> some View { self @@ -281,7 +266,7 @@ struct SecondView: View{ print("좋아요!") self.show1 = false self.agree.patch() - // data.patchFriend() + }, label: { ZStack { RoundedRectangle(cornerRadius: 15.5) @@ -375,6 +360,8 @@ struct ThirdView: View{ @State var habit = "default" @ObservedObject var data = InviteHabitModel() + @ObservedObject var agreeData = HabitAgreeModel() + @ObservedObject var disagreeData = HabitDisagreeModel() var body: some View{ ZStack { @@ -524,6 +511,7 @@ struct ThirdView: View{ Button(action: { print("좋아요!") self.show1 = false + agreeData.fetchRandomUsers() }, label: { ZStack { RoundedRectangle(cornerRadius: 15.5) @@ -596,6 +584,7 @@ struct ThirdView: View{ Button(action: { print("좋아요!") self.show2 = false + disagreeData.fetchRandomUsers() }, label: { ZStack { RoundedRectangle(cornerRadius: 15.5) @@ -702,93 +691,101 @@ extension View { } } -struct SortButtonView: View{ - var body: some View{ - VStack{ - Button(action: { - - }, label: { - Text("상장 많은 순") - }) - Spacer() - Button(action: { - - }, label: { - Text("상장 적은 순") - }) - Spacer() - Button(action: { - - }, label: { - Text("가나다 순") - }) - Spacer() - Button(action: { - - }, label: { - Text("최근 추가순") - }) - Spacer() - Button(action: { - - }, label: { - Text("오래된 순") - }) - } - } -} - +//struct SortButtonView: View{ +// var body: some View{ +// VStack{ +// Button(action: { +// +// }, label: { +// Text("상장 많은 순") +// }) +// Spacer() +// Button(action: { +// +// }, label: { +// Text("상장 적은 순") +// }) +// Spacer() +// Button(action: { +// +// }, label: { +// Text("가나다 순") +// }) +// Spacer() +// Button(action: { +// +// }, label: { +// Text("최근 추가순") +// }) +// Spacer() +// Button(action: { +// +// }, label: { +// Text("오래된 순") +// }) +// } +// } +//} -struct SortView: View { - - @Environment(\.presentationMode) private var presentationMode - - var body: some View { - NavigationView{ - VStack(alignment: .leading){ - Rectangle().frame(height: 0) - SortButtonView() - Spacer() - Button(action: { - self.presentationMode.wrappedValue.dismiss() - }, label: { - Text("닫기").frame(width: 375, height: 80).foregroundColor(.black - ) - }) - }.padding(.leading) - .navigationBarTitle("정렬", displayMode: .inline) - } - } -} +// +//struct SortView: View { +// +// @Environment(\.presentationMode) private var presentationMode +// +// var body: some View { +// NavigationView{ +// VStack(alignment: .leading){ +// Rectangle().frame(height: 0) +// SortButtonView() +// Spacer() +// Button(action: { +// self.presentationMode.wrappedValue.dismiss() +// }, label: { +// Text("닫기").frame(width: 375, height: 80).foregroundColor(.black +// ) +// }) +// }.padding(.leading) +// .navigationBarTitle("정렬", displayMode: .inline) +// } +// } +//} -struct SearchBar: View { - - @Binding var text: String - - var body: some View { - HStack { - HStack { - TextField("친구 찾기", text: $text) - .underlineTextField() - .foregroundColor(.primary) - - Image(systemName: "magnifyingglass") - if !text.isEmpty { - Button(action: { - self.text = "" - }) { - Image(systemName: "xmark.circle.fill") - } - } else { - EmptyView() - } - } - .padding(EdgeInsets(top: 4, leading: 8, bottom: 4, trailing: 8)) - .foregroundColor(.secondary) - } - .padding(.horizontal) - } -} +//struct SearchBar: View { +// +// @Binding var text: String +// +// @ObservedObject var data = SearchNameModel() +// +// var body: some View { +// HStack { +// HStack { +// TextField("친구 찾기", text: $text) +// .underlineTextField() +// .foregroundColor(.primary) +// +// if !text.isEmpty { +// Button(action: { +// self.text = "" +// }) { +// Image(systemName: "xmark.circle.fill") +// } +// } else { +// EmptyView() +// } +// +// Button(action: { +// data.fetchRandomUsers(name: text) +// }, label: { +// Image(systemName: "magnifyingglass") +// }) +// +// } +// .padding(EdgeInsets(top: 4, leading: 8, bottom: 4, trailing: 8)) +// .foregroundColor(.secondary) +// } +// .padding(.horizontal) +// } +//} #if canImport(UIKit) extension View { @@ -804,21 +801,41 @@ struct SearchView: View { @ObservedObject var data = SearchNameModel() - @State var array = ["Asd", "Fiddich"] - - - - @State private var searchText = "" + @Binding var text: String + + @State var searchText = "" var body: some View { NavigationView { VStack { - SearchBar(text: $searchText) - .padding(EdgeInsets(top: 10, leading: 0, bottom: 10, trailing: 0)) +// SearchBar(text: $searchText) + HStack { + TextField("친구 찾기", text: $text) + .underlineTextField() + .foregroundColor(.primary) + + if !text.isEmpty { + Button(action: { + self.text = "" + }) { + Image(systemName: "xmark.circle.fill") + } + } else { + EmptyView() + } + + Button(action: { + SearchManager().getSearchName(searchNameText: text) + }, label: { + Image(systemName: "magnifyingglass") + }) + + } + .padding(EdgeInsets(top: 4, leading: 8, bottom: 4, trailing: 8)) + .foregroundColor(.secondary) + List(data.SearchNames, id:\.self) { searchText in - // ForEach(array.filter{$0.hasPrefix(searchText) || searchText == ""}, id:\.self) {searchText in - ZStack(alignment: .leading) { Rectangle().foregroundColor(.secondary).cornerRadius(8).frame(height: 55) @@ -835,14 +852,15 @@ struct SearchView: View { .onTapGesture { hideKeyboard() } + .navigationBarBackButtonHidden(true) + .navigationBarItems(leading: + Button(action: { + self.presentationMode.wrappedValue.dismiss() + }, label: { + Image("Vector2") + }) + ) } - .navigationBarItems(leading: - Button(action: { - self.presentationMode.wrappedValue.dismiss() - }, label: { - Image(systemName: "x.circle") - }) - ) } } //} @@ -855,6 +873,13 @@ struct FriendView: View { @ObservedObject var model = PersonModel() @State var showModal = false @State var showModalSearch = false + @State var searchText = "" + + @State var numbers = ["Record1","Record2","Record3","Record4","Record5","Record6","Record1Seven","Record1Eight","Record1Nine","Record1Ten"] + @State var editMode = EditMode.inactive + @State var selection = Set() + @ObservedObject var data = NewPersonModel() + @State var dataArray = NewPersonModel().Friends var body: some View { VStack{ @@ -866,81 +891,64 @@ struct FriendView: View { }, label: { Image("Magnifier") }).sheet(isPresented: self.$showModalSearch){ - SearchView().presentationDetents([.fraction(0.75)]) + SearchView(text: $searchText).presentationDetents([.fraction(0.75)]) } - // Button(action: { - // self.showModal = true - // }, label: { - // Image("Group 44") - // }).sheet(isPresented: self.$showModal){ - // SortView().presentationDetents([.medium]) - // } - Button(action: { - ScrollVertical().toolbar { - EditButton() - } - }, label: { - Image("so-trash") - }) + + editButton } Divider() - ScrollVertical() - } - - } -} - - -struct TrashView: View { - - @State var numbers = ["Record1","Record2","Record3","Record4","Record5","Record6","Record1Seven","Record1Eight","Record1Nine","Record1Ten"] - @State var editMode = EditMode.inactive - @State var selection = Set() - - var body: some View { - NavigationView { - List(selection: $selection) { - ForEach(numbers, id: \.self) { number in - Text(number) + NavigationView { + List(selection: $selection) { + ForEach(data.Friends, id: \.self) { friend in + HStack{ + Image(systemName: "person.circle.fill").resizable().frame(width: 37, height: 37) + .foregroundColor(Color.random()) + VStack(alignment: .leading) { + + Text(friend.nickName) + .font(.subheadline) + .fontWeight(.semibold) + Text(friend.promise) + .fontWeight(.semibold) + .font(.caption2) + .foregroundColor(.gray) + } + Spacer() + Image(systemName: "star.fill").foregroundColor(.yellow) + Text(String(friend.stars)).frame(width: 25, height: 25, alignment: .leading) + + }.listRowSeparator(.hidden) + }.onDelete(perform: delete) } + .listStyle(PlainListStyle()) +// .navigationBarItems(trailing: editButton) + .environment(\.editMode, self.$editMode) } - .navigationBarItems(leading: deleteButton, trailing: editButton) - .environment(\.editMode, self.$editMode) } + } - private var editButton: some View { + var editButton: some View { if editMode == .inactive { return Button(action: { self.editMode = .active self.selection = Set() }) { - Text("Edit") + Image("Vector") } } else { return Button(action: { self.editMode = .inactive self.selection = Set() + deleteNumbers() }) { - Text("Done") + Image("so-trashred") } } } - private var deleteButton: some View { - if editMode == .inactive { - return Button(action: {}) { - Image(systemName: "") - } - } else { - return Button(action: deleteNumbers) { - Image(systemName: "trash") - } - } - } - - private func deleteNumbers() { + func deleteNumbers() { for id in selection { if let index = numbers.lastIndex(where: { $0 == id }) { numbers.remove(at: index) @@ -948,12 +956,86 @@ struct TrashView: View { } selection = Set() } + func delete(at offsets: IndexSet) { + numbers.remove(atOffsets: offsets) + } } +// +//struct TrashView: View { +// +// @State var numbers = ["Record1","Record2","Record3","Record4","Record5","Record6","Record1Seven","Record1Eight","Record1Nine","Record1Ten"] +// @State var editMode = EditMode.inactive +// @State var selection = Set() +// @ObservedObject var data = NewPersonModel() +// @State var dataArray = NewPersonModel().Friends +// +// +// var body: some View { +// NavigationView { +// List(selection: $selection) { +// ForEach(data.Friends, id: \.self) { friend in +// HStack{ +// Image(systemName: "person.circle.fill").resizable().frame(width: 37, height: 37) +// .foregroundColor(Color.random()) +// VStack(alignment: .leading) { +// +// Text(friend.nickName) +// .font(.subheadline) +// .fontWeight(.semibold) +// Text(friend.promise) +// .fontWeight(.semibold) +// .font(.caption2) +// .foregroundColor(.gray) +// } +// Spacer() +// Image(systemName: "star.fill").foregroundColor(.yellow) +// Text(String(friend.stars)).frame(width: 25, height: 25, alignment: .leading) +// +// }.listRowSeparator(.hidden) +// }.onDelete(perform: delete) +// } +// .listStyle(PlainListStyle()) +// .navigationBarItems(trailing: editButton) +// .environment(\.editMode, self.$editMode) +// } +// } +// var editButton: some View { +// if editMode == .inactive { +// return Button(action: { +// self.editMode = .active +// self.selection = Set() +// }) { +// Image("Vector") +// } +// } +// else { +// return Button(action: { +// self.editMode = .inactive +// self.selection = Set() +// deleteNumbers() +// }) { +// Image("so-trashred") +// } +// } +// } +// +// func deleteNumbers() { +// for id in selection { +// if let index = numbers.lastIndex(where: { $0 == id }) { +// numbers.remove(at: index) +// } +// } +// selection = Set() +// } +// private func delete(at offsets: IndexSet) { +// numbers.remove(atOffsets: offsets) +// } +//} +// struct ScrollVertical: View{ - // @ObservedObject var model = PersonModel() @ObservedObject var data = NewPersonModel() @State var editMode = EditMode.inactive @State var selection = Set() @@ -1005,6 +1087,24 @@ struct ScrollVertical: View{ }) } } + private var editButton: some View { + if editMode == .inactive { + return Button(action: { + self.editMode = .active + self.selection = Set() + }) { + Image("Vector") + } + } + else { + return Button(action: { + self.editMode = .inactive + self.selection = Set() + }) { + Image("so-trashred") + } + } + } } // } // private var editButton: some View { @@ -1075,18 +1175,14 @@ struct ContentView: View { NavigationView() { VStack(alignment: .leading){ - Rectangle().frame(height: 0) - Button(action: { - print("홈으로 이동") - }, label: { - Image("BetterMe") - .padding(.top, 17.0).padding(.leading, 18).padding(.bottom, 28) - }) - - // TabView{ - // Text("home").tabItem{ - // Image(systemName: "house") - // } +// Rectangle().frame(height: 0) +// Button(action: { +// print(Token().token) +// print(String(Token().userIdx)) +// }, label: { +// Image("BetterMe") +// .padding(.top, 17.0).padding(.leading, 18).padding(.bottom, 28) +// }) VStack{ CustomTopTabBar(tabIndex: $tabIndex) if tabIndex == 0 { @@ -1103,15 +1199,7 @@ struct ContentView: View { .frame(width: UIScreen.main.bounds.width - 24, alignment: .center) .padding(.horizontal, 12).tabItem{ Image(systemName: "medal") - - // } - // Text("earth").tabItem{ - // Image(systemName: "globe") - // } - // Text("mypage").tabItem{ - // Image(systemName: "person") - // } - // } + } } } @@ -1124,9 +1212,6 @@ struct ContentView: View { FriendView() ContentView() FriendSearchView() - // homeView() - } } - }